diff --git a/.eslintrc.js b/.eslintrc.js index c4da703ecebc7e..c2c8e1df7e58d3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -19,6 +19,7 @@ const hacks = [ 'eslint-plugin-markdown', '@babel/eslint-parser', '@babel/plugin-syntax-import-attributes', + '@stylistic/eslint-plugin-js', ]; Module._findPath = (request, paths, isMain) => { const r = ModuleFindPath(request, paths, isMain); @@ -39,7 +40,7 @@ module.exports = { es2022: true, }, extends: ['eslint:recommended', 'plugin:jsdoc/recommended'], - plugins: ['jsdoc', 'markdown', 'node-core'], + plugins: ['jsdoc', 'markdown', 'node-core', '@stylistic/js'], parser: '@babel/eslint-parser', parserOptions: { babelOptions: { @@ -133,11 +134,7 @@ module.exports = { // https://eslint.org/docs/rules/ 'accessor-pairs': 'error', 'array-callback-return': 'error', - 'arrow-parens': 'error', - 'arrow-spacing': 'error', 'block-scoped-var': 'error', - 'block-spacing': 'error', - 'brace-style': ['error', '1tbs', { allowSingleLine: true }], 'capitalized-comments': ['error', 'always', { line: { // Ignore all lines that have less characters than 20 and all lines that @@ -150,49 +147,17 @@ module.exports = { ignorePattern: '.*', }, }], - 'comma-dangle': ['error', 'always-multiline'], - 'comma-spacing': 'error', - 'comma-style': 'error', - 'computed-property-spacing': 'error', 'default-case-last': 'error', - 'dot-location': ['error', 'property'], 'dot-notation': 'error', - 'eol-last': 'error', 'eqeqeq': ['error', 'smart'], - 'func-call-spacing': 'error', 'func-name-matching': 'error', 'func-style': ['error', 'declaration', { allowArrowFunctions: true }], - 'indent': ['error', 2, { - ArrayExpression: 'first', - CallExpression: { arguments: 'first' }, - FunctionDeclaration: { parameters: 'first' }, - FunctionExpression: { parameters: 'first' }, - MemberExpression: 'off', - ObjectExpression: 'first', - SwitchCase: 1, - }], - 'key-spacing': 'error', - 'keyword-spacing': 'error', - 'linebreak-style': 'error', - 'max-len': ['error', { - code: 120, - ignorePattern: '^// Flags:', - ignoreRegExpLiterals: true, - ignoreTemplateLiterals: true, - ignoreUrls: true, - tabWidth: 2, - }], - 'new-parens': 'error', - 'no-confusing-arrow': 'error', 'no-constant-condition': ['error', { checkLoops: false }], 'no-constructor-return': 'error', 'no-duplicate-imports': 'error', 'no-else-return': 'error', - 'no-extra-parens': ['error', 'functions'], 'no-lonely-if': 'error', 'no-mixed-requires': 'error', - 'no-multi-spaces': ['error', { ignoreEOLComments: true }], - 'no-multiple-empty-lines': ['error', { max: 2, maxEOF: 0, maxBOF: 0 }], 'no-new-require': 'error', 'no-path-concat': 'error', 'no-proto': 'error', @@ -257,10 +222,8 @@ module.exports = { }, ], 'no-self-compare': 'error', - 'no-tabs': 'error', 'no-template-curly-in-string': 'error', 'no-throw-literal': 'error', - 'no-trailing-spaces': 'error', 'no-undef': ['error', { typeof: true }], 'no-undef-init': 'error', 'no-unused-expressions': ['error', { allowShortCircuit: true }], @@ -276,39 +239,11 @@ module.exports = { 'no-useless-return': 'error', 'no-var': 'error', 'no-void': 'error', - 'no-whitespace-before-property': 'error', - 'object-curly-newline': 'error', - 'object-curly-spacing': ['error', 'always'], 'one-var': ['error', { initialized: 'never' }], - 'one-var-declaration-per-line': 'error', - 'operator-linebreak': ['error', 'after'], - 'padding-line-between-statements': [ - 'error', - { blankLine: 'always', prev: 'function', next: 'function' }, - ], 'prefer-const': ['error', { ignoreReadBeforeAssign: true }], 'prefer-object-has-own': 'error', - 'quotes': ['error', 'single', { avoidEscape: true }], - 'quote-props': ['error', 'consistent'], - 'rest-spread-spacing': 'error', - 'semi': 'error', - 'semi-spacing': 'error', - 'space-before-blocks': ['error', 'always'], - 'space-before-function-paren': ['error', { - anonymous: 'never', - named: 'never', - asyncArrow: 'always', - }], - 'space-in-parens': 'error', - 'space-infix-ops': 'error', - 'space-unary-ops': 'error', - 'spaced-comment': ['error', 'always', { - 'block': { 'balanced': true }, - 'exceptions': ['-'], - }], 'strict': ['error', 'global'], 'symbol-description': 'error', - 'template-curly-spacing': 'error', 'unicode-bom': 'error', 'valid-typeof': ['error', { requireStringLiterals: true }], @@ -327,6 +262,74 @@ module.exports = { 'jsdoc/check-tag-names': 'off', 'jsdoc/require-returns': 'off', + // Stylistic rules + '@stylistic/js/arrow-parens': 'error', + '@stylistic/js/arrow-spacing': 'error', + '@stylistic/js/block-spacing': 'error', + '@stylistic/js/brace-style': ['error', '1tbs', { allowSingleLine: true }], + '@stylistic/js/comma-dangle': ['error', 'always-multiline'], + '@stylistic/js/comma-spacing': 'error', + '@stylistic/js/comma-style': 'error', + '@stylistic/js/computed-property-spacing': 'error', + '@stylistic/js/dot-location': ['error', 'property'], + '@stylistic/js/eol-last': 'error', + '@stylistic/js/func-call-spacing': 'error', + '@stylistic/js/indent': ['error', 2, { + ArrayExpression: 'first', + CallExpression: { arguments: 'first' }, + FunctionDeclaration: { parameters: 'first' }, + FunctionExpression: { parameters: 'first' }, + MemberExpression: 'off', + ObjectExpression: 'first', + SwitchCase: 1, + }], + '@stylistic/js/key-spacing': 'error', + '@stylistic/js/keyword-spacing': 'error', + '@stylistic/js/linebreak-style': 'error', + '@stylistic/js/max-len': ['error', { + code: 120, + ignorePattern: '^// Flags:', + ignoreRegExpLiterals: true, + ignoreTemplateLiterals: true, + ignoreUrls: true, + tabWidth: 2, + }], + '@stylistic/js/new-parens': 'error', + '@stylistic/js/no-confusing-arrow': 'error', + '@stylistic/js/no-extra-parens': ['error', 'functions'], + '@stylistic/js/no-multi-spaces': ['error', { ignoreEOLComments: true }], + '@stylistic/js/no-multiple-empty-lines': ['error', { max: 2, maxEOF: 0, maxBOF: 0 }], + '@stylistic/js/no-tabs': 'error', + '@stylistic/js/no-trailing-spaces': 'error', + '@stylistic/js/no-whitespace-before-property': 'error', + '@stylistic/js/object-curly-newline': 'error', + '@stylistic/js/object-curly-spacing': ['error', 'always'], + '@stylistic/js/one-var-declaration-per-line': 'error', + '@stylistic/js/operator-linebreak': ['error', 'after'], + '@stylistic/js/padding-line-between-statements': [ + 'error', + { blankLine: 'always', prev: 'function', next: 'function' }, + ], + '@stylistic/js/quotes': ['error', 'single', { avoidEscape: true }], + '@stylistic/js/quote-props': ['error', 'consistent'], + '@stylistic/js/rest-spread-spacing': 'error', + '@stylistic/js/semi': 'error', + '@stylistic/js/semi-spacing': 'error', + '@stylistic/js/space-before-blocks': ['error', 'always'], + '@stylistic/js/space-before-function-paren': ['error', { + anonymous: 'never', + named: 'never', + asyncArrow: 'always', + }], + '@stylistic/js/space-in-parens': 'error', + '@stylistic/js/space-infix-ops': 'error', + '@stylistic/js/space-unary-ops': 'error', + '@stylistic/js/spaced-comment': ['error', 'always', { + 'block': { 'balanced': true }, + 'exceptions': ['-'], + }], + '@stylistic/js/template-curly-spacing': 'error', + // Custom rules from eslint-plugin-node-core 'node-core/no-unescaped-regexp-dot': 'error', 'node-core/no-duplicate-requires': 'error', diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e4241de7d42e75..e1fe4d0add3daf 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -96,7 +96,6 @@ /doc/api/packages.md @nodejs/loaders /lib/internal/bootstrap/realm.js @nodejs/loaders /lib/internal/modules/* @nodejs/loaders -/lib/internal/process/esm_loader.js @nodejs/loaders /lib/internal/process/execution.js @nodejs/loaders /lib/module.js @nodejs/loaders /src/module_wrap* @nodejs/loaders @nodejs/vm diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml index 7e5d27d4247015..ff0a9d725d304a 100644 --- a/.github/workflows/build-tarball.yml +++ b/.github/workflows/build-tarball.yml @@ -28,7 +28,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -43,7 +43,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -69,13 +69,13 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information run: npx envinfo - name: Download tarball - uses: actions/download-artifact@87c55149d96e628cc2ef7e6fc2aab372015aec85 # v4.1.3 + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: name: tarballs path: tarballs diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index c13830c59ba601..48dd2a1fd902c8 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -2,13 +2,10 @@ name: Build Windows on: pull_request: - paths: - - lib/**/*.js - - Makefile - - src/**/*.cc - - src/**/*.h - - tools/gyp/** - - .github/workflows/build-windows.yml + paths-ignore: + - README.md + - .github/** + - '!.github/workflows/build-windows.yml' types: [opened, synchronize, reopened, ready_for_review] push: branches: @@ -16,20 +13,17 @@ on: - canary - v[0-9]+.x-staging - v[0-9]+.x - paths: - - lib/**/*.js - - Makefile - - src/**/*.cc - - src/**/*.h - - tools/gyp/** - - .github/workflows/build-windows.yml + paths-ignore: + - README.md + - .github/** + - '!.github/workflows/build-windows.yml' concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -48,7 +42,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install deps diff --git a/.github/workflows/close-stale-feature-requests.yml b/.github/workflows/close-stale-feature-requests.yml index f8f086af04dae0..301dbff620c602 100644 --- a/.github/workflows/close-stale-feature-requests.yml +++ b/.github/workflows/close-stale-feature-requests.yml @@ -19,9 +19,11 @@ env: WARN_MESSAGE: > There has been no activity on this feature request for - 5 months and it is unlikely to be implemented. - It will be closed 6 months after the last non-automated comment. - + 5 months. To help maintain relevant open issues, please + add the https://github.com/nodejs/node/labels/never-stale + label or close this issue if it should be closed. If not, + the issue will be automatically closed 6 months after the + last non-automated comment. For more information on how the project manages feature requests, please consult the diff --git a/.github/workflows/coverage-linux-without-intl.yml b/.github/workflows/coverage-linux-without-intl.yml index 5d30b97f576828..a2351225d6efbd 100644 --- a/.github/workflows/coverage-linux-without-intl.yml +++ b/.github/workflows/coverage-linux-without-intl.yml @@ -30,7 +30,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -45,7 +45,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -68,6 +68,7 @@ jobs: - name: Clean tmp run: rm -rf coverage/tmp && rm -rf out - name: Upload - uses: codecov/codecov-action@54bcd8715eee62d40e33596ef5e8f0f48dbbccab # v4.1.0 + uses: codecov/codecov-action@c16abc29c95fcf9174b58eb7e1abf4c866893bc8 # v4.1.1 with: directory: ./coverage + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml index 43dded115d9488..10705fc16a749c 100644 --- a/.github/workflows/coverage-linux.yml +++ b/.github/workflows/coverage-linux.yml @@ -30,7 +30,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -45,7 +45,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -68,6 +68,7 @@ jobs: - name: Clean tmp run: rm -rf coverage/tmp && rm -rf out - name: Upload - uses: codecov/codecov-action@54bcd8715eee62d40e33596ef5e8f0f48dbbccab # v4.1.0 + uses: codecov/codecov-action@c16abc29c95fcf9174b58eb7e1abf4c866893bc8 # v4.1.1 with: directory: ./coverage + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml index 1d00175325f33b..ead5743f51b39e 100644 --- a/.github/workflows/coverage-windows.yml +++ b/.github/workflows/coverage-windows.yml @@ -30,7 +30,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -45,7 +45,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install deps @@ -67,6 +67,7 @@ jobs: - name: Clean tmp run: npx rimraf ./coverage/tmp - name: Upload - uses: codecov/codecov-action@54bcd8715eee62d40e33596ef5e8f0f48dbbccab # v4.1.0 + uses: codecov/codecov-action@c16abc29c95fcf9174b58eb7e1abf4c866893bc8 # v4.1.1 with: directory: ./coverage + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml index 1bef86c64336fe..62eb8b29f43ecc 100644 --- a/.github/workflows/daily-wpt-fyi.yml +++ b/.github/workflows/daily-wpt-fyi.yml @@ -18,7 +18,7 @@ on: - cron: 30 0 * * * env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' permissions: contents: read @@ -33,7 +33,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index bb7b2d5cdbe572..dd1f9ee1ae6533 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -14,7 +14,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' NODE_VERSION: lts/* permissions: @@ -44,7 +44,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -64,7 +64,7 @@ jobs: with: node-version: ${{ env.NODE_VERSION }} - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -122,7 +122,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -139,7 +139,7 @@ jobs: with: persist-credentials: false - name: Use Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -179,3 +179,10 @@ jobs: persist-credentials: false # GH Actions squashes all PR commits, HEAD^ refers to the base branch. - run: git diff HEAD^ HEAD -G"pr-url:" -- "*.md" | ./tools/lint-pr-url.mjs ${{ github.event.pull_request.html_url }} + lint-readme: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + persist-credentials: false + - run: tools/lint-readme-lists.mjs diff --git a/.github/workflows/notify-on-push.yml b/.github/workflows/notify-on-push.yml index 364e6610d439aa..a7f63c7bcad9ea 100644 --- a/.github/workflows/notify-on-push.yml +++ b/.github/workflows/notify-on-push.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Slack Notification - uses: rtCamp/action-slack-notify@b24d75fe0e728a4bf9fc42ee217caa686d141ee8 # 2.2.1 + uses: rtCamp/action-slack-notify@4e5fb42d249be6a45a298f3c9543b111b02f7907 # 2.3.0 env: SLACK_COLOR: '#DE512A' SLACK_ICON: https://github.com/nodejs.png?size=48 @@ -56,7 +56,7 @@ jobs: GH_TOKEN: ${{ github.token }} - name: Slack Notification if: ${{ env.INVALID_COMMIT_MESSAGE }} - uses: rtCamp/action-slack-notify@b24d75fe0e728a4bf9fc42ee217caa686d141ee8 # 2.2.1 + uses: rtCamp/action-slack-notify@4e5fb42d249be6a45a298f3c9543b111b02f7907 # 2.3.0 env: SLACK_COLOR: '#DE512A' SLACK_ICON: https://github.com/nodejs.png?size=48 diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index e74d17781bea19..bee3bf155f7059 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -73,6 +73,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@8a470fddafa5cbb6266ee11b37ef4d8aae19c571 # v3.24.6 + uses: github/codeql-action/upload-sarif@1b1aada464948af03b950897e5eb522f92603cc2 # v3.24.9 with: sarif_file: results.sarif diff --git a/.github/workflows/test-asan.yml b/.github/workflows/test-asan.yml index c97d55d4e8bef8..495f6679d950d5 100644 --- a/.github/workflows/test-asan.yml +++ b/.github/workflows/test-asan.yml @@ -30,7 +30,7 @@ concurrency: env: ASAN_OPTIONS: intercept_tls_get_addr=0 - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -45,13 +45,12 @@ jobs: CXX: clang++ LINK: clang++ CONFIG_FLAGS: --enable-asan - ASAN: true steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/test-internet.yml b/.github/workflows/test-internet.yml index 2c2e8060d9847f..2f50448d45aded 100644 --- a/.github/workflows/test-internet.yml +++ b/.github/workflows/test-internet.yml @@ -29,7 +29,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -44,7 +44,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index 3dd559cff24da0..cebcf5d1152a5b 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -23,7 +23,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -38,7 +38,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index ae76bfa175523d..ddcda36bd71aa6 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -29,7 +29,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' FLAKY_TESTS: keep_retrying permissions: @@ -44,7 +44,7 @@ jobs: with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/test-ubsan.yml b/.github/workflows/test-ubsan.yml new file mode 100644 index 00000000000000..ef88b76496dcfb --- /dev/null +++ b/.github/workflows/test-ubsan.yml @@ -0,0 +1,63 @@ +name: Test UBSan + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + paths-ignore: + - .mailmap + - '**.md' + - AUTHORS + - doc/** + - .github/** + - '!.github/workflows/test-ubsan.yml' + push: + branches: + - main + - canary + - v[0-9]+.x-staging + - v[0-9]+.x + paths-ignore: + - .mailmap + - '**.md' + - AUTHORS + - doc/** + - .github/** + - '!.github/workflows/test-ubsan.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + PYTHON_VERSION: '3.12' + FLAKY_TESTS: keep_retrying + +permissions: + contents: read + +jobs: + test-ubsan: + if: false # Temporary disabled. Reference: https://github.com/nodejs/node/pull/52293#issuecomment-2059270585 + runs-on: ubuntu-latest + env: + CC: gcc + CXX: g++ + LINK: g++ + CONFIG_FLAGS: --enable-ubsan + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + persist-credentials: false + - name: Store suppressions path + run: | + echo "UBSAN_OPTIONS=suppressions=$GITHUB_WORKSPACE/suppressions.supp" >> $GITHUB_ENV + - name: Set up Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Environment Information + run: npx envinfo + - name: Build + run: make build-ci -j2 V=1 + - name: Test + run: make run-ci -j2 V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' -t 300 --measure-flakiness 9" diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index 91125e06c7008b..d333e1e0fda0bf 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -25,6 +25,7 @@ on: - eslint - github_reporter - googletest + - gyp-next - histogram - icu # - libuv @@ -42,7 +43,7 @@ on: - zlib env: - PYTHON_VERSION: '3.11' + PYTHON_VERSION: '3.12' permissions: contents: read @@ -157,6 +158,14 @@ jobs: cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output + - id: gyp-next + subsystem: tools + label: tools + run: | + ./tools/dep_updaters/update-gyp-next.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output - id: histogram subsystem: deps label: dependencies @@ -294,7 +303,7 @@ jobs: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} if: matrix.id == 'icu' && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - run: ${{ matrix.run }} diff --git a/.github/workflows/update-v8.yml b/.github/workflows/update-v8.yml index 22ba68435101a5..e2b58456bf789a 100644 --- a/.github/workflows/update-v8.yml +++ b/.github/workflows/update-v8.yml @@ -20,7 +20,7 @@ jobs: with: persist-credentials: false - name: Cache node modules and update-v8 - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: cache-v8-npm env: cache-name: cache-v8-npm diff --git a/.mailmap b/.mailmap index 30584cce8b7fb1..1a3408a3f221d5 100644 --- a/.mailmap +++ b/.mailmap @@ -448,8 +448,9 @@ Ron Korving Ruben Bridgewater Ruben Bridgewater Russell Dempsey -Ruy Adorno -Ruy Adorno +Ruy Adorno +Ruy Adorno +Ruy Adorno Ryan Dahl Ryan Emery Ryan Mahan diff --git a/BUILDING.md b/BUILDING.md index bedc4da273fdf3..ed40bd90e5630a 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -121,6 +121,8 @@ platforms. This is true regardless of entries in the table below. | AIX | ppc64be >=power8 | >= 7.2 TL04 | Tier 2 | | | FreeBSD | x64 | >= 12.4 | Experimental | | + + [^1]: Older kernel versions may work. However official Node.js release binaries are [built on RHEL 8 systems](#official-binary-platforms-and-toolchains) with kernel 4.18. @@ -147,6 +149,8 @@ platforms. This is true regardless of entries in the table below. [^5]: Our macOS x64 Binaries are compiled with 10.15 as a target. Xcode11 is required to compile. + + ### Supported toolchains Depending on the host platform, the selection of toolchains may vary. @@ -173,6 +177,8 @@ Binaries at are produced on: | linux-x64 | RHEL 8 with gcc-toolset-10[^6] | | win-x64 and win-x86 | Windows 2012 R2 (x64) with Visual Studio 2019 | + + [^6]: Binaries produced on these systems are compatible with glibc >= 2.28 and libstdc++ >= 6.0.25 (`GLIBCXX_3.4.25`). These are available on distributions natively supporting GCC 8.1 or higher, such as Debian 10, @@ -183,6 +189,8 @@ Binaries at are produced on: distributions natively supporting GCC 9.3 or higher, such as Debian 11, Ubuntu 20.04. + + #### OpenSSL asm support OpenSSL-1.1.1 requires the following assembler version for use of asm @@ -319,6 +327,8 @@ documentation tests. To run the linter without running tests, use `make lint`/`vcbuild lint`. It will lint JavaScript, C++, and Markdown files. +To fix auto fixable JavaScript linting errors, use `make lint-js-fix`. + If you are updating tests and want to run tests in a single test file (e.g. `test/parallel/test-stream2-transform.js`): @@ -531,23 +541,30 @@ make test-only #### Speeding up frequent rebuilds when developing -If you plan to frequently rebuild Node.js, especially if using several branches, -installing `ccache` can help to greatly reduce build times. Set up with: +Tips: The `ccache` utility is widely used and should generally work fine. +If you encounter any difficulties, consider disabling `mold` as a +troubleshooting step. + +If you plan to frequently rebuild Node.js, especially if using several +branches, installing `ccache` and `mold` can help to greatly reduce build +times. Set up with: On GNU/Linux: ```bash -sudo apt install ccache # for Debian/Ubuntu, included in most Linux distros -export CC="ccache gcc" # add to your .profile -export CXX="ccache g++" # add to your .profile +sudo apt install ccache mold # for Debian/Ubuntu, included in most Linux distros +export CC="ccache gcc" # add to your .profile +export CXX="ccache g++" # add to your .profile +export LDFLAGS="-fuse-ld=mold" # add to your .profile ``` On macOS: ```bash -brew install ccache # see https://brew.sh -export CC="ccache cc" # add to ~/.zshrc or other shell config file -export CXX="ccache c++" # add to ~/.zshrc or other shell config file +brew install ccache mold # see https://brew.sh +export CC="ccache cc" # add to ~/.zshrc or other shell config file +export CXX="ccache c++" # add to ~/.zshrc or other shell config file +export LDFLAGS="-fuse-ld=mold" # add to ~/.zshrc or other shell config file ``` This will allow for near-instantaneous rebuilds when switching branches back @@ -565,6 +582,11 @@ the specified directory. The JS debugger of Visual Studio Code supports this configuration since the November 2020 version and allows for setting breakpoints. +Refs: + +1. +2. + #### Troubleshooting Unix and macOS builds Stale builds can sometimes result in `file not found` errors while building. @@ -578,6 +600,22 @@ to run it again before invoking `make -j4`. ### Windows +#### Tips + +You may need disable vcpkg integration if you got link error about symbol +redefine related to zlib.lib(zlib1.dll), even you never install it by hand, +as vcpkg is part of CLion and Visual Studio now. + +```powershell +# find your vcpkg +# double check vcpkg install the related file +vcpkg owns zlib.lib +vcpkg owns zlib1.dll +vcpkg integrate remove +``` + +Refs: #24448, , [vcpkg](https://github.com/microsoft/vcpkg/) + #### Prerequisites ##### Option 1: Manual install @@ -627,7 +665,7 @@ packages: To install Node.js prerequisites using [Boxstarter WebLauncher](https://boxstarter.org/weblauncher), open -with Internet Explorer or Edge browser on the target machine. +with Edge browser on the target machine. Alternatively, you can use PowerShell. Run those commands from an elevated (Administrator) PowerShell terminal: diff --git a/CHANGELOG.md b/CHANGELOG.md index 53bead5132e64c..bd78ef32e8ba0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,7 +35,8 @@ release. -20.12.2
+20.13.0
+20.12.2
20.12.1
20.12.0
20.11.1
diff --git a/GOVERNANCE.md b/GOVERNANCE.md index d29012745ea87f..1a5faf99a480ec 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -68,7 +68,7 @@ The TSC can remove inactive collaborators or provide them with _emeritus_ status. Emeriti may request that the TSC restore them to active status. A collaborator is automatically made emeritus (and removed from active -collaborator status) if it has been more than 18 months since the collaborator +collaborator status) if it has been more than 12 months since the collaborator has authored or approved a commit that has landed. ## Technical Steering Committee diff --git a/LICENSE b/LICENSE index 21ab4d655e6650..6b3d1a613b9769 100644 --- a/LICENSE +++ b/LICENSE @@ -136,7 +136,7 @@ The externally maintained libraries used by Node.js are: COPYRIGHT AND PERMISSION NOTICE - Copyright © 2016-2023 Unicode, Inc. + Copyright © 2016-2024 Unicode, Inc. NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR @@ -172,6 +172,8 @@ The externally maintained libraries used by Node.js are: dealings in these Data Files or Software without prior written authorization of the copyright holder. + SPDX-License-Identifier: Unicode-3.0 + ---------------------------------------------------------------------- Third-Party Software Licenses diff --git a/Makefile b/Makefile index 7bd80d06c17125..475043ceae7eb6 100644 --- a/Makefile +++ b/Makefile @@ -1512,15 +1512,15 @@ cpplint: lint-cpp # Try with '--system' if it fails without; the system may have set '--user' lint-py-build: $(info Pip installing ruff on $(shell $(PYTHON) --version)...) - $(PYTHON) -m pip install --upgrade --target tools/pip/site-packages ruff==0.0.272 || \ - $(PYTHON) -m pip install --upgrade --system --target tools/pip/site-packages ruff==0.0.272 + $(PYTHON) -m pip install --upgrade --target tools/pip/site-packages ruff==0.3.4 || \ + $(PYTHON) -m pip install --upgrade --system --target tools/pip/site-packages ruff==0.3.4 .PHONY: lint-py ifneq ("","$(wildcard tools/pip/site-packages/ruff)") # Lint the Python code with ruff. lint-py: tools/pip/site-packages/bin/ruff --version - tools/pip/site-packages/bin/ruff . + tools/pip/site-packages/bin/ruff check . else lint-py: $(warning Python linting with ruff is not available) diff --git a/README.md b/README.md index 356542a581a0e0..a7f7d19d048c31 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ For information about the governance of the Node.js project, see * [ronag](https://github.com/ronag) - **Robert Nagy** <> * [ruyadorno](https://github.com/ruyadorno) - - **Ruy Adorno** <> (he/him) + **Ruy Adorno** <> (he/him) * [ShogunPanda](https://github.com/ShogunPanda) - **Paolo Insogna** <> (he/him) * [targos](https://github.com/targos) - @@ -209,28 +209,14 @@ For information about the governance of the Node.js project, see **Beth Griggs** <> (she/her) * [bnoordhuis](https://github.com/bnoordhuis) - **Ben Noordhuis** <> -* [ChALkeR](https://github.com/ChALkeR) - - **Сковорода Никита Андреевич** <> (he/him) * [cjihrig](https://github.com/cjihrig) - **Colin Ihrig** <> (he/him) * [codebytere](https://github.com/codebytere) - **Shelley Vohr** <> (she/her) -* [danbev](https://github.com/danbev) - - **Daniel Bevenius** <> (he/him) * [danielleadams](https://github.com/danielleadams) - **Danielle Adams** <> (she/her) -* [fhinkel](https://github.com/fhinkel) - - **Franziska Hinkelmann** <> (she/her) -* [gabrielschulhof](https://github.com/gabrielschulhof) - - **Gabriel Schulhof** <> -* [mscdex](https://github.com/mscdex) - - **Brian White** <> * [MylesBorins](https://github.com/MylesBorins) - **Myles Borins** <> (he/him) -* [rvagg](https://github.com/rvagg) - - **Rod Vagg** <> -* [TimothyGu](https://github.com/TimothyGu) - - **Tiancheng "Timothy" Gu** <> (he/him) * [Trott](https://github.com/Trott) - **Rich Trott** <> (he/him) @@ -242,12 +228,20 @@ For information about the governance of the Node.js project, see * [addaleax](https://github.com/addaleax) - **Anna Henningsen** <> (she/her) +* [ChALkeR](https://github.com/ChALkeR) - + **Сковорода Никита Андреевич** <> (he/him) * [chrisdickinson](https://github.com/chrisdickinson) - **Chris Dickinson** <> +* [danbev](https://github.com/danbev) - + **Daniel Bevenius** <> (he/him) * [evanlucas](https://github.com/evanlucas) - **Evan Lucas** <> (he/him) +* [fhinkel](https://github.com/fhinkel) - + **Franziska Hinkelmann** <> (she/her) * [Fishrock123](https://github.com/Fishrock123) - **Jeremiah Senkpiel** <> (he/they) +* [gabrielschulhof](https://github.com/gabrielschulhof) - + **Gabriel Schulhof** <> * [gibfahn](https://github.com/gibfahn) - **Gibson Fahnestock** <> (he/him) * [indutny](https://github.com/indutny) - @@ -258,6 +252,8 @@ For information about the governance of the Node.js project, see **Josh Gavant** <> * [mmarchini](https://github.com/mmarchini) - **Mary Marchini** <> (she/her) +* [mscdex](https://github.com/mscdex) - + **Brian White** <> * [nebrius](https://github.com/nebrius) - **Bryan Hughes** <> * [ofrobots](https://github.com/ofrobots) - @@ -268,12 +264,16 @@ For information about the governance of the Node.js project, see **Bert Belder** <> * [RaisinTen](https://github.com/RaisinTen) - **Darshan Sen** <> (he/him) +* [rvagg](https://github.com/rvagg) - + **Rod Vagg** <> * [sam-github](https://github.com/sam-github) - **Sam Roberts** <> * [shigeki](https://github.com/shigeki) - **Shigeki Ohtsu** <> (he/him) * [thefourtheye](https://github.com/thefourtheye) - **Sakthipriyan Vairamani** <> (he/him) +* [TimothyGu](https://github.com/TimothyGu) - + **Tiancheng "Timothy" Gu** <> (he/him) * [trevnorris](https://github.com/trevnorris) - **Trevor Norris** <> @@ -291,12 +291,8 @@ For information about the governance of the Node.js project, see **Antoine du Hamel** <> (he/him) * [anonrig](https://github.com/anonrig) - **Yagiz Nizipli** <> (he/him) -* [antsmartian](https://github.com/antsmartian) - - **Anto Aravinth** <> (he/him) * [apapirovski](https://github.com/apapirovski) - **Anatoli Papirovski** <> (he/him) -* [AshCripps](https://github.com/AshCripps) - - **Ash Cripps** <> * [atlowChemi](https://github.com/atlowChemi) - **Chemi Atlow** <> (he/him) * [Ayase-252](https://github.com/Ayase-252) - @@ -307,8 +303,6 @@ For information about the governance of the Node.js project, see **Benjamin Gruenbaum** <> * [BethGriggs](https://github.com/BethGriggs) - **Beth Griggs** <> (she/her) -* [bmeck](https://github.com/bmeck) - - **Bradley Farias** <> * [bnb](https://github.com/bnb) - **Tierney Cyren** <> (they/them) * [bnoordhuis](https://github.com/bnoordhuis) - @@ -317,8 +311,6 @@ For information about the governance of the Node.js project, see **Ruben Bridgewater** <> (he/him) * [cclauss](https://github.com/cclauss) - **Christian Clauss** <> (he/him) -* [ChALkeR](https://github.com/ChALkeR) - - **Сковорода Никита Андреевич** <> (he/him) * [cjihrig](https://github.com/cjihrig) - **Colin Ihrig** <> (he/him) * [codebytere](https://github.com/codebytere) - @@ -327,26 +319,22 @@ For information about the governance of the Node.js project, see **Kohei Ueno** <> (he/him) * [daeyeon](https://github.com/daeyeon) - **Daeyeon Jeong** <> (he/him) -* [danbev](https://github.com/danbev) - - **Daniel Bevenius** <> (he/him) * [danielleadams](https://github.com/danielleadams) - **Danielle Adams** <> (she/her) * [debadree25](https://github.com/debadree25) - **Debadree Chatterjee** <> (he/him) * [deokjinkim](https://github.com/deokjinkim) - **Deokjin Kim** <> (he/him) -* [devsnek](https://github.com/devsnek) - - **Gus Caplan** <> (they/them) * [edsadr](https://github.com/edsadr) - **Adrian Estrada** <> (he/him) * [erickwendel](https://github.com/erickwendel) - **Erick Wendel** <> (he/him) * [Ethan-Arrowood](https://github.com/Ethan-Arrowood) - **Ethan Arrowood** <> (he/him) -* [fhinkel](https://github.com/fhinkel) - - **Franziska Hinkelmann** <> (she/her) * [F3n67u](https://github.com/F3n67u) - **Feng Yu** <> (he/him) +* [fhinkel](https://github.com/fhinkel) - + **Franziska Hinkelmann** <> (she/her) * [Flarna](https://github.com/Flarna) - **Gerhard Stöbich** <> (he/they) * [gabrielschulhof](https://github.com/gabrielschulhof) - @@ -365,8 +353,6 @@ For information about the governance of the Node.js project, see **Harshitha K P** <> (she/her) * [himself65](https://github.com/himself65) - **Zeyu "Alex" Yang** <> (he/him) -* [iansu](https://github.com/iansu) - - **Ian Sutherland** <> * [JakobJingleheimer](https://github.com/JakobJingleheimer) - **Jacob Smith** <> (he/him) * [jasnell](https://github.com/jasnell) - @@ -419,8 +405,6 @@ For information about the governance of the Node.js project, see **Moshe Atlow** <> (he/him) * [MrJithil](https://github.com/MrJithil) - **Jithil P Ponnan** <> (he/him) -* [mscdex](https://github.com/mscdex) - - **Brian White** <> * [MylesBorins](https://github.com/MylesBorins) - **Myles Borins** <> (he/him) * [ovflowd](https://github.com/ovflowd) - @@ -431,22 +415,16 @@ For information about the governance of the Node.js project, see **Stephen Belanger** <> (he/him) * [RafaelGSS](https://github.com/RafaelGSS) - **Rafael Gonzaga** <> (he/him) -* [rluvaton](https://github.com/rluvaton) - - **Raz Luvaton** <> (he/him) * [richardlau](https://github.com/richardlau) - **Richard Lau** <> -* [rickyes](https://github.com/rickyes) - - **Ricky Zhou** <<0x19951125@gmail.com>> (he/him) +* [rluvaton](https://github.com/rluvaton) - + **Raz Luvaton** <> (he/him) * [ronag](https://github.com/ronag) - **Robert Nagy** <> * [ruyadorno](https://github.com/ruyadorno) - - **Ruy Adorno** <> (he/him) -* [ryzokuken](https://github.com/ryzokuken) - - **Ujjwal Sharma** <> (he/him) + **Ruy Adorno** <> (he/him) * [santigimeno](https://github.com/santigimeno) - **Santiago Gimeno** <> -* [shisama](https://github.com/shisama) - - **Masashi Hirano** <> (he/him) * [ShogunPanda](https://github.com/ShogunPanda) - **Paolo Insogna** <> (he/him) * [srl295](https://github.com/srl295) - @@ -457,16 +435,14 @@ For information about the governance of the Node.js project, see **Michaël Zasso** <> (he/him) * [theanarkh](https://github.com/theanarkh) - **theanarkh** <> (he/him) -* [TimothyGu](https://github.com/TimothyGu) - - **Tiancheng "Timothy" Gu** <> (he/him) * [tniessen](https://github.com/tniessen) - **Tobias Nießen** <> (he/him) * [trivikr](https://github.com/trivikr) - **Trivikram Kamat** <> * [Trott](https://github.com/Trott) - **Rich Trott** <> (he/him) -* [vdeturckheim](https://github.com/vdeturckheim) - - **Vladimir de Turckheim** <> (he/him) +* [UlisesGascon](https://github.com/ulisesgascon) - + **Ulises Gascón** <> (he/him) * [vmoroz](https://github.com/vmoroz) - **Vladimir Morozov** <> (he/him) * [VoltrexKeyva](https://github.com/VoltrexKeyva) - @@ -477,10 +453,10 @@ For information about the governance of the Node.js project, see **Khaidi Chu** <> (he/him) * [yashLadha](https://github.com/yashLadha) - **Yash Ladha** <> (he/him) +* [zcbenz](https://github.com/zcbenz) - + **Cheng Zhao** <> (he/him) * [ZYSzys](https://github.com/ZYSzys) - **Yongsheng Zhang** <> (he/him) -* [zcbenz](https://github.com/zcbenz) - - **Cheng Zhao** (he/him)
@@ -495,14 +471,20 @@ For information about the governance of the Node.js project, see **Aleksei Koziatinskii** <> * [andrasq](https://github.com/andrasq) - **Andras** <> -* [AnnaMag](https://github.com/AnnaMag) - - **Anna M. Kedzierska** <> * [AndreasMadsen](https://github.com/AndreasMadsen) - **Andreas Madsen** <> (he/him) +* [AnnaMag](https://github.com/AnnaMag) - + **Anna M. Kedzierska** <> +* [antsmartian](https://github.com/antsmartian) - + **Anto Aravinth** <> (he/him) * [aqrln](https://github.com/aqrln) - **Alexey Orlenko** <> (he/him) +* [AshCripps](https://github.com/AshCripps) - + **Ash Cripps** <> * [bcoe](https://github.com/bcoe) - **Ben Coe** <> (he/him) +* [bmeck](https://github.com/bmeck) - + **Bradley Farias** <> * [bmeurer](https://github.com/bmeurer) - **Benedikt Meurer** <> * [boneskull](https://github.com/boneskull) - @@ -513,16 +495,22 @@ For information about the governance of the Node.js project, see **Bartosz Sosnowski** <> * [calvinmetcalf](https://github.com/calvinmetcalf) - **Calvin Metcalf** <> +* [ChALkeR](https://github.com/ChALkeR) - + **Сковорода Никита Андреевич** <> (he/him) * [chrisdickinson](https://github.com/chrisdickinson) - **Chris Dickinson** <> * [claudiorodriguez](https://github.com/claudiorodriguez) - **Claudio Rodriguez** <> +* [danbev](https://github.com/danbev) - + **Daniel Bevenius** <> (he/him) * [DavidCai1993](https://github.com/DavidCai1993) - **David Cai** <> (he/him) * [davisjam](https://github.com/davisjam) - **Jamie Davis** <> (he/him) * [devnexen](https://github.com/devnexen) - **David Carlier** <> +* [devsnek](https://github.com/devsnek) - + **Gus Caplan** <> (they/them) * [digitalinfinity](https://github.com/digitalinfinity) - **Hitesh Kanwathirtha** <> (he/him) * [dmabupt](https://github.com/dmabupt) - @@ -553,6 +541,8 @@ For information about the governance of the Node.js project, see **Yang Guo** <> (he/him) * [hiroppy](https://github.com/hiroppy) - **Yuta Hiroto** <> (he/him) +* [iansu](https://github.com/iansu) - + **Ian Sutherland** <> * [iarna](https://github.com/iarna) - **Rebecca Turner** <> * [imran-iq](https://github.com/imran-iq) - @@ -615,6 +605,8 @@ For information about the governance of the Node.js project, see **Christopher Monsanto** <> * [MoonBall](https://github.com/MoonBall) - **Chen Gang** <> +* [mscdex](https://github.com/mscdex) - + **Brian White** <> * [not-an-aardvark](https://github.com/not-an-aardvark) - **Teddy Katz** <> (he/him) * [ofrobots](https://github.com/ofrobots) - @@ -649,6 +641,8 @@ For information about the governance of the Node.js project, see **Refael Ackermann (רפאל פלחי)** <> (he/him/הוא/אתה) * [rexagod](https://github.com/rexagod) - **Pranshu Srivastava** <> (he/him) +* [rickyes](https://github.com/rickyes) - + **Ricky Zhou** <<0x19951125@gmail.com>> (he/him) * [rlidwka](https://github.com/rlidwka) - **Alex Kocharin** <> * [rmg](https://github.com/rmg) - @@ -665,6 +659,8 @@ For information about the governance of the Node.js project, see **Sam Ruby** <> * [rvagg](https://github.com/rvagg) - **Rod Vagg** <> +* [ryzokuken](https://github.com/ryzokuken) - + **Ujjwal Sharma** <> (he/him) * [saghul](https://github.com/saghul) - **Saúl Ibarra Corretgé** <> * [sam-github](https://github.com/sam-github) - @@ -675,6 +671,8 @@ For information about the governance of the Node.js project, see **Nikolai Vavilov** <> * [shigeki](https://github.com/shigeki) - **Shigeki Ohtsu** <> (he/him) +* [shisama](https://github.com/shisama) - + **Masashi Hirano** <> (he/him) * [silverwind](https://github.com/silverwind) - **Roman Reiss** <> * [starkwang](https://github.com/starkwang) - @@ -687,10 +685,14 @@ For information about the governance of the Node.js project, see **Sakthipriyan Vairamani** <> (he/him) * [thlorenz](https://github.com/thlorenz) - **Thorsten Lorenz** <> +* [TimothyGu](https://github.com/TimothyGu) - + **Tiancheng "Timothy" Gu** <> (he/him) * [trevnorris](https://github.com/trevnorris) - **Trevor Norris** <> * [tunniclm](https://github.com/tunniclm) - **Mike Tunnicliffe** <> +* [vdeturckheim](https://github.com/vdeturckheim) - + **Vladimir de Turckheim** <> (he/him) * [vkurchatkin](https://github.com/vkurchatkin) - **Vladimir Kurchatkin** <> * [vsemozhetbyt](https://github.com/vsemozhetbyt) - @@ -739,10 +741,12 @@ maintaining the Node.js project. **Mert Can Altin** <> * [Mesteery](https://github.com/Mesteery) - **Mestery** <> (he/him) -* [preveen-stack](https://github.com/preveen-stack) - - **Preveen Padmanabhan** <> (he/him) * [PoojaDurgad](https://github.com/PoojaDurgad) - **Pooja Durgad** <> +* [preveen-stack](https://github.com/preveen-stack) - + **Preveen Padmanabhan** <> (he/him) +* [RedYetiDev](https://github.com/redyetidev) - + **Aviv Keller** <> (they/them) * [VoltrexKeyva](https://github.com/VoltrexKeyva) - **Mohammed Keyvanzadeh** <> (he/him) @@ -761,6 +765,8 @@ Primary GPG keys for Node.js Releasers (some Releasers sign with subkeys): `74F12602B6F1C4E913FAA37AD3A89613643B6201` * **Juan José Arboleda** <> `DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7` +* **Marco Ippolito** <> + `CC68F5A3106FF448322E48ED27F5E38D5B0A215F` * **Michaël Zasso** <> `8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600` * **Myles Borins** <> @@ -782,6 +788,7 @@ gpg --keyserver hkps://keys.openpgp.org --recv-keys 4ED778F539E3634C779C87C6D706 gpg --keyserver hkps://keys.openpgp.org --recv-keys 141F07595B7B3FFE74309A937405533BE57C7D57 gpg --keyserver hkps://keys.openpgp.org --recv-keys 74F12602B6F1C4E913FAA37AD3A89613643B6201 gpg --keyserver hkps://keys.openpgp.org --recv-keys DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 +gpg --keyserver hkps://keys.openpgp.org --recv-keys CC68F5A3106FF448322E48ED27F5E38D5B0A215F gpg --keyserver hkps://keys.openpgp.org --recv-keys 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 gpg --keyserver hkps://keys.openpgp.org --recv-keys C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 gpg --keyserver hkps://keys.openpgp.org --recv-keys 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 @@ -843,12 +850,11 @@ releases on a rotation basis as outlined in the * Datadog * [bengl](https://github.com/bengl) - **Bryan English** <> (he/him) -* NearForm - * [RafaelGSS](https://github.com/RafaelGSS) - - **Rafael Gonzaga** <> (he/him) * NodeSource * [juanarbol](https://github.com/juanarbol) - **Juan José Arboleda** <> (he/him) + * [RafaelGSS](https://github.com/RafaelGSS) - + **Rafael Gonzaga** <> (he/him) * Platformatic * [mcollina](https://github.com/mcollina) - **Matteo Collina** <> (he/him) diff --git a/benchmark/_cli.js b/benchmark/_cli.js index eb6c4add9799a4..33ba2e0963f2fe 100644 --- a/benchmark/_cli.js +++ b/benchmark/_cli.js @@ -125,3 +125,24 @@ CLI.prototype.shouldSkip = function(scripts) { return skip; }; + +/** + * Extracts the CPU core setting from the CLI arguments. + * @returns {string|null} The CPU core setting if found, otherwise null. + */ +CLI.prototype.getCpuCoreSetting = function() { + const cpuCoreSetting = this.optional.set.find((s) => s.startsWith('CPUSET=')); + if (!cpuCoreSetting) return null; + + const value = cpuCoreSetting.split('=')[1]; + // Validate the CPUSET value to match patterns like "0", "0-2", "0,1,2", "0,2-4,6" or "0,0,1-2" + const isValid = /^(\d+(-\d+)?)(,\d+(-\d+)?)*$/.test(value); + if (!isValid) { + throw new Error(` + Invalid CPUSET format: "${value}". Please use a single core number (e.g., "0"), + a range of cores (e.g., "0-3"), or a list of cores/ranges + (e.g., "0,2,4" or "0-2,4").\n\n${this.usage} + `); + } + return value; +}; diff --git a/benchmark/abort_controller/abort-signal-static-abort.js b/benchmark/abort_controller/abort-signal-static-abort.js new file mode 100644 index 00000000000000..2b1c884a260780 --- /dev/null +++ b/benchmark/abort_controller/abort-signal-static-abort.js @@ -0,0 +1,29 @@ +'use strict'; +const common = require('../common.js'); + +const bench = common.createBenchmark(main, { + n: [5e6], + kind: ['default-reason', 'same-reason'], +}); + +function main({ n, kind }) { + switch (kind) { + case 'default-reason': + bench.start(); + for (let i = 0; i < n; ++i) + AbortSignal.abort(); + bench.end(n); + break; + case 'same-reason': { + const reason = new Error('same reason'); + + bench.start(); + for (let i = 0; i < n; ++i) + AbortSignal.abort(reason); + bench.end(n); + break; + } + default: + throw new Error('Invalid kind'); + } +} diff --git a/benchmark/blob/blob.js b/benchmark/blob/blob.js index 4a79a87d27deba..83e58007dd58e9 100644 --- a/benchmark/blob/blob.js +++ b/benchmark/blob/blob.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const { Blob } = require('buffer'); const bench = common.createBenchmark(main, { - bytes: [128, 1024, 1024 ** 2], + bytes: [128, 1024, 8192], n: [1e3], operation: ['text', 'arrayBuffer'], }); diff --git a/benchmark/buffers/buffer-atob.js b/benchmark/buffers/buffer-atob.js new file mode 100644 index 00000000000000..2cc20759e3f0f6 --- /dev/null +++ b/benchmark/buffers/buffer-atob.js @@ -0,0 +1,20 @@ +'use strict'; +const common = require('../common.js'); +const assert = require('node:assert'); + +const bench = common.createBenchmark(main, { + size: [16, 32, 64, 128], + n: [1e6], +}); + +function main({ n, size }) { + const input = btoa('A'.repeat(size)); + let out = 0; + + bench.start(); + for (let i = 0; i < n; i++) { + out += atob(input).length; + } + bench.end(n); + assert(out > 0); +} diff --git a/benchmark/buffers/buffer-btoa.js b/benchmark/buffers/buffer-btoa.js new file mode 100644 index 00000000000000..3867d5890b1d79 --- /dev/null +++ b/benchmark/buffers/buffer-btoa.js @@ -0,0 +1,20 @@ +'use strict'; +const common = require('../common.js'); +const assert = require('node:assert'); + +const bench = common.createBenchmark(main, { + size: [16, 32, 64, 128, 256, 1024], + n: [1e6], +}); + +function main({ n, size }) { + const input = 'A'.repeat(size); + let out = 0; + + bench.start(); + for (let i = 0; i < n; i++) { + out += btoa(input).length; + } + bench.end(n); + assert(out > 0); +} diff --git a/benchmark/compare.js b/benchmark/compare.js index 503901f607ef02..ad3084db390414 100644 --- a/benchmark/compare.js +++ b/benchmark/compare.js @@ -1,6 +1,6 @@ 'use strict'; -const { fork } = require('child_process'); +const { spawn, fork } = require('node:child_process'); const { inspect } = require('util'); const path = require('path'); const CLI = require('./_cli.js'); @@ -24,6 +24,12 @@ const cli = new CLI(`usage: ./node compare.js [options] [--] ... repeated) --set variable=value set benchmark variable (can be repeated) --no-progress don't show benchmark progress indicator + + Examples: + --set CPUSET=0 Runs benchmarks on CPU core 0. + --set CPUSET=0-2 Specifies that benchmarks should run on CPU cores 0 to 2. + + Note: The CPUSET format should match the specifications of the 'taskset' command `, { arrayArgs: ['set', 'filter', 'exclude'], boolArgs: ['no-progress'] }); if (!cli.optional.new || !cli.optional.old) { @@ -69,10 +75,21 @@ if (showProgress) { (function recursive(i) { const job = queue[i]; - - const child = fork(path.resolve(__dirname, job.filename), cli.optional.set, { - execPath: cli.optional[job.binary], - }); + const resolvedPath = path.resolve(__dirname, job.filename); + + const cpuCore = cli.getCpuCoreSetting(); + let child; + if (cpuCore !== null) { + const spawnArgs = ['-c', cpuCore, cli.optional[job.binary], resolvedPath, ...cli.optional.set]; + child = spawn('taskset', spawnArgs, { + env: process.env, + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], + }); + } else { + child = fork(resolvedPath, cli.optional.set, { + execPath: cli.optional[job.binary], + }); + } child.on('message', (data) => { if (data.type === 'report') { diff --git a/benchmark/crypto/timingSafeEqual.js b/benchmark/crypto/timingSafeEqual.js new file mode 100644 index 00000000000000..475807dba4ea4e --- /dev/null +++ b/benchmark/crypto/timingSafeEqual.js @@ -0,0 +1,22 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('node:assert'); +const { randomBytes, timingSafeEqual } = require('node:crypto'); + +const bench = common.createBenchmark(main, { + n: [1e5], + bufferSize: [10, 100, 200, 2_100, 22_023], +}); + +function main({ n, bufferSize }) { + const bufs = [randomBytes(bufferSize), randomBytes(bufferSize)]; + bench.start(); + let count = 0; + for (let i = 0; i < n; i++) { + const ret = timingSafeEqual(bufs[i % 2], bufs[1]); + if (ret) count++; + } + bench.end(n); + assert.strictEqual(count, Math.floor(n / 2)); +} diff --git a/benchmark/path/toNamespacedPath-posix.js b/benchmark/path/toNamespacedPath-posix.js new file mode 100644 index 00000000000000..dbef737dc8ee84 --- /dev/null +++ b/benchmark/path/toNamespacedPath-posix.js @@ -0,0 +1,26 @@ +'use strict'; +const common = require('../common.js'); +const { posix } = require('path'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + path: [ + '', + '.', + '/tmp/bar', + '/home/node/..', + posix.join(__dirname, '/..'), + 'bar/baz', + ], + n: [1e5], +}); + +function main({ n, path }) { + bench.start(); + let a; + for (let i = 0; i < n; i++) { + a = posix.toNamespacedPath(path); + } + bench.end(n); + assert.ok(a + 'a'); +} diff --git a/benchmark/path/toNamespacedPath-win32.js b/benchmark/path/toNamespacedPath-win32.js new file mode 100644 index 00000000000000..7cb38bf63aebf0 --- /dev/null +++ b/benchmark/path/toNamespacedPath-win32.js @@ -0,0 +1,28 @@ +'use strict'; +const common = require('../common.js'); +const { win32 } = require('path'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + path: [ + '', + 'c:/ignore', + 'd:\\a/b\\c/d', + '\\e.exe', + 'c:/blah\\blah', + 'd:/games', + 'c:../a', + win32.join(__dirname, '/..'), + ], + n: [1e5], +}); + +function main({ n, path }) { + bench.start(); + let a; + for (let i = 0; i < n; i++) { + a = win32.toNamespacedPath(path); + } + bench.end(n); + assert.ok(a + 'a'); +} diff --git a/benchmark/perf_hooks/histogram-clone.js b/benchmark/perf_hooks/histogram-clone.js new file mode 100644 index 00000000000000..4b610963fa2a0a --- /dev/null +++ b/benchmark/perf_hooks/histogram-clone.js @@ -0,0 +1,24 @@ +'use strict'; + +const assert = require('assert'); +const common = require('../common.js'); + +const { createHistogram } = require('perf_hooks'); + +const bench = common.createBenchmark(main, { + n: [1e5], +}); + +let _histogram; + +function main({ n }) { + const histogram = createHistogram(); + + bench.start(); + for (let i = 0; i < n; i++) + _histogram = structuredClone(histogram); + bench.end(n); + + // Avoid V8 deadcode (elimination) + assert.ok(_histogram); +} diff --git a/benchmark/perf_hooks/histogram-create.js b/benchmark/perf_hooks/histogram-create.js new file mode 100644 index 00000000000000..89ddad1fa79224 --- /dev/null +++ b/benchmark/perf_hooks/histogram-create.js @@ -0,0 +1,22 @@ +'use strict'; + +const assert = require('assert'); +const common = require('../common.js'); + +const { createHistogram } = require('perf_hooks'); + +const bench = common.createBenchmark(main, { + n: [1e5], +}); + +let _histogram; + +function main({ n }) { + bench.start(); + for (let i = 0; i < n; i++) + _histogram = createHistogram(); + bench.end(n); + + // Avoid V8 deadcode (elimination) + assert.ok(_histogram); +} diff --git a/benchmark/run.js b/benchmark/run.js index 0b63fb930bb000..6a61df71221710 100644 --- a/benchmark/run.js +++ b/benchmark/run.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); -const fork = require('child_process').fork; +const { spawn, fork } = require('node:child_process'); const CLI = require('./_cli.js'); const cli = new CLI(`usage: ./node run.js [options] [--] ... @@ -17,7 +17,14 @@ const cli = new CLI(`usage: ./node run.js [options] [--] ... test only run a single configuration from the options matrix all each benchmark category is run one after the other + + Examples: + --set CPUSET=0 Runs benchmarks on CPU core 0. + --set CPUSET=0-2 Specifies that benchmarks should run on CPU cores 0 to 2. + + Note: The CPUSET format should match the specifications of the 'taskset' command on your system. `, { arrayArgs: ['set', 'filter', 'exclude'] }); + const benchmarks = cli.benchmarks(); if (benchmarks.length === 0) { @@ -40,10 +47,21 @@ if (format === 'csv') { (function recursive(i) { const filename = benchmarks[i]; - const child = fork( - path.resolve(__dirname, filename), - cli.test ? ['--test'] : cli.optional.set, - ); + const scriptPath = path.resolve(__dirname, filename); + + const args = cli.test ? ['--test'] : cli.optional.set; + const cpuCore = cli.getCpuCoreSetting(); + let child; + if (cpuCore !== null) { + child = spawn('taskset', ['-c', cpuCore, 'node', scriptPath, ...args], { + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], + }); + } else { + child = fork( + scriptPath, + args, + ); + } if (format !== 'csv') { console.log(); diff --git a/benchmark/streams/readable-uint8array.js b/benchmark/streams/readable-uint8array.js new file mode 100644 index 00000000000000..372b415f87be20 --- /dev/null +++ b/benchmark/streams/readable-uint8array.js @@ -0,0 +1,36 @@ +'use strict'; +const common = require('../common.js'); +const { Readable } = require('stream'); + +const bench = common.createBenchmark(main, { + n: [1e6], + kind: ['read', 'encoding'], +}); +const ABC = new Uint8Array([0x41, 0x42, 0x43]); + +function main({ n, kind }) { + switch (kind) { + case 'read': { + bench.start(); + const readable = new Readable({ + read() {}, + }); + for (let i = 0; i < n; ++i) readable.push(ABC); + bench.end(n); + break; + } + + case 'encoding': { + bench.start(); + const readable = new Readable({ + read() {}, + }); + readable.setEncoding('utf8'); + for (let i = 0; i < n; ++i) readable.push(ABC); + bench.end(n); + break; + } + default: + throw new Error('Invalid kind'); + } +} diff --git a/benchmark/streams/writable-uint8array.js b/benchmark/streams/writable-uint8array.js new file mode 100644 index 00000000000000..9e243384738711 --- /dev/null +++ b/benchmark/streams/writable-uint8array.js @@ -0,0 +1,51 @@ +'use strict'; +const common = require('../common.js'); +const { Writable } = require('stream'); + +const bench = common.createBenchmark(main, { + n: [50e6], + kind: ['write', 'object-mode', 'writev'], +}); +const ABC = new Uint8Array([0x41, 0x42, 0x43]); + +function main({ n, kind }) { + switch (kind) { + case 'write': { + bench.start(); + const wr = new Writable({ + write(chunk, encoding, cb) { + cb(); + }, + }); + for (let i = 0; i < n; ++i) wr.write(ABC); + bench.end(n); + break; + } + + case 'object-mode': { + bench.start(); + const wr = new Writable({ + objectMode: true, + write(chunk, encoding, cb) { + cb(); + }, + }); + for (let i = 0; i < n; ++i) wr.write(ABC); + bench.end(n); + break; + } + case 'writev': { + bench.start(); + const wr = new Writable({ + writev(chunks, cb) { + cb(); + }, + }); + for (let i = 0; i < n; ++i) wr.write(ABC); + bench.end(n); + break; + } + default: + throw new Error('Invalid kind'); + } +} diff --git a/benchmark/util/style-text.js b/benchmark/util/style-text.js new file mode 100644 index 00000000000000..195907bba5c628 --- /dev/null +++ b/benchmark/util/style-text.js @@ -0,0 +1,39 @@ +'use strict'; + +const common = require('../common.js'); + +const { styleText } = require('node:util'); + +const bench = common.createBenchmark(main, { + messageType: ['string', 'number', 'boolean', 'invalid'], + format: ['red', 'italic', 'invalid'], + n: [1e3], +}); + +function main({ messageType, format, n }) { + let str; + switch (messageType) { + case 'string': + str = 'hello world'; + break; + case 'number': + str = 10; + break; + case 'boolean': + str = true; + break; + case 'invalid': + str = undefined; + break; + } + + bench.start(); + for (let i = 0; i < n; i++) { + try { + styleText(format, str); + } catch { + // eslint-disable no-empty + } + } + bench.end(n); +} diff --git a/common.gypi b/common.gypi index efcd8da848150d..c49e2494659bf2 100644 --- a/common.gypi +++ b/common.gypi @@ -2,6 +2,7 @@ 'variables': { 'configuring_node%': 0, 'asan%': 0, + 'ubsan%': 0, 'werror': '', # Turn off -Werror in V8 build. 'visibility%': 'hidden', # V8's visibility setting 'target_arch%': 'ia32', # set v8's target architecture @@ -36,7 +37,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.19', + 'v8_embedder_string': '-node.20', ##### V8 defaults for Node.js ##### @@ -374,6 +375,29 @@ }], ], }], + ['ubsan == 1 and OS != "mac" and OS != "zos"', { + 'cflags+': [ + '-fno-omit-frame-pointer', + '-fsanitize=undefined', + ], + 'defines': [ 'UNDEFINED_SANITIZER'], + 'cflags!': [ '-fno-omit-frame-pointer' ], + 'ldflags': [ '-fsanitize=undefined' ], + }], + ['ubsan == 1 and OS == "mac"', { + 'xcode_settings': { + 'OTHER_CFLAGS+': [ + '-fno-omit-frame-pointer', + '-fsanitize=undefined', + '-DUNDEFINED_SANITIZER' + ], + }, + 'target_conditions': [ + ['_type!="static_library"', { + 'xcode_settings': {'OTHER_LDFLAGS': ['-fsanitize=undefined']}, + }], + ], + }], # The defines bellow must include all things from the external_v8_defines # list in v8/BUILD.gn. ['v8_enable_v8_checks == 1', { diff --git a/configure.py b/configure.py index 00c8513d6820ec..11c0df455451d4 100755 --- a/configure.py +++ b/configure.py @@ -724,6 +724,12 @@ default=None, help='compile for Address Sanitizer to find memory bugs') +parser.add_argument('--enable-ubsan', + action='store_true', + dest='enable_ubsan', + default=None, + help='compile for Undefined Behavior Sanitizer') + parser.add_argument('--enable-static', action='store_true', dest='enable_static', @@ -1280,9 +1286,7 @@ def configure_node(o): o['variables']['want_separate_host_toolset'] = int(cross_compiling) - # Enable branch protection for arm64 if target_arch == 'arm64': - o['cflags']+=['-msign-return-address=all'] o['variables']['arm_fpu'] = options.arm_fpu or 'neon' if options.node_snapshot_main is not None: @@ -1439,6 +1443,7 @@ def configure_node(o): o['variables']['linked_module_files'] = options.linked_module o['variables']['asan'] = int(options.enable_asan or 0) + o['variables']['ubsan'] = int(options.enable_ubsan or 0) if options.coverage: o['variables']['coverage'] = 'true' diff --git a/deps/ada/ada.cpp b/deps/ada/ada.cpp index 9641cce39cda12..bff36abb835760 100644 --- a/deps/ada/ada.cpp +++ b/deps/ada/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2024-01-29 13:13:24 -0500. Do not edit! */ +/* auto-generated on 2024-04-11 16:39:11 -0400. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -11585,7 +11585,7 @@ ada_really_inline bool url::parse_scheme(const std::string_view input) { } } } else { // slow path - std::string _buffer = std::string(input); + std::string _buffer(input); // Next function is only valid if the input is ASCII and returns false // otherwise, but it seems that we always have ascii content so we do not // need to check the return value. @@ -13227,7 +13227,7 @@ template } } } else { // slow path - std::string _buffer = std::string(input); + std::string _buffer(input); // Next function is only valid if the input is ASCII and returns false // otherwise, but it seems that we always have ascii content so we do not // need to check the return value. @@ -13683,7 +13683,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { return false; } - std::string previous_host = std::string(get_hostname()); + std::string previous_host(get_hostname()); uint32_t previous_port = components.port; size_t host_end_pos = input.find('#'); @@ -14983,7 +14983,7 @@ bool ada_can_parse(const char* input, size_t length) noexcept { bool ada_can_parse_with_base(const char* input, size_t input_length, const char* base, size_t base_length) noexcept { - auto base_view = std::string_view(base, base_length); + std::string_view base_view(base, base_length); return ada::can_parse(std::string_view(input, input_length), &base_view); } @@ -15388,14 +15388,18 @@ ada_owned_string ada_search_params_to_string(ada_url_search_params result) { size_t ada_search_params_size(ada_url_search_params result) { ada::result& r = *(ada::result*)result; - if (!r) return 0; + if (!r) { + return 0; + } return r->size(); } void ada_search_params_sort(ada_url_search_params result) { ada::result& r = *(ada::result*)result; - if (r) r->sort(); + if (r) { + r->sort(); + } } void ada_search_params_append(ada_url_search_params result, const char* key, @@ -15444,7 +15448,9 @@ bool ada_search_params_has(ada_url_search_params result, const char* key, size_t key_length) { ada::result& r = *(ada::result*)result; - if (!r) return false; + if (!r) { + return false; + } return r->has(std::string_view(key, key_length)); } @@ -15453,7 +15459,9 @@ bool ada_search_params_has_value(ada_url_search_params result, const char* key, size_t value_length) { ada::result& r = *(ada::result*)result; - if (!r) return false; + if (!r) { + return false; + } return r->has(std::string_view(key, key_length), std::string_view(value, value_length)); } @@ -15462,9 +15470,13 @@ ada_string ada_search_params_get(ada_url_search_params result, const char* key, size_t key_length) { ada::result& r = *(ada::result*)result; - if (!r) return ada_string_create(NULL, 0); + if (!r) { + return ada_string_create(NULL, 0); + } auto found = r->get(std::string_view(key, key_length)); - if (!found.has_value()) return ada_string_create(NULL, 0); + if (!found.has_value()) { + return ada_string_create(NULL, 0); + } return ada_string_create(found->data(), found->length()); } @@ -15522,14 +15534,18 @@ void ada_free_strings(ada_strings result) { size_t ada_strings_size(ada_strings result) { ada::result>* r = (ada::result>*)result; - if (!r) return 0; + if (!r) { + return 0; + } return (*r)->size(); } ada_string ada_strings_get(ada_strings result, size_t index) { ada::result>* r = (ada::result>*)result; - if (!r) return ada_string_create(NULL, 0); + if (!r) { + return ada_string_create(NULL, 0); + } std::string_view view = (*r)->at(index); return ada_string_create(view.data(), view.length()); } @@ -15544,9 +15560,13 @@ ada_string ada_search_params_keys_iter_next( ada_url_search_params_keys_iter result) { ada::result* r = (ada::result*)result; - if (!r) return ada_string_create(NULL, 0); + if (!r) { + return ada_string_create(NULL, 0); + } auto next = (*r)->next(); - if (!next.has_value()) return ada_string_create(NULL, 0); + if (!next.has_value()) { + return ada_string_create(NULL, 0); + } return ada_string_create(next->data(), next->length()); } @@ -15554,7 +15574,9 @@ bool ada_search_params_keys_iter_has_next( ada_url_search_params_keys_iter result) { ada::result* r = (ada::result*)result; - if (!r) return false; + if (!r) { + return false; + } return (*r)->has_next(); } @@ -15569,9 +15591,13 @@ ada_string ada_search_params_values_iter_next( ada_url_search_params_values_iter result) { ada::result* r = (ada::result*)result; - if (!r) return ada_string_create(NULL, 0); + if (!r) { + return ada_string_create(NULL, 0); + } auto next = (*r)->next(); - if (!next.has_value()) return ada_string_create(NULL, 0); + if (!next.has_value()) { + return ada_string_create(NULL, 0); + } return ada_string_create(next->data(), next->length()); } @@ -15579,7 +15605,9 @@ bool ada_search_params_values_iter_has_next( ada_url_search_params_values_iter result) { ada::result* r = (ada::result*)result; - if (!r) return false; + if (!r) { + return false; + } return (*r)->has_next(); } @@ -15596,8 +15624,9 @@ ada_string_pair ada_search_params_entries_iter_next( (ada::result*)result; if (!r) return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)}; auto next = (*r)->next(); - if (!next.has_value()) + if (!next.has_value()) { return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)}; + } return ada_string_pair{ ada_string_create(next->first.data(), next->first.length()), ada_string_create(next->second.data(), next->second.length())}; @@ -15607,7 +15636,9 @@ bool ada_search_params_entries_iter_has_next( ada_url_search_params_entries_iter result) { ada::result* r = (ada::result*)result; - if (!r) return false; + if (!r) { + return false; + } return (*r)->has_next(); } diff --git a/deps/ada/ada.h b/deps/ada/ada.h index 03a22534d3f87c..b9e000b841d1ed 100644 --- a/deps/ada/ada.h +++ b/deps/ada/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2024-01-29 13:13:24 -0500. Do not edit! */ +/* auto-generated on 2024-04-11 16:39:11 -0400. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -461,9 +461,11 @@ namespace ada { #ifdef ADA_VISUAL_STUDIO #define ADA_ASSUME(COND) __assume(COND) #else -#define ADA_ASSUME(COND) \ - do { \ - if (!(COND)) __builtin_unreachable(); \ +#define ADA_ASSUME(COND) \ + do { \ + if (!(COND)) { \ + __builtin_unreachable(); \ + } \ } while (0) #endif @@ -482,6 +484,9 @@ namespace ada { #include /** + * These functions are not part of our public API and may + * change at any time. + * @private * @namespace ada::character_sets * @brief Includes the definitions for unicode character sets. */ @@ -492,6 +497,11 @@ ada_really_inline bool bit_at(const uint8_t a[], uint8_t i); #endif // ADA_CHARACTER_SETS_H /* end file include/ada/character_sets.h */ +/** + * These functions are not part of our public API and may + * change at any time. + * @private + */ namespace ada::character_sets { constexpr char hex[1024] = @@ -936,19 +946,19 @@ constexpr uint8_t WWW_FORM_URLENCODED_PERCENT_ENCODE[32] = { // 20 21 22 23 24 25 26 27 0x00 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, // 28 29 2A 2B 2C 2D 2E 2F - 0x01 | 0x02 | 0x00 | 0x08 | 0x10 | 0x00 | 0x00 | 0x00, + 0x01 | 0x02 | 0x00 | 0x08 | 0x10 | 0x00 | 0x00 | 0x80, // 30 31 32 33 34 35 36 37 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 38 39 3A 3B 3C 3D 3E 3F - 0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x80, + 0x00 | 0x00 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, // 40 41 42 43 44 45 46 47 - 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 48 49 4A 4B 4C 4D 4E 4F 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 50 51 52 53 54 55 56 57 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 58 59 5A 5B 5C 5D 5E 5F - 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + 0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x40 | 0x00, // 60 61 62 63 64 65 66 67 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 68 69 6A 6B 6C 6D 6E 6F @@ -956,7 +966,7 @@ constexpr uint8_t WWW_FORM_URLENCODED_PERCENT_ENCODE[32] = { // 70 71 72 73 74 75 76 77 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 78 79 7A 7B 7C 7D 7E 7F - 0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x40 | 0x80, + 0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, // 80 81 82 83 84 85 86 87 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, // 88 89 8A 8B 8C 8D 8E 8F @@ -1064,7 +1074,7 @@ ada_really_inline bool begins_with(std::string_view view, } // namespace ada::checkers -#endif // ADA_CHECKERS_H +#endif // ADA_CHECKERS_INL_H /* end file include/ada/checkers-inl.h */ /* begin file include/ada/log.h */ /** @@ -1540,6 +1550,9 @@ struct url_base { #include /** + * These functions are not part of our public API and may + * change at any time. + * * @private * @namespace ada::helpers * @brief Includes the definitions for helper functions @@ -1702,6 +1715,7 @@ inline void inner_concat(std::string& buffer, T t, Args... args) { } /** + * @private * Concatenate the arguments and return a string. * @returns a string */ @@ -1713,6 +1727,7 @@ std::string concat(Args... args) { } /** + * @private * @return Number of leading zeroes. */ inline int leading_zeroes(uint32_t input_num) noexcept { @@ -1726,6 +1741,7 @@ inline int leading_zeroes(uint32_t input_num) noexcept { } /** + * @private * Counts the number of decimal digits necessary to represent x. * faster than std::to_string(x).size(). * @return digit count @@ -4335,6 +4351,30 @@ constexpr std::string_view is_special_list[] = {"http", " ", "https", "ws", constexpr uint16_t special_ports[] = {80, 0, 443, 80, 21, 443, 0, 0}; } // namespace details +/**** + * @private + * In is_special, get_scheme_type, and get_special_port, we + * use a standard hashing technique to find the index of the scheme in + * the is_special_list. The hashing technique is based on the size of + * the scheme and the first character of the scheme. It ensures that we + * do at most one string comparison per call. If the protocol is + * predictible (e.g., it is always "http"), we can get a better average + * performance by using a simpler approach where we loop and compare + * scheme with all possible protocols starting with the most likely + * protocol. Doing multiple comparisons may have a poor worst case + * performance, however. In this instance, we choose a potentially + * slightly lower best-case performance for a better worst-case + * performance. We can revisit this choice at any time. + * + * Reference: + * Schmidt, Douglas C. "Gperf: A perfect hash function generator." + * More C++ gems 17 (2000). + * + * Reference: https://en.wikipedia.org/wiki/Perfect_hash_function + * + * Reference: https://github.com/ada-url/ada/issues/617 + ****/ + ada_really_inline constexpr bool is_special(std::string_view scheme) { if (scheme.empty()) { return false; @@ -4434,12 +4474,17 @@ std::string ipv4(uint64_t address) noexcept; #include /** + * Unicode operations. These functions are not part of our public API and may + * change at any time. + * + * @private * @namespace ada::unicode * @brief Includes the definitions for unicode operations */ namespace ada::unicode { /** + * @private * We receive a UTF-8 string representing a domain name. * If the string is percent encoded, we apply percent decoding. * @@ -4483,11 +4528,13 @@ bool to_ascii(std::optional& out, std::string_view plain, size_t first_percent); /** + * @private * @see https://www.unicode.org/reports/tr46/#ToUnicode */ std::string to_unicode(std::string_view input); /** + * @private * Checks if the input has tab or newline characters. * * @attention The has_tabs_or_newline function is a bottleneck and it is simple @@ -4497,12 +4544,14 @@ ada_really_inline bool has_tabs_or_newline( std::string_view user_input) noexcept; /** + * @private * Checks if the input is a forbidden host code point. * @see https://url.spec.whatwg.org/#forbidden-host-code-point */ ada_really_inline constexpr bool is_forbidden_host_code_point(char c) noexcept; /** + * @private * Checks if the input contains a forbidden domain code point. * @see https://url.spec.whatwg.org/#forbidden-domain-code-point */ @@ -4510,6 +4559,7 @@ ada_really_inline constexpr bool contains_forbidden_domain_code_point( const char* input, size_t length) noexcept; /** + * @private * Checks if the input contains a forbidden domain code point in which case * the first bit is set to 1. If the input contains an upper case ASCII letter, * then the second bit is set to 1. @@ -4520,6 +4570,7 @@ contains_forbidden_domain_code_point_or_upper(const char* input, size_t length) noexcept; /** + * @private * Checks if the input is a forbidden domain code point. * @see https://url.spec.whatwg.org/#forbidden-domain-code-point */ @@ -4527,11 +4578,13 @@ ada_really_inline constexpr bool is_forbidden_domain_code_point( char c) noexcept; /** + * @private * Checks if the input is alphanumeric, '+', '-' or '.' */ ada_really_inline constexpr bool is_alnum_plus(char c) noexcept; /** + * @private * @details An ASCII hex digit is an ASCII upper hex digit or ASCII lower hex * digit. An ASCII upper hex digit is an ASCII digit or a code point in the * range U+0041 (A) to U+0046 (F), inclusive. An ASCII lower hex digit is an @@ -4540,6 +4593,7 @@ ada_really_inline constexpr bool is_alnum_plus(char c) noexcept; ada_really_inline constexpr bool is_ascii_hex_digit(char c) noexcept; /** + * @private * Checks if the input is a C0 control or space character. * * @details A C0 control or space is a C0 control or U+0020 SPACE. @@ -4549,6 +4603,7 @@ ada_really_inline constexpr bool is_ascii_hex_digit(char c) noexcept; ada_really_inline constexpr bool is_c0_control_or_space(char c) noexcept; /** + * @private * Checks if the input is a ASCII tab or newline character. * * @details An ASCII tab or newline is U+0009 TAB, U+000A LF, or U+000D CR. @@ -4556,6 +4611,7 @@ ada_really_inline constexpr bool is_c0_control_or_space(char c) noexcept; ada_really_inline constexpr bool is_ascii_tab_or_newline(char c) noexcept; /** + * @private * @details A double-dot path segment must be ".." or an ASCII case-insensitive * match for ".%2e", "%2e.", or "%2e%2e". */ @@ -4563,6 +4619,7 @@ ada_really_inline ada_constexpr bool is_double_dot_path_segment( std::string_view input) noexcept; /** + * @private * @details A single-dot path segment must be "." or an ASCII case-insensitive * match for "%2e". */ @@ -4570,17 +4627,20 @@ ada_really_inline constexpr bool is_single_dot_path_segment( std::string_view input) noexcept; /** + * @private * @details ipv4 character might contain 0-9 or a-f character ranges. */ ada_really_inline constexpr bool is_lowercase_hex(char c) noexcept; /** + * @private * @details Convert hex to binary. Caller is responsible to ensure that * the parameter is an hexadecimal digit (0-9, A-F, a-f). */ ada_really_inline unsigned constexpr convert_hex_to_binary(char c) noexcept; /** + * @private * first_percent should be = input.find('%') * * @todo It would be faster as noexcept maybe, but it could be unsafe since. @@ -4591,12 +4651,14 @@ ada_really_inline unsigned constexpr convert_hex_to_binary(char c) noexcept; std::string percent_decode(std::string_view input, size_t first_percent); /** + * @private * Returns a percent-encoding string whether percent encoding was needed or not. * @see https://github.com/nodejs/node/blob/main/src/node_url.cc#L226 */ std::string percent_encode(std::string_view input, const uint8_t character_set[]); /** + * @private * Returns a percent-encoded string version of input, while starting the percent * encoding at the provided index. * @see https://github.com/nodejs/node/blob/main/src/node_url.cc#L226 @@ -4604,6 +4666,7 @@ std::string percent_encode(std::string_view input, std::string percent_encode(std::string_view input, const uint8_t character_set[], size_t index); /** + * @private * Returns true if percent encoding was needed, in which case, we store * the percent-encoded content in 'out'. If the boolean 'append' is set to * true, the content is appended to 'out'. @@ -4614,12 +4677,14 @@ template bool percent_encode(std::string_view input, const uint8_t character_set[], std::string& out); /** + * @private * Returns the index at which percent encoding should start, or (equivalently), * the length of the prefix that does not require percent encoding. */ ada_really_inline size_t percent_encode_index(std::string_view input, const uint8_t character_set[]); /** + * @private * Lowers the string in-place, assuming that the content is ASCII. * Return true if the content was ASCII. */ @@ -4957,12 +5022,16 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u); #include /** + * These functions are not part of our public API and may + * change at any time. + * @private * @namespace ada::checkers * @brief Includes the definitions for validation functions */ namespace ada::checkers { /** + * @private * Assuming that x is an ASCII letter, this function returns the lower case * equivalent. * @details More likely to be inlined by the compiler and constexpr. @@ -4970,6 +5039,7 @@ namespace ada::checkers { constexpr char to_lower(char x) noexcept; /** + * @private * Returns true if the character is an ASCII letter. Equivalent to std::isalpha * but more likely to be inlined by the compiler. * @@ -4978,6 +5048,7 @@ constexpr char to_lower(char x) noexcept; constexpr bool is_alpha(char x) noexcept; /** + * @private * Check whether a string starts with 0x or 0X. The function is only * safe if input.size() >=2. * @@ -4985,17 +5056,20 @@ constexpr bool is_alpha(char x) noexcept; */ inline bool has_hex_prefix_unsafe(std::string_view input); /** + * @private * Check whether a string starts with 0x or 0X. */ inline bool has_hex_prefix(std::string_view input); /** + * @private * Check whether x is an ASCII digit. More likely to be inlined than * std::isdigit. */ constexpr bool is_digit(char x) noexcept; /** + * @private * @details A string starts with a Windows drive letter if all of the following * are true: * @@ -5009,6 +5083,7 @@ constexpr bool is_digit(char x) noexcept; inline constexpr bool is_windows_drive_letter(std::string_view input) noexcept; /** + * @private * @details A normalized Windows drive letter is a Windows drive letter of which * the second code point is U+003A (:). */ @@ -5016,12 +5091,14 @@ inline constexpr bool is_normalized_windows_drive_letter( std::string_view input) noexcept; /** + * @private * @warning Will be removed when Ada requires C++20. */ ada_really_inline bool begins_with(std::string_view view, std::string_view prefix); /** + * @private * Returns true if an input is an ipv4 address. It is assumed that the string * does not contain uppercase ASCII characters (the input should have been * lowered cased before calling this function) and is not empty. @@ -5029,6 +5106,7 @@ ada_really_inline bool begins_with(std::string_view view, ada_really_inline ada_constexpr bool is_ipv4(std::string_view view) noexcept; /** + * @private * Returns a bitset. If the first bit is set, then at least one character needs * percent encoding. If the second bit is set, a \\ is found. If the third bit * is set then we have a dot. If the fourth bit is set, then we have a percent @@ -5038,6 +5116,7 @@ ada_really_inline constexpr uint8_t path_signature( std::string_view input) noexcept; /** + * @private * Returns true if the length of the domain name and its labels are according to * the specifications. The length of the domain must be 255 octets (253 * characters not including the last 2 which are the empty label reserved at the @@ -5589,7 +5668,7 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { if (query.has_value()) { out.search_start = uint32_t(running_index); running_index += get_search().size(); - if (get_search().size() == 0) { + if (get_search().empty()) { running_index++; } } @@ -5751,6 +5830,10 @@ ada_really_inline size_t url::parse_port(std::string_view view, #include /** + * Unicode operations. These functions are not part of our public API and may + * change at any time. + * + * private * @namespace ada::unicode * @brief Includes the declarations for unicode operations */ @@ -6056,7 +6139,7 @@ inline void url_aggregator::append_base_pathname(const std::string_view input) { ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); #if ADA_DEVELOPMENT_CHECKS // computing the expected password. - std::string path_expected = std::string(get_pathname()); + std::string path_expected(get_pathname()); path_expected.append(input); #endif // ADA_DEVELOPMENT_CHECKS uint32_t ending_index = uint32_t(buffer.size()); @@ -6126,7 +6209,7 @@ inline void url_aggregator::append_base_username(const std::string_view input) { ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); #if ADA_DEVELOPMENT_CHECKS // computing the expected password. - std::string username_expected = std::string(get_username()); + std::string username_expected(get_username()); username_expected.append(input); #endif // ADA_DEVELOPMENT_CHECKS add_authority_slashes_if_needed(); @@ -6156,7 +6239,7 @@ inline void url_aggregator::append_base_username(const std::string_view input) { components.hash_start += difference; } #if ADA_DEVELOPMENT_CHECKS - std::string username_after = std::string(get_username()); + std::string username_after(get_username()); ADA_ASSERT_EQUAL( username_expected, username_after, "append_base_username problem after inserting " + std::string(input)); @@ -6282,7 +6365,7 @@ inline void url_aggregator::append_base_password(const std::string_view input) { components.hash_start += difference; } #if ADA_DEVELOPMENT_CHECKS - std::string password_after = std::string(get_password()); + std::string password_after(get_password()); ADA_ASSERT_EQUAL( password_expected, password_after, "append_base_password problem after inserting " + std::string(input)); @@ -6769,7 +6852,7 @@ struct url_search_params { /** * @see https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior */ - inline std::string to_string(); + inline std::string to_string() const; /** * Returns a simple JS-style iterator over all of the keys in this @@ -6886,12 +6969,12 @@ inline void url_search_params::initialize(std::string_view input) { auto equal = current.find('='); if (equal == std::string_view::npos) { - auto name = std::string(current); + std::string name(current); std::replace(name.begin(), name.end(), '+', ' '); params.emplace_back(unicode::percent_decode(name, name.find('%')), ""); } else { - auto name = std::string(current.substr(0, equal)); - auto value = std::string(current.substr(equal + 1)); + std::string name(current.substr(0, equal)); + std::string value(current.substr(equal + 1)); std::replace(name.begin(), name.end(), '+', ' '); std::replace(value.begin(), value.end(), '+', ' '); @@ -6964,7 +7047,7 @@ inline bool url_search_params::has(std::string_view key, return entry != params.end(); } -inline std::string url_search_params::to_string() { +inline std::string url_search_params::to_string() const { auto character_set = ada::character_sets::WWW_FORM_URLENCODED_PERCENT_ENCODE; std::string out{}; for (size_t i = 0; i < params.size(); i++) { @@ -7049,20 +7132,26 @@ inline bool url_search_params_iter::has_next() { template <> inline std::optional url_search_params_keys_iter::next() { - if (!has_next()) return std::nullopt; + if (!has_next()) { + return std::nullopt; + } return params.params[pos++].first; } template <> inline std::optional url_search_params_values_iter::next() { - if (!has_next()) return std::nullopt; + if (!has_next()) { + return std::nullopt; + } return params.params[pos++].second; } template <> inline std::optional url_search_params_entries_iter::next() { - if (!has_next()) return std::nullopt; + if (!has_next()) { + return std::nullopt; + } return params.params[pos++]; } @@ -7080,14 +7169,14 @@ url_search_params_entries_iter::next() { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "2.7.6" +#define ADA_VERSION "2.7.8" namespace ada { enum { ADA_VERSION_MAJOR = 2, ADA_VERSION_MINOR = 7, - ADA_VERSION_REVISION = 6, + ADA_VERSION_REVISION = 8, }; } // namespace ada diff --git a/deps/cares/CHANGES b/deps/cares/CHANGES index 24a68a89849b67..ae56d4f24bc3d9 100644 --- a/deps/cares/CHANGES +++ b/deps/cares/CHANGES @@ -1,5 +1,250 @@ Changelog for the c-ares project. Generated with git2changes.pl +Version 1.28.1 (30 Mar 2024) + +GitHub (30 Mar 2024) +- [Brad House brought this change] + + release prep for 1.28.1 (#739) + +Brad House (30 Mar 2024) +- ares_search() and ares_getaddrinfo() resolution fails if no search domains + + Due to an error in creating the list of domains to search, if no search + domains were configured, resolution would fail. + + Fixes Issue: #737 + Fix By: Brad House (@bradh352) + +- typo + +Version 1.28.0 (28 Mar 2024) + +GitHub (28 Mar 2024) +- [Brad House brought this change] + + Allow configuration value for NDots to be zero (#735) + + As per Issue #734 some people use `ndots:0` in their configuration which + is allowed by the system resolver but not by c-ares. Add support for + `ndots:0` and add a test case to validate this behavior. + + Fixes Issue: #734 + Fix By: Brad House (@bradh352) + +Brad House (27 Mar 2024) +- typo + +GitHub (27 Mar 2024) +- [Brad House brought this change] + + 1.28.0 release prep (#733) + +Brad House (27 Mar 2024) +- CMake: don't overwrite global required libraries/definitions/includes + + When chain building c-ares, global settings were being unset which + could lead to build problems. + + Fixes Issue: #729 + Fix By: Brad House (@bradh352) + +- remove tests that have been disabled forever + +- clang-format + +- ares_search_dnsrec() takes a const + +- sonarcloud: clean up some minor codesmells + +GitHub (26 Mar 2024) +- [Brad House brought this change] + + mark deprecated functions as such (#732) + + Multiple functions have been deprecated over the years, annotate them + with attribute deprecated. + + When possible show a message about their replacements. + + This is a continuation/completion of PR #706 + + Fix By: Cristian Rodríguez (@crrodriguez) + +Brad House (26 Mar 2024) +- silence clang static analyzer + +- silence coverity + +- coverity: fix mostly bogus warnings + +- fix missing doc + +GitHub (25 Mar 2024) +- [Brad House brought this change] + + Rework internals to pass around `ares_dns_record_t` instead of binary data (#730) + + c-ares has historically passed around raw dns packets in binary form. + Now that we have a new parser, and messages are already parsed + internally, lets pass around that parsed message rather than requiring + multiple parse attempts on the same message. Also add a new + `ares_send_dnsrec()` and `ares_query_dnsrec()` similar to + `ares_search_dnsrec()` added with PR #719 that can return the pointer to + the `ares_dns_record_t` to the caller enqueuing queries and rework + `ares_search_dnsrec()` to use `ares_send_dnsrec()` internally. + + Fix By: Brad House (@bradh352) + +Brad House (23 Mar 2024) +- tests: mockserver is local, shorten timeouts to make test cases run faster to use less CI resources + +- appveyor: disable UWP builds until MSVC version is updated in base image + +GitHub (21 Mar 2024) +- [Faraz brought this change] + + Include netinet6/in6.h (#728) + + On some platforms, "netinet6/in6.h" is not included by "netinet/in.h" + and needs to be included separately. + + Fix By: Faraz (@farazrbx) + +- [Oliver Welsh brought this change] + + Add function ares_search_dnrec() to search for records using the new DNS record parser (#719) + + This PR adds a new function `ares_search_dnsrec()` to search for records + using the new DNS record parser. + + The function takes an arbitrary DNS record object to search (that must + represent a query for a single name). The function takes a new callback + type, `ares_callback_dnsrec`, that is invoked with a parsed DNS record + object rather than the raw buffer(+length). + + The original motivation for this change is to provide support for + [draft-kaplan-enum-sip-routing-04](https://datatracker.ietf.org/doc/html/draft-kaplan-enum-sip-routing-04); + when routing phone calls using an ENUM server, it can be useful to + include identifying source information in an OPT RR options value, to + help select the appropriate route for the call. The new function allows + for more customisable searches like this. + + **Summary of code changes** + + A new function `ares_search_dnsrec()` has been added and exposed. + Moreover, the entire `ares_search_int()` internal code flow has been + refactored to use parsed DNS record objects and the new DNS record + parser. The DNS record object is passed through the `search_query` + structure by encoding/decoding to/from a buffer (if multiple search + domains are used). A helper function `ares_dns_write_query_altname()` is + used to re-write the DNS record object with a new query name (used to + append search domains). + + `ares_search()` is now a wrapper around the new internal code, where the + DNS record object is created based on the name, class and type + parameters. + + The new function uses a new callback type, `ares_callback_dnsrec`. This + is invoked with a parsed DNS record object. For now, we convert from + `ares_callback` to this new type using `ares__dnsrec_convert_cb()`. + + Some functions that are common to both `ares_query()` and + `ares_search()` have been refactored using the new DNS record parser. + See `ares_dns_record_create_query()` and + `ares_dns_query_reply_tostatus()`. + + **Testing** + + A new FV has been added to test the new function, which searches for a + DNS record containing an OPT RR with custom options value. + + As part of this, I needed to enhance the mock DNS server to expect + request text (and assert that it matches actual request text). This is + because the FV needs to check that the request contains the correct OPT + RR. + + **Documentation** + + The man page docs have been updated to describe the new feature. + + **Futures** + + In the future, a new variant of `ares_send()` could be introduced in the + same vein (`ares_send_dnsrec()`). This could be used by + `ares_search_dnsrec()`. Moreover, we could migrate internal code to use + `ares_callback_dnsrec` as the default callback. + + This will help to make the new DNS record parser the norm in C-Ares. + + --------- + + Co-authored-by: Oliver Welsh (@oliverwelsh) + +- [Brad House brought this change] + + Replace configuration file parsers with memory-safe parser (#725) + + Rewrite configuration parsers using new memory safe parsing functions. + After CVE-2024-25629 its obvious that we need to prioritize again on + getting all the hand written parsers with direct pointer manipulation + replaced. They're just not safe and hard to audit. It was yet another + example of 20+yr old code having a memory safety issue just now coming + to light. + + Though these parsers are definitely less efficient, they're written with + memory safety in mind, and any performance difference is going to be + meaningless for something that only happens once a while. + + Fix By: Brad House (@bradh352) + +Brad House (12 Mar 2024) +- skip ubsan/asan on debian arm64 due to the compiler getting killed + +- ares_init potential memory leak + + If initializing using default settings fails, there may be a memory leak of + search domains that were set by system configuration. + + Fixes Issue: #724 + Fix By: Brad House (@bradh352) + +GitHub (12 Mar 2024) +- [Faraz Fallahi brought this change] + + simple implementation for isascii where stdlib isascii is not available (#721) + + Some platforms don't have the isascii() function. Implement as a macro. + + Fix By: Faraz Fallahi (@fffaraz) + +Brad House (11 Mar 2024) +- Doxygen: fix typos + + Fix reported typos in doxygen-style comments. + + Fixes Issue: #722 + Credit: @dzalyalov88 + +- CI: update freebsd image + +- CMake: Fix Chain building if CMAKE runtime paths not set + + This fixes issues created by #708 + + Fix By: Brad House (@bradh352) + +- silence benign warnings + +- Remove acountry completely from code, including manpage + + Since acountry cannot be restored due to nerd.dk being decommissioned, + we should completely remove the manpage and source. This also + will resolve issue #718. + + Fixes Issue: #718 + Fix By: Brad House (@bradh352) + Version 1.27.0 (22 Feb 2024) GitHub (22 Feb 2024) @@ -6100,127 +6345,3 @@ Yang Tse (10 Mar 2013) Daniel Stenberg (9 Mar 2013) - ares.h: there is no ares_free_soa function - -Yang Tse (9 Mar 2013) -- Makefile.am: empty AM_LDFLAGS definition for automake 1.7 compatibility - -- ares_inet_ntop.3: s/socklen_t/ares_socklen_t - -- configure: use XC_LIBTOOL for portability across libtool versions - -- xc-lt-iface.m4: provide XC_LIBTOOL macro - -- Makefile.am: use AM_CPPFLAGS instead of INCLUDES - -- inet_ntop.c: s/socklen_t/ares_socklen_t - -- inet_ntop.c: s/socklen_t/ares_socklen_t for portability - -Daniel Stenberg (19 Feb 2013) -- ares.h: s/socklen_t/ares_socklen_t for portability - -- ares_inet_ntop.3: 4th argument is socklen_t! - -- spell inet correctly! - -- ares_inet_pton/ntop: cleanup - - Make sure that the symbols are always exported and present in c-ares. - - Make the headers prefixed with 'ares'. - - Removed the inet_ntop.h version as it no longer features any content. - -- ares_inet_ntop/ares_inet_pton: added man pages - -Yang Tse (15 Feb 2013) -- [Gisle Vanem brought this change] - - curl_setup_once.h: definition of HAVE_CLOSE_S defines sclose() to close_s() - -- [Gisle Vanem brought this change] - - config-dos.h: define HAVE_CLOSE_S for MSDOS/Watt-32 - -- [Gisle Vanem brought this change] - - config-dos.h: define strerror() to strerror_s_() for High-C - -Daniel Stenberg (13 Feb 2013) -- ares_get_datatype: removed unused function - - it was also wrongly named as internal functions require two underscores - -- ares__bitncmp: use two underscores for private functions - - It used a single one previously making it look like a public one - -- ares__generate_new_id: moved to ares_query.c - - ... and ares__rc4 is turned into a local static function. - -- ares__swap_lists: make private and static - - ... since there's only one user, make it static within ares_process.c - -Yang Tse (13 Feb 2013) -- Makefile.msvc: add four VS version strings - -Daniel Stenberg (13 Feb 2013) -- ares_expand_name.3: clarify how to free the data - -Yang Tse (30 Jan 2013) -- zz40-xc-ovr.m4: fix 'wc' detection - follow-up 2 - - - Fix a pair of single quotes to double quotes. - - URL: http://curl.haxx.se/mail/lib-2013-01/0355.html - Reported by: Tor Arntsen - -- zz40-xc-ovr.m4: fix 'wc' detection - follow-up - - - Take into account that 'wc' may return leading spaces and/or tabs. - - - Set initial IFS to space, tab and newline. - -- zz40-xc-ovr.m4: fix 'wc' detection - - - Take into account that 'wc' may return leading spaces. - - - Set internationalization behavior variables. - - Tor Arntsen analyzed and reported the issue. - - URL: http://curl.haxx.se/mail/lib-2013-01/0351.html - -- zz40-xc-ovr.m4: check another three basic utilities - -- zz40-xc-ovr.m4: 1.0 interface stabilization - - - Stabilization results in 4 public interface m4 macros: - XC_CONFIGURE_PREAMBLE - XC_CONFIGURE_PREAMBLE_VER_MAJOR - XC_CONFIGURE_PREAMBLE_VER_MINOR - XC_CHECK_PATH_SEPARATOR - - Avoid one level of internal indirection - - Update comments - - Drop XC_OVR_ZZ40 macro - -- zz40-xc-ovr.m4: emit witness message in configure BODY - - This avoids witness message in output when running configure --help, - while sending the message to config.log for other configure runs. - -- zz40-xc-ovr.m4: truly do version conditional overriding - - - version conditional overriding - - catch unexpanded XC macros - - fix double words in comments - -- zz40-xc-ovr.m4: fix variable assignment of subshell output bashism - - Tor Arntsen analyzed and reported the issue. - - URL: http://curl.haxx.se/mail/lib-2013-01/0306.html - -- zz40-xc-ovr.m4: reinstate strict AC_REQUIRE macro dependencies diff --git a/deps/cares/CMakeLists.txt b/deps/cares/CMakeLists.txt index e951cafd7b4068..2718ce52b73ff6 100644 --- a/deps/cares/CMakeLists.txt +++ b/deps/cares/CMakeLists.txt @@ -12,10 +12,10 @@ INCLUDE (CheckCSourceCompiles) INCLUDE (CheckStructHasMember) INCLUDE (CheckLibraryExists) -PROJECT (c-ares LANGUAGES C VERSION "1.27.0" ) +PROJECT (c-ares LANGUAGES C VERSION "1.28.1" ) # Set this version before release -SET (CARES_VERSION "1.27.0") +SET (CARES_VERSION "1.28.1") INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are wrong. @@ -30,7 +30,7 @@ INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are w # For example, a version of 4:0:2 would generate output such as: # libname.so -> libname.so.2 # libname.so.2 -> libname.so.2.2.0 -SET (CARES_LIB_VERSIONINFO "14:0:12") +SET (CARES_LIB_VERSIONINFO "15:1:13") OPTION (CARES_STATIC "Build as a static library" OFF) @@ -98,7 +98,7 @@ IF (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") - SET (PACKAGE_DIRECTORY ${PROJECT_BINARY_DIR}/package) + SET (CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") ENDIF () # Destinations for installing different kinds of targets (pass to install command). @@ -113,11 +113,10 @@ SET (TARGETS_INST_DEST # CHECK_LIBRARY_EXISTS can't be used as it will return true if the function # is found in a different required/dependent library. MACRO (CARES_FUNCTION_IN_LIBRARY func lib var) - - SET (_ORIG_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") + SET (_ORIG_FIL_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") SET (CMAKE_REQUIRED_LIBRARIES ) CHECK_FUNCTION_EXISTS ("${func}" "_CARES_FUNC_IN_LIB_GLOBAL_${func}") - SET (CMAKE_REQUIRED_LIBRARIES "${_ORIG_CMAKE_REQUIRED_LIBRARIES}") + SET (CMAKE_REQUIRED_LIBRARIES "${_ORIG_FIL_CMAKE_REQUIRED_LIBRARIES}") IF ("${_CARES_FUNC_IN_LIB_GLOBAL_${func}}") SET (${var} FALSE) @@ -207,6 +206,7 @@ CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H) CHECK_INCLUDE_FILES (memory.h HAVE_MEMORY_H) CHECK_INCLUDE_FILES (netdb.h HAVE_NETDB_H) CHECK_INCLUDE_FILES (netinet/in.h HAVE_NETINET_IN_H) +CHECK_INCLUDE_FILES (netinet6/in6.h HAVE_NETINET6_IN6_H) # On old MacOS SDK versions, you must include sys/socket.h before net/if.h IF (HAVE_SYS_SOCKET_H) CHECK_INCLUDE_FILES ("sys/socket.h;net/if.h" HAVE_NET_IF_H) @@ -303,7 +303,11 @@ ENDIF () # headers, libraries, and definitions for the detection to work properly # CMAKE_REQUIRED_DEFINITIONS, CMAKE_REQUIRED_LIBRARIES, and # CMAKE_EXTRA_INCLUDE_FILES. When we're done with the detection, we'll -# unset them. +# restore them to their original values (otherwise a parent project +# that tries to set these won't be maintained, see Issue #729) +SET (ORIG_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEEFINITIONS}) +SET (ORIG_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) +SET (ORIG_CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES}) SET (CMAKE_REQUIRED_DEFINITIONS ${SYSFLAGS}) LIST (APPEND CMAKE_REQUIRED_LIBRARIES ${CARES_DEPENDENT_LIBS}) @@ -323,6 +327,7 @@ CARES_EXTRAINCLUDE_IFSET (HAVE_NETDB_H netdb.h) CARES_EXTRAINCLUDE_IFSET (HAVE_NET_IF_H net/if.h) CARES_EXTRAINCLUDE_IFSET (HAVE_IFADDRS_H ifaddrs.h) CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_IN_H netinet/in.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET6_IN6_H netinet6/in6.h) CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_TCP_H netinet/tcp.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SIGNAL_H signal.h) CARES_EXTRAINCLUDE_IFSET (HAVE_STDLIB_H stdlib.h) @@ -458,10 +463,10 @@ CHECK_SYMBOL_EXISTS (epoll_create1 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_EPOLL) # from libc. We need to perform a link test instead of a header/symbol test. CHECK_FUNCTION_EXISTS (__system_property_get HAVE___SYSTEM_PROPERTY_GET) -# Unset temporary data -SET (CMAKE_EXTRA_INCLUDE_FILES) -SET (CMAKE_REQUIRED_DEFINITIONS) -SET (CMAKE_REQUIRED_LIBRARIES) +# Restore original values (as per Issue #729) +SET (CMAKE_REQUIRED_DEFINITIONS ${ORIG_CMAKE_REQUIRED_DEEFINITIONS}) +SET (CMAKE_REQUIRED_LIBRARIES ${ORIG_CMAKE_REQUIRED_LIBRARIES}) +SET (CMAKE_EXTRA_INCLUDE_FILES ${ORIG_CMAKE_EXTRA_INCLUDE_FILES}) ################################################################################ diff --git a/deps/cares/Makefile.in b/deps/cares/Makefile.in index d1c663d5488366..928cdc217ee6de 100644 --- a/deps/cares/Makefile.in +++ b/deps/cares/Makefile.in @@ -364,6 +364,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ diff --git a/deps/cares/Makefile.msvc b/deps/cares/Makefile.msvc index c89454ec155d94..f6e8f4e71f2e6f 100644 --- a/deps/cares/Makefile.msvc +++ b/deps/cares/Makefile.msvc @@ -229,7 +229,7 @@ LINK_CMD_EXE_DBG = $(LINK_CMD_EXE) /debug $(PDBTYPE_CONSOLIDATE) CARES_TARGET = $(STA_LIB_REL).lib CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB CARES_LFLAGS = -SPROG_CFLAGS = /DCARES_STATICLIB +SPROG_CFLAGS = /DCARES_STATICLIB /DCARES_NO_DEPRECATED SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(STA_LIB_REL).lib CARES_LINK = $(LINK_CMD_LIB) SPROG_LINK = $(LINK_CMD_EXE_REL) @@ -240,7 +240,7 @@ CC_CMD = $(CC_CMD_REL) CARES_TARGET = $(STA_LIB_DBG).lib CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB /DDEBUGBUILD CARES_LFLAGS = -SPROG_CFLAGS = /DCARES_STATICLIB +SPROG_CFLAGS = /DCARES_STATICLIB /DCARES_NO_DEPRECATED SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(STA_LIB_DBG).lib CARES_LINK = $(LINK_CMD_LIB) SPROG_LINK = $(LINK_CMD_EXE_DBG) @@ -251,7 +251,7 @@ CC_CMD = $(CC_CMD_DBG) CARES_TARGET = $(DYN_LIB_REL).dll CARES_CFLAGS = /DCARES_BUILDING_LIBRARY CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(CARES_OUTDIR)\$(IMP_LIB_REL).lib $(PDB_NONE) -SPROG_CFLAGS = +SPROG_CFLAGS = /DCARES_NO_DEPRECATED SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(IMP_LIB_REL).lib CARES_LINK = $(LINK_CMD_DLL) SPROG_LINK = $(LINK_CMD_EXE_REL) @@ -264,7 +264,7 @@ RC_CMD = $(RC_CMD_REL) CARES_TARGET = $(DYN_LIB_DBG).dll CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DDEBUGBUILD CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(CARES_OUTDIR)\$(IMP_LIB_DBG).lib /pdb:$(CARES_OUTDIR)\$(DYN_LIB_DBG).pdb $(PDBTYPE_CONSOLIDATE) -SPROG_CFLAGS = +SPROG_CFLAGS = /DCARES_NO_DEPRECATED SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(IMP_LIB_DBG).lib CARES_LINK = $(LINK_CMD_DLL) SPROG_LINK = $(LINK_CMD_EXE_DBG) diff --git a/deps/cares/RELEASE-NOTES.md b/deps/cares/RELEASE-NOTES.md index 0fdcbc6b968488..3a9b9dd9c35fa1 100644 --- a/deps/cares/RELEASE-NOTES.md +++ b/deps/cares/RELEASE-NOTES.md @@ -1,40 +1,49 @@ -## c-ares version 1.27.0 - Feb 23 2024 +## c-ares version 1.28.1 - Mar 30 2024 -This is a security, feature, and bugfix release. +This release contains a fix for a single significant regression introduced +in c-ares 1.28.0. -Security: +* `ares_search()` and `ares_getaddrinfo()` resolution fails if no search domains + are specified. [Issue #737](https://github.com/c-ares/c-ares/issues/737) -* Moderate. CVE-2024-25629. Reading malformatted `/etc/resolv.conf`, - `/etc/nsswitch.conf` or the `HOSTALIASES` file could result in a crash. - [GHSA-mg26-v6qh-x48q](https://github.com/c-ares/c-ares/security/advisories/GHSA-mg26-v6qh-x48q) + +## c-ares version 1.28.0 - Mar 29 2024 + +This is a feature and bugfix release. Features: -* New function `ares_queue_active_queries()` to retrieve number of in-flight - queries. [PR #712](https://github.com/c-ares/c-ares/pull/712) -* New function `ares_queue_wait_empty()` to wait for the number of in-flight - queries to reach zero. [PR #710](https://github.com/c-ares/c-ares/pull/710) -* New `ARES_FLAG_NO_DEFLT_SVR` for `ares_init_options()` to return a failure if - no DNS servers can be found rather than attempting to use `127.0.0.1`. This - also introduces a new ares status code of `ARES_ENOSERVER`. [PR #713](https://github.com/c-ares/c-ares/pull/713) +* Emit warnings when deprecated c-ares functions are used. This can be + disabled by passing a compiler definition of `CARES_NO_DEPRECATED`. [PR #732](https://github.com/c-ares/c-ares/pull/732) +* Add function `ares_search_dnsrec()` to search for records using the new DNS + record data structures. [PR #719](https://github.com/c-ares/c-ares/pull/719) +* Rework internals to pass around `ares_dns_record_t` instead of binary data, + this introduces new public functions of `ares_query_dnsrec()` and + `ares_send_dnsrec()`. [PR #730](https://github.com/c-ares/c-ares/pull/730) Changes: -* EDNS Packet size should be 1232 as per DNS Flag Day. [PR #705](https://github.com/c-ares/c-ares/pull/705) +* tests: when performing simulated queries, reduce timeouts to make tests run + faster +* Replace configuration file parsers with memory-safe parser. [PR #725](https://github.com/c-ares/c-ares/pull/725) +* Remove `acountry` completely, the manpage might still get installed otherwise. [Issue #718](https://github.com/c-ares/c-ares/pull/718) Bugfixes: -* Windows DNS suffix search list memory leak. [PR #711](https://github.com/c-ares/c-ares/pull/711) -* Fix warning due to ignoring return code of `write()`. [PR #709](https://github.com/c-ares/c-ares/pull/709) -* CMake: don't override target output locations if not top-level. [Issue #708](https://github.com/c-ares/c-ares/issues/708) -* Fix building c-ares without thread support. [PR #700](https://github.com/c-ares/c-ares/pull/700) +* CMake: don't overwrite global required libraries/definitions/includes which + could cause build errors for projects chain building c-ares. [Issue #729](https://github.com/c-ares/c-ares/issues/729) +* On some platforms, `netinet6/in6.h` is not included by `netinet/in.h` + and needs to be included separately. [PR #728](https://github.com/c-ares/c-ares/pull/728) +* Fix a potential memory leak in `ares_init()`. [Issue #724](https://github.com/c-ares/c-ares/issues/724) +* Some platforms don't have the `isascii()` function. Implement as a macro. [PR #721](https://github.com/c-ares/c-ares/pull/721) +* CMake: Fix Chain building if CMAKE runtime paths not set +* NDots configuration should allow a value of zero. [PR #735](https://github.com/c-ares/c-ares/pull/735) Thanks go to these friendly people for their efforts and contributions for this release: -* Anthony Alayo (@anthonyalayo) * Brad House (@bradh352) -* Cheng Zhao (@zcbenz) * Cristian Rodríguez (@crrodriguez) * Daniel Stenberg (@bagder) +* Faraz (@farazrbx) +* Faraz Fallahi (@fffaraz) * Oliver Welsh (@oliverwelsh) -* Vojtěch Vobr (@vojtechvobr) diff --git a/deps/cares/aminclude_static.am b/deps/cares/aminclude_static.am index e3fc636c7b51a4..6fa817a8346703 100644 --- a/deps/cares/aminclude_static.am +++ b/deps/cares/aminclude_static.am @@ -1,6 +1,6 @@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Fri Feb 23 08:24:27 CET 2024 +# from AX_AM_MACROS_STATIC on Sat Mar 30 16:17:17 CET 2024 # Code coverage diff --git a/deps/cares/cares.gyp b/deps/cares/cares.gyp index e8ac0b75796e72..053cdf8c8286ad 100644 --- a/deps/cares/cares.gyp +++ b/deps/cares/cares.gyp @@ -26,7 +26,6 @@ 'src/lib/ares__llist.c', 'src/lib/ares__llist.h', 'src/lib/ares__parse_into_addrinfo.c', - 'src/lib/ares__read_line.c', 'src/lib/ares__slist.c', 'src/lib/ares__slist.h', 'src/lib/ares__socket.c', @@ -74,7 +73,6 @@ 'src/lib/ares_library_init.c', 'src/lib/ares_ipv6.h', 'src/lib/ares_math.c', - 'src/lib/ares_mkquery.c', 'src/lib/ares_options.c', 'src/lib/ares_parse_a_reply.c', 'src/lib/ares_parse_aaaa_reply.c', @@ -154,7 +152,15 @@ 'type': '<(library)', 'include_dirs': [ 'include' ], 'direct_dependent_settings': { - 'include_dirs': [ 'include' ] + 'include_dirs': [ 'include' ], + 'cflags': [ '-Wno-error=deprecated-declarations' ], + 'conditions': [ + [ 'OS=="mac"', { + 'xcode_settings': { + 'OTHER_CFLAGS': [ '-Wno-error=deprecated-declarations' ] + } + }] + ] }, 'sources': [ '<@(cares_sources_common)', diff --git a/deps/cares/configure b/deps/cares/configure index ac3c7b55db0565..656164f46e3ad8 100755 --- a/deps/cares/configure +++ b/deps/cares/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for c-ares 1.27.0. +# Generated by GNU Autoconf 2.71 for c-ares 1.28.1. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='c-ares' PACKAGE_TARNAME='c-ares' -PACKAGE_VERSION='1.27.0' -PACKAGE_STRING='c-ares 1.27.0' +PACKAGE_VERSION='1.28.1' +PACKAGE_STRING='c-ares 1.28.1' PACKAGE_BUGREPORT='c-ares mailing list: http://lists.haxx.se/listinfo/c-ares' PACKAGE_URL='' @@ -1420,7 +1420,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures c-ares 1.27.0 to adapt to many kinds of systems. +\`configure' configures c-ares 1.28.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1491,7 +1491,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of c-ares 1.27.0:";; + short | recursive ) echo "Configuration of c-ares 1.28.1:";; esac cat <<\_ACEOF @@ -1627,7 +1627,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -c-ares configure 1.27.0 +c-ares configure 1.28.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2251,7 +2251,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by c-ares $as_me 1.27.0, which was +It was created by c-ares $as_me 1.28.1, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3225,7 +3225,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -CARES_VERSION_INFO="14:0:12" +CARES_VERSION_INFO="15:1:13" @@ -5907,7 +5907,7 @@ fi # Define the identity of the package. PACKAGE='c-ares' - VERSION='1.27.0' + VERSION='1.28.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -21681,6 +21681,31 @@ if test "x$ac_cv_header_netinet_in_h" = xyes then : printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "netinet6/in6.h" "ac_cv_header_netinet6_in6_h" " +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + + +" +if test "x$ac_cv_header_netinet6_in6_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET6_IN6_H 1" >>confdefs.h + fi ac_fn_c_check_header_compile "$LINENO" "netinet/tcp.h" "ac_cv_header_netinet_tcp_h" " #ifdef HAVE_SYS_TYPES_H @@ -25931,7 +25956,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by c-ares $as_me 1.27.0, which was +This file was extended by c-ares $as_me 1.28.1, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -25999,7 +26024,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -c-ares config.status 1.27.0 +c-ares config.status 1.28.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/deps/cares/configure.ac b/deps/cares/configure.ac index 1a3ba8c3fc4c49..4d263a7f309017 100644 --- a/deps/cares/configure.ac +++ b/deps/cares/configure.ac @@ -2,10 +2,10 @@ dnl Copyright (C) The c-ares project and its contributors dnl SPDX-License-Identifier: MIT AC_PREREQ([2.69]) -AC_INIT([c-ares], [1.27.0], +AC_INIT([c-ares], [1.28.1], [c-ares mailing list: http://lists.haxx.se/listinfo/c-ares]) -CARES_VERSION_INFO="14:0:12" +CARES_VERSION_INFO="15:1:13" dnl This flag accepts an argument of the form current[:revision[:age]]. So, dnl passing -version-info 3:12:1 sets current to 3, revision to 12, and age to dnl 1. @@ -436,6 +436,7 @@ AC_CHECK_HEADERS( netioapi.h \ netdb.h \ netinet/in.h \ + netinet6/in6.h \ netinet/tcp.h \ net/if.h \ ifaddrs.h \ diff --git a/deps/cares/docs/Makefile.in b/deps/cares/docs/Makefile.in index 4f5bb62409c7ab..8cb46878fa59ee 100644 --- a/deps/cares/docs/Makefile.in +++ b/deps/cares/docs/Makefile.in @@ -263,6 +263,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ @@ -357,18 +358,22 @@ MANPAGES = ares_cancel.3 \ ares_dns_rcode_tostr.3 \ ares_dns_record.3 \ ares_dns_record_create.3 \ + ares_dns_record_duplicate.3 \ ares_dns_record_get_flags.3 \ ares_dns_record_get_id.3 \ ares_dns_record_get_opcode.3 \ ares_dns_record_get_rcode.3 \ ares_dns_record_destroy.3 \ ares_dns_record_query_add.3 \ + ares_dns_record_query_set_name.3 \ + ares_dns_record_query_set_type.3 \ ares_dns_record_query_cnt.3 \ ares_dns_record_query_get.3 \ ares_dns_record_rr_add.3 \ ares_dns_record_rr_cnt.3 \ ares_dns_record_rr_del.3 \ ares_dns_record_rr_get.3 \ + ares_dns_record_rr_get_const.3 \ ares_dns_rec_type_fromstr.3 \ ares_dns_rec_type_t.3 \ ares_dns_rr.3 \ @@ -442,10 +447,16 @@ MANPAGES = ares_cancel.3 \ ares_parse_uri_reply.3 \ ares_process.3 \ ares_query.3 \ + ares_query_dnsrec.3 \ + ares_queue.3 \ + ares_queue_active_queries.3 \ + ares_queue_wait_empty.3 \ ares_reinit.3 \ ares_save_options.3 \ ares_search.3 \ + ares_search_dnsrec.3 \ ares_send.3 \ + ares_send_dnsrec.3 \ ares_set_local_dev.3 \ ares_set_local_ip4.3 \ ares_set_local_ip6.3 \ diff --git a/deps/cares/docs/Makefile.inc b/deps/cares/docs/Makefile.inc index 3645a7fcddc58b..882bf2280446d5 100644 --- a/deps/cares/docs/Makefile.inc +++ b/deps/cares/docs/Makefile.inc @@ -20,18 +20,22 @@ MANPAGES = ares_cancel.3 \ ares_dns_rcode_tostr.3 \ ares_dns_record.3 \ ares_dns_record_create.3 \ + ares_dns_record_duplicate.3 \ ares_dns_record_get_flags.3 \ ares_dns_record_get_id.3 \ ares_dns_record_get_opcode.3 \ ares_dns_record_get_rcode.3 \ ares_dns_record_destroy.3 \ ares_dns_record_query_add.3 \ + ares_dns_record_query_set_name.3 \ + ares_dns_record_query_set_type.3 \ ares_dns_record_query_cnt.3 \ ares_dns_record_query_get.3 \ ares_dns_record_rr_add.3 \ ares_dns_record_rr_cnt.3 \ ares_dns_record_rr_del.3 \ ares_dns_record_rr_get.3 \ + ares_dns_record_rr_get_const.3 \ ares_dns_rec_type_fromstr.3 \ ares_dns_rec_type_t.3 \ ares_dns_rr.3 \ @@ -105,13 +109,16 @@ MANPAGES = ares_cancel.3 \ ares_parse_uri_reply.3 \ ares_process.3 \ ares_query.3 \ + ares_query_dnsrec.3 \ ares_queue.3 \ ares_queue_active_queries.3 \ ares_queue_wait_empty.3 \ ares_reinit.3 \ ares_save_options.3 \ ares_search.3 \ + ares_search_dnsrec.3 \ ares_send.3 \ + ares_send_dnsrec.3 \ ares_set_local_dev.3 \ ares_set_local_ip4.3 \ ares_set_local_ip6.3 \ diff --git a/deps/cares/docs/adig.1 b/deps/cares/docs/adig.1 index 48b491b593b73c..59923790587ddd 100644 --- a/deps/cares/docs/adig.1 +++ b/deps/cares/docs/adig.1 @@ -64,4 +64,4 @@ Report bugs to the c-ares mailing list: \fBhttps://lists.haxx.se/listinfo/c-ares\fR .SH "SEE ALSO" .PP -acountry(1), ahost(1). +ahost(1). diff --git a/deps/cares/docs/ahost.1 b/deps/cares/docs/ahost.1 index 5feed981ab62c1..e17057273f8285 100644 --- a/deps/cares/docs/ahost.1 +++ b/deps/cares/docs/ahost.1 @@ -47,4 +47,4 @@ Report bugs to the c-ares mailing list: \fBhttps://lists.haxx.se/listinfo/c-ares\fR .SH "SEE ALSO" .PP -acountry(1), adig(1) +adig(1) diff --git a/deps/cares/docs/ares_dns_record.3 b/deps/cares/docs/ares_dns_record.3 index fe23b5eece60e5..01ce7601aa3199 100644 --- a/deps/cares/docs/ares_dns_record.3 +++ b/deps/cares/docs/ares_dns_record.3 @@ -19,7 +19,7 @@ ares_status_t ares_dns_parse(const unsigned char *buf, size_t buf_len, unsigned int flags, ares_dns_record_t **dnsrec); -ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, +ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec, unsigned char **buf, size_t *buf_len); ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec, @@ -28,6 +28,8 @@ ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec, ares_dns_opcode_t opcode, ares_dns_rcode_t rcode); +ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec); + unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec); unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec); @@ -41,6 +43,14 @@ ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec, ares_dns_rec_type_t qtype, ares_dns_class_t qclass); +ares_status_t ares_dns_record_query_set_name(ares_dns_record_t *dnsrec, + size_t idx, + const char *name); + +ares_status_t ares_dns_record_query_set_type(ares_dns_record_t *dnsrec, + size_t idx, + ares_dns_rec_type_t qtype); + size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec); ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec, @@ -67,7 +77,7 @@ on requests, and some may only be valid on responses: .B ARES_REC_TYPE_SOA - Start of authority zone .br -.B ARES_REC_TYPE_PTR +.B ARES_REC_TYPE_PTR - Domain name pointer .br .B ARES_REC_TYPE_HINFO @@ -317,6 +327,13 @@ is meant mostly for responses and is passed in the .IR rcode parameter and is typically \fPARES_RCODE_NOERROR\fP. +The \fIares_dns_record_duplicate(3)\fP function duplicates an existing DNS +record structure. This may be useful if needing to save a result as retrieved +from \fIares_send_dnsrec(3)\fP or \fIares_search_dnsrec(3)\fP. The structure +to be duplicated is passed in the +.IR dnsrec +parameter, and the duplicated copy is returned, or NULL on error such as +out of memory. The \fIares_dns_record_get_id(3)\fP function is used to retrieve the DNS message id from the DNS record provided in the @@ -350,6 +367,29 @@ parameter and the question class (typically \fIARES_CLASS_IN\fP) in the .IR qclass parameter. +The \fIares_dns_record_query_set_name(3)\fP function is used to modify the +question name in the DNS record provided in the +.IR dnsrec +parameter. The index of the query, which must be less than +\fIares_dns_record_query_cnt(3)\fP, is provided in the +.IR idx +parameter. The new domain name is provided in the +.IR name +parameter. Care should be taken as this will cause invalidation of any +\fIname\fP pointer retrieved from \fIares_dns_Record_query_get(3)\fP. This +function is useful if sending multiple similar queries without re-creating +the entire DNS query. + +The \fIares_dns_record_query_set_type(3)\fP function is used to modify the +question type in the DNS record provided in the +.IR dnsrec +parameter. The index of the query, which must be less than +\fIares_dns_record_query_cnt(3)\fP, is provided in the +.IR idx +parameter. The new query type is provided in the +.IR qtype +parameter. + The \fIares_dns_record_query_cnt(3)\fP function is used to retrieve the number of DNS questions in the DNS record provided in the .IR dnsrec @@ -363,7 +403,8 @@ parameter. The index provided in the parameter must be less than the value returned from \fIares_dns_record_query_cnt(3)\fP. The DNS question name will be returned in the variable pointed to by the .IR name -parameter, this may be provided as NULL if the name is not needed. +parameter, this may be provided as NULL if the name is not needed. This pointer +will be invalided by any call to \fIares_dns_record_query_set_name(3)\fP. The DNS question type will be returned in the variable pointed to by the .IR qtype parameter, this may be provided as NULL if the type is not needed. diff --git a/deps/cares/docs/ares_dns_record_duplicate.3 b/deps/cares/docs/ares_dns_record_duplicate.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_duplicate.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_query_set_name.3 b/deps/cares/docs/ares_dns_record_query_set_name.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_query_set_name.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_query_set_type.3 b/deps/cares/docs/ares_dns_record_query_set_type.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_query_set_type.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_rr_get_const.3 b/deps/cares/docs/ares_dns_record_rr_get_const.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_record_rr_get_const.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr.3 b/deps/cares/docs/ares_dns_rr.3 index 2999d18e3aa6bb..290859e838e7ef 100644 --- a/deps/cares/docs/ares_dns_rr.3 +++ b/deps/cares/docs/ares_dns_rr.3 @@ -4,14 +4,15 @@ .TH ARES_DNS_RR 3 "12 November 2023" .SH NAME ares_dns_record_rr_add, ares_dns_record_rr_cnt, ares_dns_record_rr_del, -ares_dns_record_rr_get, ares_dns_rr_get_addr, ares_dns_rr_get_addr6, -ares_dns_rr_get_bin, ares_dns_rr_get_class, ares_dns_rr_get_name, -ares_dns_rr_get_opt, ares_dns_rr_get_opt_byid, ares_dns_rr_get_opt_cnt, -ares_dns_rr_get_str, ares_dns_rr_get_ttl, ares_dns_rr_get_type, -ares_dns_rr_get_u16, ares_dns_rr_get_u32, ares_dns_rr_get_u8, ares_dns_rr_key_t, -ares_dns_rr_set_addr, ares_dns_rr_set_addr6, ares_dns_rr_set_bin, -ares_dns_rr_set_opt, ares_dns_rr_set_str, ares_dns_rr_set_u16, -ares_dns_rr_set_u32, ares_dns_rr_set_u8, ares_dns_section_t, ares_tlsa_match_t, +ares_dns_record_rr_get, ares_dns_record_rr_get_const, ares_dns_rr_get_addr, +ares_dns_rr_get_addr6, ares_dns_rr_get_bin, ares_dns_rr_get_class, +ares_dns_rr_get_name, ares_dns_rr_get_opt, ares_dns_rr_get_opt_byid, +ares_dns_rr_get_opt_cnt, ares_dns_rr_get_str, ares_dns_rr_get_ttl, +ares_dns_rr_get_type, ares_dns_rr_get_u16, ares_dns_rr_get_u32, +ares_dns_rr_get_u8, ares_dns_rr_key_t, ares_dns_rr_set_addr, +ares_dns_rr_set_addr6, ares_dns_rr_set_bin, ares_dns_rr_set_opt, +ares_dns_rr_set_str, ares_dns_rr_set_u16, ares_dns_rr_set_u32, +ares_dns_rr_set_u8, ares_dns_section_t, ares_tlsa_match_t, ares_tlsa_selector_t, ares_tlsa_usage_t \- DNS Resource Record creating, reading, and writing functions. .SH SYNOPSIS @@ -33,6 +34,10 @@ ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, ares_dns_section_t sect, size_t idx); +const ares_dns_rr_t *ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, ares_dns_section_t sect, size_t idx); @@ -357,14 +362,17 @@ parameter, and the Time To Live (TTL) in the parameter. -The \fIares_dns_record_rr_get(3)\fP function is used to retrieve the resource -record pointer from the DNS record provided in the +The \fIares_dns_record_rr_get(3)\fP and \fIares_dns_record_rr_get_const(3)\fP +functions are used to retrieve the resource record pointer from the DNS record +provided in the .IR dnsrec parameter, for the resource record section provided in the .IR sect parameter, for the specified index in the .IR idx -parameter. The index must be less than \fIares_dns_record_rr_cnt(3)\fP. +parameter. The index must be less than \fIares_dns_record_rr_cnt(3)\fP. The +former returns a writable pointer to the resource record, while the latter +returns a read-only pointer to the resource record. The \fIares_dns_record_rr_del(3)\fP is used to delete a resource record from @@ -615,8 +623,8 @@ prescribed datatype values and in general can't fail except for misuse cases, in which a 0 (or NULL) may be returned, however 0 can also be a valid return value for most of these functions. -\fIares_dns_record_rr_get(3)\fP will return the requested resource record -pointer or NULL on failure (misuse). +\fIares_dns_record_rr_get(3)\fP and \fIares_dns_record_rr_get_const(3)\fP will +return the requested resource record pointer or NULL on failure (misuse). \fIares_dns_rr_get_opt_byid(3)\fP will return ARES_TRUE if the option was found, otherwise ARES_FALSE if not found (or misuse). diff --git a/deps/cares/docs/ares_init_options.3 b/deps/cares/docs/ares_init_options.3 index 000cc1d9a592b5..72889b5b4874ef 100644 --- a/deps/cares/docs/ares_init_options.3 +++ b/deps/cares/docs/ares_init_options.3 @@ -158,7 +158,7 @@ before giving up. The default is three tries. The number of dots which must be present in a domain name for it to be queried for "as is" prior to querying for it with the default domain extensions appended. The default value is 1 unless set otherwise by -resolv.conf or the RES_OPTIONS environment variable. +resolv.conf or the RES_OPTIONS environment variable. Valid range is 0-15. .TP 18 .B ARES_OPT_MAXTIMEOUTMS .B int \fImaxtimeout\fP; diff --git a/deps/cares/docs/ares_query.3 b/deps/cares/docs/ares_query.3 index 00e44f52594d90..24decf7009441b 100644 --- a/deps/cares/docs/ares_query.3 +++ b/deps/cares/docs/ares_query.3 @@ -9,19 +9,32 @@ ares_query \- Initiate a single-question DNS query .nf #include -typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, - int \fItimeouts\fP, unsigned char *\fIabuf\fP, - int \fIalen\fP) +typedef void (*ares_callback_dnsrec)(void *arg, ares_status_t status, + size_t timeouts, + const ares_dns_record_t *dnsrec); + +ares_status_t ares_query_dnsrec(ares_channel_t *channel, + const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, + ares_callback_dnsrec callback, + void *arg, + unsigned short *qid); + +typedef void (*ares_callback)(void *arg, int status, + int timeouts, unsigned char *abuf, + int alen); + +void ares_query(ares_channel_t *channel, const char *name, + int dnsclass, int type, + ares_callback callback, void *arg); -void ares_query(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, - int \fIdnsclass\fP, int \fItype\fP, - ares_callback \fIcallback\fP, void *\fIarg\fP) .fi + .SH DESCRIPTION -The -.B ares_query -function initiates a single-question DNS query on the name service -channel identified by + +The \fBares_query_dnsrec(3)\fP and \fBares_query(3)\fP functions initiate a +single-question DNS query on the name service channel identified by .IR channel . The parameter .I name @@ -31,27 +44,27 @@ a label must be escaped with a backslash. The parameters .I dnsclass and .I type -give the class and type of the query using the values defined in -.BR . +give the class and type of the query. + +\fBares_query_dnsrec(3)\fP uses the ares \fBares_dns_class_t\fP and +\fBares_dns_rec_type_t\fP defined types. However, \fBares_query(3)\fP uses +the values defined in \fB\fP. + When the query is complete or has failed, the ares library will invoke .IR callback . -Completion or failure of the query may happen immediately, or may -happen during a later call to -.BR ares_process (3) -or -.BR ares_destroy (3). -.PP +Completion or failure of the query may happen immediately (even before the +return of the function call), or may happen during a later call to +\fBares_process(3)\fP or \fBares_destroy(3)\fP. + If this is called from a thread other than which the main program event loop is running, care needs to be taken to ensure any file descriptor lists are updated immediately within the eventloop. When the associated callback is called, it is called with a channel lock so care must be taken to ensure any processing is minimal to prevent DNS channel stalls. -.PP + The callback argument .I arg -is copied from the -.B ares_query -argument +is copied from the \fBares_query_dnsrec(3)\fP or \fBares_query(3)\fP argument .IR arg . The callback argument .I status @@ -73,9 +86,7 @@ The query completed but the server claims to have experienced a failure. (This code can only occur if the .B ARES_FLAG_NOCHECKRESP flag was specified at channel initialization time; otherwise, such -responses are ignored at the -.BR ares_send (3) -level.) +responses are ignored at the \fBares_send_dnsrec(3)\fP level.) .TP 19 .B ARES_ENOTFOUND The query completed but the queried-for domain name was not found. @@ -85,18 +96,14 @@ The query completed but the server does not implement the operation requested by the query. (This code can only occur if the .B ARES_FLAG_NOCHECKRESP flag was specified at channel initialization time; otherwise, such -responses are ignored at the -.BR ares_send (3) -level.) +responses are ignored at the \fBares_send_dnsrec(3)\fP level.) .TP 19 .B ARES_EREFUSED The query completed but the server refused the query. (This code can only occur if the .B ARES_FLAG_NOCHECKRESP flag was specified at channel initialization time; otherwise, such -responses are ignored at the -.BR ares_send (3) -level.) +responses are ignored at the \fBares_send_dnsrec(3)\fP level.) .TP 19 .B ARES_EBADNAME The query name @@ -126,23 +133,26 @@ is being destroyed; the query will not be completed. The query will not be completed because no DNS servers were configured on the channel. .PP + The callback argument .I timeouts reports how many times a query timed out during the execution of the given request. -.PP + If the query completed (even if there was something wrong with it, as indicated by some of the above error codes), the callback argument +.I dnsrec +or .I abuf -points to a result buffer of length -.IR alen . -If the query did not complete, -.I abuf -will be NULL and -.I alen -will be 0. +will be non-NULL, otherwise they will be NULL. + +.SH AVAILABILITY +\fBares_query_dnsrec(3)\fP was introduced in c-ares 1.28.0. + .SH SEE ALSO -.BR ares_process (3) +.BR ares_process (3), +.BR ares_dns_record (3) + .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/deps/cares/docs/ares_query_dnsrec.3 b/deps/cares/docs/ares_query_dnsrec.3 new file mode 100644 index 00000000000000..b178e987646055 --- /dev/null +++ b/deps/cares/docs/ares_query_dnsrec.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_query.3 diff --git a/deps/cares/docs/ares_queue.3 b/deps/cares/docs/ares_queue.3 new file mode 100644 index 00000000000000..1212e8d3f8c3cc --- /dev/null +++ b/deps/cares/docs/ares_queue.3 @@ -0,0 +1,53 @@ +.\" +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_QUEUE 3 "16 February 2024" +.SH NAME +ares_queue_wait_empty, ares_queue_active_queries \- Functions for checking the +c-ares queue status +.SH SYNOPSIS +.nf +#include + +size_t ares_queue_active_queries(ares_channel_t *channel); + +ares_status_t ares_queue_wait_empty(ares_channel_t *channel, + int timeout_ms); +.fi +.SH DESCRIPTION +The \fBares_queue_active_queries(3)\fP function retrieves the total number of +active queries pending answers from servers. Some c-ares requests may spawn +multiple queries, such as \fIares_getaddrinfo(3)\fP when using \fIAF_UNSPEC\fP, +which will be reflected in this number. The \fBchannel\fP parameter must be set +to an initialized channel. + +The \fBares_queue_wait_empty(3)\fP function blocks until notified that there are +no longer any queries in queue, or the specified timeout has expired. The +\fBchannel\fP parameter must be set to an initialized channel. The +\fBtimeout_ms\fP parameter is the number of milliseconds to wait for the queue +to be empty or -1 for Infinite. + +.SH RETURN VALUES +\fIares_queue_active_queries(3)\fP returns the active query count. + +\fIares_queue_wait_empty(3)\fP can return any of the following values: +.TP 14 +.B ARES_ENOTIMP +if not built with threading support +.TP 14 +.B ARES_ETIMEOUT +if requested timeout expired +.TP 14 +.B ARES_SUCCESS +when queue is empty. +.TP 14 + +.SH AVAILABILITY +This function was first introduced in c-ares version 1.27.0, and requires the +c-ares library to be built with threading support. + +.SH SEE ALSO +.BR ares_init_options (3), +.BR ares_threadsafety (3) +.SH AUTHOR +Copyright (C) 2024 The c-ares project and its members. diff --git a/deps/cares/docs/ares_queue_active_queries.3 b/deps/cares/docs/ares_queue_active_queries.3 new file mode 100644 index 00000000000000..c16c69ddcb9e02 --- /dev/null +++ b/deps/cares/docs/ares_queue_active_queries.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2024 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_queue.3 diff --git a/deps/cares/docs/ares_queue_wait_empty.3 b/deps/cares/docs/ares_queue_wait_empty.3 new file mode 100644 index 00000000000000..c16c69ddcb9e02 --- /dev/null +++ b/deps/cares/docs/ares_queue_wait_empty.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2024 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_queue.3 diff --git a/deps/cares/docs/ares_search.3 b/deps/cares/docs/ares_search.3 index 08246d349d02fd..1a324b0ff47db5 100644 --- a/deps/cares/docs/ares_search.3 +++ b/deps/cares/docs/ares_search.3 @@ -9,13 +9,23 @@ ares_search \- Initiate a DNS query with domain search .nf #include +typedef void (*ares_callback_dnsrec)(void *\fIarg\fP, + ares_status_t \fIstatus\fP, + size_t \fItimeouts\fP, + const ares_dns_record_t *\fIdnsrec\fP); + +void ares_search_dnsrec(ares_channel_t *\fIchannel\fP, + const ares_dns_record_t *\fIdnsrec\fP, + ares_callback_dnsrec \fIcallback\fP, void *\fIarg\fP); + typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, unsigned char *\fIabuf\fP, - int \fIalen\fP) + int \fIalen\fP); void ares_search(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP, - ares_callback \fIcallback\fP, void *\fIarg\fP) + ares_callback \fIcallback\fP, void *\fIarg\fP); + .fi .SH DESCRIPTION The @@ -142,9 +152,34 @@ will usually be NULL and will usually be 0, but in some cases an unsuccessful query result may be placed in .IR abuf . + +The \fIares_search_dnsrec(3)\fP function behaves identically to +\fIares_search(3)\fP, but takes an initialized and filled DNS record object to +use for queries as the second argument +.I dnsrec +instead of a name, class and type. This object is used as the base for the +queries and must itself represent a valid query for a single name. Note that +the search domains will only be appended to the name in the question section; +RRs on the DNS record object will not be affected. Moreover, the +.I callback +argument is of type \fIares_callback_dnsrec\fP. This callback behaves +identically to \fIares_callback\fP, but is invoked with a parsed DNS record +object +.I dnsrec +rather than a raw buffer with length. Note that this object is read-only. + +The \fIares_search_dnsrec(3)\fP function returns an \fIares_status_t\fP response +code. This may be useful to know that the query was enqueued properly. The +response code does not reflect the result of the query, just the result of the +enqueuing of the query. + +.SH AVAILABILITY +\fBares_search_dnsrec(3)\fP was introduced in c-ares 1.28.0. + .SH SEE ALSO .BR ares_process (3), .BR ares_dns_record (3) + .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/deps/cares/docs/ares_search_dnsrec.3 b/deps/cares/docs/ares_search_dnsrec.3 new file mode 100644 index 00000000000000..86c2317c071144 --- /dev/null +++ b/deps/cares/docs/ares_search_dnsrec.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_search.3 diff --git a/deps/cares/docs/ares_send.3 b/deps/cares/docs/ares_send.3 index 1fe1c0273e7379..010bb2579174bd 100644 --- a/deps/cares/docs/ares_send.3 +++ b/deps/cares/docs/ares_send.3 @@ -9,46 +9,78 @@ ares_send \- Initiate a DNS query .nf #include -typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, - int \fItimeouts\fP, unsigned char *\fIabuf\fP, - int \fIalen\fP) +typedef void (*ares_callback_dnsrec)(void *arg, ares_status_t status, + size_t timeouts, + const ares_dns_record_t *dnsrec); + +ares_status_t ares_send_dnsrec(ares_channel_t *channel, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, + void *arg, unsigned short *qid); + +typedef void (*ares_callback)(void *arg, int status, + int timeouts, unsigned char *abuf, + int alen); + +void ares_send(ares_channel_t *channel, const unsigned char *qbuf, + int qlen, ares_callback callback, void *arg); -void ares_send(ares_channel_t *\fIchannel\fP, const unsigned char *\fIqbuf\fP, - int \fIqlen\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) .fi .SH DESCRIPTION -The -.B ares_send -function initiates a DNS query on the name service channel identified -by -.IR channel . -The parameters -.I qbuf +The \fIares_send_dnsrec(3)\fP function initiates a DNS query formatted using the +\fIares_dns_record_t *\fP data structure created via +\fIares_dns_record_create(3)\fP in the +.IR dnsrec +parameter. The supplied callback in the +.IR callback +parameter also returns the response using a +\fIares_dns_record_t *\fP data structure. + +The \fIares_send(3)\fP function similarly initiates a DNS query, but instead uses +raw binary buffers with fully formatted DNS messages passed in the request via the +.IR qbuf and -.I qlen -give the DNS query, which should already have been formatted according -to the DNS protocol. When the query is complete or has failed, the -ares library will invoke -.IR callback . -Completion or failure of the query may happen immediately, or may -happen later as network events are processed. -.PP +.IR qlen +parameters. The supplied callback in the +.IR callback +parameter also returns the raw binary DNS response in the +.IR abuf +and +.IR alen +parameters. This method should be considered deprecated in favor of +\fIares_send_dnsrec(3)\fP. + +Both functions take an initialized ares channel identified by +.IR channel . + +The \fIares_send_dnsrec(3)\fP also can be supplied an optional output parameter of +.IR qid +to populate the query id as it was placed on the wire. + +The \fIares_send_dnsrec(3)\fP function returns an \fIares_status_t\fP response +code. This may be useful to know that the query was enqueued properly. The +response code does not reflect the result of the query, just the result of the +enqueuing of the query. + +Completion or failure of the query may happen immediately (even before the +function returning), or may happen later as network events are processed. + When the associated callback is called, it is called with a channel lock so care must be taken to ensure any processing is minimal to prevent DNS channel stalls. The callback may be triggered from a different thread than the one which -called \fIares_send(3)\fP. +called \fIares_send_dnsrec(3)\fP or \fIares_send(3)\fP. For integrators running their own event loops and not using \fBARES_OPT_EVENT_THREAD\fP, care needs to be taken to ensure any file descriptor lists are updated immediately within the eventloop when notified. -.PP + The callback argument -.I arg -is copied from the -.B ares_send -argument -.IR arg . +.IR arg +is copied from the \fIares_send_dnsrec(3)\fP or \fIares_send(3)\fP +.IR arg +parameter. + The callback argument .I status indicates whether the query succeeded and, if not, how it failed. It @@ -82,43 +114,44 @@ is being destroyed; the query will not be completed. The query will not be completed because no DNS servers were configured on the channel. .PP + The callback argument .I timeouts reports how many times a query timed out during the execution of the given request. -.PP + If the query completed, the callback argument -.I abuf -points to a result buffer of length -.IR alen . -If the query did not complete, -.I abuf -will be NULL and -.I alen -will be 0. -.PP +.IR dnsrec +for \fIares_send_dnsrec(3)\fP or +.IR abuf +and +.IR alen +for \fIares_send(3)\fP will be non-NULL. + Unless the flag .B ARES_FLAG_NOCHECKRESP -was set at channel initialization time, -.B ares_send -will normally ignore responses whose questions do not match the -questions in -.IR qbuf , -as well as responses with reply codes of +was set at channel initialization time, \fIares_send_dnsrec(3)\fP and +\fIares_send(3)\fP will normally ignore responses whose questions do not match +the supplied questions, as well as responses with reply codes of .BR SERVFAIL , .BR NOTIMP , and .BR REFUSED . Unlike other query functions in the ares library, however, -.B ares_send -does not inspect the header of the reply packet to determine the error -status, so a callback status of +\fIares_send_dnsrec(3)\fP and \fIares_send(3)\fP do not inspect the header of +the reply packet to determine the error status, so a callback status of .B ARES_SUCCESS -does not reflect as much about the response as for other query -functions. +does not reflect as much about the response as for other query functions. + +.SH AVAILABILITY +\fBares_send_dnsrec(3)\fP was introduced in c-ares 1.28.0. + .SH SEE ALSO +.BR ares_dns_record_create (3), .BR ares_process (3), +.BR ares_search (3), .BR ares_dns_record (3) + .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/deps/cares/docs/ares_send_dnsrec.3 b/deps/cares/docs/ares_send_dnsrec.3 new file mode 100644 index 00000000000000..f5596f5cf049bc --- /dev/null +++ b/deps/cares/docs/ares_send_dnsrec.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_send.3 diff --git a/deps/cares/include/Makefile.in b/deps/cares/include/Makefile.in index cf8cb55170cc8b..6e06995bfc5a3b 100644 --- a/deps/cares/include/Makefile.in +++ b/deps/cares/include/Makefile.in @@ -274,6 +274,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ diff --git a/deps/cares/include/ares.h b/deps/cares/include/ares.h index acbd6583074a56..bc17230e47262f 100644 --- a/deps/cares/include/ares.h +++ b/deps/cares/include/ares.h @@ -119,6 +119,37 @@ extern "C" { # endif #endif +#ifdef __GNUC__ +# define CARES_GCC_VERSION \ + (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#else +# define CARES_GCC_VERSION 0 +#endif + +#ifndef __has_attribute +# define __has_attribute(x) 0 +#endif + +#ifdef CARES_NO_DEPRECATED +# define CARES_DEPRECATED +# define CARES_DEPRECATED_FOR(f) +#else +# if CARES_GCC_VERSION >= 30200 || __has_attribute(__deprecated__) +# define CARES_DEPRECATED __attribute__((__deprecated__)) +# else +# define CARES_DEPRECATED +# endif + +# if CARES_GCC_VERSION >= 40500 || defined(__clang__) +# define CARES_DEPRECATED_FOR(f) \ + __attribute__((deprecated("Use " #f " instead"))) +# elif defined(_MSC_VER) +# define CARES_DEPRECATED_FOR(f) __declspec(deprecated("Use " #f " instead")) +# else +# define CARES_DEPRECATED_FOR(f) CARES_DEPRECATED +# endif +#endif + typedef enum { ARES_SUCCESS = 0, @@ -352,29 +383,57 @@ typedef struct ares_channeldata *ares_channel; /* Current main channel typedef */ typedef struct ares_channeldata ares_channel_t; +/* + * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr + * struct below when ares itself was built, but many apps would use this + * private version since the header checked a HAVE_* define for it. Starting + * with 1.7.0 we always declare and use our own to stop relying on the + * system's one. + */ +struct ares_in6_addr { + union { + unsigned char _S6_u8[16]; + } _S6_un; +}; + +struct ares_addr { + int family; + + union { + struct in_addr addr4; + struct ares_in6_addr addr6; + } addr; +}; + +/* DNS record parser, writer, and helpers */ +#include "ares_dns_record.h" -typedef void (*ares_callback)(void *arg, int status, int timeouts, +typedef void (*ares_callback)(void *arg, int status, int timeouts, unsigned char *abuf, int alen); -typedef void (*ares_host_callback)(void *arg, int status, int timeouts, +typedef void (*ares_callback_dnsrec)(void *arg, ares_status_t status, + size_t timeouts, + const ares_dns_record_t *dnsrec); + +typedef void (*ares_host_callback)(void *arg, int status, int timeouts, struct hostent *hostent); -typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts, +typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts, char *node, char *service); -typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, int type, +typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, int type, void *data); -typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, int type, +typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, int type, void *data); -typedef void (*ares_addrinfo_callback)(void *arg, int status, int timeouts, +typedef void (*ares_addrinfo_callback)(void *arg, int status, int timeouts, struct ares_addrinfo *res); CARES_EXTERN int ares_library_init(int flags); CARES_EXTERN int ares_library_init_mem(int flags, void *(*amalloc)(size_t size), - void (*afree)(void *ptr), + void (*afree)(void *ptr), void *(*arealloc)(void *ptr, size_t size)); @@ -384,13 +443,14 @@ CARES_EXTERN int ares_library_init_android(jobject connectivity_manager); CARES_EXTERN int ares_library_android_initialized(void); #endif -CARES_EXTERN int ares_library_initialized(void); +CARES_EXTERN int ares_library_initialized(void); -CARES_EXTERN void ares_library_cleanup(void); +CARES_EXTERN void ares_library_cleanup(void); -CARES_EXTERN const char *ares_version(int *version); +CARES_EXTERN const char *ares_version(int *version); -CARES_EXTERN int ares_init(ares_channel_t **channelptr); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_init_options) int ares_init( + ares_channel_t **channelptr); CARES_EXTERN int ares_init_options(ares_channel_t **channelptr, const struct ares_options *options, @@ -453,7 +513,7 @@ struct iovec; struct ares_socket_functions { ares_socket_t (*asocket)(int, int, int, void *); - int (*aclose)(ares_socket_t, void *); + int (*aclose)(ares_socket_t, void *); int (*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t, void *); ares_ssize_t (*arecvfrom)(ares_socket_t, void *, size_t, int, @@ -462,24 +522,76 @@ struct ares_socket_functions { }; CARES_EXTERN void - ares_set_socket_functions(ares_channel_t *channel, - const struct ares_socket_functions *funcs, - void *user_data); + ares_set_socket_functions(ares_channel_t *channel, + const struct ares_socket_functions *funcs, + void *user_data); + +CARES_EXTERN CARES_DEPRECATED_FOR(ares_send_dnsrec) void ares_send( + ares_channel_t *channel, const unsigned char *qbuf, int qlen, + ares_callback callback, void *arg); -CARES_EXTERN void ares_send(ares_channel_t *channel, const unsigned char *qbuf, - int qlen, ares_callback callback, void *arg); +/*! Send a DNS query as an ares_dns_record_t with a callback containing the + * parsed DNS record. + * + * \param[in] channel Pointer to channel on which queries will be sent. + * \param[in] dnsrec DNS Record to send + * \param[in] callback Callback function invoked on completion or failure of + * the query sequence. + * \param[in] arg Additional argument passed to the callback function. + * \param[out] qid Query ID + * \return One of the c-ares status codes. + */ +CARES_EXTERN ares_status_t ares_send_dnsrec(ares_channel_t *channel, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, + void *arg, unsigned short *qid); -CARES_EXTERN void ares_query(ares_channel_t *channel, const char *name, - int dnsclass, int type, ares_callback callback, - void *arg); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_query_dnsrec) void ares_query( + ares_channel_t *channel, const char *name, int dnsclass, int type, + ares_callback callback, void *arg); -CARES_EXTERN void ares_search(ares_channel_t *channel, const char *name, - int dnsclass, int type, ares_callback callback, - void *arg); +/*! Perform a DNS query with a callback containing the parsed DNS record. + * + * \param[in] channel Pointer to channel on which queries will be sent. + * \param[in] name Query name + * \param[in] dnsclass DNS Class + * \param[in] type DNS Record Type + * \param[in] callback Callback function invoked on completion or failure of + * the query sequence. + * \param[in] arg Additional argument passed to the callback function. + * \param[out] qid Query ID + * \return One of the c-ares status codes. + */ +CARES_EXTERN ares_status_t ares_query_dnsrec(ares_channel_t *channel, + const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, + ares_callback_dnsrec callback, + void *arg, unsigned short *qid); + +CARES_EXTERN CARES_DEPRECATED_FOR(ares_search_dnsrec) void ares_search( + ares_channel_t *channel, const char *name, int dnsclass, int type, + ares_callback callback, void *arg); + +/*! Search for a complete DNS message. + * + * \param[in] channel Pointer to channel on which queries will be sent. + * \param[in] dnsrec Pointer to initialized and filled DNS record object. + * \param[in] callback Callback function invoked on completion or failure of + * the query sequence. + * \param[in] arg Additional argument passed to the callback function. + * \return One of the c-ares status codes. In all cases, except + * ARES_EFORMERR due to misuse, this error code will also be sent + * to the provided callback. + */ +CARES_EXTERN ares_status_t ares_search_dnsrec(ares_channel_t *channel, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, + void *arg); -CARES_EXTERN void ares_gethostbyname(ares_channel_t *channel, const char *name, - int family, ares_host_callback callback, - void *arg); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_getaddrinfo) void ares_gethostbyname( + ares_channel_t *channel, const char *name, int family, + ares_host_callback callback, void *arg); CARES_EXTERN int ares_gethostbyname_file(ares_channel_t *channel, const char *name, int family, @@ -494,61 +606,42 @@ CARES_EXTERN void ares_getnameinfo(ares_channel_t *channel, ares_socklen_t salen, int flags, ares_nameinfo_callback callback, void *arg); -CARES_EXTERN int ares_fds(ares_channel_t *channel, fd_set *read_fds, - fd_set *write_fds); +CARES_EXTERN CARES_DEPRECATED_FOR( + ARES_OPT_EVENT_THREAD or + ARES_OPT_SOCK_STATE_CB) int ares_fds(ares_channel_t *channel, + fd_set *read_fds, fd_set *write_fds); -CARES_EXTERN int ares_getsock(ares_channel_t *channel, ares_socket_t *socks, - int numsocks); +CARES_EXTERN CARES_DEPRECATED_FOR( + ARES_OPT_EVENT_THREAD or + ARES_OPT_SOCK_STATE_CB) int ares_getsock(ares_channel_t *channel, + ares_socket_t *socks, int numsocks); CARES_EXTERN struct timeval *ares_timeout(ares_channel_t *channel, struct timeval *maxtv, struct timeval *tv); -CARES_EXTERN void ares_process(ares_channel_t *channel, fd_set *read_fds, - fd_set *write_fds); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_process_fd) void ares_process( + ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds); CARES_EXTERN void ares_process_fd(ares_channel_t *channel, ares_socket_t read_fd, ares_socket_t write_fd); -CARES_EXTERN int ares_create_query(const char *name, int dnsclass, int type, - unsigned short id, int rd, - unsigned char **buf, int *buflen, - int max_udp_size); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_record_create) int ares_create_query( + const char *name, int dnsclass, int type, unsigned short id, int rd, + unsigned char **buf, int *buflen, int max_udp_size); -CARES_EXTERN int ares_mkquery(const char *name, int dnsclass, int type, - unsigned short id, int rd, unsigned char **buf, - int *buflen); - -CARES_EXTERN int ares_expand_name(const unsigned char *encoded, - const unsigned char *abuf, int alen, char **s, - long *enclen); - -CARES_EXTERN int ares_expand_string(const unsigned char *encoded, - const unsigned char *abuf, int alen, - unsigned char **s, long *enclen); - -/* - * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr - * struct below when ares itself was built, but many apps would use this - * private version since the header checked a HAVE_* define for it. Starting - * with 1.7.0 we always declare and use our own to stop relying on the - * system's one. - */ -struct ares_in6_addr { - union { - unsigned char _S6_u8[16]; - } _S6_un; -}; +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_record_create) int ares_mkquery( + const char *name, int dnsclass, int type, unsigned short id, int rd, + unsigned char **buf, int *buflen); -struct ares_addr { - int family; +CARES_EXTERN int ares_expand_name(const unsigned char *encoded, + const unsigned char *abuf, int alen, char **s, + long *enclen); - union { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; -}; +CARES_EXTERN int ares_expand_string(const unsigned char *encoded, + const unsigned char *abuf, int alen, + unsigned char **s, long *enclen); struct ares_addrttl { struct in_addr ipaddr; @@ -675,52 +768,50 @@ struct ares_addrinfo_hints { ** so written. */ -CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf, int alen, - struct hostent **host, - struct ares_addrttl *addrttls, - int *naddrttls); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_a_reply( + const unsigned char *abuf, int alen, struct hostent **host, + struct ares_addrttl *addrttls, int *naddrttls); -CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, - struct hostent **host, - struct ares_addr6ttl *addrttls, - int *naddrttls); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_aaaa_reply( + const unsigned char *abuf, int alen, struct hostent **host, + struct ares_addr6ttl *addrttls, int *naddrttls); -CARES_EXTERN int ares_parse_caa_reply(const unsigned char *abuf, int alen, - struct ares_caa_reply **caa_out); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_caa_reply( + const unsigned char *abuf, int alen, struct ares_caa_reply **caa_out); -CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf, int alen, - const void *addr, int addrlen, int family, - struct hostent **host); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_ptr_reply( + const unsigned char *abuf, int alen, const void *addr, int addrlen, + int family, struct hostent **host); -CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf, int alen, - struct hostent **host); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_ns_reply( + const unsigned char *abuf, int alen, struct hostent **host); -CARES_EXTERN int ares_parse_srv_reply(const unsigned char *abuf, int alen, - struct ares_srv_reply **srv_out); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_srv_reply( + const unsigned char *abuf, int alen, struct ares_srv_reply **srv_out); -CARES_EXTERN int ares_parse_mx_reply(const unsigned char *abuf, int alen, - struct ares_mx_reply **mx_out); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_mx_reply( + const unsigned char *abuf, int alen, struct ares_mx_reply **mx_out); -CARES_EXTERN int ares_parse_txt_reply(const unsigned char *abuf, int alen, - struct ares_txt_reply **txt_out); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_txt_reply( + const unsigned char *abuf, int alen, struct ares_txt_reply **txt_out); -CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char *abuf, int alen, - struct ares_txt_ext **txt_out); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_txt_reply_ext( + const unsigned char *abuf, int alen, struct ares_txt_ext **txt_out); -CARES_EXTERN int ares_parse_naptr_reply(const unsigned char *abuf, int alen, - struct ares_naptr_reply **naptr_out); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_naptr_reply( + const unsigned char *abuf, int alen, struct ares_naptr_reply **naptr_out); -CARES_EXTERN int ares_parse_soa_reply(const unsigned char *abuf, int alen, - struct ares_soa_reply **soa_out); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_soa_reply( + const unsigned char *abuf, int alen, struct ares_soa_reply **soa_out); -CARES_EXTERN int ares_parse_uri_reply(const unsigned char *abuf, int alen, - struct ares_uri_reply **uri_out); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_uri_reply( + const unsigned char *abuf, int alen, struct ares_uri_reply **uri_out); -CARES_EXTERN void ares_free_string(void *str); +CARES_EXTERN void ares_free_string(void *str); -CARES_EXTERN void ares_free_hostent(struct hostent *host); +CARES_EXTERN void ares_free_hostent(struct hostent *host); -CARES_EXTERN void ares_free_data(void *dataptr); +CARES_EXTERN void ares_free_data(void *dataptr); CARES_EXTERN const char *ares_strerror(int code); @@ -747,23 +838,26 @@ struct ares_addr_port_node { int tcp_port; }; -CARES_EXTERN int ares_set_servers(ares_channel_t *channel, - const struct ares_addr_node *servers); -CARES_EXTERN int - ares_set_servers_ports(ares_channel_t *channel, - const struct ares_addr_port_node *servers); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_set_servers_csv) int ares_set_servers( + ares_channel_t *channel, const struct ares_addr_node *servers); + +CARES_EXTERN + CARES_DEPRECATED_FOR(ares_set_servers_ports_csv) int ares_set_servers_ports( + ares_channel_t *channel, const struct ares_addr_port_node *servers); /* Incoming string format: host[:port][,host[:port]]... */ -CARES_EXTERN int ares_set_servers_csv(ares_channel_t *channel, - const char *servers); -CARES_EXTERN int ares_set_servers_ports_csv(ares_channel_t *channel, - const char *servers); -CARES_EXTERN char *ares_get_servers_csv(ares_channel_t *channel); +CARES_EXTERN int ares_set_servers_csv(ares_channel_t *channel, + const char *servers); +CARES_EXTERN int ares_set_servers_ports_csv(ares_channel_t *channel, + const char *servers); +CARES_EXTERN char *ares_get_servers_csv(ares_channel_t *channel); -CARES_EXTERN int ares_get_servers(ares_channel_t *channel, - struct ares_addr_node **servers); -CARES_EXTERN int ares_get_servers_ports(ares_channel_t *channel, - struct ares_addr_port_node **servers); +CARES_EXTERN CARES_DEPRECATED_FOR(ares_get_servers_csv) int ares_get_servers( + ares_channel_t *channel, struct ares_addr_node **servers); + +CARES_EXTERN + CARES_DEPRECATED_FOR(ares_get_servers_ports_csv) int ares_get_servers_ports( + ares_channel_t *channel, struct ares_addr_port_node **servers); CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size); @@ -803,7 +897,4 @@ CARES_EXTERN size_t ares_queue_active_queries(ares_channel_t *channel); } #endif -/* DNS record parser, writer, and helpers */ -#include "ares_dns_record.h" - #endif /* ARES__H */ diff --git a/deps/cares/include/ares_dns_record.h b/deps/cares/include/ares_dns_record.h index 3f802aefa3231e..8d09bd0a464254 100644 --- a/deps/cares/include/ares_dns_record.h +++ b/deps/cares/include/ares_dns_record.h @@ -393,11 +393,11 @@ typedef enum { /*! Parse Additional from RFC 1035 that allow name compression as RAW */ ARES_DNS_PARSE_AR_BASE_RAW = 1 << 2, /*! Parse Answers from later RFCs (no name compression) RAW */ - ARES_DNS_PARSE_AN_EXT_RAW = 1 << 3, + ARES_DNS_PARSE_AN_EXT_RAW = 1 << 3, /*! Parse Authority from later RFCs (no name compression) as RAW */ - ARES_DNS_PARSE_NS_EXT_RAW = 1 << 4, - /*< Parse Additional from later RFCs (no name compression) as RAW */ - ARES_DNS_PARSE_AR_EXT_RAW = 1 << 5 + ARES_DNS_PARSE_NS_EXT_RAW = 1 << 4, + /*! Parse Additional from later RFCs (no name compression) as RAW */ + ARES_DNS_PARSE_AR_EXT_RAW = 1 << 5 } ares_dns_parse_flags_t; /*! String representation of DNS Record Type @@ -468,7 +468,7 @@ CARES_EXTERN const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode); * \param[in] ipaddr ASCII string form of the ip address * \param[in,out] addr Must set "family" member to one of AF_UNSPEC, * AF_INET, AF_INET6 on input. - * \param[out] ptr_len Length of binary form address + * \param[out] out_len Length of binary form address * \return Pointer to start of binary address or NULL on error. */ CARES_EXTERN const void *ares_dns_pton(const char *ipaddr, @@ -619,6 +619,32 @@ CARES_EXTERN ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec, ares_dns_rec_type_t qtype, ares_dns_class_t qclass); +/*! Replace the question name with a new name. This may be used when performing + * a search with aliases. + * + * Note that this will invalidate the name pointer returned from + * ares_dns_record_query_get(). + * + * \param[in] dnsrec Initialized record object + * \param[in] idx Index of question (typically 0) + * \param[in] name Name to use as replacement. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_record_query_set_name( + ares_dns_record_t *dnsrec, size_t idx, const char *name); + + +/*! Replace the question type with a different type. This may be used when + * needing to query more than one address class (e.g. A and AAAA) + * + * \param[in] dnsrec Initialized record object + * \param[in] idx Index of question (typically 0) + * \param[in] qtype Record Type to use as replacement. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_record_query_set_type( + ares_dns_record_t *dnsrec, size_t idx, ares_dns_rec_type_t qtype); + /*! Get the count of queries in the DNS Record * * \param[in] dnsrec Initialized record object @@ -631,6 +657,8 @@ CARES_EXTERN size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec); * \param[in] dnsrec Initialized record object * \param[in] idx Index of query * \param[out] name Optional. Returns name, may pass NULL if not desired. + * This pointer will be invalided by any call to + * ares_dns_record_query_set_name(). * \param[out] qtype Optional. Returns record type, may pass NULL. * \param[out] qclass Optional. Returns class, may pass NULL. * \return ARES_SUCCESS on success @@ -667,17 +695,28 @@ CARES_EXTERN ares_status_t ares_dns_record_rr_add( const char *name, ares_dns_rec_type_t type, ares_dns_class_t rclass, unsigned int ttl); -/*! Fetch a resource record based on the section and index. +/*! Fetch a writable resource record based on the section and index. * * \param[in] dnsrec Initialized record object * \param[in] sect Section for resource record * \param[in] idx Index of resource record in section - * \return NULL on misuse, otherwise a pointer to the resource record + * \return NULL on misuse, otherwise a writable pointer to the resource record */ CARES_EXTERN ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, ares_dns_section_t sect, size_t idx); +/*! Fetch a non-writeable resource record based on the section and index. + * + * \param[in] dnsrec Initialized record object + * \param[in] sect Section for resource record + * \param[in] idx Index of resource record in section + * \return NULL on misuse, otherwise a const pointer to the resource record + */ +CARES_EXTERN const ares_dns_rr_t * + ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t idx); + /*! Remove the resource record based on the section and index * @@ -686,9 +725,9 @@ CARES_EXTERN ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, * \param[in] idx Index of resource record in section * \return ARES_SUCCESS on success, otherwise an error code. */ -CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, - ares_dns_section_t sect, - size_t idx); +CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); /*! Retrieve the resource record Name/Hostname @@ -696,7 +735,7 @@ CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, * \param[in] rr Pointer to resource record * \return Name */ -CARES_EXTERN const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr); +CARES_EXTERN const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr); /*! Retrieve the resource record type * @@ -959,8 +998,19 @@ CARES_EXTERN ares_status_t ares_dns_parse(const unsigned char *buf, * \param[out] buf_len Length of returned buffer containing DNS message. * \return ARES_SUCCESS on success */ -CARES_EXTERN ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, +CARES_EXTERN ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec, unsigned char **buf, size_t *buf_len); + + +/*! Duplicate a complete DNS message. This does not copy internal members + * (such as the ttl decrement capability). + * + * \param[in] dnsrec Pointer to initialized and filled DNS record object. + * \return duplicted DNS record object, or NULL on out of memory. + */ +CARES_EXTERN ares_dns_record_t * + ares_dns_record_duplicate(const ares_dns_record_t *dnsrec); + /*! @} */ #ifdef __cplusplus diff --git a/deps/cares/include/ares_version.h b/deps/cares/include/ares_version.h index 44dbdef161ac35..0e94a98be8f280 100644 --- a/deps/cares/include/ares_version.h +++ b/deps/cares/include/ares_version.h @@ -31,12 +31,12 @@ #define ARES_COPYRIGHT "2004 - 2024 Daniel Stenberg, ." #define ARES_VERSION_MAJOR 1 -#define ARES_VERSION_MINOR 27 -#define ARES_VERSION_PATCH 0 +#define ARES_VERSION_MINOR 28 +#define ARES_VERSION_PATCH 1 #define ARES_VERSION \ ((ARES_VERSION_MAJOR << 16) | (ARES_VERSION_MINOR << 8) | \ (ARES_VERSION_PATCH)) -#define ARES_VERSION_STR "1.27.0" +#define ARES_VERSION_STR "1.28.1" #if (ARES_VERSION >= 0x010700) # define CARES_HAVE_ARES_LIBRARY_INIT 1 diff --git a/deps/cares/src/Makefile.in b/deps/cares/src/Makefile.in index 040373fe95a247..f657ef0d43e7b9 100644 --- a/deps/cares/src/Makefile.in +++ b/deps/cares/src/Makefile.in @@ -285,6 +285,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ diff --git a/deps/cares/src/lib/CMakeLists.txt b/deps/cares/src/lib/CMakeLists.txt index 015e57f8193ebd..de73f712f1d1ce 100644 --- a/deps/cares/src/lib/CMakeLists.txt +++ b/deps/cares/src/lib/CMakeLists.txt @@ -31,7 +31,6 @@ IF (CARES_SHARED) EXPORT_NAME cares OUTPUT_NAME cares COMPILE_PDB_NAME cares - COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} SOVERSION ${CARES_LIB_VERSION_MAJOR} VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}" C_STANDARD 90 @@ -65,11 +64,13 @@ IF (CARES_SHARED) COMPONENT Library ${TARGETS_INST_DEST} ) - INSTALL(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/cares.pdb - DESTINATION ${CMAKE_INSTALL_BINDIR} - COMPONENT Library - OPTIONAL - ) + IF (MSVC) + INSTALL(FILES $ + DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT Library + OPTIONAL + ) + ENDIF () ENDIF () SET (STATIC_SUFFIX "_static") @@ -88,7 +89,6 @@ IF (CARES_STATIC) EXPORT_NAME cares${STATIC_SUFFIX} OUTPUT_NAME cares${STATIC_SUFFIX} COMPILE_PDB_NAME cares${STATIC_SUFFIX} - COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} C_STANDARD 90 ) @@ -116,11 +116,6 @@ IF (CARES_STATIC) INSTALL (TARGETS ${LIBNAME} EXPORT ${PROJECT_NAME}-targets COMPONENT Devel ${TARGETS_INST_DEST} ) - INSTALL(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/cares${STATIC_SUFFIX}.pdb - DESTINATION ${CMAKE_INSTALL_BINDIR} - COMPONENT Library - OPTIONAL - ) ENDIF () # For chain building: add alias targets that look like import libs that would be returned by find_package(c-ares). diff --git a/deps/cares/src/lib/Makefile.in b/deps/cares/src/lib/Makefile.in index c516cba2cf46d2..0060295c21e8ef 100644 --- a/deps/cares/src/lib/Makefile.in +++ b/deps/cares/src/lib/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Fri Jan 26 17:16:19 CET 2024 +# from AX_AM_MACROS_STATIC on Sat Mar 30 16:15:43 CET 2024 # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT @@ -169,14 +169,14 @@ am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ libcares_la-ares__htable_szvp.lo \ libcares_la-ares__iface_ips.lo libcares_la-ares__llist.lo \ libcares_la-ares__parse_into_addrinfo.lo \ - libcares_la-ares__read_line.lo libcares_la-ares__slist.lo \ - libcares_la-ares__socket.lo libcares_la-ares__sortaddrinfo.lo \ - libcares_la-ares__threads.lo libcares_la-ares__timeval.lo \ - libcares_la-ares_android.lo libcares_la-ares_cancel.lo \ - libcares_la-ares_data.lo libcares_la-ares_destroy.lo \ - libcares_la-ares_dns_mapping.lo libcares_la-ares_dns_name.lo \ - libcares_la-ares_dns_parse.lo libcares_la-ares_dns_record.lo \ - libcares_la-ares_dns_write.lo libcares_la-ares_event_epoll.lo \ + libcares_la-ares__slist.lo libcares_la-ares__socket.lo \ + libcares_la-ares__sortaddrinfo.lo libcares_la-ares__threads.lo \ + libcares_la-ares__timeval.lo libcares_la-ares_android.lo \ + libcares_la-ares_cancel.lo libcares_la-ares_data.lo \ + libcares_la-ares_destroy.lo libcares_la-ares_dns_mapping.lo \ + libcares_la-ares_dns_name.lo libcares_la-ares_dns_parse.lo \ + libcares_la-ares_dns_record.lo libcares_la-ares_dns_write.lo \ + libcares_la-ares_event_epoll.lo \ libcares_la-ares_event_kqueue.lo \ libcares_la-ares_event_poll.lo \ libcares_la-ares_event_select.lo \ @@ -193,9 +193,8 @@ am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ libcares_la-ares_gethostbyname.lo \ libcares_la-ares_getnameinfo.lo libcares_la-ares_getsock.lo \ libcares_la-ares_init.lo libcares_la-ares_library_init.lo \ - libcares_la-ares_math.lo libcares_la-ares_mkquery.lo \ - libcares_la-ares_create_query.lo libcares_la-ares_options.lo \ - libcares_la-ares_parse_a_reply.lo \ + libcares_la-ares_math.lo libcares_la-ares_create_query.lo \ + libcares_la-ares_options.lo libcares_la-ares_parse_a_reply.lo \ libcares_la-ares_parse_aaaa_reply.lo \ libcares_la-ares_parse_caa_reply.lo \ libcares_la-ares_parse_mx_reply.lo \ @@ -254,7 +253,6 @@ am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares__iface_ips.Plo \ ./$(DEPDIR)/libcares_la-ares__llist.Plo \ ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo \ - ./$(DEPDIR)/libcares_la-ares__read_line.Plo \ ./$(DEPDIR)/libcares_la-ares__slist.Plo \ ./$(DEPDIR)/libcares_la-ares__socket.Plo \ ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo \ @@ -292,7 +290,6 @@ am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares_init.Plo \ ./$(DEPDIR)/libcares_la-ares_library_init.Plo \ ./$(DEPDIR)/libcares_la-ares_math.Plo \ - ./$(DEPDIR)/libcares_la-ares_mkquery.Plo \ ./$(DEPDIR)/libcares_la-ares_options.Plo \ ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo \ ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo \ @@ -505,6 +502,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ @@ -628,7 +626,6 @@ CSOURCES = ares__addrinfo2hostent.c \ ares__iface_ips.c \ ares__llist.c \ ares__parse_into_addrinfo.c \ - ares__read_line.c \ ares__slist.c \ ares__socket.c \ ares__sortaddrinfo.c \ @@ -665,7 +662,6 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_init.c \ ares_library_init.c \ ares_math.c \ - ares_mkquery.c \ ares_create_query.c \ ares_options.c \ ares_parse_a_reply.c \ @@ -834,7 +830,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__iface_ips.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__llist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__read_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__slist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__socket.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo@am__quote@ # am--include-marker @@ -872,7 +867,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_library_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_math.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_mkquery.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_options.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo@am__quote@ # am--include-marker @@ -1019,13 +1013,6 @@ libcares_la-ares__parse_into_addrinfo.lo: ares__parse_into_addrinfo.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__parse_into_addrinfo.lo `test -f 'ares__parse_into_addrinfo.c' || echo '$(srcdir)/'`ares__parse_into_addrinfo.c -libcares_la-ares__read_line.lo: ares__read_line.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__read_line.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__read_line.Tpo -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__read_line.Tpo $(DEPDIR)/libcares_la-ares__read_line.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__read_line.c' object='libcares_la-ares__read_line.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c - libcares_la-ares__slist.lo: ares__slist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__slist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__slist.Tpo -c -o libcares_la-ares__slist.lo `test -f 'ares__slist.c' || echo '$(srcdir)/'`ares__slist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__slist.Tpo $(DEPDIR)/libcares_la-ares__slist.Plo @@ -1278,13 +1265,6 @@ libcares_la-ares_math.lo: ares_math.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_math.lo `test -f 'ares_math.c' || echo '$(srcdir)/'`ares_math.c -libcares_la-ares_mkquery.lo: ares_mkquery.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_mkquery.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_mkquery.Tpo -c -o libcares_la-ares_mkquery.lo `test -f 'ares_mkquery.c' || echo '$(srcdir)/'`ares_mkquery.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_mkquery.Tpo $(DEPDIR)/libcares_la-ares_mkquery.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_mkquery.c' object='libcares_la-ares_mkquery.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_mkquery.lo `test -f 'ares_mkquery.c' || echo '$(srcdir)/'`ares_mkquery.c - libcares_la-ares_create_query.lo: ares_create_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_create_query.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_create_query.Tpo -c -o libcares_la-ares_create_query.lo `test -f 'ares_create_query.c' || echo '$(srcdir)/'`ares_create_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_create_query.Tpo $(DEPDIR)/libcares_la-ares_create_query.Plo @@ -1728,7 +1708,6 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares__iface_ips.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__read_line.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo @@ -1766,7 +1745,6 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_mkquery.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo @@ -1855,7 +1833,6 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares__iface_ips.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__read_line.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo @@ -1893,7 +1870,6 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_mkquery.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo diff --git a/deps/cares/src/lib/Makefile.inc b/deps/cares/src/lib/Makefile.inc index 29a65fd35b1dd0..38f7a115fe3598 100644 --- a/deps/cares/src/lib/Makefile.inc +++ b/deps/cares/src/lib/Makefile.inc @@ -13,7 +13,6 @@ CSOURCES = ares__addrinfo2hostent.c \ ares__iface_ips.c \ ares__llist.c \ ares__parse_into_addrinfo.c \ - ares__read_line.c \ ares__slist.c \ ares__socket.c \ ares__sortaddrinfo.c \ @@ -50,7 +49,6 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_init.c \ ares_library_init.c \ ares_math.c \ - ares_mkquery.c \ ares_create_query.c \ ares_options.c \ ares_parse_a_reply.c \ diff --git a/deps/cares/src/lib/ares__buf.c b/deps/cares/src/lib/ares__buf.c index 8f9f32d71867ff..0663383df9e42e 100644 --- a/deps/cares/src/lib/ares__buf.c +++ b/deps/cares/src/lib/ares__buf.c @@ -45,47 +45,6 @@ struct ares__buf { * SIZE_MAX if not set. */ }; -ares_bool_t ares__isprint(int ch) -{ - if (ch >= 0x20 && ch <= 0x7E) { - return ARES_TRUE; - } - return ARES_FALSE; -} - -/* Character set allowed by hostnames. This is to include the normal - * domain name character set plus: - * - underscores which are used in SRV records. - * - Forward slashes such as are used for classless in-addr.arpa - * delegation (CNAMEs) - * - Asterisks may be used for wildcard domains in CNAMEs as seen in the - * real world. - * While RFC 2181 section 11 does state not to do validation, - * that applies to servers, not clients. Vulnerabilities have been - * reported when this validation is not performed. Security is more - * important than edge-case compatibility (which is probably invalid - * anyhow). */ -ares_bool_t ares__is_hostnamech(int ch) -{ - /* [A-Za-z0-9-*._/] - * Don't use isalnum() as it is locale-specific - */ - if (ch >= 'A' && ch <= 'Z') { - return ARES_TRUE; - } - if (ch >= 'a' && ch <= 'z') { - return ARES_TRUE; - } - if (ch >= '0' && ch <= '9') { - return ARES_TRUE; - } - if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') { - return ARES_TRUE; - } - - return ARES_FALSE; -} - ares__buf_t *ares__buf_create(void) { ares__buf_t *buf = ares_malloc_zero(sizeof(*buf)); @@ -630,6 +589,24 @@ ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf, return ares__buf_consume(buf, len); } +static ares_bool_t ares__is_whitespace(unsigned char c, + ares_bool_t include_linefeed) +{ + switch (c) { + case '\r': + case '\t': + case ' ': + case '\v': + case '\f': + return ARES_TRUE; + case '\n': + return include_linefeed; + default: + break; + } + return ARES_FALSE; +} + size_t ares__buf_consume_whitespace(ares__buf_t *buf, ares_bool_t include_linefeed) { @@ -642,24 +619,11 @@ size_t ares__buf_consume_whitespace(ares__buf_t *buf, } for (i = 0; i < remaining_len; i++) { - switch (ptr[i]) { - case '\r': - case '\t': - case ' ': - case '\v': - case '\f': - break; - case '\n': - if (!include_linefeed) { - goto done; - } - break; - default: - goto done; + if (!ares__is_whitespace(ptr[i], include_linefeed)) { + break; } } -done: if (i > 0) { ares__buf_consume(buf, i); } @@ -677,20 +641,11 @@ size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf) } for (i = 0; i < remaining_len; i++) { - switch (ptr[i]) { - case '\r': - case '\t': - case ' ': - case '\v': - case '\f': - case '\n': - goto done; - default: - break; + if (ares__is_whitespace(ptr[i], ARES_TRUE)) { + break; } } -done: if (i > 0) { ares__buf_consume(buf, i); } @@ -826,7 +781,7 @@ static ares_bool_t ares__buf_split_isduplicate(ares__llist_t *list, ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims, size_t delims_len, ares__buf_split_t flags, - ares__llist_t **list) + size_t max_sections, ares__llist_t **list) { ares_status_t status = ARES_SUCCESS; ares_bool_t first = ARES_TRUE; @@ -842,20 +797,57 @@ ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims, } while (ares__buf_len(buf)) { - size_t len; + size_t len = 0; + const unsigned char *ptr; + + if (first) { + /* No delimiter yet, just tag the start */ + ares__buf_tag(buf); + } else { + if (flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) { + /* tag then eat delimiter so its first byte in buffer */ + ares__buf_tag(buf); + ares__buf_consume(buf, 1); + } else { + /* throw away delimiter */ + ares__buf_consume(buf, 1); + ares__buf_tag(buf); + } + } + + if (max_sections && ares__llist_len(*list) >= max_sections - 1) { + ares__buf_consume(buf, ares__buf_len(buf)); + } else { + ares__buf_consume_until_charset(buf, delims, delims_len, ARES_FALSE); + } - ares__buf_tag(buf); + ptr = ares__buf_tag_fetch(buf, &len); - len = ares__buf_consume_until_charset(buf, delims, delims_len, ARES_FALSE); + /* Shouldn't be possible */ + if (ptr == NULL) { + status = ARES_EFORMERR; + goto done; + } + + if (flags & ARES_BUF_SPLIT_LTRIM) { + size_t i; + for (i = 0; i < len; i++) { + if (!ares__is_whitespace(ptr[i], ARES_TRUE)) { + break; + } + } + ptr += i; + len -= i; + } - /* Don't treat a delimiter as part of the length */ - if (!first && len && flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) { - len--; + if (flags & ARES_BUF_SPLIT_RTRIM) { + while (len && ares__is_whitespace(ptr[len - 1], ARES_TRUE)) { + len--; + } } if (len != 0 || flags & ARES_BUF_SPLIT_ALLOW_BLANK) { - const unsigned char *ptr = ares__buf_tag_fetch(buf, &len); - ares__buf_t *data; + ares__buf_t *data; if (!(flags & ARES_BUF_SPLIT_NO_DUPLICATES) || !ares__buf_split_isduplicate(*list, ptr, len, flags)) { @@ -880,12 +872,6 @@ ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims, } } - if (!(flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) && - ares__buf_len(buf) != 0) { - /* Consume delimiter */ - ares__buf_consume(buf, 1); - } - first = ARES_FALSE; } @@ -1150,3 +1136,80 @@ ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data, return ARES_SUCCESS; } + +ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf) +{ + FILE *fp = NULL; + unsigned char *ptr = NULL; + size_t len = 0; + size_t ptr_len = 0; + long ftell_len = 0; + ares_status_t status; + + if (filename == NULL || buf == NULL) { + return ARES_EFORMERR; + } + + fp = fopen(filename, "rb"); + if (fp == NULL) { + int error = ERRNO; + switch (error) { + case ENOENT: + case ESRCH: + status = ARES_ENOTFOUND; + goto done; + default: + DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, + strerror(error))); + DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename)); + status = ARES_EFILE; + goto done; + } + } + + /* Get length portably, fstat() is POSIX, not C */ + if (fseek(fp, 0, SEEK_END) != 0) { + status = ARES_EFILE; + goto done; + } + + ftell_len = ftell(fp); + if (ftell_len < 0) { + status = ARES_EFILE; + goto done; + } + len = (size_t)ftell_len; + + if (fseek(fp, 0, SEEK_SET) != 0) { + status = ARES_EFILE; + goto done; + } + + if (len == 0) { + status = ARES_SUCCESS; + goto done; + } + + /* Read entire data into buffer */ + ptr_len = len; + ptr = ares__buf_append_start(buf, &ptr_len); + if (ptr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + ptr_len = fread(ptr, 1, len, fp); + if (ptr_len != len) { + status = ARES_EFILE; + goto done; + } + + ares__buf_append_finish(buf, len); + status = ARES_SUCCESS; + +done: + if (fp != NULL) { + fclose(fp); + } + return status; +} diff --git a/deps/cares/src/lib/ares__buf.h b/deps/cares/src/lib/ares__buf.h index 52054a0b33c658..4298814f7b4396 100644 --- a/deps/cares/src/lib/ares__buf.h +++ b/deps/cares/src/lib/ares__buf.h @@ -177,7 +177,7 @@ void ares__buf_append_finish(ares__buf_t *buf, size_t len); * * \param[in] buf Initialized buffer object. * \param[in] data Data to hex dump - * \param[in] data_len Length of data to hexdump + * \param[in] len Length of data to hexdump * \return ARES_SUCCESS on success. */ ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data, @@ -373,7 +373,8 @@ size_t ares__buf_consume_whitespace(ares__buf_t *buf, size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf); -/*! Consume until a character in the character set provided is reached +/*! Consume until a character in the character set provided is reached. Does + * not include the character from the charset at the end. * * \param[in] buf Initialized buffer object * \param[in] charset character set @@ -414,7 +415,9 @@ typedef enum { /*! No flags */ ARES_BUF_SPLIT_NONE = 0, /*! The delimiter will be the first character in the buffer, except the - * first buffer since the start doesn't have a delimiter + * first buffer since the start doesn't have a delimiter. This option is + * incompatible with ARES_BUF_SPLIT_LTRIM since the delimiter is always + * the first character. */ ARES_BUF_SPLIT_DONT_CONSUME_DELIMS = 1 << 0, /*! Allow blank sections, by default blank sections are not emitted. If using @@ -424,7 +427,13 @@ typedef enum { /*! Remove duplicate entries */ ARES_BUF_SPLIT_NO_DUPLICATES = 1 << 2, /*! Perform case-insensitive matching when comparing values */ - ARES_BUF_SPLIT_CASE_INSENSITIVE = 1 << 3 + ARES_BUF_SPLIT_CASE_INSENSITIVE = 1 << 3, + /*! Trim leading whitespace from buffer */ + ARES_BUF_SPLIT_LTRIM = 1 << 4, + /*! Trim trailing whitespace from buffer */ + ARES_BUF_SPLIT_RTRIM = 1 << 5, + /*! Trim leading and trailing whitespace from buffer */ + ARES_BUF_SPLIT_TRIM = (ARES_BUF_SPLIT_LTRIM | ARES_BUF_SPLIT_RTRIM) } ares__buf_split_t; /*! Split the provided buffer into multiple sub-buffers stored in the variable @@ -435,6 +444,12 @@ typedef enum { * \param[in] delims Possible delimiters * \param[in] delims_len Length of possible delimiters * \param[in] flags One more more flags + * \param[in] max_sections Maximum number of sections. Use 0 for + * unlimited. Useful for splitting key/value + * pairs where the delimiter may be a valid + * character in the value. A value of 1 would + * have little usefulness and would effectively + * ignore the delimiter itself. * \param[out] list Result. Depending on flags, this may be a * valid list with no elements. Use * ares__llist_destroy() to free the memory which @@ -444,7 +459,7 @@ typedef enum { */ ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims, size_t delims_len, ares__buf_split_t flags, - ares__llist_t **list); + size_t max_sections, ares__llist_t **list); /*! Check the unprocessed buffer to see if it begins with the sequence of @@ -536,7 +551,7 @@ size_t ares__buf_get_position(const ares__buf_t *buf); * \param[in] remaining_len maximum length that should be used for parsing * the string, this is often less than the remaining * buffer and is based on the RR record length. - * \param[out] str Pointer passed by reference to be filled in with + * \param[out] name Pointer passed by reference to be filled in with * allocated string of the parsed that must be * ares_free()'d by the caller. * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple @@ -567,6 +582,18 @@ ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len, ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len, unsigned char **bin, size_t *bin_len, ares_bool_t allow_multiple); + +/*! Load data from specified file path into provided buffer. The entire file + * is loaded into memory. + * + * \param[in] filename complete path to file + * \param[in,out] buf Initialized (non-const) buffer object to load data + * into + * \return ARES_ENOTFOUND if file not found, ARES_EFILE if issues reading + * file, ARES_ENOMEM if out of memory, ARES_SUCCESS on success. + */ +ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf); + /*! @} */ #endif /* __ARES__BUF_H */ diff --git a/deps/cares/src/lib/ares__hosts_file.c b/deps/cares/src/lib/ares__hosts_file.c index c6fe63a429d269..e279623de37e64 100644 --- a/deps/cares/src/lib/ares__hosts_file.c +++ b/deps/cares/src/lib/ares__hosts_file.c @@ -98,95 +98,6 @@ struct ares_hosts_entry { ares__llist_t *hosts; }; -static ares_status_t ares__read_file_into_buf(const char *filename, - ares__buf_t *buf) -{ - FILE *fp = NULL; - unsigned char *ptr = NULL; - size_t len = 0; - size_t ptr_len = 0; - long ftell_len = 0; - ares_status_t status; - - if (filename == NULL || buf == NULL) { - return ARES_EFORMERR; - } - - fp = fopen(filename, "rb"); - if (fp == NULL) { - int error = ERRNO; - switch (error) { - case ENOENT: - case ESRCH: - status = ARES_ENOTFOUND; - goto done; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, - strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename)); - status = ARES_EFILE; - goto done; - } - } - - /* Get length portably, fstat() is POSIX, not C */ - if (fseek(fp, 0, SEEK_END) != 0) { - status = ARES_EFILE; - goto done; - } - - ftell_len = ftell(fp); - if (ftell_len < 0) { - status = ARES_EFILE; - goto done; - } - len = (size_t)ftell_len; - - if (fseek(fp, 0, SEEK_SET) != 0) { - status = ARES_EFILE; - goto done; - } - - if (len == 0) { - status = ARES_SUCCESS; - goto done; - } - - /* Read entire data into buffer */ - ptr_len = len; - ptr = ares__buf_append_start(buf, &ptr_len); - if (ptr == NULL) { - status = ARES_ENOMEM; - goto done; - } - - ptr_len = fread(ptr, 1, len, fp); - if (ptr_len != len) { - status = ARES_EFILE; - goto done; - } - - ares__buf_append_finish(buf, len); - status = ARES_SUCCESS; - -done: - if (fp != NULL) { - fclose(fp); - } - return status; -} - -static ares_bool_t ares__is_hostname(const char *str) -{ - size_t i; - for (i = 0; str[i] != 0; i++) { - if (!ares__is_hostnamech(str[i])) { - return ARES_FALSE; - } - } - return ARES_TRUE; -} - const void *ares_dns_pton(const char *ipaddr, struct ares_addr *addr, size_t *out_len) { @@ -605,7 +516,7 @@ static ares_status_t ares__parse_hosts(const char *filename, goto done; } - status = ares__read_file_into_buf(filename, buf); + status = ares__buf_load_file(filename, buf); if (status != ARES_SUCCESS) { goto done; } diff --git a/deps/cares/src/lib/ares__htable.h b/deps/cares/src/lib/ares__htable.h index fd1c0a2366022f..d09c865977cdae 100644 --- a/deps/cares/src/lib/ares__htable.h +++ b/deps/cares/src/lib/ares__htable.h @@ -58,21 +58,21 @@ typedef struct ares__htable ares__htable_t; * but otherwise will not change between calls. * \return hash */ -typedef unsigned int (*ares__htable_hashfunc_t)(const void *key, +typedef unsigned int (*ares__htable_hashfunc_t)(const void *key, unsigned int seed); /*! Callback to free the bucket * * \param[in] bucket user provided bucket */ -typedef void (*ares__htable_bucket_free_t)(void *bucket); +typedef void (*ares__htable_bucket_free_t)(void *bucket); /*! Callback to extract the key from the user-provided bucket * * \param[in] bucket user provided bucket * \return pointer to key held in bucket */ -typedef const void *(*ares__htable_bucket_key_t)(const void *bucket); +typedef const void *(*ares__htable_bucket_key_t)(const void *bucket); /*! Callback to compare two keys for equality * @@ -80,15 +80,15 @@ typedef const void *(*ares__htable_bucket_key_t)(const void *bucket); * \param[in] key2 second key * \return ARES_TRUE if equal, ARES_FALSE if not */ -typedef ares_bool_t (*ares__htable_key_eq_t)(const void *key1, +typedef ares_bool_t (*ares__htable_key_eq_t)(const void *key1, const void *key2); /*! Destroy the initialized hashtable * - * \param[in] initialized hashtable + * \param[in] htable initialized hashtable */ -void ares__htable_destroy(ares__htable_t *htable); +void ares__htable_destroy(ares__htable_t *htable); /*! Create a new hashtable * diff --git a/deps/cares/src/lib/ares__htable_asvp.h b/deps/cares/src/lib/ares__htable_asvp.h index ee253455b2690c..49a766d023091e 100644 --- a/deps/cares/src/lib/ares__htable_asvp.h +++ b/deps/cares/src/lib/ares__htable_asvp.h @@ -51,7 +51,7 @@ typedef struct ares__htable_asvp ares__htable_asvp_t; * * \param[in] val user-supplied value */ -typedef void (*ares__htable_asvp_val_free_t)(void *val); +typedef void (*ares__htable_asvp_val_free_t)(void *val); /*! Destroy hashtable * @@ -71,7 +71,7 @@ ares__htable_asvp_t * /*! Retrieve an array of keys from the hashtable. * * \param[in] htable Initialized hashtable - * \param[out] num_keys Count of returned keys + * \param[out] num Count of returned keys * \return Array of keys in the hashtable. Must be free'd with ares_free(). */ ares_socket_t *ares__htable_asvp_keys(const ares__htable_asvp_t *htable, diff --git a/deps/cares/src/lib/ares__htable_strvp.h b/deps/cares/src/lib/ares__htable_strvp.h index 80d375c06804a5..25dd2b90777d8d 100644 --- a/deps/cares/src/lib/ares__htable_strvp.h +++ b/deps/cares/src/lib/ares__htable_strvp.h @@ -49,7 +49,7 @@ typedef struct ares__htable_strvp ares__htable_strvp_t; * * \param[in] val user-supplied value */ -typedef void (*ares__htable_strvp_val_free_t)(void *val); +typedef void (*ares__htable_strvp_val_free_t)(void *val); /*! Destroy hashtable * diff --git a/deps/cares/src/lib/ares__htable_szvp.h b/deps/cares/src/lib/ares__htable_szvp.h index 9857afe79604d3..62b1776be92b5b 100644 --- a/deps/cares/src/lib/ares__htable_szvp.h +++ b/deps/cares/src/lib/ares__htable_szvp.h @@ -49,7 +49,7 @@ typedef struct ares__htable_szvp ares__htable_szvp_t; * * \param[in] val user-supplied value */ -typedef void (*ares__htable_szvp_val_free_t)(void *val); +typedef void (*ares__htable_szvp_val_free_t)(void *val); /*! Destroy hashtable * diff --git a/deps/cares/src/lib/ares__llist.h b/deps/cares/src/lib/ares__llist.h index bd18bb9ec1d54c..7d57bdab3b077c 100644 --- a/deps/cares/src/lib/ares__llist.h +++ b/deps/cares/src/lib/ares__llist.h @@ -52,7 +52,7 @@ typedef struct ares__llist_node ares__llist_node_t; * * \param[in] data user supplied data */ -typedef void (*ares__llist_destructor_t)(void *data); +typedef void (*ares__llist_destructor_t)(void *data); /*! Create a linked list object * @@ -201,8 +201,8 @@ void ares__llist_destroy(ares__llist_t *list); /*! Detach node from the current list and re-attach it to the new list as the * last entry. * - * \param[in] node node to move - * \param[in] parent new list + * \param[in] node node to move + * \param[in] new_parent new list */ void ares__llist_node_move_parent_last(ares__llist_node_t *node, ares__llist_t *new_parent); @@ -210,8 +210,8 @@ void ares__llist_node_move_parent_last(ares__llist_node_t *node, /*! Detach node from the current list and re-attach it to the new list as the * first entry. * - * \param[in] node node to move - * \param[in] parent new list + * \param[in] node node to move + * \param[in] new_parent new list */ void ares__llist_node_move_parent_first(ares__llist_node_t *node, ares__llist_t *new_parent); diff --git a/deps/cares/src/lib/ares__parse_into_addrinfo.c b/deps/cares/src/lib/ares__parse_into_addrinfo.c index a5ce0c594fc3be..90e951c02f3f6d 100644 --- a/deps/cares/src/lib/ares__parse_into_addrinfo.c +++ b/deps/cares/src/lib/ares__parse_into_addrinfo.c @@ -47,13 +47,12 @@ #include "ares.h" #include "ares_private.h" -ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen, +ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec, ares_bool_t cname_only_is_enodata, unsigned short port, struct ares_addrinfo *ai) { ares_status_t status; - ares_dns_record_t *dnsrec = NULL; size_t i; size_t ancount; const char *hostname = NULL; @@ -63,11 +62,6 @@ ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen, struct ares_addrinfo_cname *cnames = NULL; struct ares_addrinfo_node *nodes = NULL; - status = ares_dns_parse(abuf, alen, 0, &dnsrec); - if (status != ARES_SUCCESS) { - goto done; - } - /* Save question hostname */ status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL); if (status != ARES_SUCCESS) { @@ -83,7 +77,7 @@ ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen, for (i = 0; i < ancount; i++) { ares_dns_rec_type_t rtype; const ares_dns_rr_t *rr = - ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i); if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) { continue; @@ -177,7 +171,6 @@ ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen, done: ares__freeaddrinfo_cnames(cnames); ares__freeaddrinfo_nodes(nodes); - ares_dns_record_destroy(dnsrec); /* compatibility */ if (status == ARES_EBADNAME) { diff --git a/deps/cares/src/lib/ares__read_line.c b/deps/cares/src/lib/ares__read_line.c deleted file mode 100644 index 018f55e8b2681f..00000000000000 --- a/deps/cares/src/lib/ares__read_line.c +++ /dev/null @@ -1,90 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" - -/* This is an internal function. Its contract is to read a line from - * a file into a dynamically allocated buffer, zeroing the trailing - * newline if there is one. The calling routine may call - * ares__read_line multiple times with the same buf and bufsize - * pointers; *buf will be reallocated and *bufsize adjusted as - * appropriate. The initial value of *buf should be NULL. After the - * calling routine is done reading lines, it should free *buf. - */ -ares_status_t ares__read_line(FILE *fp, char **buf, size_t *bufsize) -{ - char *newbuf; - size_t offset = 0; - size_t len; - - if (*buf == NULL) { - *buf = ares_malloc(128); - if (!*buf) { - return ARES_ENOMEM; - } - *bufsize = 128; - } - - for (;;) { - int bytestoread = (int)(*bufsize - offset); - - if (!fgets(*buf + offset, bytestoread, fp)) { - return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF; - } - len = offset + ares_strlen(*buf + offset); - - /* Probably means there was an embedded NULL as the first character in - * the line, throw away line */ - if (len == 0) { - offset = 0; - continue; - } - - if ((*buf)[len - 1] == '\n') { - (*buf)[len - 1] = 0; - break; - } - offset = len; - if (len < *bufsize - 1) { - continue; - } - - /* Allocate more space. */ - newbuf = ares_realloc(*buf, *bufsize * 2); - if (!newbuf) { - ares_free(*buf); - *buf = NULL; - return ARES_ENOMEM; - } - *buf = newbuf; - *bufsize *= 2; - } - return ARES_SUCCESS; -} diff --git a/deps/cares/src/lib/ares__slist.h b/deps/cares/src/lib/ares__slist.h index 04cd50806ebc2d..26af88fa782499 100644 --- a/deps/cares/src/lib/ares__slist.h +++ b/deps/cares/src/lib/ares__slist.h @@ -63,7 +63,7 @@ typedef struct ares__slist_node ares__slist_node_t; * * \param[in] data User-defined data to destroy */ -typedef void (*ares__slist_destructor_t)(void *data); +typedef void (*ares__slist_destructor_t)(void *data); /*! SkipList comparison function * @@ -71,7 +71,7 @@ typedef void (*ares__slist_destructor_t)(void *data); * \param[in] data2 Second user-defined data object * \return < 0 if data1 < data1, > 0 if data1 > data2, 0 if data1 == data2 */ -typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2); +typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2); /*! Create SkipList * diff --git a/deps/cares/src/lib/ares__threads.c b/deps/cares/src/lib/ares__threads.c index 028790aead5abe..f6de8c698e373d 100644 --- a/deps/cares/src/lib/ares__threads.c +++ b/deps/cares/src/lib/ares__threads.c @@ -138,9 +138,9 @@ struct ares__thread { HANDLE thread; DWORD id; - void *(*func)(void *arg); - void *arg; - void *rv; + void *(*func)(void *arg); + void *arg; + void *rv; }; /* Wrap for pthread compatibility */ @@ -335,8 +335,8 @@ static void ares__timespec_timeout(struct timespec *ts, unsigned long add_ms) # error cannot determine current system time # endif - ts->tv_sec += add_ms / 1000; - ts->tv_nsec += (add_ms % 1000) * 1000000; + ts->tv_sec += (time_t)(add_ms / 1000); + ts->tv_nsec += (long)((add_ms % 1000) * 1000000); /* Normalize if needed */ if (ts->tv_nsec >= 1000000000) { diff --git a/deps/cares/src/lib/ares__threads.h b/deps/cares/src/lib/ares__threads.h index 39764296478a07..108354dfc1e17f 100644 --- a/deps/cares/src/lib/ares__threads.h +++ b/deps/cares/src/lib/ares__threads.h @@ -52,9 +52,9 @@ ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond, struct ares__thread; typedef struct ares__thread ares__thread_t; -typedef void *(*ares__thread_func_t)(void *arg); -ares_status_t ares__thread_create(ares__thread_t **thread, - ares__thread_func_t func, void *arg); +typedef void *(*ares__thread_func_t)(void *arg); +ares_status_t ares__thread_create(ares__thread_t **thread, + ares__thread_func_t func, void *arg); ares_status_t ares__thread_join(ares__thread_t *thread, void **rv); #endif diff --git a/deps/cares/src/lib/ares_cancel.c b/deps/cares/src/lib/ares_cancel.c index 0ee6124dd71440..5a9fb722cb7778 100644 --- a/deps/cares/src/lib/ares_cancel.c +++ b/deps/cares/src/lib/ares_cancel.c @@ -74,7 +74,7 @@ void ares_cancel(ares_channel_t *channel) query->node_all_queries = NULL; /* NOTE: its possible this may enqueue new queries */ - query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0); + query->callback(query->arg, ARES_ECANCELLED, 0, NULL); ares__free_query(query); /* See if the connection should be cleaned up */ diff --git a/deps/cares/src/lib/ares_config.h.cmake b/deps/cares/src/lib/ares_config.h.cmake index 01dcccaa17c2b4..10a1b7a971604b 100644 --- a/deps/cares/src/lib/ares_config.h.cmake +++ b/deps/cares/src/lib/ares_config.h.cmake @@ -212,6 +212,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_NETINET_IN_H +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETINET6_IN6_H + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_NETINET_TCP_H diff --git a/deps/cares/src/lib/ares_config.h.in b/deps/cares/src/lib/ares_config.h.in index 4e07e58473a009..f486b6b4f000b9 100644 --- a/deps/cares/src/lib/ares_config.h.in +++ b/deps/cares/src/lib/ares_config.h.in @@ -186,6 +186,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET6_IN6_H + /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H diff --git a/deps/cares/src/lib/ares_create_query.c b/deps/cares/src/lib/ares_create_query.c index f66b0ff6e0693d..a2f2caac6e95d9 100644 --- a/deps/cares/src/lib/ares_create_query.c +++ b/deps/cares/src/lib/ares_create_query.c @@ -28,13 +28,15 @@ #include "ares.h" #include "ares_private.h" -int ares_create_query(const char *name, int dnsclass, int type, - unsigned short id, int rd, unsigned char **bufp, - int *buflenp, int max_udp_size) +static int ares_create_query_int(const char *name, int dnsclass, int type, + unsigned short id, int rd, + unsigned char **bufp, int *buflenp, + int max_udp_size) { ares_status_t status; ares_dns_record_t *dnsrec = NULL; size_t len; + ares_dns_flags_t rd_flag = rd ? ARES_FLAG_RD : 0; if (name == NULL || bufp == NULL || buflenp == NULL) { status = ARES_EFORMERR; @@ -44,56 +46,13 @@ int ares_create_query(const char *name, int dnsclass, int type, *bufp = NULL; *buflenp = 0; - /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ - if (ares__is_onion_domain(name)) { - status = ARES_ENOTFOUND; - goto done; - } - - status = ares_dns_record_create(&dnsrec, id, rd ? ARES_FLAG_RD : 0, - ARES_OPCODE_QUERY, ARES_RCODE_NOERROR); + status = ares_dns_record_create_query( + &dnsrec, name, (ares_dns_class_t)dnsclass, (ares_dns_rec_type_t)type, id, + rd_flag, (size_t)max_udp_size); if (status != ARES_SUCCESS) { goto done; } - status = ares_dns_record_query_add(dnsrec, name, (ares_dns_rec_type_t)type, - (ares_dns_class_t)dnsclass); - if (status != ARES_SUCCESS) { - goto done; - } - - /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */ - if (max_udp_size > 0) { - ares_dns_rr_t *rr = NULL; - - status = ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "", - ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0); - if (status != ARES_SUCCESS) { - goto done; - } - - if (max_udp_size > 65535) { - status = ARES_EFORMERR; - goto done; - } - - status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, - (unsigned short)max_udp_size); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0); - if (status != ARES_SUCCESS) { - goto done; - } - } - status = ares_dns_write(dnsrec, bufp, &len); if (status != ARES_SUCCESS) { goto done; @@ -105,3 +64,17 @@ int ares_create_query(const char *name, int dnsclass, int type, ares_dns_record_destroy(dnsrec); return (int)status; } + +int ares_create_query(const char *name, int dnsclass, int type, + unsigned short id, int rd, unsigned char **bufp, + int *buflenp, int max_udp_size) +{ + return ares_create_query_int(name, dnsclass, type, id, rd, bufp, buflenp, + max_udp_size); +} + +int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id, + int rd, unsigned char **buf, int *buflen) +{ + return ares_create_query_int(name, dnsclass, type, id, rd, buf, buflen, 0); +} diff --git a/deps/cares/src/lib/ares_destroy.c b/deps/cares/src/lib/ares_destroy.c index 145084577f7fba..6965b601e76e07 100644 --- a/deps/cares/src/lib/ares_destroy.c +++ b/deps/cares/src/lib/ares_destroy.c @@ -51,7 +51,7 @@ void ares_destroy(ares_channel_t *channel) struct query *query = ares__llist_node_claim(node); query->node_all_queries = NULL; - query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL, 0); + query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL); ares__free_query(query); node = next; diff --git a/deps/cares/src/lib/ares_dns_mapping.c b/deps/cares/src/lib/ares_dns_mapping.c index 55f1af7939c32f..2b463fe83128a7 100644 --- a/deps/cares/src/lib/ares_dns_mapping.c +++ b/deps/cares/src/lib/ares_dns_mapping.c @@ -883,3 +883,37 @@ const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode) return "UNKNOWN"; } + +/* Convert an rcode and ancount from a query reply into an ares_status_t + * value. Used internally by ares_search() and ares_query(). + */ +ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode, + size_t ancount) +{ + ares_status_t status = ARES_SUCCESS; + + switch (rcode) { + case ARES_RCODE_NOERROR: + status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA; + break; + case ARES_RCODE_FORMERR: + status = ARES_EFORMERR; + break; + case ARES_RCODE_SERVFAIL: + status = ARES_ESERVFAIL; + break; + case ARES_RCODE_NXDOMAIN: + status = ARES_ENOTFOUND; + break; + case ARES_RCODE_NOTIMP: + status = ARES_ENOTIMP; + break; + case ARES_RCODE_REFUSED: + status = ARES_EREFUSED; + break; + default: + break; + } + + return status; +} diff --git a/deps/cares/src/lib/ares_dns_private.h b/deps/cares/src/lib/ares_dns_private.h index 91635e74cd8010..3af4b3c9926e42 100644 --- a/deps/cares/src/lib/ares_dns_private.h +++ b/deps/cares/src/lib/ares_dns_private.h @@ -49,6 +49,33 @@ ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec); void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec, unsigned int ttl_decrement); +/*! Create a DNS record object for a query. The arguments are the same as + * those for ares_create_query(). + * + * \param[out] dnsrec DNS record object to create. + * \param[in] name NUL-terminated name for the query. + * \param[in] dnsclass Class for the query. + * \param[in] type Type for the query. + * \param[in] id Identifier for the query. + * \param[in] flags Flags for the query. + * \param[in] max_udp_size Maximum size of a UDP packet for EDNS. + * \return ARES_SUCCESS on success, otherwise an error code. + */ +ares_status_t + ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, unsigned short id, + ares_dns_flags_t flags, size_t max_udp_size); + +/*! Convert the RCODE and ANCOUNT from a DNS query reply into a status code. + * + * \param[in] rcode The RCODE from the reply. + * \param[in] ancount The ANCOUNT from the reply. + * \return An appropriate status code. + */ +ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode, + size_t ancount); + struct ares_dns_qd { char *name; ares_dns_rec_type_t qtype; diff --git a/deps/cares/src/lib/ares_dns_record.c b/deps/cares/src/lib/ares_dns_record.c index 30219003e24a57..ec7f7e734302de 100644 --- a/deps/cares/src/lib/ares_dns_record.c +++ b/deps/cares/src/lib/ares_dns_record.c @@ -276,6 +276,39 @@ ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec, return ARES_SUCCESS; } +ares_status_t ares_dns_record_query_set_name(ares_dns_record_t *dnsrec, + size_t idx, const char *name) +{ + char *orig_name = NULL; + + if (dnsrec == NULL || idx >= dnsrec->qdcount || name == NULL) { + return ARES_EFORMERR; + } + orig_name = dnsrec->qd[idx].name; + dnsrec->qd[idx].name = ares_strdup(name); + if (dnsrec->qd[idx].name == NULL) { + dnsrec->qd[idx].name = orig_name; + return ARES_ENOMEM; + } + + ares_free(orig_name); + return ARES_SUCCESS; +} + +ares_status_t ares_dns_record_query_set_type(ares_dns_record_t *dnsrec, + size_t idx, + ares_dns_rec_type_t qtype) +{ + if (dnsrec == NULL || idx >= dnsrec->qdcount || + !ares_dns_rec_type_isvalid(qtype, ARES_TRUE)) { + return ARES_EFORMERR; + } + + dnsrec->qd[idx].qtype = qtype; + + return ARES_SUCCESS; +} + ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec, size_t idx, const char **name, ares_dns_rec_type_t *qtype, @@ -499,7 +532,7 @@ ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, return &rr_ptr[idx]; } -static const ares_dns_rr_t * +const ares_dns_rr_t * ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec, ares_dns_section_t sect, size_t idx) { @@ -1314,3 +1347,103 @@ ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec) } return ARES_FALSE; } + +/* Construct a DNS record for a name with given class and type. Used internally + * by ares_search() and ares_create_query(). + */ +ares_status_t + ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, unsigned short id, + ares_dns_flags_t flags, size_t max_udp_size) +{ + ares_status_t status; + ares_dns_rr_t *rr = NULL; + + if (dnsrec == NULL) { + return ARES_EFORMERR; + } + + *dnsrec = NULL; + + /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN */ + if (ares__is_onion_domain(name)) { + status = ARES_ENOTFOUND; + goto done; + } + + status = ares_dns_record_create(dnsrec, id, (unsigned short)flags, + ARES_OPCODE_QUERY, ARES_RCODE_NOERROR); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_record_query_add(*dnsrec, name, type, dnsclass); + if (status != ARES_SUCCESS) { + goto done; + } + + /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */ + if (max_udp_size > 0) { + /* max_udp_size must fit into a 16 bit unsigned integer field on the OPT + * RR, so check here that it fits + */ + if (max_udp_size > 65535) { + status = ARES_EFORMERR; + goto done; + } + + status = ares_dns_record_rr_add(&rr, *dnsrec, ARES_SECTION_ADDITIONAL, "", + ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, + (unsigned short)max_udp_size); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0); + if (status != ARES_SUCCESS) { + goto done; + } + } + +done: + if (status != ARES_SUCCESS) { + ares_dns_record_destroy(*dnsrec); + *dnsrec = NULL; + } + return status; +} + +ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec) +{ + unsigned char *data = NULL; + size_t data_len = 0; + ares_dns_record_t *out = NULL; + ares_status_t status; + + if (dnsrec == NULL) { + return NULL; + } + + status = ares_dns_write(dnsrec, &data, &data_len); + if (status != ARES_SUCCESS) { + return NULL; + } + + status = ares_dns_parse(data, data_len, 0, &out); + ares_free(data); + if (status != ARES_SUCCESS) { + return NULL; + } + return out; +} diff --git a/deps/cares/src/lib/ares_dns_write.c b/deps/cares/src/lib/ares_dns_write.c index 2e99c5ba88aee7..b49ec07bcb9b6b 100644 --- a/deps/cares/src/lib/ares_dns_write.c +++ b/deps/cares/src/lib/ares_dns_write.c @@ -831,10 +831,10 @@ static ares_status_t ares_dns_write_rr_raw_rr(ares__buf_t *buf, return ares__buf_append(buf, data, data_len); } -static ares_status_t ares_dns_write_rr(ares_dns_record_t *dnsrec, - ares__llist_t **namelist, - ares_dns_section_t section, - ares__buf_t *buf) +static ares_status_t ares_dns_write_rr(const ares_dns_record_t *dnsrec, + ares__llist_t **namelist, + ares_dns_section_t section, + ares__buf_t *buf) { size_t i; @@ -849,7 +849,7 @@ static ares_status_t ares_dns_write_rr(ares_dns_record_t *dnsrec, size_t end_length; unsigned int ttl; - rr = ares_dns_record_rr_get(dnsrec, section, i); + rr = ares_dns_record_rr_get_const(dnsrec, section, i); if (rr == NULL) { return ARES_EFORMERR; } @@ -988,8 +988,8 @@ static ares_status_t ares_dns_write_rr(ares_dns_record_t *dnsrec, return ARES_SUCCESS; } -ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, unsigned char **buf, - size_t *buf_len) +ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec, + unsigned char **buf, size_t *buf_len) { ares__buf_t *b = NULL; ares_status_t status; diff --git a/deps/cares/src/lib/ares_event.h b/deps/cares/src/lib/ares_event.h index 9d01d75f372afe..23e9637924ba07 100644 --- a/deps/cares/src/lib/ares_event.h +++ b/deps/cares/src/lib/ares_event.h @@ -72,11 +72,11 @@ struct ares_event { typedef struct { const char *name; ares_bool_t (*init)(ares_event_thread_t *e); - void (*destroy)(ares_event_thread_t *e); + void (*destroy)(ares_event_thread_t *e); ares_bool_t (*event_add)(ares_event_t *event); - void (*event_del)(ares_event_t *event); - void (*event_mod)(ares_event_t *event, ares_event_flags_t new_flags); - size_t (*wait)(ares_event_thread_t *e, unsigned long timeout_ms); + void (*event_del)(ares_event_t *event); + void (*event_mod)(ares_event_t *event, ares_event_flags_t new_flags); + size_t (*wait)(ares_event_thread_t *e, unsigned long timeout_ms); } ares_event_sys_t; struct ares_event_thread { diff --git a/deps/cares/src/lib/ares_event_poll.c b/deps/cares/src/lib/ares_event_poll.c index c16b2824663544..33b1d6dfd58ec7 100644 --- a/deps/cares/src/lib/ares_event_poll.c +++ b/deps/cares/src/lib/ares_event_poll.c @@ -75,8 +75,11 @@ static size_t ares_evsys_poll_wait(ares_event_thread_t *e, size_t cnt = 0; size_t i; - if (num_fds) { + if (fdlist != NULL && num_fds) { pollfd = ares_malloc_zero(sizeof(*pollfd) * num_fds); + if (pollfd == NULL) { + goto done; + } for (i = 0; i < num_fds; i++) { const ares_event_t *ev = ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]); @@ -96,7 +99,7 @@ static size_t ares_evsys_poll_wait(ares_event_thread_t *e, goto done; } - for (i = 0; i < num_fds; i++) { + for (i = 0; pollfd != NULL && i < num_fds; i++) { ares_event_t *ev; ares_event_flags_t flags = 0; diff --git a/deps/cares/src/lib/ares_getaddrinfo.c b/deps/cares/src/lib/ares_getaddrinfo.c index eaa4b422c06e9e..cfc889c70a84e2 100644 --- a/deps/cares/src/lib/ares_getaddrinfo.c +++ b/deps/cares/src/lib/ares_getaddrinfo.c @@ -79,15 +79,20 @@ struct host_query { char *lookups; /* Duplicate memory from channel because of ares_reinit() */ const char *remaining_lookups; /* types of lookup we need to perform ("fb" by default, file and dns respectively) */ - char **domains; /* duplicate from channel for ares_reinit() safety */ - size_t ndomains; - struct ares_addrinfo *ai; /* store results between lookups */ - unsigned short qid_a; /* qid for A request */ - unsigned short qid_aaaa; /* qid for AAAA request */ - size_t remaining; /* number of DNS answers waiting for */ - ares_ssize_t next_domain; /* next search domain to try */ - size_t - nodata_cnt; /* Track nodata responses to possibly override final result */ + + /* Search order for names */ + char **names; + size_t names_cnt; + size_t next_name_idx; /* next name index being attempted */ + + struct ares_addrinfo *ai; /* store results between lookups */ + unsigned short qid_a; /* qid for A request */ + unsigned short qid_aaaa; /* qid for AAAA request */ + + size_t remaining; /* number of DNS answers waiting for */ + + /* Track nodata responses to possibly override final result */ + size_t nodata_cnt; }; static const struct ares_addrinfo_hints default_hints = { @@ -98,10 +103,6 @@ static const struct ares_addrinfo_hints default_hints = { }; /* forward declarations */ -static void host_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); -static ares_bool_t as_is_first(const struct host_query *hquery); -static ares_bool_t as_is_only(const struct host_query *hquery); static ares_bool_t next_dns_lookup(struct host_query *hquery); struct ares_addrinfo_cname * @@ -324,6 +325,17 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port, return ARES_TRUE; } +static void hquery_free(struct host_query *hquery, ares_bool_t cleanup_ai) +{ + if (cleanup_ai) { + ares_freeaddrinfo(hquery->ai); + } + ares__strsplit_free(hquery->names, hquery->names_cnt); + ares_free(hquery->name); + ares_free(hquery->lookups); + ares_free(hquery); +} + static void end_hquery(struct host_query *hquery, ares_status_t status) { struct ares_addrinfo_node sentinel; @@ -349,10 +361,7 @@ static void end_hquery(struct host_query *hquery, ares_status_t status) } hquery->callback(hquery->arg, (int)status, (int)hquery->timeouts, hquery->ai); - ares__strsplit_free(hquery->domains, hquery->ndomains); - ares_free(hquery->lookups); - ares_free(hquery->name); - ares_free(hquery); + hquery_free(hquery, ARES_FALSE); } ares_bool_t ares__is_localhost(const char *name) @@ -478,25 +487,23 @@ static void terminate_retries(const struct host_query *hquery, query->no_retries = ARES_TRUE; } -static void host_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) +static void host_callback(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec) { struct host_query *hquery = (struct host_query *)arg; ares_status_t addinfostatus = ARES_SUCCESS; - unsigned short qid = 0; - hquery->timeouts += (size_t)timeouts; + hquery->timeouts += timeouts; hquery->remaining--; if (status == ARES_SUCCESS) { - if (alen < 0) { + if (dnsrec == NULL) { addinfostatus = ARES_EBADRESP; } else { - addinfostatus = ares__parse_into_addrinfo(abuf, (size_t)alen, ARES_TRUE, - hquery->port, hquery->ai); + addinfostatus = + ares__parse_into_addrinfo(dnsrec, ARES_TRUE, hquery->port, hquery->ai); } - if (addinfostatus == ARES_SUCCESS && alen >= HFIXEDSZ) { - qid = DNS_HEADER_QID(abuf); /* Converts to host byte order */ - terminate_retries(hquery, qid); + if (addinfostatus == ARES_SUCCESS) { + terminate_retries(hquery, ares_dns_record_get_id(dnsrec)); } } @@ -505,7 +512,7 @@ static void host_callback(void *arg, int status, int timeouts, /* must make sure we don't do next_lookup() on destroy or cancel, * and return the appropriate status. We won't return a partial * result in this case. */ - end_hquery(hquery, (ares_status_t)status); + end_hquery(hquery, status); } else if (addinfostatus != ARES_SUCCESS && addinfostatus != ARES_ENODATA) { /* error in parsing result e.g. no memory */ if (addinfostatus == ARES_EBADRESP && hquery->ai->nodes) { @@ -523,10 +530,9 @@ static void host_callback(void *arg, int status, int timeouts, if (status == ARES_ENODATA || addinfostatus == ARES_ENODATA) { hquery->nodata_cnt++; } - next_lookup(hquery, - hquery->nodata_cnt ? ARES_ENODATA : (ares_status_t)status); + next_lookup(hquery, hquery->nodata_cnt ? ARES_ENODATA : status); } else { - end_hquery(hquery, (ares_status_t)status); + end_hquery(hquery, status); } } @@ -542,7 +548,6 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, unsigned short port = 0; int family; struct ares_addrinfo *ai; - char *alias_name = NULL; ares_status_t status; if (!hints) { @@ -563,25 +568,12 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, return; } - /* perform HOSTALIAS resolution (technically this function does some other - * things we are going to ignore) */ - status = ares__single_domain(channel, name, &alias_name); - if (status != ARES_SUCCESS) { - callback(arg, (int)status, 0, NULL); - return; - } - - if (alias_name) { - name = alias_name; - } - if (service) { if (hints->ai_flags & ARES_AI_NUMERICSERV) { unsigned long val; errno = 0; val = strtoul(service, NULL, 0); if ((val == 0 && errno != 0) || val > 65535) { - ares_free(alias_name); callback(arg, ARES_ESERVICE, 0, NULL); return; } @@ -593,7 +585,6 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, errno = 0; val = strtoul(service, NULL, 0); if ((val == 0 && errno != 0) || val > 65535) { - ares_free(alias_name); callback(arg, ARES_ESERVICE, 0, NULL); return; } @@ -604,66 +595,53 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, ai = ares_malloc_zero(sizeof(*ai)); if (!ai) { - ares_free(alias_name); callback(arg, ARES_ENOMEM, 0, NULL); return; } if (fake_addrinfo(name, port, hints, ai, callback, arg)) { - ares_free(alias_name); return; } /* Allocate and fill in the host query structure. */ hquery = ares_malloc_zero(sizeof(*hquery)); if (!hquery) { - ares_free(alias_name); ares_freeaddrinfo(ai); callback(arg, ARES_ENOMEM, 0, NULL); return; } - memset(hquery, 0, sizeof(*hquery)); - hquery->name = ares_strdup(name); - ares_free(alias_name); - if (!hquery->name) { - ares_free(hquery); - ares_freeaddrinfo(ai); + + hquery->port = port; + hquery->channel = channel; + hquery->hints = *hints; + hquery->sent_family = -1; /* nothing is sent yet */ + hquery->callback = callback; + hquery->arg = arg; + hquery->ai = ai; + hquery->name = ares_strdup(name); + if (hquery->name == NULL) { + hquery_free(hquery, ARES_TRUE); callback(arg, ARES_ENOMEM, 0, NULL); return; } - hquery->lookups = ares_strdup(channel->lookups); - if (!hquery->lookups) { - ares_free(hquery->name); - ares_free(hquery); - ares_freeaddrinfo(ai); - callback(arg, ARES_ENOMEM, 0, NULL); + + status = + ares__search_name_list(channel, name, &hquery->names, &hquery->names_cnt); + if (status != ARES_SUCCESS) { + hquery_free(hquery, ARES_TRUE); + callback(arg, (int)status, 0, NULL); return; } + hquery->next_name_idx = 0; - if (channel->ndomains) { - /* Duplicate for ares_reinit() safety */ - hquery->domains = - ares__strsplit_duplicate(channel->domains, channel->ndomains); - if (hquery->domains == NULL) { - ares_free(hquery->lookups); - ares_free(hquery->name); - ares_free(hquery); - ares_freeaddrinfo(ai); - callback(arg, ARES_ENOMEM, 0, NULL); - return; - } - hquery->ndomains = channel->ndomains; - } - hquery->port = port; - hquery->channel = channel; - hquery->hints = *hints; - hquery->sent_family = -1; /* nothing is sent yet */ - hquery->callback = callback; - hquery->arg = arg; + hquery->lookups = ares_strdup(channel->lookups); + if (hquery->lookups == NULL) { + hquery_free(hquery, ARES_TRUE); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } hquery->remaining_lookups = hquery->lookups; - hquery->ai = ai; - hquery->next_domain = -1; /* Start performing lookups according to channel->lookups. */ next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */); @@ -684,93 +662,39 @@ void ares_getaddrinfo(ares_channel_t *channel, const char *name, static ares_bool_t next_dns_lookup(struct host_query *hquery) { - char *s = NULL; - ares_bool_t is_s_allocated = ARES_FALSE; - ares_status_t status; - - /* if next_domain == -1 and as_is_first is true, try hquery->name */ - if (hquery->next_domain == -1) { - if (as_is_first(hquery)) { - s = hquery->name; - } - hquery->next_domain = 0; - } - - /* if as_is_first is false, try hquery->name at last */ - if (!s && (size_t)hquery->next_domain == hquery->ndomains) { - if (!as_is_first(hquery)) { - s = hquery->name; - } - hquery->next_domain++; - } - - if (!s && (size_t)hquery->next_domain < hquery->ndomains && - !as_is_only(hquery)) { - status = ares__cat_domain(hquery->name, - hquery->domains[hquery->next_domain++], &s); - if (status == ARES_SUCCESS) { - is_s_allocated = ARES_TRUE; - } - } + const char *name = NULL; - if (s) { - /* NOTE: hquery may be invalidated during the call to ares_query_qid(), - * so should not be referenced after this point */ - switch (hquery->hints.ai_family) { - case AF_INET: - hquery->remaining += 1; - ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback, hquery, - &hquery->qid_a); - break; - case AF_INET6: - hquery->remaining += 1; - ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery, - &hquery->qid_aaaa); - break; - case AF_UNSPEC: - hquery->remaining += 2; - ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback, hquery, - &hquery->qid_a); - ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery, - &hquery->qid_aaaa); - break; - default: - break; - } - if (is_s_allocated) { - ares_free(s); - } - return ARES_TRUE; - } else { - assert(!hquery->ai->nodes); + if (hquery->next_name_idx >= hquery->names_cnt) { return ARES_FALSE; } -} -static ares_bool_t as_is_first(const struct host_query *hquery) -{ - const char *p; - size_t ndots = 0; - for (p = hquery->name; p && *p; p++) { - if (*p == '.') { - ndots++; - } - } - if (as_is_only(hquery)) { - /* prevent ARES_EBADNAME for valid FQDN, where ndots < channel->ndots */ - return ARES_TRUE; - } - return ndots >= hquery->channel->ndots ? ARES_TRUE : ARES_FALSE; -} + name = hquery->names[hquery->next_name_idx++]; -static ares_bool_t as_is_only(const struct host_query *hquery) -{ - size_t nname = ares_strlen(hquery->name); - if (hquery->channel->flags & ARES_FLAG_NOSEARCH) { - return ARES_TRUE; - } - if (hquery->name != NULL && nname && hquery->name[nname - 1] == '.') { - return ARES_TRUE; + /* NOTE: hquery may be invalidated during the call to ares_query_qid(), + * so should not be referenced after this point */ + switch (hquery->hints.ai_family) { + case AF_INET: + hquery->remaining += 1; + ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A, + host_callback, hquery, &hquery->qid_a); + break; + case AF_INET6: + hquery->remaining += 1; + ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, + ARES_REC_TYPE_AAAA, host_callback, hquery, + &hquery->qid_aaaa); + break; + case AF_UNSPEC: + hquery->remaining += 2; + ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A, + host_callback, hquery, &hquery->qid_a); + ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, + ARES_REC_TYPE_AAAA, host_callback, hquery, + &hquery->qid_aaaa); + break; + default: + break; } - return ARES_FALSE; + + return ARES_TRUE; } diff --git a/deps/cares/src/lib/ares_gethostbyaddr.c b/deps/cares/src/lib/ares_gethostbyaddr.c index ab54706ba96889..453673260dcee5 100644 --- a/deps/cares/src/lib/ares_gethostbyaddr.c +++ b/deps/cares/src/lib/ares_gethostbyaddr.c @@ -59,11 +59,11 @@ struct addr_query { size_t timeouts; }; -static void next_lookup(struct addr_query *aquery); -static void addr_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); -static void end_aquery(struct addr_query *aquery, ares_status_t status, - struct hostent *host); +static void next_lookup(struct addr_query *aquery); +static void addr_callback(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec); +static void end_aquery(struct addr_query *aquery, ares_status_t status, + struct hostent *host); static ares_status_t file_lookup(ares_channel_t *channel, const struct ares_addr *addr, struct hostent **host); @@ -138,7 +138,8 @@ static void next_lookup(struct addr_query *aquery) return; } aquery->remaining_lookups = p + 1; - ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, aquery); + ares_query_dnsrec(aquery->channel, name, ARES_CLASS_IN, + ARES_REC_TYPE_PTR, addr_callback, aquery, NULL); ares_free(name); return; case 'f': @@ -159,27 +160,27 @@ static void next_lookup(struct addr_query *aquery) end_aquery(aquery, ARES_ENOTFOUND, NULL); } -static void addr_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) +static void addr_callback(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec) { struct addr_query *aquery = (struct addr_query *)arg; struct hostent *host; size_t addrlen; - aquery->timeouts += (size_t)timeouts; + aquery->timeouts += timeouts; if (status == ARES_SUCCESS) { if (aquery->addr.family == AF_INET) { addrlen = sizeof(aquery->addr.addr.addr4); - status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr.addr4, - (int)addrlen, AF_INET, &host); + status = ares_parse_ptr_reply_dnsrec(dnsrec, &aquery->addr.addr.addr4, + (int)addrlen, AF_INET, &host); } else { addrlen = sizeof(aquery->addr.addr.addr6); - status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr.addr6, - (int)addrlen, AF_INET6, &host); + status = ares_parse_ptr_reply_dnsrec(dnsrec, &aquery->addr.addr.addr6, + (int)addrlen, AF_INET6, &host); } - end_aquery(aquery, (ares_status_t)status, host); + end_aquery(aquery, status, host); } else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) { - end_aquery(aquery, (ares_status_t)status, NULL); + end_aquery(aquery, status, NULL); } else { next_lookup(aquery); } diff --git a/deps/cares/src/lib/ares_init.c b/deps/cares/src/lib/ares_init.c index bae7c72fe2cf67..28a509ea48a5af 100644 --- a/deps/cares/src/lib/ares_init.c +++ b/deps/cares/src/lib/ares_init.c @@ -152,10 +152,6 @@ static ares_status_t init_by_defaults(ares_channel_t *channel) channel->tries = DEFAULT_TRIES; } - if (channel->ndots == 0) { - channel->ndots = 1; - } - if (ares__slist_len(channel->servers) == 0) { /* Add a default local named server to the channel unless configured not * to (in which case return an error). @@ -261,31 +257,6 @@ static ares_status_t init_by_defaults(ares_channel_t *channel) } error: - if (rc) { - if (channel->domains && channel->domains[0]) { - ares_free(channel->domains[0]); - } - if (channel->domains) { - ares_free(channel->domains); - channel->domains = NULL; - } - - if (channel->lookups) { - ares_free(channel->lookups); - channel->lookups = NULL; - } - - if (channel->resolvconf_path) { - ares_free(channel->resolvconf_path); - channel->resolvconf_path = NULL; - } - - if (channel->hosts_path) { - ares_free(channel->hosts_path); - channel->hosts_path = NULL; - } - } - if (hostname) { ares_free(hostname); } @@ -309,6 +280,9 @@ int ares_init_options(ares_channel_t **channelptr, return ARES_ENOMEM; } + /* One option where zero is valid, so set default value here */ + channel->ndots = 1; + status = ares__channel_threading_init(channel); if (status != ARES_SUCCESS) { goto done; diff --git a/deps/cares/src/lib/ares_ipv6.h b/deps/cares/src/lib/ares_ipv6.h index be8cbe989396c2..28d7851ff3f051 100644 --- a/deps/cares/src/lib/ares_ipv6.h +++ b/deps/cares/src/lib/ares_ipv6.h @@ -27,6 +27,10 @@ #ifndef ARES_IPV6_H #define ARES_IPV6_H +#ifdef HAVE_NETINET6_IN6_H +# include +#endif + #ifndef HAVE_PF_INET6 # define PF_INET6 AF_INET6 #endif diff --git a/deps/cares/src/lib/ares_library_init.c b/deps/cares/src/lib/ares_library_init.c index 5cd39dc244ba4b..2767f1f93c77e4 100644 --- a/deps/cares/src/lib/ares_library_init.c +++ b/deps/cares/src/lib/ares_library_init.c @@ -72,7 +72,7 @@ static void default_free(void *p) #endif void *(*ares_malloc)(size_t size) = default_malloc; void *(*ares_realloc)(void *ptr, size_t size) = default_realloc; -void (*ares_free)(void *ptr) = default_free; +void (*ares_free)(void *ptr) = default_free; void *ares_malloc_zero(size_t size) { @@ -114,7 +114,7 @@ int ares_library_init(int flags) } int ares_library_init_mem(int flags, void *(*amalloc)(size_t size), - void (*afree)(void *ptr), + void (*afree)(void *ptr), void *(*arealloc)(void *ptr, size_t size)) { if (amalloc) { diff --git a/deps/cares/src/lib/ares_mkquery.c b/deps/cares/src/lib/ares_mkquery.c deleted file mode 100644 index da1898e74cd951..00000000000000 --- a/deps/cares/src/lib/ares_mkquery.c +++ /dev/null @@ -1,35 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" -#include "ares.h" - -int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id, - int rd, unsigned char **buf, int *buflen) -{ - return ares_create_query(name, dnsclass, type, id, rd, buf, buflen, 0); -} diff --git a/deps/cares/src/lib/ares_options.c b/deps/cares/src/lib/ares_options.c index 342d2ea1bec968..adc3e062ac437e 100644 --- a/deps/cares/src/lib/ares_options.c +++ b/deps/cares/src/lib/ares_options.c @@ -316,7 +316,7 @@ ares_status_t ares__init_by_options(ares_channel_t *channel, } if (optmask & ARES_OPT_NDOTS) { - if (options->ndots <= 0) { + if (options->ndots < 0) { optmask &= ~(ARES_OPT_NDOTS); } else { channel->ndots = (size_t)options->ndots; diff --git a/deps/cares/src/lib/ares_parse_a_reply.c b/deps/cares/src/lib/ares_parse_a_reply.c index f576575fe4b2fd..da841f0da9af36 100644 --- a/deps/cares/src/lib/ares_parse_a_reply.c +++ b/deps/cares/src/lib/ares_parse_a_reply.c @@ -59,6 +59,7 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen, char *question_hostname = NULL; ares_status_t status; size_t req_naddrttls = 0; + ares_dns_record_t *dnsrec = NULL; if (alen < 0) { return ARES_EBADRESP; @@ -71,7 +72,12 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen, memset(&ai, 0, sizeof(ai)); - status = ares__parse_into_addrinfo(abuf, (size_t)alen, 0, 0, &ai); + status = ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai); if (status != ARES_SUCCESS && status != ARES_ENODATA) { goto fail; } @@ -96,6 +102,11 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen, ares__freeaddrinfo_nodes(ai.nodes); ares_free(ai.name); ares_free(question_hostname); + ares_dns_record_destroy(dnsrec); + + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } return (int)status; } diff --git a/deps/cares/src/lib/ares_parse_aaaa_reply.c b/deps/cares/src/lib/ares_parse_aaaa_reply.c index cef4ad7f80948f..b3eba166be6ad6 100644 --- a/deps/cares/src/lib/ares_parse_aaaa_reply.c +++ b/deps/cares/src/lib/ares_parse_aaaa_reply.c @@ -61,6 +61,7 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, char *question_hostname = NULL; ares_status_t status; size_t req_naddrttls = 0; + ares_dns_record_t *dnsrec = NULL; if (alen < 0) { return ARES_EBADRESP; @@ -73,7 +74,12 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, memset(&ai, 0, sizeof(ai)); - status = ares__parse_into_addrinfo(abuf, (size_t)alen, 0, 0, &ai); + status = ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai); if (status != ARES_SUCCESS && status != ARES_ENODATA) { goto fail; } @@ -97,6 +103,11 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, ares__freeaddrinfo_nodes(ai.nodes); ares_free(question_hostname); ares_free(ai.name); + ares_dns_record_destroy(dnsrec); + + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } return (int)status; } diff --git a/deps/cares/src/lib/ares_parse_ptr_reply.c b/deps/cares/src/lib/ares_parse_ptr_reply.c index d8a29f272251cf..6ee20f722e3d01 100644 --- a/deps/cares/src/lib/ares_parse_ptr_reply.c +++ b/deps/cares/src/lib/ares_parse_ptr_reply.c @@ -36,33 +36,20 @@ #include "ares.h" #include "ares_private.h" -int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int, - const void *addr, int addrlen, int family, - struct hostent **host) +ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, + const void *addr, int addrlen, + int family, struct hostent **host) { - ares_status_t status; - size_t alen; - size_t ptrcount = 0; - struct hostent *hostent = NULL; - const char *hostname = NULL; - const char *ptrname = NULL; - ares_dns_record_t *dnsrec = NULL; - size_t i; - size_t ancount; + ares_status_t status; + size_t ptrcount = 0; + struct hostent *hostent = NULL; + const char *hostname = NULL; + const char *ptrname = NULL; + size_t i; + size_t ancount; *host = NULL; - if (alen_int < 0) { - return ARES_EBADRESP; - } - - alen = (size_t)alen_int; - - status = ares_dns_parse(abuf, alen, 0, &dnsrec); - if (status != ARES_SUCCESS) { - goto done; - } - /* Fetch name from query as we will use it to compare later on. Old code * did this check, so we'll retain it. */ status = ares_dns_record_query_get(dnsrec, 0, &ptrname, NULL, NULL); @@ -114,7 +101,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int, /* Cycle through answers */ for (i = 0; i < ancount; i++) { const ares_dns_rr_t *rr = - ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i); if (rr == NULL) { /* Shouldn't be possible */ @@ -195,6 +182,34 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int, } else { *host = hostent; } + return status; +} + +int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int, + const void *addr, int addrlen, int family, + struct hostent **host) +{ + size_t alen; + ares_dns_record_t *dnsrec = NULL; + ares_status_t status; + + if (alen_int < 0) { + return ARES_EBADRESP; + } + + alen = (size_t)alen_int; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_parse_ptr_reply_dnsrec(dnsrec, addr, addrlen, family, host); + +done: ares_dns_record_destroy(dnsrec); + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } return (int)status; } diff --git a/deps/cares/src/lib/ares_private.h b/deps/cares/src/lib/ares_private.h index fd321b911c4a1c..6a9e04af2eb633 100644 --- a/deps/cares/src/lib/ares_private.h +++ b/deps/cares/src/lib/ares_private.h @@ -209,7 +209,7 @@ struct query { unsigned char *qbuf; size_t qlen; - ares_callback callback; + ares_callback_dnsrec callback; void *arg; /* Query status */ @@ -318,12 +318,12 @@ struct ares_channeldata { }; /* Does the domain end in ".onion" or ".onion."? Case-insensitive. */ -ares_bool_t ares__is_onion_domain(const char *name); +ares_bool_t ares__is_onion_domain(const char *name); /* Memory management functions */ -extern void *(*ares_malloc)(size_t size); -extern void *(*ares_realloc)(void *ptr, size_t size); -extern void (*ares_free)(void *ptr); +extern void *(*ares_malloc)(size_t size); +extern void *(*ares_realloc)(void *ptr, size_t size); +extern void (*ares_free)(void *ptr); void *ares_malloc_zero(size_t size); void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size); @@ -335,23 +335,37 @@ ares_bool_t ares__timedout(const struct timeval *now, ares_status_t ares__send_query(struct query *query, struct timeval *now); ares_status_t ares__requeue_query(struct query *query, struct timeval *now); -/* Identical to ares_query, but returns a normal ares return code like - * ARES_SUCCESS, and can be passed the qid by reference which will be - * filled in on ARES_SUCCESS */ -ares_status_t ares_query_qid(ares_channel_t *channel, const char *name, - int dnsclass, int type, ares_callback callback, - void *arg, unsigned short *qid); -/* Identical to ares_send() except returns normal ares return codes like - * ARES_SUCCESS */ -ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, - size_t qlen, ares_callback callback, void *arg, - unsigned short *qid); -void ares__close_connection(struct server_connection *conn); -void ares__close_sockets(struct server_state *server); -void ares__check_cleanup_conn(const ares_channel_t *channel, - struct server_connection *conn); -ares_status_t ares__read_line(FILE *fp, char **buf, size_t *bufsize); -void ares__free_query(struct query *query); +/*! Retrieve a list of names to use for searching. The first successful + * query in the list wins. This function also uses the HOSTSALIASES file + * as well as uses channel configuration to determine the search order. + * + * \param[in] channel initialized ares channel + * \param[in] name initial name being searched + * \param[out] names array of names to attempt, use ares__strsplit_free() + * when no longer needed. + * \param[out] names_len number of names in array + * \return ARES_SUCCESS on success, otherwise one of the other error codes. + */ +ares_status_t ares__search_name_list(const ares_channel_t *channel, + const char *name, char ***names, + size_t *names_len); + +/*! Function to create callback arg for converting from ares_callback_dnsrec + * to ares_calback */ +void *ares__dnsrec_convert_arg(ares_callback callback, void *arg); + +/*! Callback function used to convert from the ares_callback_dnsrec prototype to + * the ares_callback prototype, by writing the result and passing that to + * the inner callback. + */ +void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec); + +void ares__close_connection(struct server_connection *conn); +void ares__close_sockets(struct server_state *server); +void ares__check_cleanup_conn(const ares_channel_t *channel, + struct server_connection *conn); +void ares__free_query(struct query *query); ares_rand_state *ares__init_rand_state(void); void ares__destroy_rand_state(ares_rand_state *state); @@ -391,6 +405,7 @@ typedef struct { size_t tries; ares_bool_t rotate; size_t timeout_ms; + ares_bool_t usevc; } ares_sysconfig_t; ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig); @@ -401,8 +416,13 @@ ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, const char *str); void ares__destroy_servers_state(ares_channel_t *channel); -ares_status_t ares__single_domain(const ares_channel_t *channel, - const char *name, char **s); + +/* Returns ARES_SUCCESS if alias found, alias is set. Returns ARES_ENOTFOUND + * if not alias found. Returns other errors on critical failure like + * ARES_ENOMEM */ +ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel, + const char *name, char **alias); + ares_status_t ares__cat_domain(const char *name, const char *domain, char **s); ares_status_t ares__sortaddrinfo(ares_channel_t *channel, struct ares_addrinfo_node *ai_node); @@ -427,10 +447,13 @@ ares_status_t ares_append_ai_node(int aftype, unsigned short port, void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head, struct ares_addrinfo_cname *tail); -ares_status_t ares__parse_into_addrinfo(const unsigned char *abuf, size_t alen, +ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec, ares_bool_t cname_only_is_enodata, unsigned short port, struct ares_addrinfo *ai); +ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, + const void *addr, int addrlen, + int family, struct hostent **host); ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family, struct hostent **host); @@ -456,10 +479,9 @@ ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s, ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s, void *data, size_t data_len); void ares__close_socket(ares_channel, ares_socket_t); -int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd, - const struct sockaddr *addr, ares_socklen_t addrlen); -ares_bool_t ares__is_hostnamech(int ch); -void ares__destroy_server(struct server_state *server); +int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd, + const struct sockaddr *addr, ares_socklen_t addrlen); +void ares__destroy_server(struct server_state *server); ares_status_t ares__servers_update(ares_channel_t *channel, ares__llist_t *server_list, @@ -494,7 +516,6 @@ ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry, unsigned short port, ares_bool_t want_cnames, struct ares_addrinfo *ai); -ares_bool_t ares__isprint(int ch); /*! Parse a compressed DNS name as defined in RFC1035 starting at the current @@ -560,7 +581,7 @@ void ares_queue_notify_empty(ares_channel_t *channel); } while (0) #define ARES_CONFIG_CHECK(x) \ - (x && x->lookups && ares__slist_len(x->servers) > 0 && x->ndots > 0 && \ + (x && x->lookups && ares__slist_len(x->servers) > 0 && \ x->timeout > 0 && x->tries > 0) ares_bool_t ares__subnet_match(const struct ares_addr *addr, @@ -583,10 +604,10 @@ ares_status_t ares_qcache_insert(ares_channel_t *channel, const struct timeval *now, const struct query *query, ares_dns_record_t *dnsrec); -ares_status_t ares_qcache_fetch(ares_channel_t *channel, - const struct timeval *now, - const unsigned char *qbuf, size_t qlen, - unsigned char **abuf, size_t *alen); +ares_status_t ares_qcache_fetch(ares_channel_t *channel, + const struct timeval *now, + const ares_dns_record_t *dnsrec, + const ares_dns_record_t **dnsrec_resp); ares_status_t ares__channel_threading_init(ares_channel_t *channel); void ares__channel_threading_destroy(ares_channel_t *channel); diff --git a/deps/cares/src/lib/ares_process.c b/deps/cares/src/lib/ares_process.c index bd84d09e134805..b9705ae882b9ff 100644 --- a/deps/cares/src/lib/ares_process.c +++ b/deps/cares/src/lib/ares_process.c @@ -68,8 +68,7 @@ static ares_bool_t same_questions(const ares_dns_record_t *qrec, static ares_bool_t same_address(const struct sockaddr *sa, const struct ares_addr *aa); static void end_query(ares_channel_t *channel, struct query *query, - ares_status_t status, const unsigned char *abuf, - size_t alen); + ares_status_t status, const ares_dns_record_t *dnsrec); static void server_increment_failures(struct server_state *server) { @@ -625,6 +624,7 @@ static ares_status_t process_answer(ares_channel_t *channel, ares_dns_record_t *rdnsrec = NULL; ares_dns_record_t *qdnsrec = NULL; ares_status_t status; + ares_bool_t is_cached = ARES_FALSE; /* Parse the response */ status = ares_dns_parse(abuf, alen, 0, &rdnsrec); @@ -648,7 +648,7 @@ static ares_status_t process_answer(ares_channel_t *channel, /* Parse the question we sent as we use it to compare */ status = ares_dns_parse(query->qbuf, query->qlen, 0, &qdnsrec); if (status != ARES_SUCCESS) { - end_query(channel, query, status, NULL, 0); + end_query(channel, query, status, NULL); goto cleanup; } @@ -674,7 +674,7 @@ static ares_status_t process_answer(ares_channel_t *channel, ares_dns_has_opt_rr(qdnsrec) && !ares_dns_has_opt_rr(rdnsrec)) { status = rewrite_without_edns(qdnsrec, query); if (status != ARES_SUCCESS) { - end_query(channel, query, status, NULL, 0); + end_query(channel, query, status, NULL); goto cleanup; } @@ -729,16 +729,20 @@ static ares_status_t process_answer(ares_channel_t *channel, /* If cache insertion was successful, it took ownership. We ignore * other cache insertion failures. */ if (ares_qcache_insert(channel, now, query, rdnsrec) == ARES_SUCCESS) { - rdnsrec = NULL; + is_cached = ARES_TRUE; } server_set_good(server); - end_query(channel, query, ARES_SUCCESS, abuf, alen); + end_query(channel, query, ARES_SUCCESS, rdnsrec); status = ARES_SUCCESS; cleanup: - ares_dns_record_destroy(rdnsrec); + /* Don't cleanup the cached pointer to the dns response */ + if (!is_cached) { + ares_dns_record_destroy(rdnsrec); + } + ares_dns_record_destroy(qdnsrec); return status; } @@ -774,7 +778,7 @@ ares_status_t ares__requeue_query(struct query *query, struct timeval *now) query->error_status = ARES_ETIMEOUT; } - end_query(channel, query, query->error_status, NULL, 0); + end_query(channel, query, query->error_status, NULL); return ARES_ETIMEOUT; } @@ -893,7 +897,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now) } if (server == NULL) { - end_query(channel, query, ARES_ENOSERVER /* ? */, NULL, 0); + end_query(channel, query, ARES_ENOSERVER /* ? */, NULL); return ARES_ENOSERVER; } @@ -920,7 +924,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now) /* Anything else is not retryable, likely ENOMEM */ default: - end_query(channel, query, status, NULL, 0); + end_query(channel, query, status, NULL); return status; } } @@ -931,7 +935,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now) status = ares__append_tcpbuf(server, query); if (status != ARES_SUCCESS) { - end_query(channel, query, status, NULL, 0); + end_query(channel, query, status, NULL); /* Only safe to kill connection if it was new, otherwise it should be * cleaned up by another process later */ @@ -979,7 +983,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now) /* Anything else is not retryable, likely ENOMEM */ default: - end_query(channel, query, status, NULL, 0); + end_query(channel, query, status, NULL); return status; } node = ares__llist_node_first(server->connections); @@ -1011,7 +1015,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now) query->node_queries_by_timeout = ares__slist_insert(channel->queries_by_timeout, query); if (!query->node_queries_by_timeout) { - end_query(channel, query, ARES_ENOMEM, NULL, 0); + end_query(channel, query, ARES_ENOMEM, NULL); /* Only safe to kill connection if it was new, otherwise it should be * cleaned up by another process later */ if (new_connection) { @@ -1027,7 +1031,7 @@ ares_status_t ares__send_query(struct query *query, struct timeval *now) ares__llist_insert_last(conn->queries_to_conn, query); if (query->node_queries_to_conn == NULL) { - end_query(channel, query, ARES_ENOMEM, NULL, 0); + end_query(channel, query, ARES_ENOMEM, NULL); /* Only safe to kill connection if it was new, otherwise it should be * cleaned up by another process later */ if (new_connection) { @@ -1124,14 +1128,10 @@ static void ares_detach_query(struct query *query) } static void end_query(ares_channel_t *channel, struct query *query, - ares_status_t status, const unsigned char *abuf, - size_t alen) + ares_status_t status, const ares_dns_record_t *dnsrec) { /* Invoke the callback. */ - query->callback(query->arg, (int)status, (int)query->timeouts, - /* due to prior design flaws, abuf isn't meant to be modified, - * but bad prototypes, ugh. Lets cast off constfor compat. */ - (unsigned char *)((void *)((size_t)abuf)), (int)alen); + query->callback(query->arg, status, query->timeouts, dnsrec); ares__free_query(query); /* Check and notify if no other queries are enqueued on the channel. This diff --git a/deps/cares/src/lib/ares_qcache.c b/deps/cares/src/lib/ares_qcache.c index bab8781850789a..2af1125a0d299f 100644 --- a/deps/cares/src/lib/ares_qcache.c +++ b/deps/cares/src/lib/ares_qcache.c @@ -81,6 +81,7 @@ static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec) for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { const char *name; + size_t name_len; ares_dns_rec_type_t qtype; ares_dns_class_t qclass; @@ -114,7 +115,15 @@ static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec) goto fail; } - status = ares__buf_append_str(buf, name); + /* On queries, a '.' may be appended to the name to indicate an explicit + * name lookup without performing a search. Strip this since its not part + * of a cached response. */ + name_len = ares_strlen(name); + if (name_len && name[name_len - 1] == '.') { + name_len--; + } + + status = ares__buf_append(buf, (const unsigned char *)name, name_len); if (status != ARES_SUCCESS) { goto fail; } @@ -384,20 +393,24 @@ static ares_status_t ares__qcache_insert(ares__qcache_t *qcache, return ARES_ENOMEM; } -static ares_status_t ares__qcache_fetch(ares__qcache_t *qcache, - const ares_dns_record_t *dnsrec, - const struct timeval *now, - unsigned char **buf, size_t *buf_len) +ares_status_t ares_qcache_fetch(ares_channel_t *channel, + const struct timeval *now, + const ares_dns_record_t *dnsrec, + const ares_dns_record_t **dnsrec_resp) { char *key = NULL; ares__qcache_entry_t *entry; - ares_status_t status; + ares_status_t status = ARES_SUCCESS; - if (qcache == NULL || dnsrec == NULL) { + if (channel == NULL || dnsrec == NULL || dnsrec_resp == NULL) { return ARES_EFORMERR; } - ares__qcache_expire(qcache, now); + if (channel->qcache == NULL) { + return ARES_ENOTFOUND; + } + + ares__qcache_expire(channel->qcache, now); key = ares__qcache_calc_key(dnsrec); if (key == NULL) { @@ -405,7 +418,7 @@ static ares_status_t ares__qcache_fetch(ares__qcache_t *qcache, goto done; } - entry = ares__htable_strvp_get_direct(qcache->cache, key); + entry = ares__htable_strvp_get_direct(channel->qcache->cache, key); if (entry == NULL) { status = ARES_ENOTFOUND; goto done; @@ -414,7 +427,7 @@ static ares_status_t ares__qcache_fetch(ares__qcache_t *qcache, ares_dns_record_write_ttl_decrement( entry->dnsrec, (unsigned int)(now->tv_sec - entry->insert_ts)); - status = ares_dns_write(entry->dnsrec, buf, buf_len); + *dnsrec_resp = entry->dnsrec; done: ares_free(key); @@ -429,27 +442,3 @@ ares_status_t ares_qcache_insert(ares_channel_t *channel, return ares__qcache_insert(channel->qcache, dnsrec, query->qbuf, query->qlen, now); } - -ares_status_t ares_qcache_fetch(ares_channel_t *channel, - const struct timeval *now, - const unsigned char *qbuf, size_t qlen, - unsigned char **abuf, size_t *alen) -{ - ares_status_t status; - ares_dns_record_t *dnsrec = NULL; - - if (channel->qcache == NULL) { - return ARES_ENOTFOUND; - } - - status = ares_dns_parse(qbuf, qlen, 0, &dnsrec); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares__qcache_fetch(channel->qcache, dnsrec, now, abuf, alen); - -done: - ares_dns_record_destroy(dnsrec); - return status; -} diff --git a/deps/cares/src/lib/ares_query.c b/deps/cares/src/lib/ares_query.c index 098e6789471809..0eea80e7fc1e59 100644 --- a/deps/cares/src/lib/ares_query.c +++ b/deps/cares/src/lib/ares_query.c @@ -37,103 +37,116 @@ #include "ares_dns.h" #include "ares_private.h" -struct qquery { - ares_callback callback; - void *arg; -}; +typedef struct { + ares_callback_dnsrec callback; + void *arg; +} ares_query_dnsrec_arg_t; -static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, - int alen); - -ares_status_t ares_query_qid(ares_channel_t *channel, const char *name, - int dnsclass, int type, ares_callback callback, - void *arg, unsigned short *qid) +static void ares_query_dnsrec_cb(void *arg, ares_status_t status, + size_t timeouts, + const ares_dns_record_t *dnsrec) { - struct qquery *qquery; - unsigned char *qbuf; - int qlen; - int rd; - ares_status_t status; - - /* Compose the query. */ - rd = !(channel->flags & ARES_FLAG_NORECURSE); - status = (ares_status_t)ares_create_query( - name, dnsclass, type, 0, rd, &qbuf, &qlen, - (channel->flags & ARES_FLAG_EDNS) ? (int)channel->ednspsz : 0); + ares_query_dnsrec_arg_t *qquery = arg; + if (status != ARES_SUCCESS) { - if (qbuf != NULL) { - ares_free(qbuf); + qquery->callback(qquery->arg, status, timeouts, dnsrec); + } else { + size_t ancount; + ares_dns_rcode_t rcode; + /* Pull the response code and answer count from the packet and convert any + * errors. + */ + rcode = ares_dns_record_get_rcode(dnsrec); + ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + status = ares_dns_query_reply_tostatus(rcode, ancount); + qquery->callback(qquery->arg, status, timeouts, dnsrec); + } + ares_free(qquery); +} + +static ares_status_t ares_query_int(ares_channel_t *channel, const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, + ares_callback_dnsrec callback, void *arg, + unsigned short *qid) +{ + ares_status_t status; + ares_dns_record_t *dnsrec = NULL; + ares_dns_flags_t flags = 0; + ares_query_dnsrec_arg_t *qquery = NULL; + + if (channel == NULL || name == NULL || callback == NULL) { + status = ARES_EFORMERR; + if (callback != NULL) { + callback(arg, status, 0, NULL); } - callback(arg, (int)status, 0, NULL, 0); return status; } - /* Allocate and fill in the query structure. */ - qquery = ares_malloc(sizeof(struct qquery)); - if (!qquery) { - ares_free_string(qbuf); - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return ARES_ENOMEM; + if (!(channel->flags & ARES_FLAG_NORECURSE)) { + flags |= ARES_FLAG_RD; } + + status = ares_dns_record_create_query( + &dnsrec, name, dnsclass, type, 0, flags, + (size_t)(channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0); + if (status != ARES_SUCCESS) { + callback(arg, status, 0, NULL); + return status; + } + + qquery = ares_malloc(sizeof(*qquery)); + if (qquery == NULL) { + status = ARES_ENOMEM; + callback(arg, status, 0, NULL); + ares_dns_record_destroy(dnsrec); + return status; + } + qquery->callback = callback; qquery->arg = arg; /* Send it off. qcallback will be called when we get an answer. */ - status = ares_send_ex(channel, qbuf, (size_t)qlen, qcallback, qquery, qid); - ares_free_string(qbuf); + status = ares_send_dnsrec(channel, dnsrec, ares_query_dnsrec_cb, qquery, qid); + ares_dns_record_destroy(dnsrec); return status; } -void ares_query(ares_channel_t *channel, const char *name, int dnsclass, - int type, ares_callback callback, void *arg) +ares_status_t ares_query_dnsrec(ares_channel_t *channel, const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, + ares_callback_dnsrec callback, void *arg, + unsigned short *qid) { + ares_status_t status; + if (channel == NULL) { - return; + return ARES_EFORMERR; } + ares__channel_lock(channel); - ares_query_qid(channel, name, dnsclass, type, callback, arg, NULL); + status = ares_query_int(channel, name, dnsclass, type, callback, arg, qid); ares__channel_unlock(channel); + return status; } -static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, - int alen) +void ares_query(ares_channel_t *channel, const char *name, int dnsclass, + int type, ares_callback callback, void *arg) { - struct qquery *qquery = (struct qquery *)arg; - size_t ancount; - int rcode; + void *carg = NULL; - if (status != ARES_SUCCESS) { - qquery->callback(qquery->arg, status, timeouts, abuf, alen); - } else { - /* Pull the response code and answer count from the packet. */ - rcode = DNS_HEADER_RCODE(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - - /* Convert errors. */ - switch (rcode) { - case NOERROR: - status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA; - break; - case FORMERR: - status = ARES_EFORMERR; - break; - case SERVFAIL: - status = ARES_ESERVFAIL; - break; - case NXDOMAIN: - status = ARES_ENOTFOUND; - break; - case NOTIMP: - status = ARES_ENOTIMP; - break; - case REFUSED: - status = ARES_EREFUSED; - break; - default: - break; - } - qquery->callback(qquery->arg, status, timeouts, abuf, alen); + if (channel == NULL) { + return; } - ares_free(qquery); + + carg = ares__dnsrec_convert_arg(callback, arg); + if (carg == NULL) { + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return; + } + + ares_query_dnsrec(channel, name, (ares_dns_class_t)dnsclass, + (ares_dns_rec_type_t)type, ares__dnsrec_convert_cb, carg, + NULL); } diff --git a/deps/cares/src/lib/ares_search.c b/deps/cares/src/lib/ares_search.c index 429c7e1db0de26..4fd909cd4f8b9f 100644 --- a/deps/cares/src/lib/ares_search.c +++ b/deps/cares/src/lib/ares_search.c @@ -33,209 +33,437 @@ #include "ares.h" #include "ares_private.h" +#include "ares_dns.h" struct search_query { - /* Arguments passed to ares_search */ - ares_channel_t *channel; - char *name; /* copied into an allocated buffer */ - int dnsclass; - int type; - ares_callback callback; - void *arg; - char **domains; /* duplicate for ares_reinit() safety */ - size_t ndomains; - - int status_as_is; /* error status from trying as-is */ - size_t next_domain; /* next search domain to try */ - ares_bool_t trying_as_is; /* current query is for name as-is */ - size_t timeouts; /* number of timeouts we saw for this request */ + /* Arguments passed to ares_search_dnsrec() */ + ares_channel_t *channel; + ares_callback_dnsrec callback; + void *arg; + + /* Duplicate of DNS record passed to ares_search_dnsrec() */ + ares_dns_record_t *dnsrec; + + /* Search order for names */ + char **names; + size_t names_cnt; + + /* State tracking progress through the search query */ + size_t next_name_idx; /* next name index being attempted */ + size_t timeouts; /* number of timeouts we saw for this request */ ares_bool_t ever_got_nodata; /* did we ever get ARES_ENODATA along the way? */ }; -static void search_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); +static void squery_free(struct search_query *squery) +{ + if (squery == NULL) { + return; + } + ares__strsplit_free(squery->names, squery->names_cnt); + ares_dns_record_destroy(squery->dnsrec); + ares_free(squery); +} + +/* End a search query by invoking the user callback and freeing the + * search_query structure. + */ static void end_squery(struct search_query *squery, ares_status_t status, - unsigned char *abuf, size_t alen); + const ares_dns_record_t *dnsrec) +{ + squery->callback(squery->arg, status, squery->timeouts, dnsrec); + squery_free(squery); +} + +static void search_callback(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec); -static void ares_search_int(ares_channel_t *channel, const char *name, - int dnsclass, int type, ares_callback callback, - void *arg) +static ares_status_t ares_search_next(ares_channel_t *channel, + struct search_query *squery, + ares_bool_t *skip_cleanup) { - struct search_query *squery; - char *s; - const char *p; - ares_status_t status; - size_t ndots; + ares_status_t status; - /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ - if (ares__is_onion_domain(name)) { - callback(arg, ARES_ENOTFOUND, 0, NULL, 0); - return; + *skip_cleanup = ARES_FALSE; + + /* Misuse check */ + if (squery->next_name_idx >= squery->names_cnt) { + return ARES_EFORMERR; } - /* If name only yields one domain to search, then we don't have - * to keep extra state, so just do an ares_query(). - */ - status = ares__single_domain(channel, name, &s); + status = ares_dns_record_query_set_name( + squery->dnsrec, 0, squery->names[squery->next_name_idx++]); if (status != ARES_SUCCESS) { - callback(arg, (int)status, 0, NULL, 0); + return status; + } + + status = + ares_send_dnsrec(channel, squery->dnsrec, search_callback, squery, NULL); + + if (status != ARES_EFORMERR) { + *skip_cleanup = ARES_TRUE; + } + + return status; +} + +static void search_callback(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec) +{ + struct search_query *squery = (struct search_query *)arg; + ares_channel_t *channel = squery->channel; + ares_dns_rcode_t rcode; + size_t ancount; + ares_status_t mystatus; + ares_bool_t skip_cleanup = ARES_FALSE; + + squery->timeouts += timeouts; + + if (status != ARES_SUCCESS) { + end_squery(squery, status, dnsrec); return; } - if (s) { - ares_query(channel, s, dnsclass, type, callback, arg); - ares_free(s); + + rcode = ares_dns_record_get_rcode(dnsrec); + ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + mystatus = ares_dns_query_reply_tostatus(rcode, ancount); + + if (mystatus != ARES_ENODATA && mystatus != ARES_ESERVFAIL && + mystatus != ARES_ENOTFOUND) { + end_squery(squery, mystatus, dnsrec); return; } - /* Allocate a search_query structure to hold the state necessary for - * doing multiple lookups. + /* If we ever get ARES_ENODATA along the way, record that; if the search + * should run to the very end and we got at least one ARES_ENODATA, + * then callers like ares_gethostbyname() may want to try a T_A search + * even if the last domain we queried for T_AAAA resource records + * returned ARES_ENOTFOUND. */ - squery = ares_malloc_zero(sizeof(*squery)); - if (!squery) { - callback(arg, ARES_ENOMEM, 0, NULL, 0); + if (mystatus == ARES_ENODATA) { + squery->ever_got_nodata = ARES_TRUE; + } + + if (squery->next_name_idx < squery->names_cnt) { + mystatus = ares_search_next(channel, squery, &skip_cleanup); + if (mystatus != ARES_SUCCESS && !skip_cleanup) { + end_squery(squery, mystatus, NULL); + } return; } - squery->channel = channel; - squery->name = ares_strdup(name); - if (!squery->name) { - ares_free(squery); - callback(arg, ARES_ENOMEM, 0, NULL, 0); + + + /* We have no more domains to search, return an appropriate response. */ + if (mystatus == ARES_ENOTFOUND && squery->ever_got_nodata) { + end_squery(squery, ARES_ENODATA, NULL); return; } - /* Duplicate domains for safety during ares_reinit() */ - if (channel->ndomains) { - squery->domains = - ares__strsplit_duplicate(channel->domains, channel->ndomains); - if (squery->domains == NULL) { - ares_free(squery->name); - ares_free(squery); - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return; + end_squery(squery, mystatus, NULL); +} + +/* Determine if the domain should be looked up as-is, or if it is eligible + * for search by appending domains */ +static ares_bool_t ares__search_eligible(const ares_channel_t *channel, + const char *name) +{ + size_t len = ares_strlen(name); + + /* Name ends in '.', cannot search */ + if (len && name[len - 1] == '.') { + return ARES_FALSE; + } + + if (channel->flags & ARES_FLAG_NOSEARCH) { + return ARES_FALSE; + } + + return ARES_TRUE; +} + +ares_status_t ares__search_name_list(const ares_channel_t *channel, + const char *name, char ***names, + size_t *names_len) +{ + ares_status_t status; + char **list = NULL; + size_t list_len = 0; + char *alias = NULL; + size_t ndots = 0; + size_t idx = 0; + const char *p; + size_t i; + + /* Perform HOSTALIASES resolution */ + status = ares__lookup_hostaliases(channel, name, &alias); + if (status == ARES_SUCCESS) { + /* If hostalias succeeds, there is no searching, it is used as-is */ + list_len = 1; + list = ares_malloc_zero(sizeof(*list) * list_len); + if (list == NULL) { + status = ARES_ENOMEM; + goto done; } - squery->ndomains = channel->ndomains; + list[0] = alias; + alias = NULL; + goto done; + } else if (status != ARES_ENOTFOUND) { + goto done; } - squery->dnsclass = dnsclass; - squery->type = type; - squery->status_as_is = -1; - squery->callback = callback; - squery->arg = arg; - squery->timeouts = 0; - squery->ever_got_nodata = ARES_FALSE; + /* See if searching is eligible at all, if not, look up as-is only */ + if (!ares__search_eligible(channel, name)) { + list_len = 1; + list = ares_malloc_zero(sizeof(*list) * list_len); + if (list == NULL) { + status = ARES_ENOMEM; + goto done; + } + list[0] = ares_strdup(name); + if (list[0] == NULL) { + status = ARES_ENOMEM; + } else { + status = ARES_SUCCESS; + } + goto done; + } - /* Count the number of dots in name. */ + /* Count the number of dots in name */ ndots = 0; - for (p = name; *p; p++) { + for (p = name; *p != 0; p++) { if (*p == '.') { ndots++; } } - /* If ndots is at least the channel ndots threshold (usually 1), - * then we try the name as-is first. Otherwise, we try the name - * as-is last. - */ - if (ndots >= channel->ndots || squery->ndomains == 0) { - /* Try the name as-is first. */ - squery->next_domain = 0; - squery->trying_as_is = ARES_TRUE; - ares_query(channel, name, dnsclass, type, search_callback, squery); - } else { - /* Try the name as-is last; start with the first search domain. */ - squery->next_domain = 1; - squery->trying_as_is = ARES_FALSE; - status = ares__cat_domain(name, squery->domains[0], &s); - if (status == ARES_SUCCESS) { - ares_query(channel, s, dnsclass, type, search_callback, squery); - ares_free(s); - } else { - /* failed, free the malloc()ed memory */ - ares_free(squery->name); - ares_free(squery); - callback(arg, (int)status, 0, NULL, 0); + /* Allocate an entry for each search domain, plus one for as-is */ + list_len = channel->ndomains + 1; + list = ares_malloc_zero(sizeof(*list) * list_len); + if (list == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Set status here, its possible there are no search domains at all, so + * status may be ARES_ENOTFOUND from ares__lookup_hostaliases(). */ + status = ARES_SUCCESS; + + /* Try as-is first */ + if (ndots >= channel->ndots) { + list[idx] = ares_strdup(name); + if (list[idx] == NULL) { + status = ARES_ENOMEM; + goto done; + } + idx++; + } + + /* Append each search suffix to the name */ + for (i = 0; i < channel->ndomains; i++) { + status = ares__cat_domain(name, channel->domains[i], &list[idx]); + if (status != ARES_SUCCESS) { + goto done; } + idx++; } + + /* Try as-is last */ + if (ndots < channel->ndots) { + list[idx] = ares_strdup(name); + if (list[idx] == NULL) { + status = ARES_ENOMEM; + goto done; + } + idx++; + } + + +done: + if (status == ARES_SUCCESS) { + *names = list; + *names_len = list_len; + } else { + ares__strsplit_free(list, list_len); + } + + ares_free(alias); + return status; } -void ares_search(ares_channel_t *channel, const char *name, int dnsclass, - int type, ares_callback callback, void *arg) +static ares_status_t ares_search_int(ares_channel_t *channel, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, void *arg) { - if (channel == NULL) { - return; + struct search_query *squery = NULL; + const char *name; + ares_status_t status = ARES_SUCCESS; + ares_bool_t skip_cleanup = ARES_FALSE; + + /* Extract the name for the search. Note that searches are only supported for + * DNS records containing a single query. + */ + if (ares_dns_record_query_cnt(dnsrec) != 1) { + status = ARES_EBADQUERY; + goto fail; } - ares__channel_lock(channel); - ares_search_int(channel, name, dnsclass, type, callback, arg); - ares__channel_unlock(channel); + + status = ares_dns_record_query_get(dnsrec, 0, &name, NULL, NULL); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ + if (ares__is_onion_domain(name)) { + status = ARES_ENOTFOUND; + goto fail; + } + + /* Allocate a search_query structure to hold the state necessary for + * doing multiple lookups. + */ + squery = ares_malloc_zero(sizeof(*squery)); + if (squery == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + squery->channel = channel; + + /* Duplicate DNS record since, name will need to be rewritten */ + squery->dnsrec = ares_dns_record_duplicate(dnsrec); + if (squery->dnsrec == NULL) { + status = ARES_ENOMEM; + goto fail; + } + + squery->callback = callback; + squery->arg = arg; + squery->timeouts = 0; + squery->ever_got_nodata = ARES_FALSE; + + status = + ares__search_name_list(channel, name, &squery->names, &squery->names_cnt); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares_search_next(channel, squery, &skip_cleanup); + if (status != ARES_SUCCESS) { + goto fail; + } + + return status; + +fail: + if (!skip_cleanup) { + squery_free(squery); + callback(arg, status, 0, NULL); + } + return status; } -static void search_callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) +/* Callback argument structure passed to ares__dnsrec_convert_cb(). */ +typedef struct { + ares_callback callback; + void *arg; +} dnsrec_convert_arg_t; + +/*! Function to create callback arg for converting from ares_callback_dnsrec + * to ares_calback */ +void *ares__dnsrec_convert_arg(ares_callback callback, void *arg) { - struct search_query *squery = (struct search_query *)arg; - ares_channel_t *channel = squery->channel; - char *s; + dnsrec_convert_arg_t *carg = ares_malloc_zero(sizeof(*carg)); + if (carg == NULL) { + return NULL; + } + carg->callback = callback; + carg->arg = arg; + return carg; +} - squery->timeouts += (size_t)timeouts; +/*! Callback function used to convert from the ares_callback_dnsrec prototype to + * the ares_callback prototype, by writing the result and passing that to + * the inner callback. + */ +void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec) +{ + dnsrec_convert_arg_t *carg = arg; + unsigned char *abuf = NULL; + size_t alen = 0; - /* Stop searching unless we got a non-fatal error. */ - if (status != ARES_ENODATA && status != ARES_ESERVFAIL && - status != ARES_ENOTFOUND) { - end_squery(squery, (ares_status_t)status, abuf, (size_t)alen); - } else { - /* Save the status if we were trying as-is. */ - if (squery->trying_as_is) { - squery->status_as_is = status; + if (dnsrec != NULL) { + ares_status_t mystatus = ares_dns_write(dnsrec, &abuf, &alen); + if (mystatus != ARES_SUCCESS) { + status = mystatus; } + } - /* - * If we ever get ARES_ENODATA along the way, record that; if the search - * should run to the very end and we got at least one ARES_ENODATA, - * then callers like ares_gethostbyname() may want to try a T_A search - * even if the last domain we queried for T_AAAA resource records - * returned ARES_ENOTFOUND. - */ - if (status == ARES_ENODATA) { - squery->ever_got_nodata = ARES_TRUE; - } + carg->callback(carg->arg, (int)status, (int)timeouts, abuf, (int)alen); - if (squery->next_domain < squery->ndomains) { - ares_status_t mystatus; - /* Try the next domain. */ - mystatus = ares__cat_domain(squery->name, - squery->domains[squery->next_domain], &s); - if (mystatus != ARES_SUCCESS) { - end_squery(squery, mystatus, NULL, 0); - } else { - squery->trying_as_is = ARES_FALSE; - squery->next_domain++; - ares_query(channel, s, squery->dnsclass, squery->type, search_callback, - squery); - ares_free(s); - } - } else if (squery->status_as_is == -1) { - /* Try the name as-is at the end. */ - squery->trying_as_is = ARES_TRUE; - ares_query(channel, squery->name, squery->dnsclass, squery->type, - search_callback, squery); - } else { - if (squery->status_as_is == ARES_ENOTFOUND && squery->ever_got_nodata) { - end_squery(squery, ARES_ENODATA, NULL, 0); - } else { - end_squery(squery, (ares_status_t)squery->status_as_is, NULL, 0); - } - } + ares_free(abuf); + ares_free(carg); +} + +/* Search for a DNS name with given class and type. Wrapper around + * ares_search_int() where the DNS record to search is first constructed. + */ +void ares_search(ares_channel_t *channel, const char *name, int dnsclass, + int type, ares_callback callback, void *arg) +{ + ares_status_t status; + ares_dns_record_t *dnsrec = NULL; + size_t max_udp_size; + ares_dns_flags_t rd_flag; + void *carg = NULL; + if (channel == NULL || name == NULL) { + return; + } + + /* For now, ares_search_int() uses the ares_callback prototype. We need to + * wrap the callback passed to this function in ares__dnsrec_convert_cb, to + * convert from ares_callback_dnsrec to ares_callback. Allocate the convert + * arg structure here. + */ + carg = ares__dnsrec_convert_arg(callback, arg); + if (carg == NULL) { + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return; + } + + rd_flag = !(channel->flags & ARES_FLAG_NORECURSE) ? ARES_FLAG_RD : 0; + max_udp_size = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0; + status = ares_dns_record_create_query( + &dnsrec, name, (ares_dns_class_t)dnsclass, (ares_dns_rec_type_t)type, 0, + rd_flag, max_udp_size); + if (status != ARES_SUCCESS) { + callback(arg, (int)status, 0, NULL, 0); + ares_free(carg); + return; } + + ares__channel_lock(channel); + ares_search_int(channel, dnsrec, ares__dnsrec_convert_cb, carg); + ares__channel_unlock(channel); + + ares_dns_record_destroy(dnsrec); } -static void end_squery(struct search_query *squery, ares_status_t status, - unsigned char *abuf, size_t alen) +/* Search for a DNS record. Wrapper around ares_search_int(). */ +ares_status_t ares_search_dnsrec(ares_channel_t *channel, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, void *arg) { - squery->callback(squery->arg, (int)status, (int)squery->timeouts, abuf, - (int)alen); - ares__strsplit_free(squery->domains, squery->ndomains); - ares_free(squery->name); - ares_free(squery); + ares_status_t status; + + if (channel == NULL || dnsrec == NULL || callback == NULL) { + return ARES_EFORMERR; + } + + ares__channel_lock(channel); + status = ares_search_int(channel, dnsrec, callback, arg); + ares__channel_unlock(channel); + + return status; } /* Concatenate two domains. */ @@ -260,89 +488,113 @@ ares_status_t ares__cat_domain(const char *name, const char *domain, char **s) return ARES_SUCCESS; } -/* Determine if this name only yields one query. If it does, set *s to - * the string we should query, in an allocated buffer. If not, set *s - * to NULL. - */ -ares_status_t ares__single_domain(const ares_channel_t *channel, - const char *name, char **s) +ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel, + const char *name, char **alias) { - size_t len = ares_strlen(name); - const char *hostaliases; - FILE *fp; - char *line = NULL; - ares_status_t status; - size_t linesize; - const char *p; - const char *q; - int error; + ares_status_t status = ARES_SUCCESS; + const char *hostaliases = NULL; + ares__buf_t *buf = NULL; + ares__llist_t *lines = NULL; + ares__llist_node_t *node; + + if (channel == NULL || name == NULL || alias == NULL) { + return ARES_EFORMERR; + } + + *alias = NULL; + + /* Configuration says to not perform alias lookup */ + if (channel->flags & ARES_FLAG_NOALIASES) { + return ARES_ENOTFOUND; + } + + /* If a domain has a '.', its not allowed to perform an alias lookup */ + if (strchr(name, '.') != NULL) { + return ARES_ENOTFOUND; + } - /* If the name contains a trailing dot, then the single query is the name - * sans the trailing dot. + hostaliases = getenv("HOSTALIASES"); + if (hostaliases == NULL) { + status = ARES_ENOTFOUND; + goto done; + } + + buf = ares__buf_create(); + if (buf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ares__buf_load_file(hostaliases, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + /* The HOSTALIASES file is structured as one alias per line. The first + * field in the line is the simple hostname with no periods, followed by + * whitespace, then the full domain name, e.g.: + * + * c-ares www.c-ares.org + * curl www.curl.se */ - if ((len > 0) && (name[len - 1] == '.')) { - *s = ares_strdup(name); - return (*s) ? ARES_SUCCESS : ARES_ENOMEM; - } - - if (!(channel->flags & ARES_FLAG_NOALIASES) && !strchr(name, '.')) { - /* The name might be a host alias. */ - hostaliases = getenv("HOSTALIASES"); - if (hostaliases) { - fp = fopen(hostaliases, "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == - ARES_SUCCESS) { - if (strncasecmp(line, name, len) != 0 || !ISSPACE(line[len])) { - continue; - } - p = line + len; - while (ISSPACE(*p)) { - p++; - } - if (*p) { - q = p + 1; - while (*q && !ISSPACE(*q)) { - q++; - } - *s = ares_malloc((size_t)(q - p + 1)); - if (*s) { - memcpy(*s, p, (size_t)(q - p)); - (*s)[q - p] = 0; - } - ares_free(line); - fclose(fp); - return (*s) ? ARES_SUCCESS : ARES_ENOMEM; - } - } - ares_free(line); - fclose(fp); - if (status != ARES_SUCCESS && status != ARES_EOF) { - return status; - } - } else { - error = ERRNO; - switch (error) { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, - strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", hostaliases)); - *s = NULL; - return ARES_EFILE; - } - } - } + + status = ares__buf_split(buf, (const unsigned char *)"\n", 1, + ARES_BUF_SPLIT_TRIM, 0, &lines); + if (status != ARES_SUCCESS) { + goto done; } - if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0) { - /* No domain search to do; just try the name as-is. */ - *s = ares_strdup(name); - return (*s) ? ARES_SUCCESS : ARES_ENOMEM; + for (node = ares__llist_node_first(lines); node != NULL; + node = ares__llist_node_next(node)) { + ares__buf_t *line = ares__llist_node_val(node); + char hostname[64] = ""; + char fqdn[256] = ""; + + /* Pull off hostname */ + ares__buf_tag(line); + ares__buf_consume_nonwhitespace(line); + if (ares__buf_tag_fetch_string(line, hostname, sizeof(hostname)) != + ARES_SUCCESS) { + continue; + } + + /* Match hostname */ + if (strcasecmp(hostname, name) != 0) { + continue; + } + + /* consume whitespace */ + ares__buf_consume_whitespace(line, ARES_TRUE); + + /* pull off fqdn */ + ares__buf_tag(line); + ares__buf_consume_nonwhitespace(line); + if (ares__buf_tag_fetch_string(line, fqdn, sizeof(fqdn)) != ARES_SUCCESS || + ares_strlen(fqdn) == 0) { + continue; + } + + /* Validate characterset */ + if (!ares__is_hostname(fqdn)) { + continue; + } + + *alias = ares_strdup(fqdn); + if (*alias == NULL) { + status = ARES_ENOMEM; + goto done; + } + + /* Good! */ + status = ARES_SUCCESS; + goto done; } - *s = NULL; - return ARES_SUCCESS; + status = ARES_ENOTFOUND; + +done: + ares__buf_destroy(buf); + ares__llist_destroy(lines); + + return status; } diff --git a/deps/cares/src/lib/ares_send.c b/deps/cares/src/lib/ares_send.c index 6cefdb6a36a87e..54f2b504d50cac 100644 --- a/deps/cares/src/lib/ares_send.c +++ b/deps/cares/src/lib/ares_send.c @@ -48,52 +48,47 @@ static unsigned short generate_unique_qid(ares_channel_t *channel) return id; } -ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, - size_t qlen, ares_callback callback, void *arg, - unsigned short *qid) +static ares_status_t ares_send_dnsrec_int(ares_channel_t *channel, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, + void *arg, unsigned short *qid) { - struct query *query; - size_t packetsz; - struct timeval now = ares__tvnow(); - ares_status_t status; - unsigned short id = generate_unique_qid(channel); - unsigned char *abuf = NULL; - size_t alen = 0; + struct query *query; + size_t packetsz; + struct timeval now = ares__tvnow(); + ares_status_t status; + unsigned short id = generate_unique_qid(channel); + const ares_dns_record_t *dnsrec_resp = NULL; - /* Verify that the query is at least long enough to hold the header. */ - if (qlen < HFIXEDSZ || qlen >= (1 << 16)) { - callback(arg, ARES_EBADQUERY, 0, NULL, 0); - return ARES_EBADQUERY; - } if (ares__slist_len(channel->servers) == 0) { - callback(arg, ARES_ENOSERVER, 0, NULL, 0); + callback(arg, ARES_ENOSERVER, 0, NULL); return ARES_ENOSERVER; } /* Check query cache */ - status = ares_qcache_fetch(channel, &now, qbuf, qlen, &abuf, &alen); + status = ares_qcache_fetch(channel, &now, dnsrec, &dnsrec_resp); if (status != ARES_ENOTFOUND) { /* ARES_SUCCESS means we retrieved the cache, anything else is a critical * failure, all result in termination */ - callback(arg, (int)status, 0, abuf, (int)alen); - ares_free(abuf); + callback(arg, status, 0, dnsrec_resp); return status; } /* Allocate space for query and allocated fields. */ query = ares_malloc(sizeof(struct query)); if (!query) { - callback(arg, ARES_ENOMEM, 0, NULL, 0); + callback(arg, ARES_ENOMEM, 0, NULL); return ARES_ENOMEM; } memset(query, 0, sizeof(*query)); query->channel = channel; - query->qbuf = ares_malloc(qlen); - if (!query->qbuf) { + + status = ares_dns_write(dnsrec, &query->qbuf, &query->qlen); + if (status != ARES_SUCCESS) { ares_free(query); - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return ARES_ENOMEM; + callback(arg, status, 0, NULL); + return status; } query->qid = id; @@ -103,8 +98,6 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, /* Ignore first 2 bytes, assign our own query id */ query->qbuf[0] = (unsigned char)((id >> 8) & 0xFF); query->qbuf[1] = (unsigned char)(id & 0xFF); - memcpy(query->qbuf + 2, qbuf + 2, qlen - 2); - query->qlen = qlen; /* Fill in query arguments. */ query->callback = callback; @@ -114,7 +107,8 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, query->try_count = 0; packetsz = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : PACKETSZ; - query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > packetsz; + query->using_tcp = + (channel->flags & ARES_FLAG_USEVC) || query->qlen > packetsz; query->error_status = ARES_SUCCESS; query->timeouts = 0; @@ -127,7 +121,7 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, query->node_all_queries = ares__llist_insert_last(channel->all_queries, query); if (query->node_all_queries == NULL) { - callback(arg, ARES_ENOMEM, 0, NULL, 0); + callback(arg, ARES_ENOMEM, 0, NULL); ares__free_query(query); return ARES_ENOMEM; } @@ -136,7 +130,7 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, * responses quickly. */ if (!ares__htable_szvp_insert(channel->queries_by_qid, query->qid, query)) { - callback(arg, ARES_ENOMEM, 0, NULL, 0); + callback(arg, ARES_ENOMEM, 0, NULL); ares__free_query(query); return ARES_ENOMEM; } @@ -150,18 +144,60 @@ ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, return status; } +ares_status_t ares_send_dnsrec(ares_channel_t *channel, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, void *arg, + unsigned short *qid) +{ + ares_status_t status; + + if (channel == NULL) { + return ARES_EFORMERR; + } + + ares__channel_lock(channel); + + status = ares_send_dnsrec_int(channel, dnsrec, callback, arg, qid); + + ares__channel_unlock(channel); + + return status; +} + void ares_send(ares_channel_t *channel, const unsigned char *qbuf, int qlen, ares_callback callback, void *arg) { + ares_dns_record_t *dnsrec = NULL; + ares_status_t status; + void *carg = NULL; + if (channel == NULL) { return; } - ares__channel_lock(channel); + /* Verify that the query is at least long enough to hold the header. */ + if (qlen < HFIXEDSZ || qlen >= (1 << 16)) { + callback(arg, ARES_EBADQUERY, 0, NULL, 0); + return; + } - ares_send_ex(channel, qbuf, (size_t)qlen, callback, arg, NULL); + status = ares_dns_parse(qbuf, (size_t)qlen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + callback(arg, (int)status, 0, NULL, 0); + return; + } - ares__channel_unlock(channel); + carg = ares__dnsrec_convert_arg(callback, arg); + if (carg == NULL) { + status = ARES_ENOMEM; + ares_dns_record_destroy(dnsrec); + callback(arg, (int)status, 0, NULL, 0); + return; + } + + ares_send_dnsrec(channel, dnsrec, ares__dnsrec_convert_cb, carg, NULL); + + ares_dns_record_destroy(dnsrec); } size_t ares_queue_active_queries(ares_channel_t *channel) diff --git a/deps/cares/src/lib/ares_str.c b/deps/cares/src/lib/ares_str.c index 80660136dac8e1..5f25cfeaff041e 100644 --- a/deps/cares/src/lib/ares_str.c +++ b/deps/cares/src/lib/ares_str.c @@ -110,6 +110,54 @@ ares_bool_t ares_str_isnum(const char *str) return ARES_TRUE; } +void ares__str_rtrim(char *str) +{ + size_t len; + size_t i; + + if (str == NULL) { + return; + } + + len = ares_strlen(str); + for (i = len; i > 0; i--) { + if (!ares__isspace(str[i - 1])) { + break; + } + } + str[i] = 0; +} + +void ares__str_ltrim(char *str) +{ + size_t i; + size_t len; + + if (str == NULL) { + return; + } + + for (i = 0; str[i] != 0 && ares__isspace(str[i]); i++) { + /* Do nothing */ + } + + if (i == 0) { + return; + } + + len = ares_strlen(str); + if (i != len) { + memmove(str, str + i, len - i); + } + str[len - i] = 0; +} + +void ares__str_trim(char *str) +{ + ares__str_ltrim(str); + ares__str_rtrim(str); +} + /* tolower() is locale-specific. Use a lookup table fast conversion that only * operates on ASCII */ static const unsigned char ares__tolower_lookup[] = { @@ -151,3 +199,71 @@ ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val, } return ARES_TRUE; } + +ares_bool_t ares__isspace(int ch) +{ + switch (ch) { + case '\r': + case '\t': + case ' ': + case '\v': + case '\f': + case '\n': + return ARES_TRUE; + default: + break; + } + return ARES_FALSE; +} + +ares_bool_t ares__isprint(int ch) +{ + if (ch >= 0x20 && ch <= 0x7E) { + return ARES_TRUE; + } + return ARES_FALSE; +} + +/* Character set allowed by hostnames. This is to include the normal + * domain name character set plus: + * - underscores which are used in SRV records. + * - Forward slashes such as are used for classless in-addr.arpa + * delegation (CNAMEs) + * - Asterisks may be used for wildcard domains in CNAMEs as seen in the + * real world. + * While RFC 2181 section 11 does state not to do validation, + * that applies to servers, not clients. Vulnerabilities have been + * reported when this validation is not performed. Security is more + * important than edge-case compatibility (which is probably invalid + * anyhow). */ +ares_bool_t ares__is_hostnamech(int ch) +{ + /* [A-Za-z0-9-*._/] + * Don't use isalnum() as it is locale-specific + */ + if (ch >= 'A' && ch <= 'Z') { + return ARES_TRUE; + } + if (ch >= 'a' && ch <= 'z') { + return ARES_TRUE; + } + if (ch >= '0' && ch <= '9') { + return ARES_TRUE; + } + if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares_bool_t ares__is_hostname(const char *str) +{ + size_t i; + for (i = 0; str[i] != 0; i++) { + if (!ares__is_hostnamech(str[i])) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} diff --git a/deps/cares/src/lib/ares_str.h b/deps/cares/src/lib/ares_str.h index 2bf32d0d253da7..8d869073d8153c 100644 --- a/deps/cares/src/lib/ares_str.h +++ b/deps/cares/src/lib/ares_str.h @@ -24,8 +24,8 @@ * * SPDX-License-Identifier: MIT */ -#ifndef HEADER_CARES_STRDUP_H -#define HEADER_CARES_STRDUP_H +#ifndef __ARES_STR_H +#define __ARES_STR_H #include "ares_setup.h" #include "ares.h" @@ -48,8 +48,19 @@ size_t ares_strcpy(char *dest, const char *src, size_t dest_size); ares_bool_t ares_str_isnum(const char *str); +void ares__str_ltrim(char *str); +void ares__str_rtrim(char *str); +void ares__str_trim(char *str); + unsigned char ares__tolower(unsigned char c); ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val, size_t len); -#endif /* HEADER_CARES_STRDUP_H */ +ares_bool_t ares__isspace(int ch); +ares_bool_t ares__isprint(int ch); +ares_bool_t ares__is_hostnamech(int ch); + +ares_bool_t ares__is_hostname(const char *str); + + +#endif /* __ARES_STR_H */ diff --git a/deps/cares/src/lib/ares_strsplit.c b/deps/cares/src/lib/ares_strsplit.c index 5ec615c76482ed..395bf1ebb9a5ec 100644 --- a/deps/cares/src/lib/ares_strsplit.c +++ b/deps/cares/src/lib/ares_strsplit.c @@ -94,7 +94,7 @@ char **ares__strsplit(const char *in, const char *delms, size_t *num_elm) status = ares__buf_split( buf, (const unsigned char *)delms, ares_strlen(delms), - ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, &llist); + ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, 0, &llist); if (status != ARES_SUCCESS) { goto done; } diff --git a/deps/cares/src/lib/ares_sysconfig.c b/deps/cares/src/lib/ares_sysconfig.c index 825008b7b8a543..474534512af191 100644 --- a/deps/cares/src/lib/ares_sysconfig.c +++ b/deps/cares/src/lib/ares_sysconfig.c @@ -954,7 +954,7 @@ static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig) } } - if (res.ndots > 0) { + if (res.ndots >= 0) { sysconfig->ndots = (size_t)res.ndots; } if (res.retry > 0) { @@ -1059,6 +1059,10 @@ static ares_status_t ares_sysconfig_apply(ares_channel_t *channel, channel->rotate = sysconfig->rotate; } + if (sysconfig->usevc) { + channel->flags |= ARES_FLAG_USEVC; + } + return ARES_SUCCESS; } diff --git a/deps/cares/src/lib/ares_sysconfig_files.c b/deps/cares/src/lib/ares_sysconfig_files.c index 9802c7e54a5419..557888bc740a39 100644 --- a/deps/cares/src/lib/ares_sysconfig_files.c +++ b/deps/cares/src/lib/ares_sysconfig_files.c @@ -134,7 +134,7 @@ static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat) ares__buf_tag(buf); /* Consume ip address */ - if (ares__buf_consume_charset(buf, ip_charset, sizeof(ip_charset)) == 0) { + if (ares__buf_consume_charset(buf, ip_charset, sizeof(ip_charset) - 1) == 0) { return ARES_EBADSTR; } @@ -162,8 +162,8 @@ static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat) ares__buf_tag(buf); /* Consume mask */ - if (ares__buf_consume_charset(buf, ipv4_charset, sizeof(ipv4_charset)) == - 0) { + if (ares__buf_consume_charset(buf, ipv4_charset, + sizeof(ipv4_charset) - 1) == 0) { return ARES_EBADSTR; } @@ -241,7 +241,7 @@ ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, /* Split on space or semicolon */ status = ares__buf_split(buf, (const unsigned char *)" ;", 2, - ARES_BUF_SPLIT_NONE, &list); + ARES_BUF_SPLIT_NONE, 0, &list); if (status != ARES_SUCCESS) { goto done; } @@ -282,7 +282,8 @@ ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, return status; } -static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str) +static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str, + size_t max_domains) { if (sysconfig->domains && sysconfig->ndomains > 0) { /* if we already have some domains present, free them first */ @@ -296,410 +297,515 @@ static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str) return ARES_ENOMEM; } + /* Truncate if necessary */ + if (max_domains && sysconfig->ndomains > max_domains) { + size_t i; + for (i = max_domains; i < sysconfig->ndomains; i++) { + ares_free(sysconfig->domains[i]); + sysconfig->domains[i] = NULL; + } + sysconfig->ndomains = max_domains; + } + return ARES_SUCCESS; } -static ares_status_t config_domain(ares_sysconfig_t *sysconfig, char *str) +static ares_status_t buf_fetch_string(ares__buf_t *buf, char *str, + size_t str_len) { - char *q; - - /* Set a single search domain. */ - q = str; - while (*q && !ISSPACE(*q)) { - q++; - } - *q = '\0'; + ares_status_t status; + ares__buf_tag(buf); + ares__buf_consume(buf, ares__buf_len(buf)); - return config_search(sysconfig, str); + status = ares__buf_tag_fetch_string(buf, str, str_len); + return status; } -static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, const char *str, - const char *bindch, const char *altbindch, - const char *filech) +static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, + ares__buf_t *buf, const char *separators) { - char lookups[3]; - char *l; - const char *p; - ares_bool_t found; - - if (altbindch == NULL) { - altbindch = bindch; + ares_status_t status; + char lookupstr[32]; + size_t lookupstr_cnt = 0; + ares__llist_t *lookups = NULL; + ares__llist_node_t *node; + size_t separators_len = ares_strlen(separators); + + status = ares__buf_split(buf, (const unsigned char *)separators, + separators_len, ARES_BUF_SPLIT_TRIM, 0, &lookups); + if (status != ARES_SUCCESS) { + goto done; } - /* Set the lookup order. Only the first letter of each work - * is relevant, and it has to be "b" for DNS or "f" for the - * host file. Ignore everything else. - */ - l = lookups; - p = str; - found = ARES_FALSE; - while (*p) { - if ((*p == *bindch || *p == *altbindch || *p == *filech) && - l < lookups + 2) { - if (*p == *bindch || *p == *altbindch) { - *l++ = 'b'; - } else { - *l++ = 'f'; - } - found = ARES_TRUE; + memset(lookupstr, 0, sizeof(lookupstr)); + + for (node = ares__llist_node_first(lookups); node != NULL; + node = ares__llist_node_next(node)) { + char value[128]; + char ch; + ares__buf_t *valbuf = ares__llist_node_val(node); + + status = buf_fetch_string(valbuf, value, sizeof(value)); + if (status != ARES_SUCCESS) { + continue; } - while (*p && !ISSPACE(*p) && (*p != ',')) { - p++; + + if (strcasecmp(value, "dns") == 0 || strcasecmp(value, "bind") == 0 || + strcasecmp(value, "resolv") == 0 || strcasecmp(value, "resolve") == 0) { + ch = 'b'; + } else if (strcasecmp(value, "files") == 0 || + strcasecmp(value, "file") == 0 || + strcasecmp(value, "local") == 0) { + ch = 'f'; + } else { + continue; } - while (*p && (ISSPACE(*p) || (*p == ','))) { - p++; + + /* Look for a duplicate and ignore */ + if (memchr(lookupstr, ch, lookupstr_cnt) == NULL) { + lookupstr[lookupstr_cnt++] = ch; } } - if (!found) { - return ARES_ENOTINITIALIZED; + + if (lookupstr_cnt) { + ares_free(sysconfig->lookups); + sysconfig->lookups = ares_strdup(lookupstr); + if (sysconfig->lookups == NULL) { + return ARES_ENOMEM; + } } - *l = '\0'; - ares_free(sysconfig->lookups); - sysconfig->lookups = ares_strdup(lookups); - if (sysconfig->lookups == NULL) { - return ARES_ENOMEM; + status = ARES_SUCCESS; + +done: + if (status != ARES_ENOMEM) { + status = ARES_SUCCESS; } - return ARES_SUCCESS; + ares__llist_destroy(lookups); + return status; } -static const char *try_option(const char *p, const char *q, const char *opt) +static ares_status_t process_option(ares_sysconfig_t *sysconfig, + ares__buf_t *option) { - size_t len = ares_strlen(opt); - return ((size_t)(q - p) >= len && !strncmp(p, opt, len)) ? &p[len] : NULL; + ares__llist_t *kv = NULL; + char key[32] = ""; + char val[32] = ""; + unsigned int valint = 0; + ares_status_t status; + + /* Split on : */ + status = ares__buf_split(option, (const unsigned char *)":", 1, + ARES_BUF_SPLIT_TRIM, 2, &kv); + if (status != ARES_SUCCESS) { + goto done; + } + + status = buf_fetch_string(ares__llist_first_val(kv), key, sizeof(key)); + if (status != ARES_SUCCESS) { + goto done; + } + if (ares__llist_len(kv) == 2) { + status = buf_fetch_string(ares__llist_last_val(kv), val, sizeof(val)); + if (status != ARES_SUCCESS) { + goto done; + } + valint = (unsigned int)strtoul(val, NULL, 10); + } + + if (strcmp(key, "ndots") == 0) { + sysconfig->ndots = valint; + } else if (strcmp(key, "retrans") == 0 || strcmp(key, "timeout") == 0) { + if (valint == 0) { + return ARES_EFORMERR; + } + sysconfig->timeout_ms = valint * 1000; + } else if (strcmp(key, "retry") == 0 || strcmp(key, "attempts") == 0) { + if (valint == 0) { + return ARES_EFORMERR; + } + sysconfig->tries = valint; + } else if (strcmp(key, "rotate") == 0) { + sysconfig->rotate = ARES_TRUE; + } else if (strcmp(key, "use-vc") == 0 || strcmp(key, "usevc") == 0) { + sysconfig->usevc = ARES_TRUE; + } + +done: + ares__llist_destroy(kv); + return status; } static ares_status_t set_options(ares_sysconfig_t *sysconfig, const char *str) { - const char *p; - const char *q; - const char *val; + ares__buf_t *buf = NULL; + ares__llist_t *options = NULL; + ares_status_t status; + ares__llist_node_t *node; - if (str == NULL) { - return ARES_SUCCESS; + buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str)); + if (buf == NULL) { + return ARES_ENOMEM; } - p = str; - while (*p) { - q = p; - while (*q && !ISSPACE(*q)) { - q++; - } - val = try_option(p, q, "ndots:"); - if (val) { - sysconfig->ndots = strtoul(val, NULL, 10); - } + status = ares__buf_split(buf, (const unsigned char *)" \t", 2, + ARES_BUF_SPLIT_TRIM, 0, &options); + if (status != ARES_SUCCESS) { + goto done; + } - // Outdated option. - val = try_option(p, q, "retrans:"); - if (val) { - sysconfig->timeout_ms = strtoul(val, NULL, 10); - } + for (node = ares__llist_node_first(options); node != NULL; + node = ares__llist_node_next(node)) { + ares__buf_t *valbuf = ares__llist_node_val(node); - val = try_option(p, q, "timeout:"); - if (val) { - sysconfig->timeout_ms = strtoul(val, NULL, 10) * 1000; + status = process_option(sysconfig, valbuf); + /* Out of memory is the only fatal condition */ + if (status == ARES_ENOMEM) { + goto done; } + } - // Outdated option. - val = try_option(p, q, "retry:"); - if (val) { - sysconfig->tries = strtoul(val, NULL, 10); - } + status = ARES_SUCCESS; - val = try_option(p, q, "attempts:"); - if (val) { - sysconfig->tries = strtoul(val, NULL, 10); - } +done: + ares__llist_destroy(options); + ares__buf_destroy(buf); + return status; +} - val = try_option(p, q, "rotate"); - if (val) { - sysconfig->rotate = ARES_TRUE; +ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig) +{ + const char *localdomain; + const char *res_options; + ares_status_t status; + + localdomain = getenv("LOCALDOMAIN"); + if (localdomain) { + char *temp = ares_strdup(localdomain); + if (temp == NULL) { + return ARES_ENOMEM; } + status = config_search(sysconfig, temp, 1); + ares_free(temp); + if (status != ARES_SUCCESS) { + return status; + } + } - p = q; - while (ISSPACE(*p)) { - p++; + res_options = getenv("RES_OPTIONS"); + if (res_options) { + status = set_options(sysconfig, res_options); + if (status != ARES_SUCCESS) { + return status; } } return ARES_SUCCESS; } -static char *try_config(char *s, const char *opt, char scc) +/* Configuration Files: + * /etc/resolv.conf + * - All Unix-like systems + * - Comments start with ; or # + * - Lines have a keyword followed by a value that is interpreted specific + * to the keyword: + * - Keywords: + * - nameserver - IP address of nameserver with optional port (using a : + * prefix). If using an ipv6 address and specifying a port, the ipv6 + * address must be encapsulated in brackets. For link-local ipv6 + * addresses, the interface can also be specified with a % prefix. e.g.: + * "nameserver [fe80::1]:1234%iface" + * This keyword may be specified multiple times. + * - search - whitespace separated list of domains + * - domain - obsolete, same as search except only a single domain + * - lookup / hostresorder - local, bind, file, files + * - sortlist - whitespace separated ip-address/netmask pairs + * - options - options controlling resolver variables + * - ndots:n - set ndots option + * - timeout:n (retrans:n) - timeout per query attempt in seconds + * - attempts:n (retry:n) - number of times resolver will send query + * - rotate - round-robin selection of name servers + * - use-vc / usevc - force tcp + * /etc/nsswitch.conf + * - Modern Linux, FreeBSD, HP-UX, Solaris + * - Search order set via: + * "hosts: files dns mdns4_minimal mdns4" + * - files is /etc/hosts + * - dns is dns + * - mdns4_minimal does mdns only if ending in .local + * - mdns4 does not limit to domains ending in .local + * /etc/netsvc.conf + * - AIX + * - Search order set via: + * "hosts = local , bind" + * - bind is dns + * - local is /etc/hosts + * /etc/svc.conf + * - Tru64 + * - Same format as /etc/netsvc.conf + * /etc/host.conf + * - Early FreeBSD, Early Linux + * - Not worth supporting, format varied based on system, FreeBSD used + * just a line per search order, Linux used "order " and a comma + * delimited list of "bind" and "hosts" + */ + + +/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other + * conditions are ignored. Users may mess up config files, but we want to + * process anything we can. */ +static ares_status_t parse_resolvconf_line(ares_sysconfig_t *sysconfig, + ares__buf_t *line) { - size_t len; - char *p; - char *q; + char option[32]; + char value[512]; + ares_status_t status = ARES_SUCCESS; - if (!s || !opt) { - /* no line or no option */ - return NULL; /* LCOV_EXCL_LINE */ + /* Ignore lines beginning with a comment */ + if (ares__buf_begins_with(line, (const unsigned char *)"#", 1) || + ares__buf_begins_with(line, (const unsigned char *)";", 1)) { + return ARES_SUCCESS; } - /* Hash '#' character is always used as primary comment char, additionally - a not-NUL secondary comment char will be considered when specified. */ + ares__buf_tag(line); - /* trim line comment */ - p = s; - if (scc) { - while (*p && (*p != '#') && (*p != scc)) { - p++; - } - } else { - while (*p && (*p != '#')) { - p++; - } + /* Shouldn't be possible, but if it happens, ignore the line. */ + if (ares__buf_consume_nonwhitespace(line) == 0) { + return ARES_SUCCESS; } - *p = '\0'; - /* trim trailing whitespace */ - q = p - 1; - while ((q >= s) && ISSPACE(*q)) { - q--; + status = ares__buf_tag_fetch_string(line, option, sizeof(option)); + if (status != ARES_SUCCESS) { + return ARES_SUCCESS; } - *++q = '\0'; - /* skip leading whitespace */ - p = s; - while (*p && ISSPACE(*p)) { - p++; - } + ares__buf_consume_whitespace(line, ARES_TRUE); - if (!*p) { - /* empty line */ - return NULL; + status = buf_fetch_string(line, value, sizeof(value)); + if (status != ARES_SUCCESS) { + return ARES_SUCCESS; } - if ((len = ares_strlen(opt)) == 0) { - /* empty option */ - return NULL; /* LCOV_EXCL_LINE */ + ares__str_trim(value); + if (*value == 0) { + return ARES_SUCCESS; } - if (strncmp(p, opt, len) != 0) { - /* line and option do not match */ - return NULL; + /* At this point we have a string option and a string value, both trimmed + * of leading and trailing whitespace. Lets try to evaluate them */ + if (strcmp(option, "domain") == 0) { + /* Domain is legacy, don't overwrite an existing config set by search */ + if (sysconfig->domains == NULL) { + status = config_search(sysconfig, value, 1); + } + } else if (strcmp(option, "lookup") == 0 || + strcmp(option, "hostresorder") == 0) { + ares__buf_tag_rollback(line); + status = config_lookup(sysconfig, line, " \t"); + } else if (strcmp(option, "search") == 0) { + status = config_search(sysconfig, value, 0); + } else if (strcmp(option, "nameserver") == 0) { + status = + ares__sconfig_append_fromstr(&sysconfig->sconfig, value, ARES_TRUE); + } else if (strcmp(option, "sortlist") == 0) { + /* Ignore all failures except ENOMEM. If the sysadmin set a bad + * sortlist, just ignore the sortlist, don't cause an inoperable + * channel */ + status = + ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, value); + if (status != ARES_ENOMEM) { + status = ARES_SUCCESS; + } + } else if (strcmp(option, "options") == 0) { + status = set_options(sysconfig, value); } - /* skip over given option name */ - p += len; + return status; +} + +/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other + * conditions are ignored. Users may mess up config files, but we want to + * process anything we can. */ +static ares_status_t parse_nsswitch_line(ares_sysconfig_t *sysconfig, + ares__buf_t *line) +{ + char option[32]; + ares__buf_t *buf; + ares_status_t status = ARES_SUCCESS; + ares__llist_t *sects = NULL; - if (!*p) { - /* no option value */ - return NULL; /* LCOV_EXCL_LINE */ + /* Ignore lines beginning with a comment */ + if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) { + return ARES_SUCCESS; } - if ((opt[len - 1] != ':') && (opt[len - 1] != '=') && !ISSPACE(*p)) { - /* whitespace between option name and value is mandatory - for given option names which do not end with ':' or '=' */ - return NULL; + /* database : values (space delimited) */ + status = ares__buf_split(line, (const unsigned char *)":", 1, + ARES_BUF_SPLIT_TRIM, 2, §s); + + if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) { + goto done; } - /* skip over whitespace */ - while (*p && ISSPACE(*p)) { - p++; + buf = ares__llist_first_val(sects); + status = buf_fetch_string(buf, option, sizeof(option)); + if (status != ARES_SUCCESS) { + goto done; } - if (!*p) { - /* no option value */ - return NULL; + /* Only support "hosts:" */ + if (strcmp(option, "hosts") != 0) { + goto done; } - /* return pointer to option value */ - return p; + /* Values are space separated */ + buf = ares__llist_last_val(sects); + status = config_lookup(sysconfig, buf, " \t"); + +done: + ares__llist_destroy(sects); + if (status != ARES_ENOMEM) { + status = ARES_SUCCESS; + } + return status; } -ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig) +/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other + * conditions are ignored. Users may mess up config files, but we want to + * process anything we can. */ +static ares_status_t parse_svcconf_line(ares_sysconfig_t *sysconfig, + ares__buf_t *line) { - const char *localdomain; - const char *res_options; - ares_status_t status; + char option[32]; + ares__buf_t *buf; + ares_status_t status = ARES_SUCCESS; + ares__llist_t *sects = NULL; - localdomain = getenv("LOCALDOMAIN"); - if (localdomain) { - char *temp = ares_strdup(localdomain); - if (temp == NULL) { - return ARES_ENOMEM; - } - status = config_domain(sysconfig, temp); - ares_free(temp); - if (status != ARES_SUCCESS) { - return status; - } + /* Ignore lines beginning with a comment */ + if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) { + return ARES_SUCCESS; } - res_options = getenv("RES_OPTIONS"); - if (res_options) { - status = set_options(sysconfig, res_options); - if (status != ARES_SUCCESS) { - return status; - } + /* database = values (comma delimited)*/ + status = ares__buf_split(line, (const unsigned char *)"=", 1, + ARES_BUF_SPLIT_TRIM, 2, §s); + + if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) { + goto done; } - return ARES_SUCCESS; + buf = ares__llist_first_val(sects); + status = buf_fetch_string(buf, option, sizeof(option)); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Only support "hosts=" */ + if (strcmp(option, "hosts") != 0) { + goto done; + } + + /* Values are comma separated */ + buf = ares__llist_last_val(sects); + status = config_lookup(sysconfig, buf, ","); + +done: + ares__llist_destroy(sects); + if (status != ARES_ENOMEM) { + status = ARES_SUCCESS; + } + return status; } -ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel, - ares_sysconfig_t *sysconfig) +typedef ares_status_t (*line_callback_t)(ares_sysconfig_t *sysconfig, + ares__buf_t *line); + +/* Should only return: + * ARES_ENOTFOUND - file not found + * ARES_EFILE - error reading file (perms) + * ARES_ENOMEM - out of memory + * ARES_SUCCESS - file processed, doesn't necessarily mean it was a good + * file, but we're not erroring out if we can't parse + * something (or anything at all) */ +static ares_status_t process_config_lines(const char *filename, + ares_sysconfig_t *sysconfig, + line_callback_t cb) { - char *p; - FILE *fp = NULL; - char *line = NULL; - size_t linesize = 0; - int error; - const char *resolvconf_path; - ares_status_t status = ARES_SUCCESS; + ares_status_t status = ARES_SUCCESS; + ares__llist_node_t *node; + ares__llist_t *lines = NULL; + ares__buf_t *buf = NULL; - /* Support path for resolvconf filename set by ares_init_options */ - if (channel->resolvconf_path) { - resolvconf_path = channel->resolvconf_path; - } else { - resolvconf_path = PATH_RESOLV_CONF; - } - - fp = fopen(resolvconf_path, "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { - if ((p = try_config(line, "domain", ';'))) { - status = config_domain(sysconfig, p); - } else if ((p = try_config(line, "lookup", ';'))) { - status = config_lookup(sysconfig, p, "bind", NULL, "file"); - } else if ((p = try_config(line, "search", ';'))) { - status = config_search(sysconfig, p); - } else if ((p = try_config(line, "nameserver", ';'))) { - status = - ares__sconfig_append_fromstr(&sysconfig->sconfig, p, ARES_TRUE); - } else if ((p = try_config(line, "sortlist", ';'))) { - /* Ignore all failures except ENOMEM. If the sysadmin set a bad - * sortlist, just ignore the sortlist, don't cause an inoperable - * channel */ - status = - ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, p); - if (status != ARES_ENOMEM) { - status = ARES_SUCCESS; - } - } else if ((p = try_config(line, "options", ';'))) { - status = set_options(sysconfig, p); - } else { - status = ARES_SUCCESS; - } - if (status != ARES_SUCCESS) { - fclose(fp); - goto done; - } - } - fclose(fp); + buf = ares__buf_create(); + if (buf == NULL) { + status = ARES_ENOMEM; + goto done; + } - if (status != ARES_EOF) { - goto done; - } - } else { - error = ERRNO; - switch (error) { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, - strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", PATH_RESOLV_CONF)); - status = ARES_EFILE; - goto done; - } + status = ares__buf_load_file(filename, buf); + if (status != ARES_SUCCESS) { + goto done; } + status = ares__buf_split(buf, (const unsigned char *)"\n", 1, + ARES_BUF_SPLIT_TRIM, 0, &lines); + if (status != ARES_SUCCESS) { + goto done; + } - /* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */ - fp = fopen("/etc/nsswitch.conf", "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { - if ((p = try_config(line, "hosts:", '\0'))) { - (void)config_lookup(sysconfig, p, "dns", "resolve", "files"); - } - } - fclose(fp); - if (status != ARES_EOF) { + for (node = ares__llist_node_first(lines); node != NULL; + node = ares__llist_node_next(node)) { + ares__buf_t *line = ares__llist_node_val(node); + + status = cb(sysconfig, line); + if (status != ARES_SUCCESS) { goto done; } - } else { - error = ERRNO; - switch (error) { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, - strerror(error))); - DEBUGF( - fprintf(stderr, "Error opening file: %s\n", "/etc/nsswitch.conf")); - break; - } - /* ignore error, maybe we will get luck in next if clause */ } +done: + ares__buf_destroy(buf); + ares__llist_destroy(lines); - /* Linux / GNU libc 2.x and possibly others have host.conf */ - fp = fopen("/etc/host.conf", "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { - if ((p = try_config(line, "order", '\0'))) { - /* ignore errors */ - (void)config_lookup(sysconfig, p, "bind", NULL, "hosts"); - } - } - fclose(fp); - if (status != ARES_EOF) { - goto done; - } - } else { - error = ERRNO; - switch (error) { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, - strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/host.conf")); - break; - } + return status; +} + +ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) +{ + ares_status_t status = ARES_SUCCESS; + + /* Resolv.conf */ + status = process_config_lines((channel->resolvconf_path != NULL) + ? channel->resolvconf_path + : PATH_RESOLV_CONF, + sysconfig, parse_resolvconf_line); + if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { + goto done; + } - /* ignore error, maybe we will get luck in next if clause */ + /* Nsswitch.conf */ + status = + process_config_lines("/etc/nsswitch.conf", sysconfig, parse_nsswitch_line); + if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { + goto done; } + /* netsvc.conf */ + status = + process_config_lines("/etc/netsvc.conf", sysconfig, parse_svcconf_line); + if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { + goto done; + } - /* Tru64 uses /etc/svc.conf */ - fp = fopen("/etc/svc.conf", "r"); - if (fp) { - while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { - if ((p = try_config(line, "hosts=", '\0'))) { - /* ignore errors */ - (void)config_lookup(sysconfig, p, "bind", NULL, "local"); - } - } - fclose(fp); - if (status != ARES_EOF) { - goto done; - } - } else { - error = ERRNO; - switch (error) { - case ENOENT: - case ESRCH: - break; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, - strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/svc.conf")); - break; - } - /* ignore error */ + /* svc.conf */ + status = process_config_lines("/etc/svc.conf", sysconfig, parse_svcconf_line); + if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { + goto done; } status = ARES_SUCCESS; done: - ares_free(line); - return status; } diff --git a/deps/cares/src/lib/ares_update_servers.c b/deps/cares/src/lib/ares_update_servers.c index dd24fbfdd4675c..fce791476327c3 100644 --- a/deps/cares/src/lib/ares_update_servers.c +++ b/deps/cares/src/lib/ares_update_servers.c @@ -266,8 +266,8 @@ static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig) } else { /* IPv6 */ const unsigned char ipv6_charset[] = "ABCDEFabcdef0123456789.:"; - if (ares__buf_consume_charset(buf, ipv6_charset, sizeof(ipv6_charset)) == - 0) { + if (ares__buf_consume_charset(buf, ipv6_charset, + sizeof(ipv6_charset) - 1) == 0) { return ARES_EBADSTR; } } @@ -318,8 +318,8 @@ static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig) ares__buf_tag(buf); - if (ares__buf_consume_charset(buf, iface_charset, sizeof(iface_charset)) == - 0) { + if (ares__buf_consume_charset(buf, iface_charset, + sizeof(iface_charset) - 1) == 0) { return ARES_EBADSTR; } @@ -463,7 +463,7 @@ ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig, } status = ares__buf_split(buf, (const unsigned char *)" ,", 2, - ARES_BUF_SPLIT_NONE, &list); + ARES_BUF_SPLIT_NONE, 0, &list); if (status != ARES_SUCCESS) { goto done; } @@ -1080,7 +1080,7 @@ static ares_status_t set_servers_csv(ares_channel_t *channel, const char *_csv) if (ares_strlen(_csv) == 0) { /* blank all servers */ - return (ares_status_t)ares_set_servers_ports(channel, NULL); + return ares__servers_update(channel, NULL, ARES_TRUE); } status = ares__sconfig_append_fromstr(&slist, _csv, ARES_FALSE); diff --git a/deps/cares/src/lib/setup_once.h b/deps/cares/src/lib/setup_once.h index 8341b348e7a9e0..a6168c9aed5365 100644 --- a/deps/cares/src/lib/setup_once.h +++ b/deps/cares/src/lib/setup_once.h @@ -274,7 +274,7 @@ Error Missing_definition_of_macro_sread #define ISPRINT(x) (isprint((int)((unsigned char)x))) #define ISUPPER(x) (isupper((int)((unsigned char)x))) #define ISLOWER(x) (islower((int)((unsigned char)x))) -#define ISASCII(x) (isascii((int)((unsigned char)x))) +#define ISASCII(x) (((unsigned char)x) <= 127 ? 1 : 0) #define ISBLANK(x) \ (int)((((unsigned char)x) == ' ') || (((unsigned char)x) == '\t')) diff --git a/deps/cares/src/tools/CMakeLists.txt b/deps/cares/src/tools/CMakeLists.txt index 13aefe135e9105..fb795a91741aaf 100644 --- a/deps/cares/src/tools/CMakeLists.txt +++ b/deps/cares/src/tools/CMakeLists.txt @@ -19,7 +19,7 @@ IF (CARES_BUILD_TOOLS) C_STANDARD 90 ) - TARGET_COMPILE_DEFINITIONS (ahost PRIVATE HAVE_CONFIG_H=1) + TARGET_COMPILE_DEFINITIONS (ahost PRIVATE HAVE_CONFIG_H=1 CARES_NO_DEPRECATED) TARGET_LINK_LIBRARIES (ahost PRIVATE ${PROJECT_NAME}) IF (CARES_INSTALL) INSTALL (TARGETS ahost COMPONENT Tools ${TARGETS_INST_DEST}) @@ -40,7 +40,7 @@ IF (CARES_BUILD_TOOLS) C_STANDARD 90 ) - TARGET_COMPILE_DEFINITIONS (adig PRIVATE HAVE_CONFIG_H=1) + TARGET_COMPILE_DEFINITIONS (adig PRIVATE HAVE_CONFIG_H=1 CARES_NO_DEPRECATED) TARGET_LINK_LIBRARIES (adig PRIVATE ${PROJECT_NAME}) IF (CARES_INSTALL) INSTALL (TARGETS adig COMPONENT Tools ${TARGETS_INST_DEST}) diff --git a/deps/cares/src/tools/Makefile.am b/deps/cares/src/tools/Makefile.am index 729658d79a76da..ba7a672f89faf5 100644 --- a/deps/cares/src/tools/Makefile.am +++ b/deps/cares/src/tools/Makefile.am @@ -15,7 +15,8 @@ noinst_PROGRAMS =$(PROGS) AM_CPPFLAGS += -I$(top_builddir)/include \ -I$(top_builddir)/src/lib \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/src/lib + -I$(top_srcdir)/src/lib \ + -DCARES_NO_DEPRECATED include Makefile.inc diff --git a/deps/cares/src/tools/Makefile.in b/deps/cares/src/tools/Makefile.in index f0602fe172fdbb..0b7a310baaab5d 100644 --- a/deps/cares/src/tools/Makefile.in +++ b/deps/cares/src/tools/Makefile.in @@ -228,7 +228,7 @@ AM_CFLAGS = @AM_CFLAGS@ # might possibly already be installed in the system. AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir)/include \ -I$(top_builddir)/src/lib -I$(top_srcdir)/include \ - -I$(top_srcdir)/src/lib + -I$(top_srcdir)/src/lib -DCARES_NO_DEPRECATED AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ @@ -310,6 +310,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ diff --git a/deps/corepack/CHANGELOG.md b/deps/corepack/CHANGELOG.md index 439f6fd3b8e968..f5cef27cc047f9 100644 --- a/deps/corepack/CHANGELOG.md +++ b/deps/corepack/CHANGELOG.md @@ -1,5 +1,56 @@ # Changelog +## [0.28.0](https://github.com/nodejs/corepack/compare/v0.27.0...v0.28.0) (2024-04-20) + + +### ⚠ BREAKING CHANGES + +* call `executePackageManagerRequest` directly ([#430](https://github.com/nodejs/corepack/issues/430)) + +### Bug Fixes + +* call `executePackageManagerRequest` directly ([#430](https://github.com/nodejs/corepack/issues/430)) ([0f9b748](https://github.com/nodejs/corepack/commit/0f9b74864048d5dc150a63cc582966af0c5f363f)) + +## [0.27.0](https://github.com/nodejs/corepack/compare/v0.26.0...v0.27.0) (2024-04-19) + + +### ⚠ BREAKING CHANGES + +* attempting to download a version from the npm registry (or a mirror) that was published using the now deprecated PGP signature without providing a hash will trigger an error. Users can disable the signature verification using a environment variable. + +### Features + +* separate read and write operations on lastKnownGood.json ([#446](https://github.com/nodejs/corepack/issues/446)) ([c449adc](https://github.com/nodejs/corepack/commit/c449adc81822a604ee8f00ae2b53fc411535f96d)) +* update package manager versions ([#425](https://github.com/nodejs/corepack/issues/425)) ([1423190](https://github.com/nodejs/corepack/commit/142319056424b1e0da2bdbe801c52c5910023707)) +* update package manager versions ([#462](https://github.com/nodejs/corepack/issues/462)) ([56816c2](https://github.com/nodejs/corepack/commit/56816c2b7ebc9926f07048b0ec4ff6025bb4e293)) +* verify integrity signature when downloading from npm registry ([#432](https://github.com/nodejs/corepack/issues/432)) ([e561dd0](https://github.com/nodejs/corepack/commit/e561dd00bbacc5bc15a492fc36574fa0e37bff7b)) + + +### Bug Fixes + +* add path to `package.json` in error message ([#456](https://github.com/nodejs/corepack/issues/456)) ([32a93ea](https://github.com/nodejs/corepack/commit/32a93ea4f51eb7db7dc95a16c5719695edf4b53e)) +* correctly set `Dispatcher` prototype for `ProxyAgent` ([#451](https://github.com/nodejs/corepack/issues/451)) ([73d9a1e](https://github.com/nodejs/corepack/commit/73d9a1e2d2f84906bf01952f1dca8adab576b7bf)) +* download fewer metadata from npm registry ([#436](https://github.com/nodejs/corepack/issues/436)) ([082fabf](https://github.com/nodejs/corepack/commit/082fabf8b15658e69e4fb62bb854fe9aace78b70)) +* hash check when downloading Yarn Berry from npm ([#439](https://github.com/nodejs/corepack/issues/439)) ([4672162](https://github.com/nodejs/corepack/commit/467216281e1719a739d0eeea370b335adfb37b8d)) +* Incorrect authorization prefix for basic auth, and undocumented env var ([#454](https://github.com/nodejs/corepack/issues/454)) ([2d63536](https://github.com/nodejs/corepack/commit/2d63536413971d43f570deb035845aa0bd5202f0)) +* re-add support for custom registries with auth ([#397](https://github.com/nodejs/corepack/issues/397)) ([d267753](https://github.com/nodejs/corepack/commit/d2677538cdb613fcab6d2a45bb07f349bdc65c2b)) + +## [0.26.0](https://github.com/nodejs/corepack/compare/v0.25.2...v0.26.0) (2024-03-08) + + +### Features + +* Pins the package manager as it's used for the first time ([#413](https://github.com/nodejs/corepack/issues/413)) ([8b6c6d4](https://github.com/nodejs/corepack/commit/8b6c6d4b2b7a9d61ae6c33c07e12354bd5afc2ba)) +* update package manager versions ([#415](https://github.com/nodejs/corepack/issues/415)) ([e8edba7](https://github.com/nodejs/corepack/commit/e8edba771bca6fb10c855c04eee8102ffa792d58)) + + +### Bug Fixes + +* group the download prompt together ([#391](https://github.com/nodejs/corepack/issues/391)) ([00506b2](https://github.com/nodejs/corepack/commit/00506b2a15dd87ec03240578077a35b7980e00c1)) +* ignore `EROFS` errors ([#421](https://github.com/nodejs/corepack/issues/421)) ([b7ec137](https://github.com/nodejs/corepack/commit/b7ec137210efd35c3461321b6434e3e13a87d42f)) +* improve support for `COREPACK_NPM_REGISTRY` with Yarn Berry ([#396](https://github.com/nodejs/corepack/issues/396)) ([47be27c](https://github.com/nodejs/corepack/commit/47be27c9db988e10f651d23b3f53bcf55318a894)) +* Windows malicious file analysis waiting problem ([#398](https://github.com/nodejs/corepack/issues/398)) ([295a1cd](https://github.com/nodejs/corepack/commit/295a1cdb9cbbbce8434e8d82b96eb63e57c46c1a)) + ## [0.25.2](https://github.com/nodejs/corepack/compare/v0.25.1...v0.25.2) (2024-02-21) diff --git a/deps/corepack/README.md b/deps/corepack/README.md index 2f5819d913eb37..42dc8c19085e88 100644 --- a/deps/corepack/README.md +++ b/deps/corepack/README.md @@ -1,5 +1,7 @@ # corepack +[![Join us on OpenJS slack (channel #nodejs-corepack)](https://img.shields.io/badge/OpenJS%20Slack-%23nodejs--corepack-blue)](https://slack-invite.openjsf.org/) + Corepack is a zero-runtime-dependency Node.js script that acts as a bridge between Node.js projects and the package managers they are intended to be used with during development. In practical terms, **Corepack lets you use Yarn, npm, @@ -54,7 +56,7 @@ projects, `pnpm install` in pnpm projects, and `npm` in npm projects. Corepack will catch these calls, and depending on the situation: - **If the local project is configured for the package manager you're using**, - Corepack will silently download and cache the latest compatible version. + Corepack will download and cache the latest compatible version. - **If the local project is configured for a different package manager**, Corepack will request you to run the command again using the right package @@ -235,6 +237,12 @@ same major line. Should you need to upgrade to a new major, use an explicit package manager, and to not update the Last Known Good version when it downloads a new version of the same major line. +- `COREPACK_ENABLE_AUTO_PIN` can be set to `0` to prevent Corepack from + updating the `packageManager` field when it detects that the local package + doesn't list it. In general we recommend to always list a `packageManager` + field (which you can easily set through `corepack use [name]@[version]`), as + it ensures that your project installs are always deterministic. + - `COREPACK_ENABLE_DOWNLOAD_PROMPT` can be set to `0` to prevent Corepack showing the URL when it needs to download software, or can be set to `1` to have the URL shown. By default, when Corepack is called @@ -288,6 +296,9 @@ same major line. Should you need to upgrade to a new major, use an explicit - `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` are supported through [`node-proxy-agent`](https://github.com/TooTallNate/node-proxy-agent). +- `COREPACK_INTEGRITY_KEYS` can be set to an empty string to instruct Corepack + to skip integrity checks, or a JSON string containing custom keys. + ## Troubleshooting ### Networking @@ -303,10 +314,6 @@ There are a wide variety of networking issues that can occur while running `core See [`CONTRIBUTING.md`](./CONTRIBUTING.md). -## Design - -See [`DESIGN.md`](/DESIGN.md). - ## License (MIT) See [`LICENSE.md`](./LICENSE.md). diff --git a/deps/corepack/dist/lib/corepack.cjs b/deps/corepack/dist/lib/corepack.cjs index 3d8e819e7997e7..f81b561ce54d87 100644 --- a/deps/corepack/dist/lib/corepack.cjs +++ b/deps/corepack/dist/lib/corepack.cjs @@ -4316,78 +4316,9 @@ var require_proxy_from_env = __commonJS({ } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/symbols.js -var require_symbols = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/symbols.js"(exports, module2) { - module2.exports = { - kClose: Symbol("close"), - kDestroy: Symbol("destroy"), - kDispatch: Symbol("dispatch"), - kUrl: Symbol("url"), - kWriting: Symbol("writing"), - kResuming: Symbol("resuming"), - kQueue: Symbol("queue"), - kConnect: Symbol("connect"), - kConnecting: Symbol("connecting"), - kHeadersList: Symbol("headers list"), - kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), - kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), - kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), - kKeepAliveTimeoutValue: Symbol("keep alive timeout"), - kKeepAlive: Symbol("keep alive"), - kHeadersTimeout: Symbol("headers timeout"), - kBodyTimeout: Symbol("body timeout"), - kServerName: Symbol("server name"), - kLocalAddress: Symbol("local address"), - kHost: Symbol("host"), - kNoRef: Symbol("no ref"), - kBodyUsed: Symbol("used"), - kRunning: Symbol("running"), - kBlocking: Symbol("blocking"), - kPending: Symbol("pending"), - kSize: Symbol("size"), - kBusy: Symbol("busy"), - kQueued: Symbol("queued"), - kFree: Symbol("free"), - kConnected: Symbol("connected"), - kClosed: Symbol("closed"), - kNeedDrain: Symbol("need drain"), - kReset: Symbol("reset"), - kDestroyed: Symbol.for("nodejs.stream.destroyed"), - kMaxHeadersSize: Symbol("max headers size"), - kRunningIdx: Symbol("running index"), - kPendingIdx: Symbol("pending index"), - kError: Symbol("error"), - kClients: Symbol("clients"), - kClient: Symbol("client"), - kParser: Symbol("parser"), - kOnDestroyed: Symbol("destroy callbacks"), - kPipelining: Symbol("pipelining"), - kSocket: Symbol("socket"), - kHostHeader: Symbol("host header"), - kConnector: Symbol("connector"), - kStrictContentLength: Symbol("strict content length"), - kMaxRedirections: Symbol("maxRedirections"), - kMaxRequests: Symbol("maxRequestsPerClient"), - kProxy: Symbol("proxy agent options"), - kCounter: Symbol("socket request counter"), - kInterceptors: Symbol("dispatch interceptors"), - kMaxResponseSize: Symbol("max response size"), - kHTTP2Session: Symbol("http2Session"), - kHTTP2SessionState: Symbol("http2Session state"), - kHTTP2BuildRequest: Symbol("http2 build request"), - kHTTP1BuildRequest: Symbol("http1 build request"), - kHTTP2CopyHeaders: Symbol("http2 copy headers"), - kHTTPConnVersion: Symbol("http connection version"), - kRetryHandlerDefaultRetry: Symbol("retry agent default retry"), - kConstruct: Symbol("constructable") - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/errors.js +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/errors.js var require_errors = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/errors.js"(exports, module2) { + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/errors.js"(exports, module2) { "use strict"; var UndiciError = class extends Error { constructor(message) { @@ -4563,6 +4494,15 @@ var require_errors = __commonJS({ this.headers = headers; } }; + var SecureProxyConnectionError = class extends UndiciError { + constructor(cause, message, options) { + super(message, { cause, ...options ?? {} }); + this.name = "SecureProxyConnectionError"; + this.message = message || "Secure Proxy Connection failed"; + this.code = "UND_ERR_PRX_TLS"; + this.cause = cause; + } + }; module2.exports = { AbortError, HTTPParserError, @@ -4584,4716 +4524,4094 @@ var require_errors = __commonJS({ ResponseContentLengthMismatchError, BalancedPoolMissingUpstreamError, ResponseExceededMaxSizeError, - RequestRetryError + RequestRetryError, + SecureProxyConnectionError }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher.js -var require_dispatcher = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/symbols.js +var require_symbols = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/symbols.js"(exports, module2) { + module2.exports = { + kClose: Symbol("close"), + kDestroy: Symbol("destroy"), + kDispatch: Symbol("dispatch"), + kUrl: Symbol("url"), + kWriting: Symbol("writing"), + kResuming: Symbol("resuming"), + kQueue: Symbol("queue"), + kConnect: Symbol("connect"), + kConnecting: Symbol("connecting"), + kHeadersList: Symbol("headers list"), + kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), + kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), + kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), + kKeepAliveTimeoutValue: Symbol("keep alive timeout"), + kKeepAlive: Symbol("keep alive"), + kHeadersTimeout: Symbol("headers timeout"), + kBodyTimeout: Symbol("body timeout"), + kServerName: Symbol("server name"), + kLocalAddress: Symbol("local address"), + kHost: Symbol("host"), + kNoRef: Symbol("no ref"), + kBodyUsed: Symbol("used"), + kRunning: Symbol("running"), + kBlocking: Symbol("blocking"), + kPending: Symbol("pending"), + kSize: Symbol("size"), + kBusy: Symbol("busy"), + kQueued: Symbol("queued"), + kFree: Symbol("free"), + kConnected: Symbol("connected"), + kClosed: Symbol("closed"), + kNeedDrain: Symbol("need drain"), + kReset: Symbol("reset"), + kDestroyed: Symbol.for("nodejs.stream.destroyed"), + kResume: Symbol("resume"), + kOnError: Symbol("on error"), + kMaxHeadersSize: Symbol("max headers size"), + kRunningIdx: Symbol("running index"), + kPendingIdx: Symbol("pending index"), + kError: Symbol("error"), + kClients: Symbol("clients"), + kClient: Symbol("client"), + kParser: Symbol("parser"), + kOnDestroyed: Symbol("destroy callbacks"), + kPipelining: Symbol("pipelining"), + kSocket: Symbol("socket"), + kHostHeader: Symbol("host header"), + kConnector: Symbol("connector"), + kStrictContentLength: Symbol("strict content length"), + kMaxRedirections: Symbol("maxRedirections"), + kMaxRequests: Symbol("maxRequestsPerClient"), + kProxy: Symbol("proxy agent options"), + kCounter: Symbol("socket request counter"), + kInterceptors: Symbol("dispatch interceptors"), + kMaxResponseSize: Symbol("max response size"), + kHTTP2Session: Symbol("http2Session"), + kHTTP2SessionState: Symbol("http2Session state"), + kRetryHandlerDefaultRetry: Symbol("retry agent default retry"), + kConstruct: Symbol("constructable"), + kListeners: Symbol("listeners"), + kHTTPContext: Symbol("http context"), + kMaxConcurrentStreams: Symbol("max concurrent streams") + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/constants.js +var require_constants2 = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/constants.js"(exports, module2) { "use strict"; - var EventEmitter = require("node:events"); - var Dispatcher = class extends EventEmitter { - dispatch() { - throw new Error("not implemented"); - } - close() { - throw new Error("not implemented"); - } - destroy() { - throw new Error("not implemented"); - } + var headerNameLowerCasedRecord = {}; + var wellknownHeaderNames = [ + "Accept", + "Accept-Encoding", + "Accept-Language", + "Accept-Ranges", + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Origin", + "Access-Control-Expose-Headers", + "Access-Control-Max-Age", + "Access-Control-Request-Headers", + "Access-Control-Request-Method", + "Age", + "Allow", + "Alt-Svc", + "Alt-Used", + "Authorization", + "Cache-Control", + "Clear-Site-Data", + "Connection", + "Content-Disposition", + "Content-Encoding", + "Content-Language", + "Content-Length", + "Content-Location", + "Content-Range", + "Content-Security-Policy", + "Content-Security-Policy-Report-Only", + "Content-Type", + "Cookie", + "Cross-Origin-Embedder-Policy", + "Cross-Origin-Opener-Policy", + "Cross-Origin-Resource-Policy", + "Date", + "Device-Memory", + "Downlink", + "ECT", + "ETag", + "Expect", + "Expect-CT", + "Expires", + "Forwarded", + "From", + "Host", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", + "Keep-Alive", + "Last-Modified", + "Link", + "Location", + "Max-Forwards", + "Origin", + "Permissions-Policy", + "Pragma", + "Proxy-Authenticate", + "Proxy-Authorization", + "RTT", + "Range", + "Referer", + "Referrer-Policy", + "Refresh", + "Retry-After", + "Sec-WebSocket-Accept", + "Sec-WebSocket-Extensions", + "Sec-WebSocket-Key", + "Sec-WebSocket-Protocol", + "Sec-WebSocket-Version", + "Server", + "Server-Timing", + "Service-Worker-Allowed", + "Service-Worker-Navigation-Preload", + "Set-Cookie", + "SourceMap", + "Strict-Transport-Security", + "Supports-Loading-Mode", + "TE", + "Timing-Allow-Origin", + "Trailer", + "Transfer-Encoding", + "Upgrade", + "Upgrade-Insecure-Requests", + "User-Agent", + "Vary", + "Via", + "WWW-Authenticate", + "X-Content-Type-Options", + "X-DNS-Prefetch-Control", + "X-Frame-Options", + "X-Permitted-Cross-Domain-Policies", + "X-Powered-By", + "X-Requested-With", + "X-XSS-Protection" + ]; + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i]; + const lowerCasedKey = key.toLowerCase(); + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; + } + Object.setPrototypeOf(headerNameLowerCasedRecord, null); + module2.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord }; - module2.exports = Dispatcher; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher-base.js -var require_dispatcher_base = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher-base.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/tree.js +var require_tree = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/tree.js"(exports, module2) { "use strict"; - var Dispatcher = require_dispatcher(); var { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = require_errors(); - var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); - var kDestroyed = Symbol("destroyed"); - var kClosed = Symbol("closed"); - var kOnDestroyed = Symbol("onDestroyed"); - var kOnClosed = Symbol("onClosed"); - var kInterceptedDispatch = Symbol("Intercepted Dispatch"); - var DispatcherBase = class extends Dispatcher { - constructor() { - super(); - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; - } - get destroyed() { - return this[kDestroyed]; - } - get closed() { - return this[kClosed]; - } - get interceptors() { - return this[kInterceptors]; - } - set interceptors(newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== "function") { - throw new InvalidArgumentError("interceptor must be an function"); - } - } + wellknownHeaderNames, + headerNameLowerCasedRecord + } = require_constants2(); + var TstNode = class _TstNode { + /** @type {any} */ + value = null; + /** @type {null | TstNode} */ + left = null; + /** @type {null | TstNode} */ + middle = null; + /** @type {null | TstNode} */ + right = null; + /** @type {number} */ + code; + /** + * @param {string} key + * @param {any} value + * @param {number} index + */ + constructor(key, value, index) { + if (index === void 0 || index >= key.length) { + throw new TypeError("Unreachable"); } - this[kInterceptors] = newInterceptors; - } - close(callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data); - }); - }); + const code = this.code = key.charCodeAt(index); + if (code > 127) { + throw new TypeError("key must be ascii string"); } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); + if (key.length !== ++index) { + this.middle = new _TstNode(key, value, index); + } else { + this.value = value; } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)); - return; + } + /** + * @param {string} key + * @param {any} value + */ + add(key, value) { + const length = key.length; + if (length === 0) { + throw new TypeError("Unreachable"); } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); + let index = 0; + let node = this; + while (true) { + const code = key.charCodeAt(index); + if (code > 127) { + throw new TypeError("key must be ascii string"); + } + if (node.code === code) { + if (length === ++index) { + node.value = value; + break; + } else if (node.middle !== null) { + node = node.middle; + } else { + node.middle = new _TstNode(key, value, index); + break; + } + } else if (node.code < code) { + if (node.left !== null) { + node = node.left; + } else { + node.left = new _TstNode(key, value, index); + break; + } + } else if (node.right !== null) { + node = node.right; } else { - queueMicrotask(() => callback(null, null)); + node.right = new _TstNode(key, value, index); + break; } - return; } - this[kClosed] = true; - this[kOnClosed].push(callback); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kClose]().then(() => this.destroy()).then(() => { - queueMicrotask(onClosed); - }); } - destroy(err, callback) { - if (typeof err === "function") { - callback = err; - err = null; - } - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.destroy(err, (err2, data) => { - return err2 ? ( - /* istanbul ignore next: should never error */ - reject(err2) - ) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); + /** + * @param {Uint8Array} key + * @return {TstNode | null} + */ + search(key) { + const keylength = key.length; + let index = 0; + let node = this; + while (node !== null && index < keylength) { + let code = key[index]; + if (code <= 90 && code >= 65) { + code |= 32; } - return; - } - if (!err) { - err = new ClientDestroyedError(); - } - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); + while (node !== null) { + if (code === node.code) { + if (keylength === ++index) { + return node; + } + node = node.middle; + break; + } + node = node.code < code ? node.left : node.right; } - }; - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } - [kInterceptedDispatch](opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler); } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); - } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler); + return null; } - dispatch(opts, handler) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - try { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object."); - } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError(); - } - if (this[kClosed]) { - throw new ClientClosedError(); - } - return this[kInterceptedDispatch](opts, handler); - } catch (err) { - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - handler.onError(err); - return false; + }; + var TernarySearchTree = class { + /** @type {TstNode | null} */ + node = null; + /** + * @param {string} key + * @param {any} value + * */ + insert(key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0); + } else { + this.node.add(key, value); } } + /** + * @param {Uint8Array} key + * @return {any} + */ + lookup(key) { + return this.node?.search(key)?.value ?? null; + } + }; + var tree = new TernarySearchTree(); + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; + tree.insert(key, key); + } + module2.exports = { + TernarySearchTree, + tree }; - module2.exports = DispatcherBase; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/node/fixed-queue.js -var require_fixed_queue = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/node/fixed-queue.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/util.js +var require_util = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/util.js"(exports, module2) { "use strict"; - var kSize = 2048; - var kMask = kSize - 1; - var FixedCircularBuffer = class { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } - isEmpty() { - return this.top === this.bottom; + var assert3 = require("node:assert"); + var { kDestroyed, kBodyUsed, kListeners } = require_symbols(); + var { IncomingMessage } = require("node:http"); + var stream = require("node:stream"); + var net = require("node:net"); + var { InvalidArgumentError } = require_errors(); + var { Blob: Blob2 } = require("node:buffer"); + var nodeUtil = require("node:util"); + var { stringify } = require("node:querystring"); + var { headerNameLowerCasedRecord } = require_constants2(); + var { tree } = require_tree(); + var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); + function nop() { + } + function isStream(obj) { + return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; + } + function isBlobLike(object) { + if (object === null) { + return false; + } else if (object instanceof Blob2) { + return true; + } else if (typeof object !== "object") { + return false; + } else { + const sTag = object[Symbol.toStringTag]; + return (sTag === "Blob" || sTag === "File") && ("stream" in object && typeof object.stream === "function" || "arrayBuffer" in object && typeof object.arrayBuffer === "function"); } - isFull() { - return (this.top + 1 & kMask) === this.bottom; + } + function buildURL(url, queryParams) { + if (url.includes("?") || url.includes("#")) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".'); } - push(data) { - this.list[this.top] = data; - this.top = this.top + 1 & kMask; + const stringified = stringify(queryParams); + if (stringified) { + url += "?" + stringified; } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === void 0) - return null; - this.list[this.bottom] = void 0; - this.bottom = this.bottom + 1 & kMask; - return nextItem; + return url; + } + function parseURL(url) { + if (typeof url === "string") { + url = new URL(url); + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + return url; } - }; - module2.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); + if (!url || typeof url !== "object") { + throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); } - isEmpty() { - return this.head.isEmpty(); + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); } - push(data) { - if (this.head.isFull()) { - this.head = this.head.next = new FixedCircularBuffer(); + if (!(url instanceof URL)) { + if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { + throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); } - this.head.push(data); - } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - this.tail = tail.next; + if (url.path != null && typeof url.path !== "string") { + throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); } - return next; + if (url.pathname != null && typeof url.pathname !== "string") { + throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); + } + if (url.hostname != null && typeof url.hostname !== "string") { + throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); + } + if (url.origin != null && typeof url.origin !== "string") { + throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); + } + const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; + let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; + let path10 = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; + if (origin.endsWith("/")) { + origin = origin.substring(0, origin.length - 1); + } + if (path10 && !path10.startsWith("/")) { + path10 = `/${path10}`; + } + url = new URL(origin + path10); } - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-stats.js -var require_pool_stats = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-stats.js"(exports, module2) { - var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); - var kPool = Symbol("pool"); - var PoolStats = class { - constructor(pool) { - this[kPool] = pool; + return url; + } + function parseOrigin(url) { + url = parseURL(url); + if (url.pathname !== "/" || url.search || url.hash) { + throw new InvalidArgumentError("invalid url"); } - get connected() { - return this[kPool][kConnected]; + return url; + } + function getHostname(host) { + if (host[0] === "[") { + const idx2 = host.indexOf("]"); + assert3(idx2 !== -1); + return host.substring(1, idx2); } - get free() { - return this[kPool][kFree]; + const idx = host.indexOf(":"); + if (idx === -1) + return host; + return host.substring(0, idx); + } + function getServerName(host) { + if (!host) { + return null; } - get pending() { - return this[kPool][kPending]; + assert3.strictEqual(typeof host, "string"); + const servername = getHostname(host); + if (net.isIP(servername)) { + return ""; } - get queued() { - return this[kPool][kQueued]; + return servername; + } + function deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + function isAsyncIterable(obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); + } + function isIterable(obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); + } + function bodyLength(body) { + if (body == null) { + return 0; + } else if (isStream(body)) { + const state = body._readableState; + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null; + } else if (isBuffer(body)) { + return body.byteLength; } - get running() { - return this[kPool][kRunning]; + return null; + } + function isDestroyed(body) { + return body && !!(body.destroyed || body[kDestroyed] || stream.isDestroyed?.(body)); + } + function isReadableAborted(stream2) { + const state = stream2?._readableState; + return isDestroyed(stream2) && state && !state.endEmitted; + } + function destroy(stream2, err) { + if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { + return; } - get size() { - return this[kPool][kSize]; + if (typeof stream2.destroy === "function") { + if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { + stream2.socket = null; + } + stream2.destroy(err); + } else if (err) { + queueMicrotask(() => { + stream2.emit("error", err); + }); } - }; - module2.exports = PoolStats; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-base.js -var require_pool_base = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-base.js"(exports, module2) { - "use strict"; - var DispatcherBase = require_dispatcher_base(); - var FixedQueue = require_fixed_queue(); - var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); - var PoolStats = require_pool_stats(); - var kClients = Symbol("clients"); - var kNeedDrain = Symbol("needDrain"); - var kQueue = Symbol("queue"); - var kClosedResolve = Symbol("closed resolve"); - var kOnDrain = Symbol("onDrain"); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kGetDispatcher = Symbol("get dispatcher"); - var kAddClient = Symbol("add client"); - var kRemoveClient = Symbol("remove client"); - var kStats = Symbol("stats"); - var PoolBase = class extends DispatcherBase { - constructor() { - super(); - this[kQueue] = new FixedQueue(); - this[kClients] = []; - this[kQueued] = 0; - const pool = this; - this[kOnDrain] = function onDrain(origin, targets) { - const queue = pool[kQueue]; - let needDrain = false; - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break; - } - pool[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } - this[kNeedDrain] = needDrain; - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false; - pool.emit("drain", origin, [pool, ...targets]); + if (stream2.destroyed !== true) { + stream2[kDestroyed] = true; + } + } + var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; + function parseKeepAliveTimeout(val) { + const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); + return m ? parseInt(m[1], 10) * 1e3 : null; + } + function headerNameToString(value) { + return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + } + function bufferToLowerCasedHeaderName(value) { + return tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + } + function parseHeaders(headers, obj) { + if (obj === void 0) + obj = {}; + for (let i = 0; i < headers.length; i += 2) { + const key = headerNameToString(headers[i]); + let val = obj[key]; + if (val) { + if (typeof val === "string") { + val = [val]; + obj[key] = val; } - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); + val.push(headers[i + 1].toString("utf8")); + } else { + const headersValue = headers[i + 1]; + if (typeof headersValue === "string") { + obj[key] = headersValue; + } else { + obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8"); } - }; - this[kOnConnect] = (origin, targets) => { - pool.emit("connect", origin, [pool, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit("disconnect", origin, [pool, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit("connectionError", origin, [pool, ...targets], err); - }; - this[kStats] = new PoolStats(this); + } } - get [kBusy]() { - return this[kNeedDrain]; + if ("content-length" in obj && "content-disposition" in obj) { + obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); } - get [kConnected]() { - return this[kClients].filter((client) => client[kConnected]).length; + return obj; + } + function parseRawHeaders(headers) { + const len = headers.length; + const ret = new Array(len); + let hasContentLength = false; + let contentDispositionIdx = -1; + let key; + let val; + let kLen = 0; + for (let n = 0; n < headers.length; n += 2) { + key = headers[n]; + val = headers[n + 1]; + typeof key !== "string" && (key = key.toString()); + typeof val !== "string" && (val = val.toString("utf8")); + kLen = key.length; + if (kLen === 14 && key[7] === "-" && (key === "content-length" || key.toLowerCase() === "content-length")) { + hasContentLength = true; + } else if (kLen === 19 && key[7] === "-" && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { + contentDispositionIdx = n + 1; + } + ret[n] = key; + ret[n + 1] = val; } - get [kFree]() { - return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); } - get [kPending]() { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; - } - return ret; + return ret; + } + function isBuffer(buffer) { + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); + } + function validateHandler(handler, method, upgrade) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); } - get [kRunning]() { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; - } - return ret; + if (typeof handler.onConnect !== "function") { + throw new InvalidArgumentError("invalid onConnect method"); } - get [kSize]() { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; - } - return ret; + if (typeof handler.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); } - get stats() { - return this[kStats]; + if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) { + throw new InvalidArgumentError("invalid onBodySent method"); } - async [kClose]() { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map((c) => c.close())); - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; - }); + if (upgrade || method === "CONNECT") { + if (typeof handler.onUpgrade !== "function") { + throw new InvalidArgumentError("invalid onUpgrade method"); } - } - async [kDestroy](err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break; - } - item.handler.onError(err); + } else { + if (typeof handler.onHeaders !== "function") { + throw new InvalidArgumentError("invalid onHeaders method"); } - return Promise.all(this[kClients].map((c) => c.destroy(err))); - } - [kDispatch](opts, handler) { - const dispatcher = this[kGetDispatcher](); - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); + if (typeof handler.onData !== "function") { + throw new InvalidArgumentError("invalid onData method"); + } + if (typeof handler.onComplete !== "function") { + throw new InvalidArgumentError("invalid onComplete method"); } - return !this[kNeedDrain]; } - [kAddClient](client) { - client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].push(client); - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]); + } + function isDisturbed(body) { + return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])); + } + function isErrored(body) { + return !!(body && stream.isErrored(body)); + } + function isReadable(body) { + return !!(body && stream.isReadable(body)); + } + function getSocketInfo(socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + }; + } + function ReadableStreamFrom(iterable) { + let iterator; + return new ReadableStream( + { + async start() { + iterator = iterable[Symbol.asyncIterator](); + }, + async pull(controller) { + const { done, value } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + controller.byobRequest?.respond(0); + }); + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); + if (buf.byteLength) { + controller.enqueue(new Uint8Array(buf)); + } } - }); + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator.return(); + }, + type: "bytes" } - return this; + ); + } + function isFormDataLike(object) { + return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; + } + function addAbortListener(signal, listener) { + if ("addEventListener" in signal) { + signal.addEventListener("abort", listener, { once: true }); + return () => signal.removeEventListener("abort", listener); } - [kRemoveClient](client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); - this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); + signal.addListener("abort", listener); + return () => signal.removeListener("abort", listener); + } + var hasToWellFormed = typeof String.prototype.toWellFormed === "function"; + var hasIsWellFormed = typeof String.prototype.isWellFormed === "function"; + function toUSVString(val) { + return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val); + } + function isUSVString(val) { + return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}`; + } + function isTokenCharCode(c) { + switch (c) { + case 34: + case 40: + case 41: + case 44: + case 47: + case 58: + case 59: + case 60: + case 61: + case 62: + case 63: + case 64: + case 91: + case 92: + case 93: + case 123: + case 125: + return false; + default: + return c >= 33 && c <= 126; } - }; + } + function isValidHTTPToken(characters) { + if (characters.length === 0) { + return false; + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false; + } + } + return true; + } + var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + function isValidHeaderChar(characters) { + return !headerCharRegex.test(characters); + } + function parseRangeHeader(range) { + if (range == null || range === "") + return { start: 0, end: null, size: null }; + const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; + return m ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } : null; + } + function addListener(obj, name, listener) { + const listeners = obj[kListeners] ??= []; + listeners.push([name, listener]); + obj.on(name, listener); + return obj; + } + function removeAllListeners(obj) { + for (const [name, listener] of obj[kListeners] ?? []) { + obj.removeListener(name, listener); + } + obj[kListeners] = null; + } + function errorRequest(client, request, err) { + try { + request.onError(err); + assert3(request.aborted); + } catch (err2) { + client.emit("error", err2); + } + } + var kEnumerableProperty = /* @__PURE__ */ Object.create(null); + kEnumerableProperty.enumerable = true; module2.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/constants.js -var require_constants2 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/constants.js"(exports, module2) { - "use strict"; - var headerNameLowerCasedRecord = {}; - var wellknownHeaderNames = [ - "Accept", - "Accept-Encoding", - "Accept-Language", - "Accept-Ranges", - "Access-Control-Allow-Credentials", - "Access-Control-Allow-Headers", - "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin", - "Access-Control-Expose-Headers", - "Access-Control-Max-Age", - "Access-Control-Request-Headers", - "Access-Control-Request-Method", - "Age", - "Allow", - "Alt-Svc", - "Alt-Used", - "Authorization", - "Cache-Control", - "Clear-Site-Data", - "Connection", - "Content-Disposition", - "Content-Encoding", - "Content-Language", - "Content-Length", - "Content-Location", - "Content-Range", - "Content-Security-Policy", - "Content-Security-Policy-Report-Only", - "Content-Type", - "Cookie", - "Cross-Origin-Embedder-Policy", - "Cross-Origin-Opener-Policy", - "Cross-Origin-Resource-Policy", - "Date", - "Device-Memory", - "Downlink", - "ECT", - "ETag", - "Expect", - "Expect-CT", - "Expires", - "Forwarded", - "From", - "Host", - "If-Match", - "If-Modified-Since", - "If-None-Match", - "If-Range", - "If-Unmodified-Since", - "Keep-Alive", - "Last-Modified", - "Link", - "Location", - "Max-Forwards", - "Origin", - "Permissions-Policy", - "Pragma", - "Proxy-Authenticate", - "Proxy-Authorization", - "RTT", - "Range", - "Referer", - "Referrer-Policy", - "Refresh", - "Retry-After", - "Sec-WebSocket-Accept", - "Sec-WebSocket-Extensions", - "Sec-WebSocket-Key", - "Sec-WebSocket-Protocol", - "Sec-WebSocket-Version", - "Server", - "Server-Timing", - "Service-Worker-Allowed", - "Service-Worker-Navigation-Preload", - "Set-Cookie", - "SourceMap", - "Strict-Transport-Security", - "Supports-Loading-Mode", - "TE", - "Timing-Allow-Origin", - "Trailer", - "Transfer-Encoding", - "Upgrade", - "Upgrade-Insecure-Requests", - "User-Agent", - "Vary", - "Via", - "WWW-Authenticate", - "X-Content-Type-Options", - "X-DNS-Prefetch-Control", - "X-Frame-Options", - "X-Permitted-Cross-Domain-Policies", - "X-Powered-By", - "X-Requested-With", - "X-XSS-Protection" - ]; - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = wellknownHeaderNames[i]; - const lowerCasedKey = key.toLowerCase(); - headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; - } - Object.setPrototypeOf(headerNameLowerCasedRecord, null); - module2.exports = { - wellknownHeaderNames, - headerNameLowerCasedRecord + kEnumerableProperty, + nop, + isDisturbed, + isErrored, + isReadable, + toUSVString, + isUSVString, + isReadableAborted, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + headerNameToString, + bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, + parseRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + validateHandler, + getSocketInfo, + isFormDataLike, + buildURL, + addAbortListener, + isValidHTTPToken, + isValidHeaderChar, + isTokenCharCode, + parseRangeHeader, + nodeMajor, + nodeMinor, + nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13, + safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"] }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/tree.js -var require_tree = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/tree.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/readable.js +var require_readable = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/readable.js"(exports, module2) { "use strict"; - var { - wellknownHeaderNames, - headerNameLowerCasedRecord - } = require_constants2(); - var TstNode = class _TstNode { - /** @type {any} */ - value = null; - /** @type {null | TstNode} */ - left = null; - /** @type {null | TstNode} */ - middle = null; - /** @type {null | TstNode} */ - right = null; - /** @type {number} */ - code; - /** - * @param {Uint8Array} key - * @param {any} value - * @param {number} index - */ - constructor(key, value, index) { - if (index === void 0 || index >= key.length) { - throw new TypeError("Unreachable"); + var assert3 = require("node:assert"); + var { Readable: Readable2 } = require("node:stream"); + var { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require_errors(); + var util = require_util(); + var { ReadableStreamFrom } = require_util(); + var kConsume = Symbol("kConsume"); + var kReading = Symbol("kReading"); + var kBody = Symbol("kBody"); + var kAbort = Symbol("kAbort"); + var kContentType = Symbol("kContentType"); + var kContentLength = Symbol("kContentLength"); + var noop = () => { + }; + var BodyReadable = class extends Readable2 { + constructor({ + resume, + abort, + contentType = "", + contentLength, + highWaterMark = 64 * 1024 + // Same as nodejs fs streams. + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark + }); + this._readableState.dataEmitted = false; + this[kAbort] = abort; + this[kConsume] = null; + this[kBody] = null; + this[kContentType] = contentType; + this[kContentLength] = contentLength; + this[kReading] = false; + } + destroy(err) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); } - this.code = key[index]; - if (key.length !== ++index) { - this.middle = new _TstNode(key, value, index); - } else { - this.value = value; + if (err) { + this[kAbort](); } + return super.destroy(err); } - /** - * @param {Uint8Array} key - * @param {any} value - * @param {number} index - */ - add(key, value, index) { - if (index === void 0 || index >= key.length) { - throw new TypeError("Unreachable"); + _destroy(err, callback) { + setImmediate(() => { + callback(err); + }); + } + on(ev, ...args) { + if (ev === "data" || ev === "readable") { + this[kReading] = true; } - const code = key[index]; - if (this.code === code) { - if (key.length === ++index) { - this.value = value; - } else if (this.middle !== null) { - this.middle.add(key, value, index); - } else { - this.middle = new _TstNode(key, value, index); - } - } else if (this.code < code) { - if (this.left !== null) { - this.left.add(key, value, index); - } else { - this.left = new _TstNode(key, value, index); + return super.on(ev, ...args); + } + addListener(ev, ...args) { + return this.on(ev, ...args); + } + off(ev, ...args) { + const ret = super.off(ev, ...args); + if (ev === "data" || ev === "readable") { + this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; + } + return ret; + } + removeListener(ev, ...args) { + return this.off(ev, ...args); + } + push(chunk) { + if (this[kConsume] && chunk !== null) { + consumePush(this[kConsume], chunk); + return this[kReading] ? super.push(chunk) : true; + } + return super.push(chunk); + } + // https://fetch.spec.whatwg.org/#dom-body-text + async text() { + return consume(this, "text"); + } + // https://fetch.spec.whatwg.org/#dom-body-json + async json() { + return consume(this, "json"); + } + // https://fetch.spec.whatwg.org/#dom-body-blob + async blob() { + return consume(this, "blob"); + } + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer + async arrayBuffer() { + return consume(this, "arrayBuffer"); + } + // https://fetch.spec.whatwg.org/#dom-body-formdata + async formData() { + throw new NotSupportedError(); + } + // https://fetch.spec.whatwg.org/#dom-body-bodyused + get bodyUsed() { + return util.isDisturbed(this); + } + // https://fetch.spec.whatwg.org/#dom-body-body + get body() { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this); + if (this[kConsume]) { + this[kBody].getReader(); + assert3(this[kBody].locked); } - } else if (this.right !== null) { - this.right.add(key, value, index); - } else { - this.right = new _TstNode(key, value, index); } + return this[kBody]; } - /** - * @param {Uint8Array} key - * @return {TstNode | null} - */ - search(key) { - const keylength = key.length; - let index = 0; - let node = this; - while (node !== null && index < keylength) { - let code = key[index]; - if (code >= 65 && code <= 90) { - code |= 32; + async dump(opts) { + let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024; + const signal = opts?.signal; + if (signal != null && (typeof signal !== "object" || !("aborted" in signal))) { + throw new InvalidArgumentError("signal must be an AbortSignal"); + } + signal?.throwIfAborted(); + if (this._readableState.closeEmitted) { + return null; + } + return await new Promise((resolve, reject) => { + if (this[kContentLength] > limit) { + this.destroy(new AbortError()); } - while (node !== null) { - if (code === node.code) { - if (keylength === ++index) { - return node; - } - node = node.middle; - break; + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()); + }; + signal?.addEventListener("abort", onAbort); + this.on("close", function() { + signal?.removeEventListener("abort", onAbort); + if (signal?.aborted) { + reject(signal.reason ?? new AbortError()); + } else { + resolve(null); } - node = node.code < code ? node.left : node.right; - } - } - return null; + }).on("error", noop).on("data", function(chunk) { + limit -= chunk.length; + if (limit <= 0) { + this.destroy(); + } + }).resume(); + }); } }; - var TernarySearchTree = class { - /** @type {TstNode | null} */ - node = null; - /** - * @param {Uint8Array} key - * @param {any} value - * */ - insert(key, value) { - if (this.node === null) { - this.node = new TstNode(key, value, 0); + function isLocked(self2) { + return self2[kBody] && self2[kBody].locked === true || self2[kConsume]; + } + function isUnusable(self2) { + return util.isDisturbed(self2) || isLocked(self2); + } + async function consume(stream, type) { + assert3(!stream[kConsume]); + return new Promise((resolve, reject) => { + if (isUnusable(stream)) { + const rState = stream._readableState; + if (rState.destroyed && rState.closeEmitted === false) { + stream.on("error", (err) => { + reject(err); + }).on("close", () => { + reject(new TypeError("unusable")); + }); + } else { + reject(rState.errored ?? new TypeError("unusable")); + } } else { - this.node.add(key, value, 0); + queueMicrotask(() => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; + stream.on("error", function(err) { + consumeFinish(this[kConsume], err); + }).on("close", function() { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); + consumeStart(stream[kConsume]); + }); } + }); + } + function consumeStart(consume2) { + if (consume2.body === null) { + return; } - /** - * @param {Uint8Array} key - */ - lookup(key) { - return this.node?.search(key)?.value ?? null; + const { _readableState: state } = consume2.stream; + if (state.bufferIndex) { + const start = state.bufferIndex; + const end = state.buffer.length; + for (let n = start; n < end; n++) { + consumePush(consume2, state.buffer[n]); + } + } else { + for (const chunk of state.buffer) { + consumePush(consume2, chunk); + } + } + if (state.endEmitted) { + consumeEnd(this[kConsume]); + } else { + consume2.stream.on("end", function() { + consumeEnd(this[kConsume]); + }); + } + consume2.stream.resume(); + while (consume2.stream.read() != null) { } - }; - var tree = new TernarySearchTree(); - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; - tree.insert(Buffer.from(key), key); } - module2.exports = { - TernarySearchTree, - tree - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/util.js -var require_util = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/util.js"(exports, module2) { - "use strict"; - var assert3 = require("node:assert"); - var { kDestroyed, kBodyUsed } = require_symbols(); - var { IncomingMessage } = require("node:http"); - var stream = require("node:stream"); - var net = require("node:net"); - var { InvalidArgumentError } = require_errors(); - var { Blob: Blob2 } = require("node:buffer"); - var nodeUtil = require("node:util"); - var { stringify } = require("node:querystring"); - var { headerNameLowerCasedRecord } = require_constants2(); - var { tree } = require_tree(); - var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); - function nop() { + function chunksDecode(chunks, length) { + if (chunks.length === 0 || length === 0) { + return ""; + } + const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length); + const bufferLength = buffer.length; + const start = bufferLength > 2 && buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191 ? 3 : 0; + return buffer.utf8Slice(start, bufferLength); } - function isStream(obj) { - return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; + function consumeEnd(consume2) { + const { type, body, resolve, stream, length } = consume2; + try { + if (type === "text") { + resolve(chunksDecode(body, length)); + } else if (type === "json") { + resolve(JSON.parse(chunksDecode(body, length))); + } else if (type === "arrayBuffer") { + const dst = new Uint8Array(length); + let pos = 0; + for (const buf of body) { + dst.set(buf, pos); + pos += buf.byteLength; + } + resolve(dst.buffer); + } else if (type === "blob") { + resolve(new Blob(body, { type: stream[kContentType] })); + } + consumeFinish(consume2); + } catch (err) { + stream.destroy(err); + } } - function isBlobLike(object) { - return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); + function consumePush(consume2, chunk) { + consume2.length += chunk.length; + consume2.body.push(chunk); } - function buildURL(url, queryParams) { - if (url.includes("?") || url.includes("#")) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".'); + function consumeFinish(consume2, err) { + if (consume2.body === null) { + return; } - const stringified = stringify(queryParams); - if (stringified) { - url += "?" + stringified; + if (err) { + consume2.reject(err); + } else { + consume2.resolve(); } - return url; + consume2.type = null; + consume2.stream = null; + consume2.resolve = null; + consume2.reject = null; + consume2.length = 0; + consume2.body = null; } - function parseURL(url) { - if (typeof url === "string") { - url = new URL(url); - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + module2.exports = { Readable: BodyReadable, chunksDecode }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/util.js +var require_util2 = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/util.js"(exports, module2) { + var assert3 = require("node:assert"); + var { + ResponseStatusCodeError + } = require_errors(); + var { chunksDecode } = require_readable(); + var CHUNK_LIMIT = 128 * 1024; + async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) { + assert3(body); + let chunks = []; + let length = 0; + for await (const chunk of body) { + chunks.push(chunk); + length += chunk.length; + if (length > CHUNK_LIMIT) { + chunks = null; + break; } - return url; } - if (!url || typeof url !== "object") { - throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); - } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`; + if (statusCode === 204 || !contentType || !chunks) { + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers))); + return; } - if (!(url instanceof URL)) { - if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { - throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); - } - if (url.path != null && typeof url.path !== "string") { - throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); - } - if (url.pathname != null && typeof url.pathname !== "string") { - throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); - } - if (url.hostname != null && typeof url.hostname !== "string") { - throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); - } - if (url.origin != null && typeof url.origin !== "string") { - throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); - } - const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; - let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; - let path10 = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; - if (origin.endsWith("/")) { - origin = origin.substring(0, origin.length - 1); - } - if (path10 && !path10.startsWith("/")) { - path10 = `/${path10}`; + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + let payload; + try { + if (isContentTypeApplicationJson(contentType)) { + payload = JSON.parse(chunksDecode(chunks, length)); + } else if (isContentTypeText(contentType)) { + payload = chunksDecode(chunks, length); } - url = new URL(origin + path10); - } - return url; - } - function parseOrigin(url) { - url = parseURL(url); - if (url.pathname !== "/" || url.search || url.hash) { - throw new InvalidArgumentError("invalid url"); + } catch { + } finally { + Error.stackTraceLimit = stackTraceLimit; } - return url; + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload))); } - function getHostname(host) { - if (host[0] === "[") { - const idx2 = host.indexOf("]"); - assert3(idx2 !== -1); - return host.substring(1, idx2); + var isContentTypeApplicationJson = (contentType) => { + return contentType.length > 15 && contentType[11] === "/" && contentType[0] === "a" && contentType[1] === "p" && contentType[2] === "p" && contentType[3] === "l" && contentType[4] === "i" && contentType[5] === "c" && contentType[6] === "a" && contentType[7] === "t" && contentType[8] === "i" && contentType[9] === "o" && contentType[10] === "n" && contentType[12] === "j" && contentType[13] === "s" && contentType[14] === "o" && contentType[15] === "n"; + }; + var isContentTypeText = (contentType) => { + return contentType.length > 4 && contentType[4] === "/" && contentType[0] === "t" && contentType[1] === "e" && contentType[2] === "x" && contentType[3] === "t"; + }; + module2.exports = { + getResolveErrorBodyCallback, + isContentTypeApplicationJson, + isContentTypeText + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/abort-signal.js +var require_abort_signal = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/abort-signal.js"(exports, module2) { + var { addAbortListener } = require_util(); + var { RequestAbortedError } = require_errors(); + var kListener = Symbol("kListener"); + var kSignal = Symbol("kSignal"); + function abort(self2) { + if (self2.abort) { + self2.abort(self2[kSignal]?.reason); + } else { + self2.reason = self2[kSignal]?.reason ?? new RequestAbortedError(); } - const idx = host.indexOf(":"); - if (idx === -1) - return host; - return host.substring(0, idx); + removeSignal(self2); } - function getServerName(host) { - if (!host) { - return null; - } - assert3.strictEqual(typeof host, "string"); - const servername = getHostname(host); - if (net.isIP(servername)) { - return ""; + function addSignal(self2, signal) { + self2.reason = null; + self2[kSignal] = null; + self2[kListener] = null; + if (!signal) { + return; } - return servername; - } - function deepClone(obj) { - return JSON.parse(JSON.stringify(obj)); - } - function isAsyncIterable(obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); - } - function isIterable(obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); - } - function bodyLength(body) { - if (body == null) { - return 0; - } else if (isStream(body)) { - const state = body._readableState; - return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null; - } else if (isBuffer(body)) { - return body.byteLength; + if (signal.aborted) { + abort(self2); + return; } - return null; - } - function isDestroyed(stream2) { - return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); - } - function isReadableAborted(stream2) { - const state = stream2?._readableState; - return isDestroyed(stream2) && state && !state.endEmitted; + self2[kSignal] = signal; + self2[kListener] = () => { + abort(self2); + }; + addAbortListener(self2[kSignal], self2[kListener]); } - function destroy(stream2, err) { - if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { + function removeSignal(self2) { + if (!self2[kSignal]) { return; } - if (typeof stream2.destroy === "function") { - if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { - stream2.socket = null; + if ("removeEventListener" in self2[kSignal]) { + self2[kSignal].removeEventListener("abort", self2[kListener]); + } else { + self2[kSignal].removeListener("abort", self2[kListener]); + } + self2[kSignal] = null; + self2[kListener] = null; + } + module2.exports = { + addSignal, + removeSignal + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-request.js +var require_api_request = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-request.js"(exports, module2) { + "use strict"; + var assert3 = require("node:assert"); + var { Readable: Readable2 } = require_readable(); + var { InvalidArgumentError } = require_errors(); + var util = require_util(); + var { getResolveErrorBodyCallback } = require_util2(); + var { AsyncResource } = require("node:async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var RequestHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { + throw new InvalidArgumentError("invalid highWaterMark"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_REQUEST"); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on("error", util.nop), err); + } + throw err; } - stream2.destroy(err); - } else if (err) { - process.nextTick((stream3, err2) => { - stream3.emit("error", err2); - }, stream2, err); + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.res = null; + this.abort = null; + this.body = body; + this.trailers = {}; + this.context = null; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError; + this.highWaterMark = highWaterMark; + if (util.isStream(body)) { + body.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); } - if (stream2.destroyed !== true) { - stream2[kDestroyed] = true; + onConnect(abort, context) { + if (this.reason) { + abort(this.reason); + return; + } + assert3(this.callback); + this.abort = abort; + this.context = context; } - } - var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; - function parseKeepAliveTimeout(val) { - const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); - return m ? parseInt(m[1], 10) * 1e3 : null; - } - function headerNameToString(value) { - return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase(); - } - function bufferToLowerCasedHeaderName(value) { - return tree.lookup(value) ?? value.toString("latin1").toLowerCase(); - } - function parseHeaders(headers, obj) { - if (!Array.isArray(headers)) - return headers; - if (obj === void 0) - obj = {}; - for (let i = 0; i < headers.length; i += 2) { - const key = headerNameToString(headers[i]); - let val = obj[key]; - if (val) { - if (typeof val === "string") { - val = [val]; - obj[key] = val; + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this; + const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); } - val.push(headers[i + 1].toString("utf8")); - } else { - const headersValue = headers[i + 1]; - if (typeof headersValue === "string") { - obj[key] = headersValue; + return; + } + const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders["content-type"]; + const contentLength = parsedHeaders["content-length"]; + const body = new Readable2({ resume, abort, contentType, contentLength, highWaterMark }); + this.callback = null; + this.res = body; + if (callback !== null) { + if (this.throwOnError && statusCode >= 400) { + this.runInAsyncScope( + getResolveErrorBodyCallback, + null, + { callback, body, contentType, statusCode, statusMessage, headers } + ); } else { - obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8"); + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + trailers: this.trailers, + opaque, + body, + context + }); } } } - if ("content-length" in obj && "content-disposition" in obj) { - obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); + onData(chunk) { + const { res } = this; + return res.push(chunk); } - return obj; - } - function parseRawHeaders(headers) { - const ret = []; - let hasContentLength = false; - let contentDispositionIdx = -1; - for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0].toString(); - const val = headers[n + 1].toString("utf8"); - if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { - ret.push(key, val); - hasContentLength = true; - } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { - contentDispositionIdx = ret.push(key, val) - 1; - } else { - ret.push(key, val); + onComplete(trailers) { + const { res } = this; + removeSignal(this); + util.parseHeaders(trailers, this.trailers); + res.push(null); + } + onError(err) { + const { res, callback, body, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (res) { + this.res = null; + queueMicrotask(() => { + util.destroy(res, err); + }); + } + if (body) { + this.body = null; + util.destroy(body, err); } } - if (hasContentLength && contentDispositionIdx !== -1) { - ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); + }; + function request(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + request.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new RequestHandler(opts, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); } - return ret; } - function isBuffer(buffer) { - return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); - } - function validateHandler(handler, method, upgrade) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); + module2.exports = request; + module2.exports.RequestHandler = RequestHandler; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-stream.js +var require_api_stream = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-stream.js"(exports, module2) { + "use strict"; + var assert3 = require("node:assert"); + var { finished, PassThrough } = require("node:stream"); + var { InvalidArgumentError, InvalidReturnValueError } = require_errors(); + var util = require_util(); + var { getResolveErrorBodyCallback } = require_util2(); + var { AsyncResource } = require("node:async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var StreamHandler = class extends AsyncResource { + constructor(opts, factory, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("invalid factory"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_STREAM"); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on("error", util.nop), err); + } + throw err; + } + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.factory = factory; + this.callback = callback; + this.res = null; + this.abort = null; + this.context = null; + this.trailers = null; + this.body = body; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError || false; + if (util.isStream(body)) { + body.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); } - if (typeof handler.onConnect !== "function") { - throw new InvalidArgumentError("invalid onConnect method"); + onConnect(abort, context) { + if (this.reason) { + abort(this.reason); + return; + } + assert3(this.callback); + this.abort = abort; + this.context = context; } - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { factory, opaque, context, callback, responseHeaders } = this; + const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); + } + return; + } + this.factory = null; + let res; + if (this.throwOnError && statusCode >= 400) { + const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders["content-type"]; + res = new PassThrough(); + this.callback = null; + this.runInAsyncScope( + getResolveErrorBodyCallback, + null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ); + } else { + if (factory === null) { + return; + } + res = this.runInAsyncScope(factory, null, { + statusCode, + headers, + opaque, + context + }); + if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { + throw new InvalidReturnValueError("expected Writable"); + } + finished(res, { readable: false }, (err) => { + const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this; + this.res = null; + if (err || !res2.readable) { + util.destroy(res2, err); + } + this.callback = null; + this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers }); + if (err) { + abort(); + } + }); + } + res.on("drain", resume); + this.res = res; + const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState?.needDrain; + return needDrain !== true; } - if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) { - throw new InvalidArgumentError("invalid onBodySent method"); + onData(chunk) { + const { res } = this; + return res ? res.write(chunk) : true; } - if (upgrade || method === "CONNECT") { - if (typeof handler.onUpgrade !== "function") { - throw new InvalidArgumentError("invalid onUpgrade method"); + onComplete(trailers) { + const { res } = this; + removeSignal(this); + if (!res) { + return; } - } else { - if (typeof handler.onHeaders !== "function") { - throw new InvalidArgumentError("invalid onHeaders method"); + this.trailers = util.parseHeaders(trailers); + res.end(); + } + onError(err) { + const { res, callback, opaque, body } = this; + removeSignal(this); + this.factory = null; + if (res) { + this.res = null; + util.destroy(res, err); + } else if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); } - if (typeof handler.onData !== "function") { - throw new InvalidArgumentError("invalid onData method"); + if (body) { + this.body = null; + util.destroy(body, err); } - if (typeof handler.onComplete !== "function") { - throw new InvalidArgumentError("invalid onComplete method"); + } + }; + function stream(opts, factory, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new StreamHandler(opts, factory, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); } } - function isDisturbed(body) { - return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])); - } - function isErrored(body) { - return !!(body && stream.isErrored(body)); - } - function isReadable(body) { - return !!(body && stream.isReadable(body)); - } - function getSocketInfo(socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead - }; - } - function ReadableStreamFrom(iterable) { - let iterator; - return new ReadableStream( - { - async start() { - iterator = iterable[Symbol.asyncIterator](); + module2.exports = stream; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-pipeline.js +var require_api_pipeline = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-pipeline.js"(exports, module2) { + "use strict"; + var { + Readable: Readable2, + Duplex, + PassThrough + } = require("node:stream"); + var { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = require_errors(); + var util = require_util(); + var { AsyncResource } = require("node:async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var assert3 = require("node:assert"); + var kResume = Symbol("resume"); + var PipelineRequest = class extends Readable2 { + constructor() { + super({ autoDestroy: true }); + this[kResume] = null; + } + _read() { + const { [kResume]: resume } = this; + if (resume) { + this[kResume] = null; + resume(); + } + } + _destroy(err, callback) { + this._read(); + callback(err); + } + }; + var PipelineResponse = class extends Readable2 { + constructor(resume) { + super({ autoDestroy: true }); + this[kResume] = resume; + } + _read() { + this[kResume](); + } + _destroy(err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + callback(err); + } + }; + var PipelineHandler = class extends AsyncResource { + constructor(opts, handler) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof handler !== "function") { + throw new InvalidArgumentError("invalid handler"); + } + const { signal, method, opaque, onInfo, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_PIPELINE"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.handler = handler; + this.abort = null; + this.context = null; + this.onInfo = onInfo || null; + this.req = new PipelineRequest().on("error", util.nop); + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body } = this; + if (body?.resume) { + body.resume(); + } }, - async pull(controller) { - const { done, value } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - controller.byobRequest?.respond(0); - }); + write: (chunk, encoding, callback) => { + const { req } = this; + if (req.push(chunk, encoding) || req._readableState.destroyed) { + callback(); } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - if (buf.byteLength) { - controller.enqueue(new Uint8Array(buf)); - } + req[kResume] = callback; } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); }, - type: "bytes" + destroy: (err, callback) => { + const { body, req, res, ret, abort } = this; + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError(); + } + if (abort && err) { + abort(); + } + util.destroy(body, err); + util.destroy(req, err); + util.destroy(res, err); + removeSignal(this); + callback(err); + } + }).on("prefinish", () => { + const { req } = this; + req.push(null); + }); + this.res = null; + addSignal(this, signal); + } + onConnect(abort, context) { + const { ret, res } = this; + if (this.reason) { + abort(this.reason); + return; } - ); - } - function isFormDataLike(object) { - return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; - } - function addAbortListener(signal, listener) { - if ("addEventListener" in signal) { - signal.addEventListener("abort", listener, { once: true }); - return () => signal.removeEventListener("abort", listener); + assert3(!res, "pipeline cannot be retried"); + assert3(!ret.destroyed); + this.abort = abort; + this.context = context; } - signal.addListener("abort", listener); - return () => signal.removeListener("abort", listener); - } - var hasToWellFormed = !!String.prototype.toWellFormed; - function toUSVString(val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed(); - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val); + onHeaders(statusCode, rawHeaders, resume) { + const { opaque, handler, context } = this; + if (statusCode < 200) { + if (this.onInfo) { + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.onInfo({ statusCode, headers }); + } + return; + } + this.res = new PipelineResponse(resume); + let body; + try { + this.handler = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + body = this.runInAsyncScope(handler, null, { + statusCode, + headers, + opaque, + body: this.res, + context + }); + } catch (err) { + this.res.on("error", util.nop); + throw err; + } + if (!body || typeof body.on !== "function") { + throw new InvalidReturnValueError("expected Readable"); + } + body.on("data", (chunk) => { + const { ret, body: body2 } = this; + if (!ret.push(chunk) && body2.pause) { + body2.pause(); + } + }).on("error", (err) => { + const { ret } = this; + util.destroy(ret, err); + }).on("end", () => { + const { ret } = this; + ret.push(null); + }).on("close", () => { + const { ret } = this; + if (!ret._readableState.ended) { + util.destroy(ret, new RequestAbortedError()); + } + }); + this.body = body; } - return `${val}`; - } - function isTokenCharCode(c) { - switch (c) { - case 34: - case 40: - case 41: - case 44: - case 47: - case 58: - case 59: - case 60: - case 61: - case 62: - case 63: - case 64: - case 91: - case 92: - case 93: - case 123: - case 125: - return false; - default: - return c >= 33 && c <= 126; + onData(chunk) { + const { res } = this; + return res.push(chunk); + } + onComplete(trailers) { + const { res } = this; + res.push(null); + } + onError(err) { + const { ret } = this; + this.handler = null; + util.destroy(ret, err); + } + }; + function pipeline(opts, handler) { + try { + const pipelineHandler = new PipelineHandler(opts, handler); + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); + return pipelineHandler.ret; + } catch (err) { + return new PassThrough().destroy(err); } } - function isValidHTTPToken(characters) { - if (characters.length === 0) { - return false; + module2.exports = pipeline; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-upgrade.js +var require_api_upgrade = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-upgrade.js"(exports, module2) { + "use strict"; + var { InvalidArgumentError, SocketError } = require_errors(); + var { AsyncResource } = require("node:async_hooks"); + var util = require_util(); + var { addSignal, removeSignal } = require_abort_signal(); + var assert3 = require("node:assert"); + var UpgradeHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + super("UNDICI_UPGRADE"); + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.abort = null; + this.context = null; + addSignal(this, signal); } - for (let i = 0; i < characters.length; ++i) { - if (!isTokenCharCode(characters.charCodeAt(i))) { - return false; + onConnect(abort, context) { + if (this.reason) { + abort(this.reason); + return; + } + assert3(this.callback); + this.abort = abort; + this.context = null; + } + onHeaders() { + throw new SocketError("bad upgrade", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this; + assert3.strictEqual(statusCode, 101); + removeSignal(this); + this.callback = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.runInAsyncScope(callback, null, null, { + headers, + socket, + opaque, + context + }); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); } } - return true; + }; + function upgrade(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const upgradeHandler = new UpgradeHandler(opts, callback); + this.dispatch({ + ...opts, + method: opts.method || "GET", + upgrade: opts.protocol || "Websocket" + }, upgradeHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } } - function parseRangeHeader(range) { - if (range == null || range === "") - return { start: 0, end: null, size: null }; - const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; - return m ? { - start: parseInt(m[1]), - end: m[2] ? parseInt(m[2]) : null, - size: m[3] ? parseInt(m[3]) : null - } : null; - } - var kEnumerableProperty = /* @__PURE__ */ Object.create(null); - kEnumerableProperty.enumerable = true; - module2.exports = { - kEnumerableProperty, - nop, - isDisturbed, - isErrored, - isReadable, - toUSVString, - isReadableAborted, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - isAsyncIterable, - isDestroyed, - headerNameToString, - bufferToLowerCasedHeaderName, - parseRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - validateHandler, - getSocketInfo, - isFormDataLike, - buildURL, - addAbortListener, - isValidHTTPToken, - isTokenCharCode, - parseRangeHeader, - nodeMajor, - nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13, - safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"] - }; + module2.exports = upgrade; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/diagnostics.js -var require_diagnostics = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/diagnostics.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-connect.js +var require_api_connect = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/api-connect.js"(exports, module2) { "use strict"; - var diagnosticsChannel = require("node:diagnostics_channel"); - var util = require("node:util"); - var undiciDebugLog = util.debuglog("undici"); - var fetchDebuglog = util.debuglog("fetch"); - var websocketDebuglog = util.debuglog("websocket"); - var isClientSet = false; - var channels = { - // Client - beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"), - connected: diagnosticsChannel.channel("undici:client:connected"), - connectError: diagnosticsChannel.channel("undici:client:connectError"), - sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"), - // Request - create: diagnosticsChannel.channel("undici:request:create"), - bodySent: diagnosticsChannel.channel("undici:request:bodySent"), - headers: diagnosticsChannel.channel("undici:request:headers"), - trailers: diagnosticsChannel.channel("undici:request:trailers"), - error: diagnosticsChannel.channel("undici:request:error"), - // WebSocket - open: diagnosticsChannel.channel("undici:websocket:open"), - close: diagnosticsChannel.channel("undici:websocket:close"), - socketError: diagnosticsChannel.channel("undici:websocket:socket_error"), - ping: diagnosticsChannel.channel("undici:websocket:ping"), - pong: diagnosticsChannel.channel("undici:websocket:pong") - }; - if (undiciDebugLog.enabled || fetchDebuglog.enabled) { - const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; - diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host } - } = evt; - debuglog( - "connecting to %s using %s%s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version2 - ); - }); - diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host } - } = evt; - debuglog( - "connected to %s using %s%s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version2 - ); - }); - diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host }, - error - } = evt; - debuglog( - "connection to %s using %s%s errored - %s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version2, - error.message - ); - }); - diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { - const { - request: { method, path: path10, origin } - } = evt; - debuglog("sending request to %s %s/%s", method, origin, path10); - }); - diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => { - const { - request: { method, path: path10, origin }, - response: { statusCode } - } = evt; - debuglog( - "received response to %s %s/%s - HTTP %d", - method, - origin, - path10, - statusCode - ); - }); - diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => { - const { - request: { method, path: path10, origin } - } = evt; - debuglog("trailers received from %s %s/%s", method, origin, path10); - }); - diagnosticsChannel.channel("undici:request:error").subscribe((evt) => { - const { - request: { method, path: path10, origin }, - error - } = evt; - debuglog( - "request to %s %s/%s errored - %s", - method, - origin, - path10, - error.message - ); - }); - isClientSet = true; - } - if (websocketDebuglog.enabled) { - if (!isClientSet) { - const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; - diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host } - } = evt; - debuglog( - "connecting to %s%s using %s%s", - host, - port ? `:${port}` : "", - protocol, - version2 - ); - }); - diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host } - } = evt; - debuglog( - "connected to %s%s using %s%s", - host, - port ? `:${port}` : "", - protocol, - version2 - ); - }); - diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host }, - error - } = evt; - debuglog( - "connection to %s%s using %s%s errored - %s", - host, - port ? `:${port}` : "", - protocol, - version2, - error.message - ); + var assert3 = require("node:assert"); + var { AsyncResource } = require("node:async_hooks"); + var { InvalidArgumentError, SocketError } = require_errors(); + var util = require_util(); + var { addSignal, removeSignal } = require_abort_signal(); + var ConnectHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + super("UNDICI_CONNECT"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.callback = callback; + this.abort = null; + addSignal(this, signal); + } + onConnect(abort, context) { + if (this.reason) { + abort(this.reason); + return; + } + assert3(this.callback); + this.abort = abort; + this.context = context; + } + onHeaders() { + throw new SocketError("bad connect", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this; + removeSignal(this); + this.callback = null; + let headers = rawHeaders; + if (headers != null) { + headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + } + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + socket, + opaque, + context }); - diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { - const { - request: { method, path: path10, origin } - } = evt; - debuglog("sending request to %s %s/%s", method, origin, path10); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + }; + function connect(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + connect.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); }); } - diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => { - const { - address: { address, port } - } = evt; - websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : ""); - }); - diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => { - const { websocket, code, reason } = evt; - websocketDebuglog( - "closed connection to %s - %s %s", - websocket.url, - code, - reason - ); - }); - diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => { - websocketDebuglog("connection errored - %s", err.message); - }); - diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => { - websocketDebuglog("ping received"); - }); - diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => { - websocketDebuglog("pong received"); - }); + try { + const connectHandler = new ConnectHandler(opts, callback); + this.dispatch({ ...opts, method: "CONNECT" }, connectHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } } - module2.exports = { - channels - }; + module2.exports = connect; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/timers.js -var require_timers = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/timers.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/index.js +var require_api = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/api/index.js"(exports, module2) { "use strict"; - var fastNow = Date.now(); - var fastNowTimeout; - var fastTimers = []; - function onTimeout() { - fastNow = Date.now(); - let len = fastTimers.length; - let idx = 0; - while (idx < len) { - const timer = fastTimers[idx]; - if (timer.state === 0) { - timer.state = fastNow + timer.delay; - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1; - timer.callback(timer.opaque); - } - if (timer.state === -1) { - timer.state = -2; - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop(); - } else { - fastTimers.pop(); - } - len -= 1; - } else { - idx += 1; - } - } - if (fastTimers.length > 0) { - refreshTimeout(); - } - } - function refreshTimeout() { - if (fastNowTimeout?.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTimeout, 1e3); - if (fastNowTimeout.unref) { - fastNowTimeout.unref(); - } - } - } - var Timeout = class { - constructor(callback, delay, opaque) { - this.callback = callback; - this.delay = delay; - this.opaque = opaque; - this.state = -2; - this.refresh(); - } - refresh() { - if (this.state === -2) { - fastTimers.push(this); - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } - } - this.state = 0; - } - clear() { - this.state = -1; - } - }; - module2.exports = { - setTimeout(callback, delay, opaque) { - return delay < 1e3 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); - }, - clearTimeout(timeout) { - if (timeout instanceof Timeout) { - timeout.clear(); - } else { - clearTimeout(timeout); - } - } - }; + module2.exports.request = require_api_request(); + module2.exports.stream = require_api_stream(); + module2.exports.pipeline = require_api_pipeline(); + module2.exports.upgrade = require_api_upgrade(); + module2.exports.connect = require_api_connect(); } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/streamsearch/sbmh.js -var require_sbmh = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/streamsearch/sbmh.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/dispatcher.js +var require_dispatcher = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/dispatcher.js"(exports, module2) { "use strict"; - var EventEmitter = require("node:events").EventEmitter; - var inherits = require("node:util").inherits; - function SBMH(needle) { - if (typeof needle === "string") { - needle = Buffer.from(needle); - } - if (!Buffer.isBuffer(needle)) { - throw new TypeError("The needle has to be a String or a Buffer."); - } - const needleLength = needle.length; - if (needleLength === 0) { - throw new Error("The needle cannot be an empty String/Buffer."); - } - if (needleLength > 256) { - throw new Error("The needle cannot have a length bigger than 256."); - } - this.maxMatches = Infinity; - this.matches = 0; - this._occ = new Array(256).fill(needleLength); - this._lookbehind_size = 0; - this._needle = needle; - this._bufpos = 0; - this._lookbehind = Buffer.alloc(needleLength); - for (var i = 0; i < needleLength - 1; ++i) { - this._occ[needle[i]] = needleLength - 1 - i; - } - } - inherits(SBMH, EventEmitter); - SBMH.prototype.reset = function() { - this._lookbehind_size = 0; - this.matches = 0; - this._bufpos = 0; - }; - SBMH.prototype.push = function(chunk, pos) { - if (!Buffer.isBuffer(chunk)) { - chunk = Buffer.from(chunk, "binary"); - } - const chlen = chunk.length; - this._bufpos = pos || 0; - let r; - while (r !== chlen && this.matches < this.maxMatches) { - r = this._sbmh_feed(chunk); + var EventEmitter = require("node:events"); + var Dispatcher = class extends EventEmitter { + dispatch() { + throw new Error("not implemented"); } - return r; - }; - SBMH.prototype._sbmh_feed = function(data) { - const len = data.length; - const needle = this._needle; - const needleLength = needle.length; - const lastNeedleChar = needle[needleLength - 1]; - let pos = -this._lookbehind_size; - let ch; - if (pos < 0) { - while (pos < 0 && pos <= len - needleLength) { - ch = this._sbmh_lookup_char(data, pos + needleLength - 1); - if (ch === lastNeedleChar && this._sbmh_memcmp(data, pos, needleLength - 1)) { - this._lookbehind_size = 0; - ++this.matches; - this.emit("info", true); - return this._bufpos = pos + needleLength; - } - pos += this._occ[ch]; - } - if (pos < 0) { - while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { - ++pos; - } - } - if (pos >= 0) { - this.emit("info", false, this._lookbehind, 0, this._lookbehind_size); - this._lookbehind_size = 0; - } else { - const bytesToCutOff = this._lookbehind_size + pos; - if (bytesToCutOff > 0) { - this.emit("info", false, this._lookbehind, 0, bytesToCutOff); - } - this._lookbehind.copy( - this._lookbehind, - 0, - bytesToCutOff, - this._lookbehind_size - bytesToCutOff - ); - this._lookbehind_size -= bytesToCutOff; - data.copy(this._lookbehind, this._lookbehind_size); - this._lookbehind_size += len; - this._bufpos = len; - return len; - } - } - pos += (pos >= 0) * this._bufpos; - if (data.indexOf(needle, pos) !== -1) { - pos = data.indexOf(needle, pos); - ++this.matches; - if (pos > 0) { - this.emit("info", true, data, this._bufpos, pos); - } else { - this.emit("info", true); + close() { + throw new Error("not implemented"); + } + destroy() { + throw new Error("not implemented"); + } + compose(...args) { + const interceptors = Array.isArray(args[0]) ? args[0] : args; + let dispatch = this.dispatch.bind(this); + for (const interceptor of interceptors) { + if (interceptor == null) { + continue; + } + if (typeof interceptor !== "function") { + throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`); + } + dispatch = interceptor(dispatch); + if (dispatch == null || typeof dispatch !== "function" || dispatch.length !== 2) { + throw new TypeError("invalid interceptor"); + } } - return this._bufpos = pos + needleLength; - } else { - pos = len - needleLength; + return new ComposedDispatcher(this, dispatch); } - while (pos < len && (data[pos] !== needle[0] || Buffer.compare( - data.subarray(pos, pos + len - pos), - needle.subarray(0, len - pos) - ) !== 0)) { - ++pos; + }; + var ComposedDispatcher = class extends Dispatcher { + #dispatcher = null; + #dispatch = null; + constructor(dispatcher, dispatch) { + super(); + this.#dispatcher = dispatcher; + this.#dispatch = dispatch; } - if (pos < len) { - data.copy(this._lookbehind, 0, pos, pos + (len - pos)); - this._lookbehind_size = len - pos; + dispatch(...args) { + this.#dispatch(...args); } - if (pos > 0) { - this.emit("info", false, data, this._bufpos, pos < len ? pos : len); + close(...args) { + return this.#dispatcher.close(...args); } - this._bufpos = len; - return len; - }; - SBMH.prototype._sbmh_lookup_char = function(data, pos) { - return pos < 0 ? this._lookbehind[this._lookbehind_size + pos] : data[pos]; - }; - SBMH.prototype._sbmh_memcmp = function(data, pos, len) { - for (var i = 0; i < len; ++i) { - if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { - return false; - } + destroy(...args) { + return this.#dispatcher.destroy(...args); } - return true; }; - module2.exports = SBMH; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js -var require_PartStream = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js"(exports, module2) { - "use strict"; - var inherits = require("node:util").inherits; - var ReadableStream2 = require("node:stream").Readable; - function PartStream(opts) { - ReadableStream2.call(this, opts); - } - inherits(PartStream, ReadableStream2); - PartStream.prototype._read = function(n) { - }; - module2.exports = PartStream; + module2.exports = Dispatcher; } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/getLimit.js -var require_getLimit = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/getLimit.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js +var require_dispatcher_base = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports, module2) { "use strict"; - module2.exports = function getLimit(limits, name, defaultLimit) { - if (!limits || limits[name] === void 0 || limits[name] === null) { - return defaultLimit; + var Dispatcher = require_dispatcher(); + var { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = require_errors(); + var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); + var kDestroyed = Symbol("destroyed"); + var kClosed = Symbol("closed"); + var kOnDestroyed = Symbol("onDestroyed"); + var kOnClosed = Symbol("onClosed"); + var kInterceptedDispatch = Symbol("Intercepted Dispatch"); + var DispatcherBase = class extends Dispatcher { + constructor() { + super(); + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; } - if (typeof limits[name] !== "number" || isNaN(limits[name])) { - throw new TypeError("Limit " + name + " is not a valid number"); + get destroyed() { + return this[kDestroyed]; } - return limits[name]; - }; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js -var require_HeaderParser = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js"(exports, module2) { - "use strict"; - var EventEmitter = require("node:events").EventEmitter; - var inherits = require("node:util").inherits; - var getLimit = require_getLimit(); - var StreamSearch = require_sbmh(); - var B_DCRLF = Buffer.from("\r\n\r\n"); - var RE_CRLF = /\r\n/g; - var RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; - function HeaderParser(cfg) { - EventEmitter.call(this); - cfg = cfg || {}; - const self2 = this; - this.nread = 0; - this.maxed = false; - this.npairs = 0; - this.maxHeaderPairs = getLimit(cfg, "maxHeaderPairs", 2e3); - this.maxHeaderSize = getLimit(cfg, "maxHeaderSize", 80 * 1024); - this.buffer = ""; - this.header = {}; - this.finished = false; - this.ss = new StreamSearch(B_DCRLF); - this.ss.on("info", function(isMatch, data, start, end) { - if (data && !self2.maxed) { - if (self2.nread + end - start >= self2.maxHeaderSize) { - end = self2.maxHeaderSize - self2.nread + start; - self2.nread = self2.maxHeaderSize; - self2.maxed = true; - } else { - self2.nread += end - start; - } - self2.buffer += data.toString("binary", start, end); - } - if (isMatch) { - self2._finish(); - } - }); - } - inherits(HeaderParser, EventEmitter); - HeaderParser.prototype.push = function(data) { - const r = this.ss.push(data); - if (this.finished) { - return r; - } - }; - HeaderParser.prototype.reset = function() { - this.finished = false; - this.buffer = ""; - this.header = {}; - this.ss.reset(); - }; - HeaderParser.prototype._finish = function() { - if (this.buffer) { - this._parseHeader(); - } - this.ss.matches = this.ss.maxMatches; - const header = this.header; - this.header = {}; - this.buffer = ""; - this.finished = true; - this.nread = this.npairs = 0; - this.maxed = false; - this.emit("header", header); - }; - HeaderParser.prototype._parseHeader = function() { - if (this.npairs === this.maxHeaderPairs) { - return; + get closed() { + return this[kClosed]; } - const lines = this.buffer.split(RE_CRLF); - const len = lines.length; - let m, h; - for (var i = 0; i < len; ++i) { - if (lines[i].length === 0) { - continue; - } - if (lines[i][0] === " " || lines[i][0] === " ") { - if (h) { - this.header[h][this.header[h].length - 1] += lines[i]; - continue; + get interceptors() { + return this[kInterceptors]; + } + set interceptors(newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== "function") { + throw new InvalidArgumentError("interceptor must be an function"); + } } } - const posColon = lines[i].indexOf(":"); - if (posColon === -1 || posColon === 0) { - return; - } - m = RE_HDR.exec(lines[i]); - h = m[1].toLowerCase(); - this.header[h] = this.header[h] || []; - this.header[h].push(m[2] || ""); - if (++this.npairs === this.maxHeaderPairs) { - break; - } + this[kInterceptors] = newInterceptors; } - }; - module2.exports = HeaderParser; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js -var require_Dicer = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js"(exports, module2) { - "use strict"; - var WritableStream = require("node:stream").Writable; - var inherits = require("node:util").inherits; - var StreamSearch = require_sbmh(); - var PartStream = require_PartStream(); - var HeaderParser = require_HeaderParser(); - var DASH = 45; - var B_ONEDASH = Buffer.from("-"); - var B_CRLF = Buffer.from("\r\n"); - var EMPTY_FN = function() { - }; - function Dicer(cfg) { - if (!(this instanceof Dicer)) { - return new Dicer(cfg); - } - WritableStream.call(this, cfg); - if (!cfg || !cfg.headerFirst && typeof cfg.boundary !== "string") { - throw new TypeError("Boundary required"); - } - if (typeof cfg.boundary === "string") { - this.setBoundary(cfg.boundary); - } else { - this._bparser = void 0; - } - this._headerFirst = cfg.headerFirst; - this._dashes = 0; - this._parts = 0; - this._finished = false; - this._realFinish = false; - this._isPreamble = true; - this._justMatched = false; - this._firstWrite = true; - this._inHeader = true; - this._part = void 0; - this._cb = void 0; - this._ignoreData = false; - this._partOpts = { highWaterMark: cfg.partHwm }; - this._pause = false; - const self2 = this; - this._hparser = new HeaderParser(cfg); - this._hparser.on("header", function(header) { - self2._inHeader = false; - self2._part.emit("header", header); - }); - } - inherits(Dicer, WritableStream); - Dicer.prototype.emit = function(ev) { - if (ev === "finish" && !this._realFinish) { - if (!this._finished) { - const self2 = this; - process.nextTick(function() { - self2.emit("error", new Error("Unexpected end of multipart data")); - if (self2._part && !self2._ignoreData) { - const type = self2._isPreamble ? "Preamble" : "Part"; - self2._part.emit("error", new Error(type + " terminated early due to unexpected end of multipart data")); - self2._part.push(null); - process.nextTick(function() { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - }); - return; - } - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; + close(callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data); + }); }); } - } else { - WritableStream.prototype.emit.apply(this, arguments); - } - }; - Dicer.prototype._write = function(data, encoding, cb) { - if (!this._hparser && !this._bparser) { - return cb(); - } - if (this._headerFirst && this._isPreamble) { - if (!this._part) { - this._part = new PartStream(this._partOpts); - if (this._events.preamble) { - this.emit("preamble", this._part); - } else { - this._ignore(); - } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - const r = this._hparser.push(data); - if (!this._inHeader && r !== void 0 && r < data.length) { - data = data.slice(r); - } else { - return cb(); + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return; } - } - if (this._firstWrite) { - this._bparser.push(B_CRLF); - this._firstWrite = false; - } - this._bparser.push(data); - if (this._pause) { - this._cb = cb; - } else { - cb(); - } - }; - Dicer.prototype.reset = function() { - this._part = void 0; - this._bparser = void 0; - this._hparser = void 0; - }; - Dicer.prototype.setBoundary = function(boundary) { - const self2 = this; - this._bparser = new StreamSearch("\r\n--" + boundary); - this._bparser.on("info", function(isMatch, data, start, end) { - self2._oninfo(isMatch, data, start, end); - }); - }; - Dicer.prototype._ignore = function() { - if (this._part && !this._ignoreData) { - this._ignoreData = true; - this._part.on("error", EMPTY_FN); - this._part.resume(); - } - }; - Dicer.prototype._oninfo = function(isMatch, data, start, end) { - let buf; - const self2 = this; - let i = 0; - let r; - let shouldWriteMore = true; - if (!this._part && this._justMatched && data) { - while (this._dashes < 2 && start + i < end) { - if (data[start + i] === DASH) { - ++i; - ++this._dashes; + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); } else { - if (this._dashes) { - buf = B_ONEDASH; - } - this._dashes = 0; - break; - } - } - if (this._dashes === 2) { - if (start + i < end && this._events.trailer) { - this.emit("trailer", data.slice(start + i, end)); - } - this.reset(); - this._finished = true; - if (self2._parts === 0) { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; + queueMicrotask(() => callback(null, null)); } - } - if (this._dashes) { return; } - } - if (this._justMatched) { - this._justMatched = false; - } - if (!this._part) { - this._part = new PartStream(this._partOpts); - this._part._read = function(n) { - self2._unpause(); + this[kClosed] = true; + this[kOnClosed].push(callback); + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } }; - if (this._isPreamble && this._events.preamble) { - this.emit("preamble", this._part); - } else if (this._isPreamble !== true && this._events.part) { - this.emit("part", this._part); - } else { - this._ignore(); - } - if (!this._isPreamble) { - this._inHeader = true; - } + this[kClose]().then(() => this.destroy()).then(() => { + queueMicrotask(onClosed); + }); } - if (data && start < end && !this._ignoreData) { - if (this._isPreamble || !this._inHeader) { - if (buf) { - shouldWriteMore = this._part.push(buf); - } - shouldWriteMore = this._part.push(data.slice(start, end)); - if (!shouldWriteMore) { - this._pause = true; - } - } else if (!this._isPreamble && this._inHeader) { - if (buf) { - this._hparser.push(buf); - } - r = this._hparser.push(data.slice(start, end)); - if (!this._inHeader && r !== void 0 && r < end) { - this._oninfo(false, data, start + r, end); - } + destroy(err, callback) { + if (typeof err === "function") { + callback = err; + err = null; } - } - if (isMatch) { - this._hparser.reset(); - if (this._isPreamble) { - this._isPreamble = false; - } else { - if (start !== end) { - ++this._parts; - this._part.on("end", function() { - if (--self2._parts === 0) { - if (self2._finished) { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - } else { - self2._unpause(); - } - } + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.destroy(err, (err2, data) => { + return err2 ? ( + /* istanbul ignore next: should never error */ + reject(err2) + ) : resolve(data); }); - } + }); } - this._part.push(null); - this._part = void 0; - this._ignoreData = false; - this._justMatched = true; - this._dashes = 0; - } - }; - Dicer.prototype._unpause = function() { - if (!this._pause) { - return; - } - this._pause = false; - if (this._cb) { - const cb = this._cb; - this._cb = void 0; - cb(); - } - }; - module2.exports = Dicer; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/decodeText.js -var require_decodeText = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/decodeText.js"(exports, module2) { - "use strict"; - var utf8Decoder = new TextDecoder("utf-8"); - var textDecoders = /* @__PURE__ */ new Map([ - ["utf-8", utf8Decoder], - ["utf8", utf8Decoder] - ]); - function getDecoder(charset) { - let lc; - while (true) { - switch (charset) { - case "utf-8": - case "utf8": - return decoders.utf8; - case "latin1": - case "ascii": - case "us-ascii": - case "iso-8859-1": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "windows-1252": - case "iso_8859-1:1987": - case "cp1252": - case "x-cp1252": - return decoders.latin1; - case "utf16le": - case "utf-16le": - case "ucs2": - case "ucs-2": - return decoders.utf16le; - case "base64": - return decoders.base64; - default: - if (lc === void 0) { - lc = true; - charset = charset.toLowerCase(); - continue; - } - return decoders.other.bind(charset); - } - } - } - var decoders = { - utf8: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.utf8Slice(0, data.length); - }, - latin1: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - return data; - } - return data.latin1Slice(0, data.length); - }, - utf16le: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; } - return data.ucs2Slice(0, data.length); - }, - base64: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; + if (!err) { + err = new ClientDestroyedError(); } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); + } + [kInterceptedDispatch](opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler); } - return data.base64Slice(0, data.length); - }, - other: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler); + } + dispatch(opts, handler) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); } - if (textDecoders.has(exports.toString())) { - try { - return textDecoders.get(exports).decode(data); - } catch (e) { + try { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object."); + } + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError(); + } + if (this[kClosed]) { + throw new ClientClosedError(); + } + return this[kInterceptedDispatch](opts, handler); + } catch (err) { + if (typeof handler.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); } + handler.onError(err); + return false; } - return typeof data === "string" ? data : data.toString(); } }; - function decodeText(text, sourceEncoding, destEncoding) { - if (text) { - return getDecoder(destEncoding)(text, sourceEncoding); - } - return text; - } - module2.exports = decodeText; + module2.exports = DispatcherBase; } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/parseParams.js -var require_parseParams = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/parseParams.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js +var require_fixed_queue = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js"(exports, module2) { "use strict"; - var decodeText = require_decodeText(); - var RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; - var EncodedLookup = { - "%00": "\0", - "%01": "", - "%02": "", - "%03": "", - "%04": "", - "%05": "", - "%06": "", - "%07": "\x07", - "%08": "\b", - "%09": " ", - "%0a": "\n", - "%0A": "\n", - "%0b": "\v", - "%0B": "\v", - "%0c": "\f", - "%0C": "\f", - "%0d": "\r", - "%0D": "\r", - "%0e": "", - "%0E": "", - "%0f": "", - "%0F": "", - "%10": "", - "%11": "", - "%12": "", - "%13": "", - "%14": "", - "%15": "", - "%16": "", - "%17": "", - "%18": "", - "%19": "", - "%1a": "", - "%1A": "", - "%1b": "\x1B", - "%1B": "\x1B", - "%1c": "", - "%1C": "", - "%1d": "", - "%1D": "", - "%1e": "", - "%1E": "", - "%1f": "", - "%1F": "", - "%20": " ", - "%21": "!", - "%22": '"', - "%23": "#", - "%24": "$", - "%25": "%", - "%26": "&", - "%27": "'", - "%28": "(", - "%29": ")", - "%2a": "*", - "%2A": "*", - "%2b": "+", - "%2B": "+", - "%2c": ",", - "%2C": ",", - "%2d": "-", - "%2D": "-", - "%2e": ".", - "%2E": ".", - "%2f": "/", - "%2F": "/", - "%30": "0", - "%31": "1", - "%32": "2", - "%33": "3", - "%34": "4", - "%35": "5", - "%36": "6", - "%37": "7", - "%38": "8", - "%39": "9", - "%3a": ":", - "%3A": ":", - "%3b": ";", - "%3B": ";", - "%3c": "<", - "%3C": "<", - "%3d": "=", - "%3D": "=", - "%3e": ">", - "%3E": ">", - "%3f": "?", - "%3F": "?", - "%40": "@", - "%41": "A", - "%42": "B", - "%43": "C", - "%44": "D", - "%45": "E", - "%46": "F", - "%47": "G", - "%48": "H", - "%49": "I", - "%4a": "J", - "%4A": "J", - "%4b": "K", - "%4B": "K", - "%4c": "L", - "%4C": "L", - "%4d": "M", - "%4D": "M", - "%4e": "N", - "%4E": "N", - "%4f": "O", - "%4F": "O", - "%50": "P", - "%51": "Q", - "%52": "R", - "%53": "S", - "%54": "T", - "%55": "U", - "%56": "V", - "%57": "W", - "%58": "X", - "%59": "Y", - "%5a": "Z", - "%5A": "Z", - "%5b": "[", - "%5B": "[", - "%5c": "\\", - "%5C": "\\", - "%5d": "]", - "%5D": "]", - "%5e": "^", - "%5E": "^", - "%5f": "_", - "%5F": "_", - "%60": "`", - "%61": "a", - "%62": "b", - "%63": "c", - "%64": "d", - "%65": "e", - "%66": "f", - "%67": "g", - "%68": "h", - "%69": "i", - "%6a": "j", - "%6A": "j", - "%6b": "k", - "%6B": "k", - "%6c": "l", - "%6C": "l", - "%6d": "m", - "%6D": "m", - "%6e": "n", - "%6E": "n", - "%6f": "o", - "%6F": "o", - "%70": "p", - "%71": "q", - "%72": "r", - "%73": "s", - "%74": "t", - "%75": "u", - "%76": "v", - "%77": "w", - "%78": "x", - "%79": "y", - "%7a": "z", - "%7A": "z", - "%7b": "{", - "%7B": "{", - "%7c": "|", - "%7C": "|", - "%7d": "}", - "%7D": "}", - "%7e": "~", - "%7E": "~", - "%7f": "\x7F", - "%7F": "\x7F", - "%80": "\x80", - "%81": "\x81", - "%82": "\x82", - "%83": "\x83", - "%84": "\x84", - "%85": "\x85", - "%86": "\x86", - "%87": "\x87", - "%88": "\x88", - "%89": "\x89", - "%8a": "\x8A", - "%8A": "\x8A", - "%8b": "\x8B", - "%8B": "\x8B", - "%8c": "\x8C", - "%8C": "\x8C", - "%8d": "\x8D", - "%8D": "\x8D", - "%8e": "\x8E", - "%8E": "\x8E", - "%8f": "\x8F", - "%8F": "\x8F", - "%90": "\x90", - "%91": "\x91", - "%92": "\x92", - "%93": "\x93", - "%94": "\x94", - "%95": "\x95", - "%96": "\x96", - "%97": "\x97", - "%98": "\x98", - "%99": "\x99", - "%9a": "\x9A", - "%9A": "\x9A", - "%9b": "\x9B", - "%9B": "\x9B", - "%9c": "\x9C", - "%9C": "\x9C", - "%9d": "\x9D", - "%9D": "\x9D", - "%9e": "\x9E", - "%9E": "\x9E", - "%9f": "\x9F", - "%9F": "\x9F", - "%a0": "\xA0", - "%A0": "\xA0", - "%a1": "\xA1", - "%A1": "\xA1", - "%a2": "\xA2", - "%A2": "\xA2", - "%a3": "\xA3", - "%A3": "\xA3", - "%a4": "\xA4", - "%A4": "\xA4", - "%a5": "\xA5", - "%A5": "\xA5", - "%a6": "\xA6", - "%A6": "\xA6", - "%a7": "\xA7", - "%A7": "\xA7", - "%a8": "\xA8", - "%A8": "\xA8", - "%a9": "\xA9", - "%A9": "\xA9", - "%aa": "\xAA", - "%Aa": "\xAA", - "%aA": "\xAA", - "%AA": "\xAA", - "%ab": "\xAB", - "%Ab": "\xAB", - "%aB": "\xAB", - "%AB": "\xAB", - "%ac": "\xAC", - "%Ac": "\xAC", - "%aC": "\xAC", - "%AC": "\xAC", - "%ad": "\xAD", - "%Ad": "\xAD", - "%aD": "\xAD", - "%AD": "\xAD", - "%ae": "\xAE", - "%Ae": "\xAE", - "%aE": "\xAE", - "%AE": "\xAE", - "%af": "\xAF", - "%Af": "\xAF", - "%aF": "\xAF", - "%AF": "\xAF", - "%b0": "\xB0", - "%B0": "\xB0", - "%b1": "\xB1", - "%B1": "\xB1", - "%b2": "\xB2", - "%B2": "\xB2", - "%b3": "\xB3", - "%B3": "\xB3", - "%b4": "\xB4", - "%B4": "\xB4", - "%b5": "\xB5", - "%B5": "\xB5", - "%b6": "\xB6", - "%B6": "\xB6", - "%b7": "\xB7", - "%B7": "\xB7", - "%b8": "\xB8", - "%B8": "\xB8", - "%b9": "\xB9", - "%B9": "\xB9", - "%ba": "\xBA", - "%Ba": "\xBA", - "%bA": "\xBA", - "%BA": "\xBA", - "%bb": "\xBB", - "%Bb": "\xBB", - "%bB": "\xBB", - "%BB": "\xBB", - "%bc": "\xBC", - "%Bc": "\xBC", - "%bC": "\xBC", - "%BC": "\xBC", - "%bd": "\xBD", - "%Bd": "\xBD", - "%bD": "\xBD", - "%BD": "\xBD", - "%be": "\xBE", - "%Be": "\xBE", - "%bE": "\xBE", - "%BE": "\xBE", - "%bf": "\xBF", - "%Bf": "\xBF", - "%bF": "\xBF", - "%BF": "\xBF", - "%c0": "\xC0", - "%C0": "\xC0", - "%c1": "\xC1", - "%C1": "\xC1", - "%c2": "\xC2", - "%C2": "\xC2", - "%c3": "\xC3", - "%C3": "\xC3", - "%c4": "\xC4", - "%C4": "\xC4", - "%c5": "\xC5", - "%C5": "\xC5", - "%c6": "\xC6", - "%C6": "\xC6", - "%c7": "\xC7", - "%C7": "\xC7", - "%c8": "\xC8", - "%C8": "\xC8", - "%c9": "\xC9", - "%C9": "\xC9", - "%ca": "\xCA", - "%Ca": "\xCA", - "%cA": "\xCA", - "%CA": "\xCA", - "%cb": "\xCB", - "%Cb": "\xCB", - "%cB": "\xCB", - "%CB": "\xCB", - "%cc": "\xCC", - "%Cc": "\xCC", - "%cC": "\xCC", - "%CC": "\xCC", - "%cd": "\xCD", - "%Cd": "\xCD", - "%cD": "\xCD", - "%CD": "\xCD", - "%ce": "\xCE", - "%Ce": "\xCE", - "%cE": "\xCE", - "%CE": "\xCE", - "%cf": "\xCF", - "%Cf": "\xCF", - "%cF": "\xCF", - "%CF": "\xCF", - "%d0": "\xD0", - "%D0": "\xD0", - "%d1": "\xD1", - "%D1": "\xD1", - "%d2": "\xD2", - "%D2": "\xD2", - "%d3": "\xD3", - "%D3": "\xD3", - "%d4": "\xD4", - "%D4": "\xD4", - "%d5": "\xD5", - "%D5": "\xD5", - "%d6": "\xD6", - "%D6": "\xD6", - "%d7": "\xD7", - "%D7": "\xD7", - "%d8": "\xD8", - "%D8": "\xD8", - "%d9": "\xD9", - "%D9": "\xD9", - "%da": "\xDA", - "%Da": "\xDA", - "%dA": "\xDA", - "%DA": "\xDA", - "%db": "\xDB", - "%Db": "\xDB", - "%dB": "\xDB", - "%DB": "\xDB", - "%dc": "\xDC", - "%Dc": "\xDC", - "%dC": "\xDC", - "%DC": "\xDC", - "%dd": "\xDD", - "%Dd": "\xDD", - "%dD": "\xDD", - "%DD": "\xDD", - "%de": "\xDE", - "%De": "\xDE", - "%dE": "\xDE", - "%DE": "\xDE", - "%df": "\xDF", - "%Df": "\xDF", - "%dF": "\xDF", - "%DF": "\xDF", - "%e0": "\xE0", - "%E0": "\xE0", - "%e1": "\xE1", - "%E1": "\xE1", - "%e2": "\xE2", - "%E2": "\xE2", - "%e3": "\xE3", - "%E3": "\xE3", - "%e4": "\xE4", - "%E4": "\xE4", - "%e5": "\xE5", - "%E5": "\xE5", - "%e6": "\xE6", - "%E6": "\xE6", - "%e7": "\xE7", - "%E7": "\xE7", - "%e8": "\xE8", - "%E8": "\xE8", - "%e9": "\xE9", - "%E9": "\xE9", - "%ea": "\xEA", - "%Ea": "\xEA", - "%eA": "\xEA", - "%EA": "\xEA", - "%eb": "\xEB", - "%Eb": "\xEB", - "%eB": "\xEB", - "%EB": "\xEB", - "%ec": "\xEC", - "%Ec": "\xEC", - "%eC": "\xEC", - "%EC": "\xEC", - "%ed": "\xED", - "%Ed": "\xED", - "%eD": "\xED", - "%ED": "\xED", - "%ee": "\xEE", - "%Ee": "\xEE", - "%eE": "\xEE", - "%EE": "\xEE", - "%ef": "\xEF", - "%Ef": "\xEF", - "%eF": "\xEF", - "%EF": "\xEF", - "%f0": "\xF0", - "%F0": "\xF0", - "%f1": "\xF1", - "%F1": "\xF1", - "%f2": "\xF2", - "%F2": "\xF2", - "%f3": "\xF3", - "%F3": "\xF3", - "%f4": "\xF4", - "%F4": "\xF4", - "%f5": "\xF5", - "%F5": "\xF5", - "%f6": "\xF6", - "%F6": "\xF6", - "%f7": "\xF7", - "%F7": "\xF7", - "%f8": "\xF8", - "%F8": "\xF8", - "%f9": "\xF9", - "%F9": "\xF9", - "%fa": "\xFA", - "%Fa": "\xFA", - "%fA": "\xFA", - "%FA": "\xFA", - "%fb": "\xFB", - "%Fb": "\xFB", - "%fB": "\xFB", - "%FB": "\xFB", - "%fc": "\xFC", - "%Fc": "\xFC", - "%fC": "\xFC", - "%FC": "\xFC", - "%fd": "\xFD", - "%Fd": "\xFD", - "%fD": "\xFD", - "%FD": "\xFD", - "%fe": "\xFE", - "%Fe": "\xFE", - "%fE": "\xFE", - "%FE": "\xFE", - "%ff": "\xFF", - "%Ff": "\xFF", - "%fF": "\xFF", - "%FF": "\xFF" - }; - function encodedReplacer(match) { - return EncodedLookup[match]; - } - var STATE_KEY = 0; - var STATE_VALUE = 1; - var STATE_CHARSET = 2; - var STATE_LANG = 3; - function parseParams(str) { - const res = []; - let state = STATE_KEY; - let charset = ""; - let inquote = false; - let escaping = false; - let p = 0; - let tmp = ""; - const len = str.length; - for (var i = 0; i < len; ++i) { - const char = str[i]; - if (char === "\\" && inquote) { - if (escaping) { - escaping = false; - } else { - escaping = true; - continue; - } - } else if (char === '"') { - if (!escaping) { - if (inquote) { - inquote = false; - state = STATE_KEY; - } else { - inquote = true; - } - continue; - } else { - escaping = false; - } - } else { - if (escaping && inquote) { - tmp += "\\"; - } - escaping = false; - if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { - if (state === STATE_CHARSET) { - state = STATE_LANG; - charset = tmp.substring(1); - } else { - state = STATE_VALUE; - } - tmp = ""; - continue; - } else if (state === STATE_KEY && (char === "*" || char === "=") && res.length) { - state = char === "*" ? STATE_CHARSET : STATE_VALUE; - res[p] = [tmp, void 0]; - tmp = ""; - continue; - } else if (!inquote && char === ";") { - state = STATE_KEY; - if (charset) { - if (tmp.length) { - tmp = decodeText( - tmp.replace(RE_ENCODED, encodedReplacer), - "binary", - charset - ); - } - charset = ""; - } else if (tmp.length) { - tmp = decodeText(tmp, "binary", "utf8"); - } - if (res[p] === void 0) { - res[p] = tmp; - } else { - res[p][1] = tmp; - } - tmp = ""; - ++p; - continue; - } else if (!inquote && (char === " " || char === " ")) { - continue; - } - } - tmp += char; + var kSize = 2048; + var kMask = kSize - 1; + var FixedCircularBuffer = class { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; } - if (charset && tmp.length) { - tmp = decodeText( - tmp.replace(RE_ENCODED, encodedReplacer), - "binary", - charset - ); - } else if (tmp) { - tmp = decodeText(tmp, "binary", "utf8"); + isEmpty() { + return this.top === this.bottom; } - if (res[p] === void 0) { - if (tmp) { - res[p] = tmp; - } - } else { - res[p][1] = tmp; + isFull() { + return (this.top + 1 & kMask) === this.bottom; } - return res; - } - module2.exports = parseParams; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/basename.js -var require_basename = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/basename.js"(exports, module2) { - "use strict"; - module2.exports = function basename(path10) { - if (typeof path10 !== "string") { - return ""; + push(data) { + this.list[this.top] = data; + this.top = this.top + 1 & kMask; } - for (var i = path10.length - 1; i >= 0; --i) { - switch (path10.charCodeAt(i)) { - case 47: - case 92: - path10 = path10.slice(i + 1); - return path10 === ".." || path10 === "." ? "" : path10; - } + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === void 0) + return null; + this.list[this.bottom] = void 0; + this.bottom = this.bottom + 1 & kMask; + return nextItem; } - return path10 === ".." || path10 === "." ? "" : path10; }; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/multipart.js -var require_multipart = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/multipart.js"(exports, module2) { - "use strict"; - var { Readable: Readable2 } = require("node:stream"); - var { inherits } = require("node:util"); - var Dicer = require_Dicer(); - var parseParams = require_parseParams(); - var decodeText = require_decodeText(); - var basename = require_basename(); - var getLimit = require_getLimit(); - var RE_BOUNDARY = /^boundary$/i; - var RE_FIELD = /^form-data$/i; - var RE_CHARSET = /^charset$/i; - var RE_FILENAME = /^filename$/i; - var RE_NAME = /^name$/i; - Multipart.detect = /^multipart\/form-data/i; - function Multipart(boy, cfg) { - let i; - let len; - const self2 = this; - let boundary; - const limits = cfg.limits; - const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => contentType === "application/octet-stream" || fileName !== void 0); - const parsedConType = cfg.parsedConType || []; - const defCharset = cfg.defCharset || "utf8"; - const preservePath = cfg.preservePath; - const fileOpts = { highWaterMark: cfg.fileHwm }; - for (i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_BOUNDARY.test(parsedConType[i][0])) { - boundary = parsedConType[i][1]; - break; - } + module2.exports = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); } - function checkFinished() { - if (nends === 0 && finished && !boy._done) { - finished = false; - self2.end(); - } + isEmpty() { + return this.head.isEmpty(); } - if (typeof boundary !== "string") { - throw new Error("Multipart: Boundary not found"); + push(data) { + if (this.head.isFull()) { + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); } - const fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); - const fileSizeLimit = getLimit(limits, "fileSize", Infinity); - const filesLimit = getLimit(limits, "files", Infinity); - const fieldsLimit = getLimit(limits, "fields", Infinity); - const partsLimit = getLimit(limits, "parts", Infinity); - const headerPairsLimit = getLimit(limits, "headerPairs", 2e3); - const headerSizeLimit = getLimit(limits, "headerSize", 80 * 1024); - let nfiles = 0; - let nfields = 0; - let nends = 0; - let curFile; - let curField; - let finished = false; - this._needDrain = false; - this._pause = false; - this._cb = void 0; - this._nparts = 0; - this._boy = boy; - const parserCfg = { - boundary, - maxHeaderPairs: headerPairsLimit, - maxHeaderSize: headerSizeLimit, - partHwm: fileOpts.highWaterMark, - highWaterMark: cfg.highWaterMark - }; - this.parser = new Dicer(parserCfg); - this.parser.on("drain", function() { - self2._needDrain = false; - if (self2._cb && !self2._pause) { - const cb = self2._cb; - self2._cb = void 0; - cb(); + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + this.tail = tail.next; } - }).on("part", function onPart(part) { - if (++self2._nparts > partsLimit) { - self2.parser.removeListener("part", onPart); - self2.parser.on("part", skipPart); - boy.hitPartsLimit = true; - boy.emit("partsLimit"); - return skipPart(part); - } - if (curField) { - const field = curField; - field.emit("end"); - field.removeAllListeners("end"); - } - part.on("header", function(header) { - let contype; - let fieldname; - let parsed; - let charset; - let encoding; - let filename; - let nsize = 0; - if (header["content-type"]) { - parsed = parseParams(header["content-type"][0]); - if (parsed[0]) { - contype = parsed[0].toLowerCase(); - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_CHARSET.test(parsed[i][0])) { - charset = parsed[i][1].toLowerCase(); - break; - } - } - } - } - if (contype === void 0) { - contype = "text/plain"; - } - if (charset === void 0) { - charset = defCharset; - } - if (header["content-disposition"]) { - parsed = parseParams(header["content-disposition"][0]); - if (!RE_FIELD.test(parsed[0])) { - return skipPart(part); - } - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_NAME.test(parsed[i][0])) { - fieldname = parsed[i][1]; - } else if (RE_FILENAME.test(parsed[i][0])) { - filename = parsed[i][1]; - if (!preservePath) { - filename = basename(filename); - } - } - } - } else { - return skipPart(part); - } - if (header["content-transfer-encoding"]) { - encoding = header["content-transfer-encoding"][0].toLowerCase(); - } else { - encoding = "7bit"; - } - let onData, onEnd; - if (isPartAFile(fieldname, contype, filename)) { - if (nfiles === filesLimit) { - if (!boy.hitFilesLimit) { - boy.hitFilesLimit = true; - boy.emit("filesLimit"); - } - return skipPart(part); - } - ++nfiles; - if (!boy._events.file) { - self2.parser._ignore(); - return; - } - ++nends; - const file = new FileStream(fileOpts); - curFile = file; - file.on("end", function() { - --nends; - self2._pause = false; - checkFinished(); - if (self2._cb && !self2._needDrain) { - const cb = self2._cb; - self2._cb = void 0; - cb(); - } - }); - file._read = function(n) { - if (!self2._pause) { - return; - } - self2._pause = false; - if (self2._cb && !self2._needDrain) { - const cb = self2._cb; - self2._cb = void 0; - cb(); - } - }; - boy.emit("file", fieldname, file, filename, encoding, contype); - onData = function(data) { - if ((nsize += data.length) > fileSizeLimit) { - const extralen = fileSizeLimit - nsize + data.length; - if (extralen > 0) { - file.push(data.slice(0, extralen)); - } - file.truncated = true; - file.bytesRead = fileSizeLimit; - part.removeAllListeners("data"); - file.emit("limit"); - return; - } else if (!file.push(data)) { - self2._pause = true; - } - file.bytesRead = nsize; - }; - onEnd = function() { - curFile = void 0; - file.push(null); - }; - } else { - if (nfields === fieldsLimit) { - if (!boy.hitFieldsLimit) { - boy.hitFieldsLimit = true; - boy.emit("fieldsLimit"); - } - return skipPart(part); - } - ++nfields; - ++nends; - let buffer = ""; - let truncated = false; - curField = part; - onData = function(data) { - if ((nsize += data.length) > fieldSizeLimit) { - const extralen = fieldSizeLimit - (nsize - data.length); - buffer += data.toString("binary", 0, extralen); - truncated = true; - part.removeAllListeners("data"); - } else { - buffer += data.toString("binary"); - } - }; - onEnd = function() { - curField = void 0; - if (buffer.length) { - buffer = decodeText(buffer, "binary", charset); - } - boy.emit("field", fieldname, buffer, false, truncated, encoding, contype); - --nends; - checkFinished(); - }; - } - part._readableState.sync = false; - part.on("data", onData); - part.on("end", onEnd); - }).on("error", function(err) { - if (curFile) { - curFile.emit("error", err); - } - }); - }).on("error", function(err) { - boy.emit("error", err); - }).on("finish", function() { - finished = true; - checkFinished(); - }); - } - Multipart.prototype.write = function(chunk, cb) { - const r = this.parser.write(chunk); - if (r && !this._pause) { - cb(); - } else { - this._needDrain = !r; - this._cb = cb; - } - }; - Multipart.prototype.end = function() { - const self2 = this; - if (self2.parser.writable) { - self2.parser.end(); - } else if (!self2._boy._done) { - process.nextTick(function() { - self2._boy._done = true; - self2._boy.emit("finish"); - }); + return next; } }; - function skipPart(part) { - part.resume(); - } - function FileStream(opts) { - Readable2.call(this, opts); - this.bytesRead = 0; - this.truncated = false; - } - inherits(FileStream, Readable2); - FileStream.prototype._read = function(n) { - }; - module2.exports = Multipart; } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/Decoder.js -var require_Decoder = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/Decoder.js"(exports, module2) { - "use strict"; - var RE_PLUS = /\+/g; - var HEX = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]; - function Decoder() { - this.buffer = void 0; - } - Decoder.prototype.write = function(str) { - str = str.replace(RE_PLUS, " "); - let res = ""; - let i = 0; - let p = 0; - const len = str.length; - for (; i < len; ++i) { - if (this.buffer !== void 0) { - if (!HEX[str.charCodeAt(i)]) { - res += "%" + this.buffer; - this.buffer = void 0; - --i; - } else { - this.buffer += str[i]; - ++p; - if (this.buffer.length === 2) { - res += String.fromCharCode(parseInt(this.buffer, 16)); - this.buffer = void 0; - } - } - } else if (str[i] === "%") { - if (i > p) { - res += str.substring(p, i); - p = i; - } - this.buffer = ""; - ++p; - } +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool-stats.js +var require_pool_stats = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool-stats.js"(exports, module2) { + var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); + var kPool = Symbol("pool"); + var PoolStats = class { + constructor(pool) { + this[kPool] = pool; + } + get connected() { + return this[kPool][kConnected]; } - if (p < len && this.buffer === void 0) { - res += str.substring(p); + get free() { + return this[kPool][kFree]; + } + get pending() { + return this[kPool][kPending]; + } + get queued() { + return this[kPool][kQueued]; + } + get running() { + return this[kPool][kRunning]; + } + get size() { + return this[kPool][kSize]; } - return res; - }; - Decoder.prototype.reset = function() { - this.buffer = void 0; }; - module2.exports = Decoder; + module2.exports = PoolStats; } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/urlencoded.js -var require_urlencoded = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/urlencoded.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool-base.js +var require_pool_base = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool-base.js"(exports, module2) { "use strict"; - var Decoder = require_Decoder(); - var decodeText = require_decodeText(); - var getLimit = require_getLimit(); - var RE_CHARSET = /^charset$/i; - UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; - function UrlEncoded(boy, cfg) { - const limits = cfg.limits; - const parsedConType = cfg.parsedConType; - this.boy = boy; - this.fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); - this.fieldNameSizeLimit = getLimit(limits, "fieldNameSize", 100); - this.fieldsLimit = getLimit(limits, "fields", Infinity); - let charset; - for (var i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_CHARSET.test(parsedConType[i][0])) { - charset = parsedConType[i][1].toLowerCase(); - break; - } - } - if (charset === void 0) { - charset = cfg.defCharset || "utf8"; - } - this.decoder = new Decoder(); - this.charset = charset; - this._fields = 0; - this._state = "key"; - this._checkingBytes = true; - this._bytesKey = 0; - this._bytesVal = 0; - this._key = ""; - this._val = ""; - this._keyTrunc = false; - this._valTrunc = false; - this._hitLimit = false; - } - UrlEncoded.prototype.write = function(data, cb) { - if (this._fields === this.fieldsLimit) { - if (!this.boy.hitFieldsLimit) { - this.boy.hitFieldsLimit = true; - this.boy.emit("fieldsLimit"); - } - return cb(); - } - let idxeq; - let idxamp; - let i; - let p = 0; - const len = data.length; - while (p < len) { - if (this._state === "key") { - idxeq = idxamp = void 0; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 61) { - idxeq = i; - break; - } else if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { - this._hitLimit = true; + var DispatcherBase = require_dispatcher_base(); + var FixedQueue = require_fixed_queue(); + var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); + var PoolStats = require_pool_stats(); + var kClients = Symbol("clients"); + var kNeedDrain = Symbol("needDrain"); + var kQueue = Symbol("queue"); + var kClosedResolve = Symbol("closed resolve"); + var kOnDrain = Symbol("onDrain"); + var kOnConnect = Symbol("onConnect"); + var kOnDisconnect = Symbol("onDisconnect"); + var kOnConnectionError = Symbol("onConnectionError"); + var kGetDispatcher = Symbol("get dispatcher"); + var kAddClient = Symbol("add client"); + var kRemoveClient = Symbol("remove client"); + var kStats = Symbol("stats"); + var PoolBase = class extends DispatcherBase { + constructor() { + super(); + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; + const pool = this; + this[kOnDrain] = function onDrain(origin, targets) { + const queue = pool[kQueue]; + let needDrain = false; + while (!needDrain) { + const item = queue.shift(); + if (!item) { break; - } else if (this._checkingBytes) { - ++this._bytesKey; - } - } - if (idxeq !== void 0) { - if (idxeq > p) { - this._key += this.decoder.write(data.toString("binary", p, idxeq)); - } - this._state = "val"; - this._hitLimit = false; - this._checkingBytes = true; - this._val = ""; - this._bytesVal = 0; - this._valTrunc = false; - this.decoder.reset(); - p = idxeq + 1; - } else if (idxamp !== void 0) { - ++this._fields; - let key; - const keyTrunc = this._keyTrunc; - if (idxamp > p) { - key = this._key += this.decoder.write(data.toString("binary", p, idxamp)); - } else { - key = this._key; - } - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - if (key.length) { - this.boy.emit( - "field", - decodeText(key, "binary", this.charset), - "", - keyTrunc, - false - ); - } - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._key += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { - this._checkingBytes = false; - this._keyTrunc = true; } - } else { - if (p < len) { - this._key += this.decoder.write(data.toString("binary", p)); - } - p = len; + pool[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); } - } else { - idxamp = void 0; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesVal; - } + this[kNeedDrain] = needDrain; + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false; + pool.emit("drain", origin, [pool, ...targets]); } - if (idxamp !== void 0) { - ++this._fields; - if (idxamp > p) { - this._val += this.decoder.write(data.toString("binary", p, idxamp)); - } - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - decodeText(this._val, "binary", this.charset), - this._keyTrunc, - this._valTrunc - ); - this._state = "key"; - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._val += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if (this._val === "" && this.fieldSizeLimit === 0 || (this._bytesVal = this._val.length) === this.fieldSizeLimit) { - this._checkingBytes = false; - this._valTrunc = true; - } - } else { - if (p < len) { - this._val += this.decoder.write(data.toString("binary", p)); - } - p = len; + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); } + }; + this[kOnConnect] = (origin, targets) => { + pool.emit("connect", origin, [pool, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit("disconnect", origin, [pool, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit("connectionError", origin, [pool, ...targets], err); + }; + this[kStats] = new PoolStats(this); + } + get [kBusy]() { + return this[kNeedDrain]; + } + get [kConnected]() { + return this[kClients].filter((client) => client[kConnected]).length; + } + get [kFree]() { + return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; + } + get [kPending]() { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; } + return ret; } - cb(); - }; - UrlEncoded.prototype.end = function() { - if (this.boy._done) { - return; + get [kRunning]() { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret; } - if (this._state === "key" && this._key.length > 0) { - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - "", - this._keyTrunc, - false - ); - } else if (this._state === "val") { - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - decodeText(this._val, "binary", this.charset), - this._keyTrunc, - this._valTrunc - ); + get [kSize]() { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; + } + return ret; } - this.boy._done = true; - this.boy.emit("finish"); - }; - module2.exports = UrlEncoded; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/main.js -var require_main = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/main.js"(exports, module2) { - "use strict"; - var WritableStream = require("node:stream").Writable; - var { inherits } = require("node:util"); - var Dicer = require_Dicer(); - var MultipartParser = require_multipart(); - var UrlencodedParser = require_urlencoded(); - var parseParams = require_parseParams(); - function Busboy(opts) { - if (!(this instanceof Busboy)) { - return new Busboy(opts); - } - if (typeof opts !== "object") { - throw new TypeError("Busboy expected an options-Object."); - } - if (typeof opts.headers !== "object") { - throw new TypeError("Busboy expected an options-Object with headers-attribute."); - } - if (typeof opts.headers["content-type"] !== "string") { - throw new TypeError("Missing Content-Type-header."); - } - const { - headers, - ...streamOptions - } = opts; - this.opts = { - autoDestroy: false, - ...streamOptions - }; - WritableStream.call(this, this.opts); - this._done = false; - this._parser = this.getParserByHeaders(headers); - this._finished = false; - } - inherits(Busboy, WritableStream); - Busboy.prototype.emit = function(ev) { - if (ev === "finish") { - if (!this._done) { - this._parser?.end(); - return; - } else if (this._finished) { - return; + get stats() { + return this[kStats]; + } + async [kClose]() { + if (this[kQueue].isEmpty()) { + return Promise.all(this[kClients].map((c) => c.close())); + } else { + return new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); } - this._finished = true; } - WritableStream.prototype.emit.apply(this, arguments); - }; - Busboy.prototype.getParserByHeaders = function(headers) { - const parsed = parseParams(headers["content-type"]); - const cfg = { - defCharset: this.opts.defCharset, - fileHwm: this.opts.fileHwm, - headers, - highWaterMark: this.opts.highWaterMark, - isPartAFile: this.opts.isPartAFile, - limits: this.opts.limits, - parsedConType: parsed, - preservePath: this.opts.preservePath - }; - if (MultipartParser.detect.test(parsed[0])) { - return new MultipartParser(this, cfg); + async [kDestroy](err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break; + } + item.handler.onError(err); + } + return Promise.all(this[kClients].map((c) => c.destroy(err))); + } + [kDispatch](opts, handler) { + const dispatcher = this[kGetDispatcher](); + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); + } + return !this[kNeedDrain]; + } + [kAddClient](client) { + client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].push(client); + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]); + } + }); + } + return this; } - if (UrlencodedParser.detect.test(parsed[0])) { - return new UrlencodedParser(this, cfg); + [kRemoveClient](client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + }); + this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); } - throw new Error("Unsupported Content-Type."); }; - Busboy.prototype._write = function(chunk, encoding, cb) { - this._parser.write(chunk, cb); + module2.exports = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher }; - module2.exports = Busboy; - module2.exports.default = Busboy; - module2.exports.Busboy = Busboy; - module2.exports.Dicer = Dicer; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/constants.js -var require_constants3 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/constants.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/diagnostics.js +var require_diagnostics = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/diagnostics.js"(exports, module2) { "use strict"; - var corsSafeListedMethods = ["GET", "HEAD", "POST"]; - var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); - var nullBodyStatus = [101, 204, 205, 304]; - var redirectStatus = [301, 302, 303, 307, 308]; - var redirectStatusSet = new Set(redirectStatus); - var badPorts = [ - "1", - "7", - "9", - "11", - "13", - "15", - "17", - "19", - "20", - "21", - "22", - "23", - "25", - "37", - "42", - "43", - "53", - "69", - "77", - "79", - "87", - "95", - "101", - "102", - "103", - "104", - "109", - "110", - "111", - "113", - "115", - "117", - "119", - "123", - "135", - "137", - "139", - "143", - "161", - "179", - "389", - "427", - "465", - "512", - "513", - "514", - "515", - "526", - "530", - "531", - "532", - "540", - "548", - "554", - "556", - "563", - "587", - "601", - "636", - "989", - "990", - "993", - "995", - "1719", - "1720", - "1723", - "2049", - "3659", - "4045", - "5060", - "5061", - "6000", - "6566", - "6665", - "6666", - "6667", - "6668", - "6669", - "6697", - "10080" - ]; - var badPortsSet = new Set(badPorts); - var referrerPolicy = [ - "", - "no-referrer", - "no-referrer-when-downgrade", - "same-origin", - "origin", - "strict-origin", - "origin-when-cross-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ]; - var referrerPolicySet = new Set(referrerPolicy); - var requestRedirect = ["follow", "manual", "error"]; - var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; - var safeMethodsSet = new Set(safeMethods); - var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; - var requestCredentials = ["omit", "same-origin", "include"]; - var requestCache = [ - "default", - "no-store", - "reload", - "no-cache", - "force-cache", - "only-if-cached" - ]; - var requestBodyHeader = [ - "content-encoding", - "content-language", - "content-location", - "content-type", - // See https://github.com/nodejs/undici/issues/2021 - // 'Content-Length' is a forbidden header name, which is typically - // removed in the Headers implementation. However, undici doesn't - // filter out headers, so we add it here. - "content-length" - ]; - var requestDuplex = [ - "half" - ]; - var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; - var forbiddenMethodsSet = new Set(forbiddenMethods); - var subresource = [ - "audio", - "audioworklet", - "font", - "image", - "manifest", - "paintworklet", - "script", - "style", - "track", - "video", - "xslt", - "" - ]; - var subresourceSet = new Set(subresource); - module2.exports = { - subresource, - forbiddenMethods, - requestBodyHeader, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - redirectStatus, - corsSafeListedMethods, - nullBodyStatus, - safeMethods, - badPorts, - requestDuplex, - subresourceSet, - badPortsSet, - redirectStatusSet, - corsSafeListedMethodsSet, - safeMethodsSet, - forbiddenMethodsSet, - referrerPolicySet + var diagnosticsChannel = require("node:diagnostics_channel"); + var util = require("node:util"); + var undiciDebugLog = util.debuglog("undici"); + var fetchDebuglog = util.debuglog("fetch"); + var websocketDebuglog = util.debuglog("websocket"); + var isClientSet = false; + var channels = { + // Client + beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"), + connected: diagnosticsChannel.channel("undici:client:connected"), + connectError: diagnosticsChannel.channel("undici:client:connectError"), + sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"), + // Request + create: diagnosticsChannel.channel("undici:request:create"), + bodySent: diagnosticsChannel.channel("undici:request:bodySent"), + headers: diagnosticsChannel.channel("undici:request:headers"), + trailers: diagnosticsChannel.channel("undici:request:trailers"), + error: diagnosticsChannel.channel("undici:request:error"), + // WebSocket + open: diagnosticsChannel.channel("undici:websocket:open"), + close: diagnosticsChannel.channel("undici:websocket:close"), + socketError: diagnosticsChannel.channel("undici:websocket:socket_error"), + ping: diagnosticsChannel.channel("undici:websocket:ping"), + pong: diagnosticsChannel.channel("undici:websocket:pong") }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/global.js -var require_global = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/global.js"(exports, module2) { - "use strict"; - var globalOrigin = Symbol.for("undici.globalOrigin.1"); - function getGlobalOrigin() { - return globalThis[globalOrigin]; + if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; + diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host } + } = evt; + debuglog( + "connecting to %s using %s%s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version2 + ); + }); + diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host } + } = evt; + debuglog( + "connected to %s using %s%s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version2 + ); + }); + diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host }, + error + } = evt; + debuglog( + "connection to %s using %s%s errored - %s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version2, + error.message + ); + }); + diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { + const { + request: { method, path: path10, origin } + } = evt; + debuglog("sending request to %s %s/%s", method, origin, path10); + }); + diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => { + const { + request: { method, path: path10, origin }, + response: { statusCode } + } = evt; + debuglog( + "received response to %s %s/%s - HTTP %d", + method, + origin, + path10, + statusCode + ); + }); + diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => { + const { + request: { method, path: path10, origin } + } = evt; + debuglog("trailers received from %s %s/%s", method, origin, path10); + }); + diagnosticsChannel.channel("undici:request:error").subscribe((evt) => { + const { + request: { method, path: path10, origin }, + error + } = evt; + debuglog( + "request to %s %s/%s errored - %s", + method, + origin, + path10, + error.message + ); + }); + isClientSet = true; } - function setGlobalOrigin(newOrigin) { - if (newOrigin === void 0) { - Object.defineProperty(globalThis, globalOrigin, { - value: void 0, - writable: true, - enumerable: false, - configurable: false + if (websocketDebuglog.enabled) { + if (!isClientSet) { + const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; + diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host } + } = evt; + debuglog( + "connecting to %s%s using %s%s", + host, + port ? `:${port}` : "", + protocol, + version2 + ); + }); + diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host } + } = evt; + debuglog( + "connected to %s%s using %s%s", + host, + port ? `:${port}` : "", + protocol, + version2 + ); + }); + diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host }, + error + } = evt; + debuglog( + "connection to %s%s using %s%s errored - %s", + host, + port ? `:${port}` : "", + protocol, + version2, + error.message + ); + }); + diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { + const { + request: { method, path: path10, origin } + } = evt; + debuglog("sending request to %s %s/%s", method, origin, path10); }); - return; - } - const parsedURL = new URL(newOrigin); - if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); } - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, - enumerable: false, - configurable: false + diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => { + const { + address: { address, port } + } = evt; + websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : ""); + }); + diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => { + const { websocket, code, reason } = evt; + websocketDebuglog( + "closed connection to %s - %s %s", + websocket.url, + code, + reason + ); + }); + diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => { + websocketDebuglog("connection errored - %s", err.message); + }); + diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => { + websocketDebuglog("ping received"); + }); + diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => { + websocketDebuglog("pong received"); }); } module2.exports = { - getGlobalOrigin, - setGlobalOrigin + channels }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/dataURL.js -var require_dataURL = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/dataURL.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/request.js +var require_request = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/request.js"(exports, module2) { + "use strict"; + var { + InvalidArgumentError, + NotSupportedError + } = require_errors(); var assert3 = require("node:assert"); - var encoder = new TextEncoder(); - var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; - var HTTP_WHITESPACE_REGEX = /[\u000A|\u000D|\u0009|\u0020]/; - var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; - var HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; - function dataURLProcessor(dataURL) { - assert3(dataURL.protocol === "data:"); - let input = URLSerializer(dataURL, true); - input = input.slice(5); - const position = { position: 0 }; - let mimeType = collectASequenceOfCodePointsFast( - ",", - input, - position - ); - const mimeTypeLength = mimeType.length; - mimeType = removeASCIIWhitespace(mimeType, true, true); - if (position.position >= input.length) { - return "failure"; + var { + isValidHTTPToken, + isValidHeaderChar, + isStream, + destroy, + isBuffer, + isFormDataLike, + isIterable, + isBlobLike, + buildURL, + validateHandler, + getServerName + } = require_util(); + var { channels } = require_diagnostics(); + var { headerNameLowerCasedRecord } = require_constants2(); + var invalidPathRegex = /[^\u0021-\u00ff]/; + var kHandler = Symbol("handler"); + var Request = class { + constructor(origin, { + path: path10, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue, + servername + }, handler) { + if (typeof path10 !== "string") { + throw new InvalidArgumentError("path must be a string"); + } else if (path10[0] !== "/" && !(path10.startsWith("http://") || path10.startsWith("https://")) && method !== "CONNECT") { + throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); + } else if (invalidPathRegex.exec(path10) !== null) { + throw new InvalidArgumentError("invalid request path"); + } + if (typeof method !== "string") { + throw new InvalidArgumentError("method must be a string"); + } else if (!isValidHTTPToken(method)) { + throw new InvalidArgumentError("invalid request method"); + } + if (upgrade && typeof upgrade !== "string") { + throw new InvalidArgumentError("upgrade must be a string"); + } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("invalid headersTimeout"); + } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("invalid bodyTimeout"); + } + if (reset != null && typeof reset !== "boolean") { + throw new InvalidArgumentError("invalid reset"); + } + if (expectContinue != null && typeof expectContinue !== "boolean") { + throw new InvalidArgumentError("invalid expectContinue"); + } + this.headersTimeout = headersTimeout; + this.bodyTimeout = bodyTimeout; + this.throwOnError = throwOnError === true; + this.method = method; + this.abort = null; + if (body == null) { + this.body = null; + } else if (isStream(body)) { + this.body = body; + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy() { + destroy(this); + }; + this.body.on("end", this.endHandler); + } + this.errorHandler = (err) => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on("error", this.errorHandler); + } else if (isBuffer(body)) { + this.body = body.byteLength ? body : null; + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null; + } else if (typeof body === "string") { + this.body = body.length ? Buffer.from(body) : null; + } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { + this.body = body; + } else { + throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); + } + this.completed = false; + this.aborted = false; + this.upgrade = upgrade || null; + this.path = query ? buildURL(path10, query) : path10; + this.origin = origin; + this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; + this.blocking = blocking == null ? false : blocking; + this.reset = reset == null ? null : reset; + this.host = null; + this.contentLength = null; + this.contentType = null; + this.headers = []; + this.expectContinue = expectContinue != null ? expectContinue : false; + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]); + } + } else if (headers && typeof headers === "object") { + if (headers[Symbol.iterator]) { + for (const header of headers) { + if (!Array.isArray(header) || header.length !== 2) { + throw new InvalidArgumentError("headers must be in key-value pair format"); + } + processHeader(this, header[0], header[1]); + } + } else { + const keys = Object.keys(headers); + for (let i = 0; i < keys.length; ++i) { + processHeader(this, keys[i], headers[keys[i]]); + } + } + } else if (headers != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + validateHandler(handler, method, upgrade); + this.servername = servername || getServerName(this.host); + this[kHandler] = handler; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); + } } - position.position++; - const encodedBody = input.slice(mimeTypeLength + 1); - let body = stringPercentDecode(encodedBody); - if (/;(\u0020){0,}base64$/i.test(mimeType)) { - const stringBody = isomorphicDecode(body); - body = forgivingBase64(stringBody); - if (body === "failure") { - return "failure"; + onBodySent(chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk); + } catch (err) { + this.abort(err); + } } - mimeType = mimeType.slice(0, -6); - mimeType = mimeType.replace(/(\u0020)+$/, ""); - mimeType = mimeType.slice(0, -1); } - if (mimeType.startsWith(";")) { - mimeType = "text/plain" + mimeType; + onRequestSent() { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent(); + } catch (err) { + this.abort(err); + } + } } - let mimeTypeRecord = parseMIMEType(mimeType); - if (mimeTypeRecord === "failure") { - mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); + onConnect(abort) { + assert3(!this.aborted); + assert3(!this.completed); + if (this.error) { + abort(this.error); + } else { + this.abort = abort; + return this[kHandler].onConnect(abort); + } } - return { mimeType: mimeTypeRecord, body }; - } - function URLSerializer(url, excludeFragment = false) { - if (!excludeFragment) { - return url.href; + onResponseStarted() { + return this[kHandler].onResponseStarted?.(); } - const href = url.href; - const hashLength = url.hash.length; - const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); - if (!hashLength && href.endsWith("#")) { - return serialized.slice(0, -1); + onHeaders(statusCode, headers, resume, statusText) { + assert3(!this.aborted); + assert3(!this.completed); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + } + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText); + } catch (err) { + this.abort(err); + } } - return serialized; - } - function collectASequenceOfCodePoints(condition, input, position) { - let result = ""; - while (position.position < input.length && condition(input[position.position])) { - result += input[position.position]; - position.position++; + onData(chunk) { + assert3(!this.aborted); + assert3(!this.completed); + try { + return this[kHandler].onData(chunk); + } catch (err) { + this.abort(err); + return false; + } } - return result; - } - function collectASequenceOfCodePointsFast(char, input, position) { - const idx = input.indexOf(char, position.position); - const start = position.position; - if (idx === -1) { - position.position = input.length; - return input.slice(start); - } - position.position = idx; - return input.slice(start, position.position); - } - function stringPercentDecode(input) { - const bytes = encoder.encode(input); - return percentDecode(bytes); - } - function isHexCharByte(byte) { - return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102; - } - function hexByteToNumber(byte) { - return ( - // 0-9 - byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55 - ); - } - function percentDecode(input) { - const length = input.length; - const output = new Uint8Array(length); - let j = 0; - for (let i = 0; i < length; ++i) { - const byte = input[i]; - if (byte !== 37) { - output[j++] = byte; - } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) { - output[j++] = 37; - } else { - output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]); - i += 2; - } - } - return length === j ? output : output.subarray(0, j); - } - function parseMIMEType(input) { - input = removeHTTPWhitespace(input, true, true); - const position = { position: 0 }; - const type = collectASequenceOfCodePointsFast( - "/", - input, - position - ); - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return "failure"; - } - if (position.position > input.length) { - return "failure"; - } - position.position++; - let subtype = collectASequenceOfCodePointsFast( - ";", - input, - position - ); - subtype = removeHTTPWhitespace(subtype, false, true); - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return "failure"; + onUpgrade(statusCode, headers, socket) { + assert3(!this.aborted); + assert3(!this.completed); + return this[kHandler].onUpgrade(statusCode, headers, socket); } - const typeLowercase = type.toLowerCase(); - const subtypeLowercase = subtype.toLowerCase(); - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - /** @type {Map} */ - parameters: /* @__PURE__ */ new Map(), - // https://mimesniff.spec.whatwg.org/#mime-type-essence - essence: `${typeLowercase}/${subtypeLowercase}` - }; - while (position.position < input.length) { - position.position++; - collectASequenceOfCodePoints( - // https://fetch.spec.whatwg.org/#http-whitespace - (char) => HTTP_WHITESPACE_REGEX.test(char), - input, - position - ); - let parameterName = collectASequenceOfCodePoints( - (char) => char !== ";" && char !== "=", - input, - position - ); - parameterName = parameterName.toLowerCase(); - if (position.position < input.length) { - if (input[position.position] === ";") { - continue; - } - position.position++; + onComplete(trailers) { + this.onFinally(); + assert3(!this.aborted); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); } - if (position.position > input.length) { - break; + try { + return this[kHandler].onComplete(trailers); + } catch (err) { + this.onError(err); } - let parameterValue = null; - if (input[position.position] === '"') { - parameterValue = collectAnHTTPQuotedString(input, position, true); - collectASequenceOfCodePointsFast( - ";", - input, - position - ); - } else { - parameterValue = collectASequenceOfCodePointsFast( - ";", - input, - position - ); - parameterValue = removeHTTPWhitespace(parameterValue, false, true); - if (parameterValue.length === 0) { - continue; - } + } + onError(error) { + this.onFinally(); + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); } - if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { - mimeType.parameters.set(parameterName, parameterValue); + if (this.aborted) { + return; } + this.aborted = true; + return this[kHandler].onError(error); } - return mimeType; - } - function forgivingBase64(data) { - data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ""); - let dataLength = data.length; - if (dataLength % 4 === 0) { - if (data.charCodeAt(dataLength - 1) === 61) { - --dataLength; - if (data.charCodeAt(dataLength - 1) === 61) { - --dataLength; - } + onFinally() { + if (this.errorHandler) { + this.body.off("error", this.errorHandler); + this.errorHandler = null; + } + if (this.endHandler) { + this.body.off("end", this.endHandler); + this.endHandler = null; } } - if (dataLength % 4 === 1) { - return "failure"; + addHeader(key, value) { + processHeader(this, key, value); + return this; } - if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { - return "failure"; + }; + function processHeader(request, key, val) { + if (val && (typeof val === "object" && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`); + } else if (val === void 0) { + return; } - const buffer = Buffer.from(data, "base64"); - return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); - } - function collectAnHTTPQuotedString(input, position, extractValue) { - const positionStart = position.position; - let value = ""; - assert3(input[position.position] === '"'); - position.position++; - while (true) { - value += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== "\\", - input, - position - ); - if (position.position >= input.length) { - break; + let headerName = headerNameLowerCasedRecord[key]; + if (headerName === void 0) { + headerName = key.toLowerCase(); + if (headerNameLowerCasedRecord[headerName] === void 0 && !isValidHTTPToken(headerName)) { + throw new InvalidArgumentError("invalid header key"); } - const quoteOrBackslash = input[position.position]; - position.position++; - if (quoteOrBackslash === "\\") { - if (position.position >= input.length) { - value += "\\"; - break; + } + if (Array.isArray(val)) { + const arr = []; + for (let i = 0; i < val.length; i++) { + if (typeof val[i] === "string") { + if (!isValidHeaderChar(val[i])) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + arr.push(val[i]); + } else if (val[i] === null) { + arr.push(""); + } else if (typeof val[i] === "object") { + throw new InvalidArgumentError(`invalid ${key} header`); + } else { + arr.push(`${val[i]}`); } - value += input[position.position]; - position.position++; - } else { - assert3(quoteOrBackslash === '"'); - break; } + val = arr; + } else if (typeof val === "string") { + if (!isValidHeaderChar(val)) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + } else if (val === null) { + val = ""; + } else if (typeof val === "object") { + throw new InvalidArgumentError(`invalid ${key} header`); + } else { + val = `${val}`; } - if (extractValue) { - return value; - } - return input.slice(positionStart, position.position); - } - function serializeAMimeType(mimeType) { - assert3(mimeType !== "failure"); - const { parameters, essence } = mimeType; - let serialization = essence; - for (let [name, value] of parameters.entries()) { - serialization += ";"; - serialization += name; - serialization += "="; - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - value = value.replace(/(\\|")/g, "\\$1"); - value = '"' + value; - value += '"'; + if (request.host === null && headerName === "host") { + if (typeof val !== "string") { + throw new InvalidArgumentError("invalid host header"); } - serialization += value; + request.host = val; + } else if (request.contentLength === null && headerName === "content-length") { + request.contentLength = parseInt(val, 10); + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError("invalid content-length header"); + } + } else if (request.contentType === null && headerName === "content-type") { + request.contentType = val; + request.headers.push(key, val); + } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") { + throw new InvalidArgumentError(`invalid ${headerName} header`); + } else if (headerName === "connection") { + const value = typeof val === "string" ? val.toLowerCase() : null; + if (value !== "close" && value !== "keep-alive") { + throw new InvalidArgumentError("invalid connection header"); + } + if (value === "close") { + request.reset = true; + } + } else if (headerName === "expect") { + throw new NotSupportedError("expect header not supported"); + } else { + request.headers.push(key, val); } - return serialization; - } - function isHTTPWhiteSpace(char) { - return char === 13 || char === 10 || char === 9 || char === 32; - } - function removeHTTPWhitespace(str, leading = true, trailing = true) { - return removeChars(str, leading, trailing, isHTTPWhiteSpace); - } - function isASCIIWhitespace(char) { - return char === 13 || char === 10 || char === 9 || char === 12 || char === 32; - } - function removeASCIIWhitespace(str, leading = true, trailing = true) { - return removeChars(str, leading, trailing, isASCIIWhitespace); } - function removeChars(str, leading, trailing, predicate) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - while (lead < str.length && predicate(str.charCodeAt(lead))) - lead++; - } - if (trailing) { - while (trail > 0 && predicate(str.charCodeAt(trail))) - trail--; - } - return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1); - } - function isomorphicDecode(input) { - const length = input.length; - if ((2 << 15) - 1 > length) { - return String.fromCharCode.apply(null, input); - } - let result = ""; - let i = 0; - let addition = (2 << 15) - 1; - while (i < length) { - if (i + addition > length) { - addition = length - i; - } - result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); - } - return result; - } - function minimizeSupportedMimeType(mimeType) { - switch (mimeType.essence) { - case "application/ecmascript": - case "application/javascript": - case "application/x-ecmascript": - case "application/x-javascript": - case "text/ecmascript": - case "text/javascript": - case "text/javascript1.0": - case "text/javascript1.1": - case "text/javascript1.2": - case "text/javascript1.3": - case "text/javascript1.4": - case "text/javascript1.5": - case "text/jscript": - case "text/livescript": - case "text/x-ecmascript": - case "text/x-javascript": - return "text/javascript"; - case "application/json": - case "text/json": - return "application/json"; - case "image/svg+xml": - return "image/svg+xml"; - case "text/xml": - case "application/xml": - return "application/xml"; - } - if (mimeType.subtype.endsWith("+json")) { - return "application/json"; - } - if (mimeType.subtype.endsWith("+xml")) { - return "application/xml"; - } - return ""; - } - module2.exports = { - dataURLProcessor, - URLSerializer, - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType, - removeChars, - minimizeSupportedMimeType - }; + module2.exports = Request; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/util.js -var require_util2 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/util.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/connect.js +var require_connect = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/core/connect.js"(exports, module2) { "use strict"; - var { Transform } = require("node:stream"); - var zlib = require("node:zlib"); - var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants3(); - var { getGlobalOrigin } = require_global(); - var { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require_dataURL(); - var { performance } = require("node:perf_hooks"); - var { isBlobLike, toUSVString, ReadableStreamFrom, isValidHTTPToken } = require_util(); + var net = require("node:net"); var assert3 = require("node:assert"); - var { isUint8Array } = require("util/types"); - var crypto; - try { - crypto = require("node:crypto"); - } catch { - } - function responseURL(response) { - const urlList = response.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString(); - } - function responseLocationURL(response, requestFragment) { - if (!redirectStatusSet.has(response.status)) { - return null; - } - let location = response.headersList.get("location", true); - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response)); - } - if (location && !location.hash) { - location.hash = requestFragment; - } - return location; - } - function requestCurrentURL(request) { - return request.urlList[request.urlList.length - 1]; - } - function requestBadPort(request) { - const url = requestCurrentURL(request); - if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { - return "blocked"; - } - return "allowed"; - } - function isErrorLike(object) { - return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); - } - function isValidReasonPhrase(statusText) { - for (let i = 0; i < statusText.length; ++i) { - const c = statusText.charCodeAt(i); - if (!(c === 9 || // HTAB - c >= 32 && c <= 126 || // SP / VCHAR - c >= 128 && c <= 255)) { - return false; + var util = require_util(); + var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); + var tls; + var SessionCache; + if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { + SessionCache = class WeakSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); + this._sessionRegistry = new global.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return; + } + const ref = this._sessionCache.get(key); + if (ref !== void 0 && ref.deref() === void 0) { + this._sessionCache.delete(key); + } + }); } - } - return true; - } - function isValidHeaderName(potentialValue) { - return isValidHTTPToken(potentialValue); - } - function isValidHeaderValue(potentialValue) { - if (potentialValue.startsWith(" ") || potentialValue.startsWith(" ") || potentialValue.endsWith(" ") || potentialValue.endsWith(" ")) { - return false; - } - if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { - return false; - } - return true; - } - function setRequestReferrerPolicyOnRedirect(request, actualResponse) { - const { headersList } = actualResponse; - const policyHeader = (headersList.get("referrer-policy", true) ?? "").split(","); - let policy = ""; - if (policyHeader.length > 0) { - for (let i = policyHeader.length; i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.has(token)) { - policy = token; - break; + get(sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null; + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; } + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); } - } - if (policy !== "") { - request.referrerPolicy = policy; - } - } - function crossOriginResourcePolicyCheck() { - return "allowed"; - } - function corsCheck() { - return "success"; - } - function TAOCheck() { - return "success"; - } - function appendFetchMetadata(httpRequest) { - let header = null; - header = httpRequest.mode; - httpRequest.headersList.set("sec-fetch-mode", header, true); - } - function appendRequestOriginHeader(request) { - let serializedOrigin = request.origin; - if (request.responseTainting === "cors" || request.mode === "websocket") { - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin, true); + }; + } else { + SessionCache = class SimpleSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); } - } else if (request.method !== "GET" && request.method !== "HEAD") { - switch (request.referrerPolicy) { - case "no-referrer": - serializedOrigin = null; - break; - case "no-referrer-when-downgrade": - case "strict-origin": - case "strict-origin-when-cross-origin": - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - case "same-origin": - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - default: + get(sessionKey) { + return this._sessionCache.get(sessionKey); } - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin, true); + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + if (this._sessionCache.size >= this._maxCachedSessions) { + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); + } + this._sessionCache.set(sessionKey, session); } - } - } - function coarsenTime(timestamp, crossOriginIsolatedCapability) { - return timestamp; + }; } - function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { - if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { - return { - domainLookupStartTime: defaultStartTime, - domainLookupEndTime: defaultStartTime, - connectionStartTime: defaultStartTime, - connectionEndTime: defaultStartTime, - secureConnectionStartTime: defaultStartTime, - ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol - }; + function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); } - return { - domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability), - domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability), - connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability), - connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability), - secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability), - ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol - }; - } - function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { - return coarsenTime(performance.now(), crossOriginIsolatedCapability); - } - function createOpaqueTimingInfo(timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 1e4 : timeout; + allowH2 = allowH2 != null ? allowH2 : false; + return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === "https:") { + if (!tls) { + tls = require("node:tls"); + } + servername = servername || options.servername || util.getServerName(host) || null; + const sessionKey = servername || hostname; + const session = sessionCache.get(sessionKey) || null; + assert3(sessionKey); + socket = tls.connect({ + highWaterMark: 16384, + // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], + socket: httpSocket, + // upgrade socket connection + port: port || 443, + host: hostname + }); + socket.on("session", function(session2) { + sessionCache.set(sessionKey, session2); + }); + } else { + assert3(!httpSocket, "httpSocket can only be sent on TLS update"); + socket = net.connect({ + highWaterMark: 64 * 1024, + // Same as nodejs fs streams. + ...options, + localAddress, + port: port || 80, + host: hostname + }); + } + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); + socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { + cancelTimeout(); + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }).on("error", function(err) { + cancelTimeout(); + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + return socket; }; } - function makePolicyContainer() { - return { - referrerPolicy: "strict-origin-when-cross-origin" + function setupTimeout(onConnectTimeout2, timeout) { + if (!timeout) { + return () => { + }; + } + let s1 = null; + let s2 = null; + const timeoutId = setTimeout(() => { + s1 = setImmediate(() => { + if (process.platform === "win32") { + s2 = setImmediate(() => onConnectTimeout2()); + } else { + onConnectTimeout2(); + } + }); + }, timeout); + return () => { + clearTimeout(timeoutId); + clearImmediate(s1); + clearImmediate(s2); }; } - function clonePolicyContainer(policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy - }; + function onConnectTimeout(socket) { + let message = "Connect Timeout Error"; + if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { + message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")})`; + } + util.destroy(socket, new ConnectTimeoutError(message)); } - function determineRequestsReferrer(request) { - const policy = request.referrerPolicy; - assert3(policy); - let referrerSource = null; - if (request.referrer === "client") { - const globalOrigin = getGlobalOrigin(); - if (!globalOrigin || globalOrigin.origin === "null") { - return "no-referrer"; + module2.exports = buildConnector; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/util/timers.js +var require_timers = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/util/timers.js"(exports, module2) { + "use strict"; + var fastNow = Date.now(); + var fastNowTimeout; + var fastTimers = []; + function onTimeout() { + fastNow = Date.now(); + let len = fastTimers.length; + let idx = 0; + while (idx < len) { + const timer = fastTimers[idx]; + if (timer.state === 0) { + timer.state = fastNow + timer.delay; + } else if (timer.state > 0 && fastNow >= timer.state) { + timer.state = -1; + timer.callback(timer.opaque); } - referrerSource = new URL(globalOrigin); - } else if (request.referrer instanceof URL) { - referrerSource = request.referrer; - } - let referrerURL = stripURLForReferrer(referrerSource); - const referrerOrigin = stripURLForReferrer(referrerSource, true); - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; - } - const areSameOrigin = sameOrigin(request, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); - switch (policy) { - case "origin": - return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); - case "unsafe-url": - return referrerURL; - case "same-origin": - return areSameOrigin ? referrerOrigin : "no-referrer"; - case "origin-when-cross-origin": - return areSameOrigin ? referrerURL : referrerOrigin; - case "strict-origin-when-cross-origin": { - const currentURL = requestCurrentURL(request); - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL; - } - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; + if (timer.state === -1) { + timer.state = -2; + if (idx !== len - 1) { + fastTimers[idx] = fastTimers.pop(); + } else { + fastTimers.pop(); } - return referrerOrigin; + len -= 1; + } else { + idx += 1; } - case "strict-origin": - case "no-referrer-when-downgrade": - default: - return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; - } - } - function stripURLForReferrer(url, originOnly) { - assert3(url instanceof URL); - if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { - return "no-referrer"; } - url.username = ""; - url.password = ""; - url.hash = ""; - if (originOnly) { - url.pathname = ""; - url.search = ""; + if (fastTimers.length > 0) { + refreshTimeout(); } - return url; } - function isURLPotentiallyTrustworthy(url) { - if (!(url instanceof URL)) { - return false; - } - if (url.href === "about:blank" || url.href === "about:srcdoc") { - return true; - } - if (url.protocol === "data:") - return true; - if (url.protocol === "file:") - return true; - return isOriginPotentiallyTrustworthy(url.origin); - function isOriginPotentiallyTrustworthy(origin) { - if (origin == null || origin === "null") - return false; - const originAsURL = new URL(origin); - if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { - return true; - } - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { - return true; + function refreshTimeout() { + if (fastNowTimeout?.refresh) { + fastNowTimeout.refresh(); + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTimeout, 1e3); + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); } - return false; } } - function bytesMatch(bytes, metadataList) { - if (crypto === void 0) { - return true; - } - const parsedMetadata = parseMetadata(metadataList); - if (parsedMetadata === "no metadata") { - return true; + var Timeout = class { + constructor(callback, delay, opaque) { + this.callback = callback; + this.delay = delay; + this.opaque = opaque; + this.state = -2; + this.refresh(); } - if (parsedMetadata.length === 0) { - return true; + refresh() { + if (this.state === -2) { + fastTimers.push(this); + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); + } + } + this.state = 0; } - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)); - const strongest = list[0].algo; - const metadata = list.filter((item) => item.algo === strongest); - for (const item of metadata) { - const algorithm = item.algo; - let expectedValue = item.hash; - if (expectedValue.endsWith("==")) { - expectedValue = expectedValue.slice(0, -2); - } - let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); - if (actualValue.endsWith("==")) { - actualValue = actualValue.slice(0, -2); - } - if (actualValue === expectedValue) { - return true; - } - let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest("base64url"); - if (actualBase64URL.endsWith("==")) { - actualBase64URL = actualBase64URL.slice(0, -2); - } - if (actualBase64URL === expectedValue) { - return true; - } - } - return false; - } - var parseHashWithOptions = /(?sha256|sha384|sha512)-(?[A-Za-z0-9+/]+={0,2}(?=\s|$))( +[!-~]*)?/i; - function parseMetadata(metadata) { - const result = []; - let empty = true; - const supportedHashes = crypto.getHashes(); - for (const token of metadata.split(" ")) { - empty = false; - const parsedToken = parseHashWithOptions.exec(token); - if (parsedToken === null || parsedToken.groups === void 0) { - continue; - } - const algorithm = parsedToken.groups.algo; - if (supportedHashes.includes(algorithm.toLowerCase())) { - result.push(parsedToken.groups); - } - } - if (empty === true) { - return "no metadata"; - } - return result; - } - function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { - } - function sameOrigin(A, B) { - if (A.origin === B.origin && A.origin === "null") { - return true; - } - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true; + clear() { + this.state = -1; } - return false; - } - function createDeferredPromise() { - let res; - let rej; - const promise = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - return { promise, resolve: res, reject: rej }; - } - function isAborted(fetchParams) { - return fetchParams.controller.state === "aborted"; - } - function isCancelled(fetchParams) { - return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; - } - var normalizeMethodRecordBase = { - delete: "DELETE", - DELETE: "DELETE", - get: "GET", - GET: "GET", - head: "HEAD", - HEAD: "HEAD", - options: "OPTIONS", - OPTIONS: "OPTIONS", - post: "POST", - POST: "POST", - put: "PUT", - PUT: "PUT" - }; - var normalizeMethodRecord = { - ...normalizeMethodRecordBase, - patch: "patch", - PATCH: "PATCH" }; - Object.setPrototypeOf(normalizeMethodRecordBase, null); - Object.setPrototypeOf(normalizeMethodRecord, null); - function normalizeMethod(method) { - return normalizeMethodRecordBase[method.toLowerCase()] ?? method; - } - function serializeJavascriptValueToJSONString(value) { - const result = JSON.stringify(value); - if (result === void 0) { - throw new TypeError("Value is not JSON serializable"); - } - assert3(typeof result === "string"); - return result; - } - var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - function makeIterator(iterator, name, kind, keyIndex = 0, valueIndex = 1) { - const object = { - index: 0, - kind, - target: iterator - }; - const iteratorObject = Object.create(esIteratorPrototype); - Object.defineProperty(iteratorObject, "next", { - value: function next() { - if (Object.getPrototypeOf(this) !== iteratorObject) { - throw new TypeError( - `'next' called on an object that does not implement interface ${name} Iterator.` - ); - } - const { index, kind: kind2, target } = object; - const values = target(); - const len = values.length; - if (index >= len) { - return { value: void 0, done: true }; - } - const { [keyIndex]: key, [valueIndex]: value } = values[index]; - object.index = index + 1; - let result; - switch (kind2) { - case "key": - result = key; - break; - case "value": - result = value; - break; - case "key+value": - result = [key, value]; - break; - } - return { - value: result, - done: false - }; - }, - writable: true, - enumerable: true, - configurable: true - }); - Object.defineProperty(iteratorObject, Symbol.toStringTag, { - value: `${name} Iterator`, - writable: false, - enumerable: false, - configurable: true - }); - return Object.create(iteratorObject); - } - async function fullyReadBody(body, processBody, processBodyError) { - const successSteps = processBody; - const errorSteps = processBodyError; - let reader; - try { - reader = body.stream.getReader(); - } catch (e) { - errorSteps(e); - return; - } - try { - const result = await readAllBytes(reader); - successSteps(result); - } catch (e) { - errorSteps(e); - } - } - function isReadableStreamLike(stream) { - return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; - } - function readableStreamClose(controller) { - try { - controller.close(); - controller.byobRequest?.respond(0); - } catch (err) { - if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) { - throw err; + module2.exports = { + setTimeout(callback, delay, opaque) { + return delay < 1e3 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); + }, + clearTimeout(timeout) { + if (timeout instanceof Timeout) { + timeout.clear(); + } else { + clearTimeout(timeout); } } - } - function isomorphicEncode(input) { - for (let i = 0; i < input.length; i++) { - assert3(input.charCodeAt(i) <= 255); - } - return input; - } - async function readAllBytes(reader) { - const bytes = []; - let byteLength = 0; - while (true) { - const { done, value: chunk } = await reader.read(); - if (done) { - return Buffer.concat(bytes, byteLength); - } - if (!isUint8Array(chunk)) { - throw new TypeError("Received non-Uint8Array chunk"); + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/utils.js +var require_utils = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/utils.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.enumToMap = void 0; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === "number") { + res[key] = value; } - bytes.push(chunk); - byteLength += chunk.length; - } - } - function urlIsLocal(url) { - assert3("protocol" in url); - const protocol = url.protocol; - return protocol === "about:" || protocol === "blob:" || protocol === "data:"; - } - function urlHasHttpsScheme(url) { - if (typeof url === "string") { - return url.startsWith("https:"); - } - return url.protocol === "https:"; - } - function urlIsHttpHttpsScheme(url) { - assert3("protocol" in url); - const protocol = url.protocol; - return protocol === "http:" || protocol === "https:"; + }); + return res; } - function simpleRangeHeaderValue(value, allowWhitespace) { - const data = value; - if (!data.startsWith("bytes")) { - return "failure"; - } - const position = { position: 5 }; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position - ); - } - if (data.charCodeAt(position.position) !== 61) { - return "failure"; - } - position.position++; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position - ); - } - const rangeStart = collectASequenceOfCodePoints( - (char) => { - const code = char.charCodeAt(0); - return code >= 48 && code <= 57; - }, - data, - position - ); - const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position - ); - } - if (data.charCodeAt(position.position) !== 45) { - return "failure"; - } - position.position++; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position - ); - } - const rangeEnd = collectASequenceOfCodePoints( - (char) => { - const code = char.charCodeAt(0); - return code >= 48 && code <= 57; - }, - data, - position - ); - const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; - if (position.position < data.length) { - return "failure"; - } - if (rangeEndValue === null && rangeStartValue === null) { - return "failure"; - } - if (rangeStartValue > rangeEndValue) { - return "failure"; - } - return { rangeStartValue, rangeEndValue }; - } - function buildContentRange(rangeStart, rangeEnd, fullLength) { - let contentRange = "bytes "; - contentRange += isomorphicEncode(`${rangeStart}`); - contentRange += "-"; - contentRange += isomorphicEncode(`${rangeEnd}`); - contentRange += "/"; - contentRange += isomorphicEncode(`${fullLength}`); - return contentRange; - } - var InflateStream = class extends Transform { - _transform(chunk, encoding, callback) { - if (!this._inflateStream) { - if (chunk.length === 0) { - callback(); - return; - } - this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate() : zlib.createInflateRaw(); - this._inflateStream.on("data", this.push.bind(this)); - this._inflateStream.on("end", () => this.push(null)); - this._inflateStream.on("error", (err) => this.destroy(err)); - } - this._inflateStream.write(chunk, encoding, callback); - } - _final(callback) { - if (this._inflateStream) { - this._inflateStream.end(); - this._inflateStream = null; - } - callback(); - } - }; - function createInflate() { - return new InflateStream(); - } - function extractMimeType(headers) { - let charset = null; - let essence = null; - let mimeType = null; - const values = getDecodeSplit("content-type", headers); - if (values === null) { - return "failure"; - } - for (const value of values) { - const temporaryMimeType = parseMIMEType(value); - if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") { - continue; - } - mimeType = temporaryMimeType; - if (mimeType.essence !== essence) { - charset = null; - if (mimeType.parameters.has("charset")) { - charset = mimeType.parameters.get("charset"); - } - essence = mimeType.essence; - } else if (!mimeType.parameters.has("charset") && charset !== null) { - mimeType.parameters.set("charset", charset); - } - } - if (mimeType == null) { - return "failure"; - } - return mimeType; - } - function gettingDecodingSplitting(value) { - const input = value; - const position = { position: 0 }; - const values = []; - let temporaryValue = ""; - while (position.position < input.length) { - temporaryValue += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== ",", - input, - position - ); - if (position.position < input.length) { - if (input.charCodeAt(position.position) === 34) { - temporaryValue += collectAnHTTPQuotedString( - input, - position - ); - if (position.position < input.length) { - continue; - } - } else { - assert3(input.charCodeAt(position.position) === 44); - position.position++; - } - } - temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32); - values.push(temporaryValue); - temporaryValue = ""; - } - return values; - } - function getDecodeSplit(name, list) { - const value = list.get(name, true); - if (value === null) { - return null; - } - return gettingDecodingSplitting(value); - } - module2.exports = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - clampAndCoarsenConnectionTimingInfo, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes, - normalizeMethodRecord, - simpleRangeHeaderValue, - buildContentRange, - parseMetadata, - createInflate, - extractMimeType - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/symbols.js -var require_symbols2 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/symbols.js"(exports, module2) { - "use strict"; - module2.exports = { - kUrl: Symbol("url"), - kHeaders: Symbol("headers"), - kSignal: Symbol("signal"), - kState: Symbol("state"), - kGuard: Symbol("guard"), - kRealm: Symbol("realm") - }; + exports.enumToMap = enumToMap; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/webidl.js -var require_webidl = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/webidl.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/constants.js +var require_constants3 = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/constants.js"(exports) { "use strict"; - var { types } = require("node:util"); - var { toUSVString } = require_util2(); - var webidl = {}; - webidl.converters = {}; - webidl.util = {}; - webidl.errors = {}; - webidl.errors.exception = function(message) { - return new TypeError(`${message.header}: ${message.message}`); - }; - webidl.errors.conversionFailed = function(context) { - const plural2 = context.types.length === 1 ? "" : " one of"; - const message = `${context.argument} could not be converted to${plural2}: ${context.types.join(", ")}.`; - return webidl.errors.exception({ - header: context.prefix, - message - }); - }; - webidl.errors.invalidArgument = function(context) { - return webidl.errors.exception({ - header: context.prefix, - message: `"${context.value}" is an invalid ${context.type}.` - }); - }; - webidl.brandCheck = function(V, I, opts = void 0) { - if (opts?.strict !== false) { - if (!(V instanceof I)) { - throw new TypeError("Illegal invocation"); - } - } else { - if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { - throw new TypeError("Illegal invocation"); - } - } - }; - webidl.argumentLengthCheck = function({ length }, min, ctx) { - if (length < min) { - throw webidl.errors.exception({ - message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, - ...ctx - }); - } - }; - webidl.illegalConstructor = function() { - throw webidl.errors.exception({ - header: "TypeError", - message: "Illegal constructor" - }); - }; - webidl.util.Type = function(V) { - switch (typeof V) { - case "undefined": - return "Undefined"; - case "boolean": - return "Boolean"; - case "string": - return "String"; - case "symbol": - return "Symbol"; - case "number": - return "Number"; - case "bigint": - return "BigInt"; - case "function": - case "object": { - if (V === null) { - return "Null"; - } - return "Object"; - } - } - }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; + var utils_1 = require_utils(); + var ERROR; + (function(ERROR2) { + ERROR2[ERROR2["OK"] = 0] = "OK"; + ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; + ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; + ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; + ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR2[ERROR2["USER"] = 24] = "USER"; + })(ERROR = exports.ERROR || (exports.ERROR = {})); + var TYPE; + (function(TYPE2) { + TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; + TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; + TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; + })(TYPE = exports.TYPE || (exports.TYPE = {})); + var FLAGS; + (function(FLAGS2) { + FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; + FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; + FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; + FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(FLAGS = exports.FLAGS || (exports.FLAGS = {})); + var LENIENT_FLAGS; + (function(LENIENT_FLAGS2) { + LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); + var METHODS; + (function(METHODS2) { + METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; + METHODS2[METHODS2["GET"] = 1] = "GET"; + METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; + METHODS2[METHODS2["POST"] = 3] = "POST"; + METHODS2[METHODS2["PUT"] = 4] = "PUT"; + METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; + METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; + METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; + METHODS2[METHODS2["COPY"] = 8] = "COPY"; + METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; + METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; + METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; + METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; + METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; + METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; + METHODS2[METHODS2["BIND"] = 16] = "BIND"; + METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; + METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; + METHODS2[METHODS2["ACL"] = 19] = "ACL"; + METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; + METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; + METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; + METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; + METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; + METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; + METHODS2[METHODS2["LINK"] = 31] = "LINK"; + METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; + METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; + METHODS2[METHODS2["PRI"] = 34] = "PRI"; + METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; + METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; + METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; + METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; + METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; + METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports.METHODS || (exports.METHODS = {})); + exports.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS["M-SEARCH"], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE + ]; + exports.METHODS_ICE = [ + METHODS.SOURCE + ]; + exports.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST + ]; + exports.METHOD_MAP = utils_1.enumToMap(METHODS); + exports.H_METHOD_MAP = {}; + Object.keys(exports.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; + } + }); + var FINISH; + (function(FINISH2) { + FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; + FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; + })(FINISH = exports.FINISH || (exports.FINISH = {})); + exports.ALPHA = []; + for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { + exports.ALPHA.push(String.fromCharCode(i)); + exports.ALPHA.push(String.fromCharCode(i + 32)); + } + exports.NUM_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9 + }; + exports.HEX_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15 + }; + exports.NUM = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); + exports.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; + exports.USERINFO_CHARS = exports.ALPHANUM.concat(exports.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); + exports.STRICT_URL_CHAR = [ + "!", + '"', + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + ":", + ";", + "<", + "=", + ">", + "@", + "[", + "\\", + "]", + "^", + "_", + "`", + "{", + "|", + "}", + "~" + ].concat(exports.ALPHANUM); + exports.URL_CHAR = exports.STRICT_URL_CHAR.concat([" ", "\f"]); + for (let i = 128; i <= 255; i++) { + exports.URL_CHAR.push(i); + } + exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); + exports.STRICT_TOKEN = [ + "!", + "#", + "$", + "%", + "&", + "'", + "*", + "+", + "-", + ".", + "^", + "_", + "`", + "|", + "~" + ].concat(exports.ALPHANUM); + exports.TOKEN = exports.STRICT_TOKEN.concat([" "]); + exports.HEADER_CHARS = [" "]; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports.HEADER_CHARS.push(i); + } + } + exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); + exports.MAJOR = exports.NUM_MAP; + exports.MINOR = exports.MAJOR; + var HEADER_STATE; + (function(HEADER_STATE2) { + HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); + exports.SPECIAL_HEADERS = { + "connection": HEADER_STATE.CONNECTION, + "content-length": HEADER_STATE.CONTENT_LENGTH, + "proxy-connection": HEADER_STATE.CONNECTION, + "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, + "upgrade": HEADER_STATE.UPGRADE + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js +var require_llhttp_wasm = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports, module2) { + var { Buffer: Buffer2 } = require("node:buffer"); + module2.exports = Buffer2.from("AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=", "base64"); + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +var require_llhttp_simd_wasm = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports, module2) { + var { Buffer: Buffer2 } = require("node:buffer"); + module2.exports = Buffer2.from("AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64"); + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/constants.js +var require_constants4 = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/constants.js"(exports, module2) { + "use strict"; + var corsSafeListedMethods = ["GET", "HEAD", "POST"]; + var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); + var nullBodyStatus = [101, 204, 205, 304]; + var redirectStatus = [301, 302, 303, 307, 308]; + var redirectStatusSet = new Set(redirectStatus); + var badPorts = [ + "1", + "7", + "9", + "11", + "13", + "15", + "17", + "19", + "20", + "21", + "22", + "23", + "25", + "37", + "42", + "43", + "53", + "69", + "77", + "79", + "87", + "95", + "101", + "102", + "103", + "104", + "109", + "110", + "111", + "113", + "115", + "117", + "119", + "123", + "135", + "137", + "139", + "143", + "161", + "179", + "389", + "427", + "465", + "512", + "513", + "514", + "515", + "526", + "530", + "531", + "532", + "540", + "548", + "554", + "556", + "563", + "587", + "601", + "636", + "989", + "990", + "993", + "995", + "1719", + "1720", + "1723", + "2049", + "3659", + "4045", + "4190", + "5060", + "5061", + "6000", + "6566", + "6665", + "6666", + "6667", + "6668", + "6669", + "6679", + "6697", + "10080" + ]; + var badPortsSet = new Set(badPorts); + var referrerPolicy = [ + "", + "no-referrer", + "no-referrer-when-downgrade", + "same-origin", + "origin", + "strict-origin", + "origin-when-cross-origin", + "strict-origin-when-cross-origin", + "unsafe-url" + ]; + var referrerPolicySet = new Set(referrerPolicy); + var requestRedirect = ["follow", "manual", "error"]; + var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; + var safeMethodsSet = new Set(safeMethods); + var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; + var requestCredentials = ["omit", "same-origin", "include"]; + var requestCache = [ + "default", + "no-store", + "reload", + "no-cache", + "force-cache", + "only-if-cached" + ]; + var requestBodyHeader = [ + "content-encoding", + "content-language", + "content-location", + "content-type", + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + "content-length" + ]; + var requestDuplex = [ + "half" + ]; + var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; + var forbiddenMethodsSet = new Set(forbiddenMethods); + var subresource = [ + "audio", + "audioworklet", + "font", + "image", + "manifest", + "paintworklet", + "script", + "style", + "track", + "video", + "xslt", + "" + ]; + var subresourceSet = new Set(subresource); + module2.exports = { + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicySet + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/global.js +var require_global = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/global.js"(exports, module2) { + "use strict"; + var globalOrigin = Symbol.for("undici.globalOrigin.1"); + function getGlobalOrigin() { + return globalThis[globalOrigin]; + } + function setGlobalOrigin(newOrigin) { + if (newOrigin === void 0) { + Object.defineProperty(globalThis, globalOrigin, { + value: void 0, + writable: true, + enumerable: false, + configurable: false + }); + return; + } + const parsedURL = new URL(newOrigin); + if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); + } + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); + } + module2.exports = { + getGlobalOrigin, + setGlobalOrigin + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/data-url.js +var require_data_url = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/data-url.js"(exports, module2) { + "use strict"; + var assert3 = require("node:assert"); + var encoder = new TextEncoder(); + var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; + var HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/; + var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; + var HTTP_QUOTED_STRING_TOKENS = /[\u0009\u0020-\u007E\u0080-\u00FF]/; + function dataURLProcessor(dataURL) { + assert3(dataURL.protocol === "data:"); + let input = URLSerializer(dataURL, true); + input = input.slice(5); + const position = { position: 0 }; + let mimeType = collectASequenceOfCodePointsFast( + ",", + input, + position + ); + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); + if (position.position >= input.length) { + return "failure"; + } + position.position++; + const encodedBody = input.slice(mimeTypeLength + 1); + let body = stringPercentDecode(encodedBody); + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + const stringBody = isomorphicDecode(body); + body = forgivingBase64(stringBody); + if (body === "failure") { + return "failure"; + } + mimeType = mimeType.slice(0, -6); + mimeType = mimeType.replace(/(\u0020)+$/, ""); + mimeType = mimeType.slice(0, -1); + } + if (mimeType.startsWith(";")) { + mimeType = "text/plain" + mimeType; + } + let mimeTypeRecord = parseMIMEType(mimeType); + if (mimeTypeRecord === "failure") { + mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); + } + return { mimeType: mimeTypeRecord, body }; + } + function URLSerializer(url, excludeFragment = false) { + if (!excludeFragment) { + return url.href; + } + const href = url.href; + const hashLength = url.hash.length; + const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); + if (!hashLength && href.endsWith("#")) { + return serialized.slice(0, -1); + } + return serialized; + } + function collectASequenceOfCodePoints(condition, input, position) { + let result = ""; + while (position.position < input.length && condition(input[position.position])) { + result += input[position.position]; + position.position++; + } + return result; + } + function collectASequenceOfCodePointsFast(char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; + if (idx === -1) { + position.position = input.length; + return input.slice(start); + } + position.position = idx; + return input.slice(start, position.position); + } + function stringPercentDecode(input) { + const bytes = encoder.encode(input); + return percentDecode(bytes); + } + function isHexCharByte(byte) { + return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102; + } + function hexByteToNumber(byte) { + return ( + // 0-9 + byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55 + ); + } + function percentDecode(input) { + const length = input.length; + const output = new Uint8Array(length); + let j = 0; + for (let i = 0; i < length; ++i) { + const byte = input[i]; + if (byte !== 37) { + output[j++] = byte; + } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) { + output[j++] = 37; + } else { + output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]); + i += 2; + } + } + return length === j ? output : output.subarray(0, j); + } + function parseMIMEType(input) { + input = removeHTTPWhitespace(input, true, true); + const position = { position: 0 }; + const type = collectASequenceOfCodePointsFast( + "/", + input, + position + ); + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return "failure"; + } + if (position.position > input.length) { + return "failure"; + } + position.position++; + let subtype = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + subtype = removeHTTPWhitespace(subtype, false, true); + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return "failure"; + } + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: /* @__PURE__ */ new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + }; + while (position.position < input.length) { + position.position++; + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + (char) => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ); + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ";" && char !== "=", + input, + position + ); + parameterName = parameterName.toLowerCase(); + if (position.position < input.length) { + if (input[position.position] === ";") { + continue; + } + position.position++; + } + if (position.position > input.length) { + break; + } + let parameterValue = null; + if (input[position.position] === '"') { + parameterValue = collectAnHTTPQuotedString(input, position, true); + collectASequenceOfCodePointsFast( + ";", + input, + position + ); + } else { + parameterValue = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + if (parameterValue.length === 0) { + continue; + } + } + if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { + mimeType.parameters.set(parameterName, parameterValue); + } + } + return mimeType; + } + function forgivingBase64(data) { + data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ""); + let dataLength = data.length; + if (dataLength % 4 === 0) { + if (data.charCodeAt(dataLength - 1) === 61) { + --dataLength; + if (data.charCodeAt(dataLength - 1) === 61) { + --dataLength; + } + } + } + if (dataLength % 4 === 1) { + return "failure"; + } + if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { + return "failure"; + } + const buffer = Buffer.from(data, "base64"); + return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); + } + function collectAnHTTPQuotedString(input, position, extractValue) { + const positionStart = position.position; + let value = ""; + assert3(input[position.position] === '"'); + position.position++; + while (true) { + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== "\\", + input, + position + ); + if (position.position >= input.length) { + break; + } + const quoteOrBackslash = input[position.position]; + position.position++; + if (quoteOrBackslash === "\\") { + if (position.position >= input.length) { + value += "\\"; + break; + } + value += input[position.position]; + position.position++; + } else { + assert3(quoteOrBackslash === '"'); + break; + } + } + if (extractValue) { + return value; + } + return input.slice(positionStart, position.position); + } + function serializeAMimeType(mimeType) { + assert3(mimeType !== "failure"); + const { parameters, essence } = mimeType; + let serialization = essence; + for (let [name, value] of parameters.entries()) { + serialization += ";"; + serialization += name; + serialization += "="; + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + value = value.replace(/(\\|")/g, "\\$1"); + value = '"' + value; + value += '"'; + } + serialization += value; + } + return serialization; + } + function isHTTPWhiteSpace(char) { + return char === 13 || char === 10 || char === 9 || char === 32; + } + function removeHTTPWhitespace(str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isHTTPWhiteSpace); + } + function isASCIIWhitespace(char) { + return char === 13 || char === 10 || char === 9 || char === 12 || char === 32; + } + function removeASCIIWhitespace(str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isASCIIWhitespace); + } + function removeChars(str, leading, trailing, predicate) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + while (lead < str.length && predicate(str.charCodeAt(lead))) + lead++; + } + if (trailing) { + while (trail > 0 && predicate(str.charCodeAt(trail))) + trail--; + } + return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1); + } + function isomorphicDecode(input) { + const length = input.length; + if ((2 << 15) - 1 > length) { + return String.fromCharCode.apply(null, input); + } + let result = ""; + let i = 0; + let addition = (2 << 15) - 1; + while (i < length) { + if (i + addition > length) { + addition = length - i; + } + result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); + } + return result; + } + function minimizeSupportedMimeType(mimeType) { + switch (mimeType.essence) { + case "application/ecmascript": + case "application/javascript": + case "application/x-ecmascript": + case "application/x-javascript": + case "text/ecmascript": + case "text/javascript": + case "text/javascript1.0": + case "text/javascript1.1": + case "text/javascript1.2": + case "text/javascript1.3": + case "text/javascript1.4": + case "text/javascript1.5": + case "text/jscript": + case "text/livescript": + case "text/x-ecmascript": + case "text/x-javascript": + return "text/javascript"; + case "application/json": + case "text/json": + return "application/json"; + case "image/svg+xml": + return "image/svg+xml"; + case "text/xml": + case "application/xml": + return "application/xml"; + } + if (mimeType.subtype.endsWith("+json")) { + return "application/json"; + } + if (mimeType.subtype.endsWith("+xml")) { + return "application/xml"; + } + return ""; + } + module2.exports = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType, + removeChars, + minimizeSupportedMimeType, + HTTP_TOKEN_CODEPOINTS, + isomorphicDecode + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/webidl.js +var require_webidl = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/webidl.js"(exports, module2) { + "use strict"; + var { types, inspect } = require("node:util"); + var { toUSVString } = require_util(); + var webidl = {}; + webidl.converters = {}; + webidl.util = {}; + webidl.errors = {}; + webidl.errors.exception = function(message) { + return new TypeError(`${message.header}: ${message.message}`); + }; + webidl.errors.conversionFailed = function(context) { + const plural2 = context.types.length === 1 ? "" : " one of"; + const message = `${context.argument} could not be converted to${plural2}: ${context.types.join(", ")}.`; + return webidl.errors.exception({ + header: context.prefix, + message + }); + }; + webidl.errors.invalidArgument = function(context) { + return webidl.errors.exception({ + header: context.prefix, + message: `"${context.value}" is an invalid ${context.type}.` + }); + }; + webidl.brandCheck = function(V, I, opts = void 0) { + if (opts?.strict !== false) { + if (!(V instanceof I)) { + throw new TypeError("Illegal invocation"); + } + } else { + if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { + throw new TypeError("Illegal invocation"); + } + } + }; + webidl.argumentLengthCheck = function({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, + ...ctx + }); + } + }; + webidl.illegalConstructor = function() { + throw webidl.errors.exception({ + header: "TypeError", + message: "Illegal constructor" + }); + }; + webidl.util.Type = function(V) { + switch (typeof V) { + case "undefined": + return "Undefined"; + case "boolean": + return "Boolean"; + case "string": + return "String"; + case "symbol": + return "Symbol"; + case "number": + return "Number"; + case "bigint": + return "BigInt"; + case "function": + case "object": { + if (V === null) { + return "Null"; + } + return "Object"; + } + } + }; webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { let upperBound; let lowerBound; @@ -9319,7 +8637,7 @@ var require_webidl = __commonJS({ if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { throw webidl.errors.exception({ header: "Integer conversion", - message: `Could not convert ${V} to an integer.` + message: `Could not convert ${webidl.util.Stringify(V)} to an integer.` }); } x = webidl.util.IntegerPart(x); @@ -9357,15 +8675,28 @@ var require_webidl = __commonJS({ } return r; }; + webidl.util.Stringify = function(V) { + const type = webidl.util.Type(V); + switch (type) { + case "Symbol": + return `Symbol(${V.description})`; + case "Object": + return inspect(V); + case "String": + return `"${V}"`; + default: + return `${V}`; + } + }; webidl.sequenceConverter = function(converter) { - return (V) => { + return (V, Iterable) => { if (webidl.util.Type(V) !== "Object") { throw webidl.errors.exception({ header: "Sequence", message: `Value of type ${webidl.util.Type(V)} is not an Object.` }); } - const method = V?.[Symbol.iterator]?.(); + const method = typeof Iterable === "function" ? Iterable() : V?.[Symbol.iterator]?.(); const seq = []; if (method === void 0 || typeof method.next !== "function") { throw webidl.errors.exception({ @@ -9393,7 +8724,7 @@ var require_webidl = __commonJS({ } const result = {}; if (!types.isProxy(O)) { - const keys2 = Object.keys(O); + const keys2 = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; for (const key of keys2) { const typedKey = keyConverter(key); const typedValue = valueConverter(O[key]); @@ -9418,7 +8749,7 @@ var require_webidl = __commonJS({ if (opts.strict !== false && !(V instanceof i)) { throw webidl.errors.exception({ header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` + message: `Expected ${webidl.util.Stringify(V)} to be an instance of ${i.name}.` }); } return V; @@ -9520,8 +8851,8 @@ var require_webidl = __commonJS({ webidl.converters.ArrayBuffer = function(V, opts = {}) { if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, + prefix: webidl.util.Stringify(V), + argument: webidl.util.Stringify(V), types: ["ArrayBuffer"] }); } @@ -9531,13 +8862,19 @@ var require_webidl = __commonJS({ message: "SharedArrayBuffer is not allowed." }); } + if (V.resizable || V.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); + } return V; }; webidl.converters.TypedArray = function(V, T, opts = {}) { if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { throw webidl.errors.conversionFailed({ prefix: `${T.name}`, - argument: `${V}`, + argument: webidl.util.Stringify(V), types: [T.name] }); } @@ -9547,6 +8884,12 @@ var require_webidl = __commonJS({ message: "SharedArrayBuffer is not allowed." }); } + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); + } return V; }; webidl.converters.DataView = function(V, opts = {}) { @@ -9562,1848 +8905,1787 @@ var require_webidl = __commonJS({ message: "SharedArrayBuffer is not allowed." }); } - return V; - }; - webidl.converters.BufferSource = function(V, opts = {}) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, { ...opts, allowShared: false }); - } - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor, { ...opts, allowShared: false }); - } - if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts, { ...opts, allowShared: false }); - } - throw new TypeError(`Could not convert ${V} to a BufferSource.`); - }; - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.ByteString - ); - webidl.converters["sequence>"] = webidl.sequenceConverter( - webidl.converters["sequence"] - ); - webidl.converters["record"] = webidl.recordConverter( - webidl.converters.ByteString, - webidl.converters.ByteString - ); - module2.exports = { - webidl - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/file.js -var require_file = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/file.js"(exports, module2) { - "use strict"; - var { Blob: Blob2, File: NativeFile } = require("node:buffer"); - var { types } = require("node:util"); - var { kState } = require_symbols2(); - var { isBlobLike } = require_util2(); - var { webidl } = require_webidl(); - var { parseMIMEType, serializeAMimeType } = require_dataURL(); - var { kEnumerableProperty } = require_util(); - var encoder = new TextEncoder(); - var File = class _File extends Blob2 { - constructor(fileBits, fileName, options = {}) { - webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); - fileBits = webidl.converters["sequence"](fileBits); - fileName = webidl.converters.USVString(fileName); - options = webidl.converters.FilePropertyBag(options); - const n = fileName; - let t = options.type; - let d; - substep: { - if (t) { - t = parseMIMEType(t); - if (t === "failure") { - t = ""; - break substep; - } - t = serializeAMimeType(t).toLowerCase(); - } - d = options.lastModified; - } - super(processBlobParts(fileBits, options), { type: t }); - this[kState] = { - name: n, - lastModified: d, - type: t - }; - } - get name() { - webidl.brandCheck(this, _File); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, _File); - return this[kState].lastModified; - } - get type() { - webidl.brandCheck(this, _File); - return this[kState].type; - } - }; - var FileLike = class _FileLike { - constructor(blobLike, fileName, options = {}) { - const n = fileName; - const t = options.type; - const d = options.lastModified ?? Date.now(); - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d - }; - } - stream(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.stream(...args); - } - arrayBuffer(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.arrayBuffer(...args); - } - slice(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.slice(...args); - } - text(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.text(...args); - } - get size() { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.size; - } - get type() { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.type; - } - get name() { - webidl.brandCheck(this, _FileLike); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, _FileLike); - return this[kState].lastModified; - } - get [Symbol.toStringTag]() { - return "File"; - } - }; - Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: "File", - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty - }); - webidl.converters.Blob = webidl.interfaceConverter(Blob2); - webidl.converters.BlobPart = function(V, opts) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V, opts); - } + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); } - return webidl.converters.USVString(V, opts); + return V; }; - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.BlobPart - ); - webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: "lastModified", - converter: webidl.converters["long long"], - get defaultValue() { - return Date.now(); - } - }, - { - key: "type", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "endings", - converter: (value) => { - value = webidl.converters.DOMString(value); - value = value.toLowerCase(); - if (value !== "native") { - value = "transparent"; - } - return value; - }, - defaultValue: "transparent" - } - ]); - function processBlobParts(parts, options) { - const bytes = []; - for (const element of parts) { - if (typeof element === "string") { - let s = element; - if (options.endings === "native") { - s = convertLineEndingsNative(s); - } - bytes.push(encoder.encode(s)); - } else if (ArrayBuffer.isView(element) || types.isArrayBuffer(element)) { - if (element.buffer) { - bytes.push( - new Uint8Array(element.buffer, element.byteOffset, element.byteLength) - ); - } else { - bytes.push(new Uint8Array(element)); - } - } else if (isBlobLike(element)) { - bytes.push(element); - } + webidl.converters.BufferSource = function(V, opts = {}) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, { ...opts, allowShared: false }); } - return bytes; - } - function convertLineEndingsNative(s) { - let nativeLineEnding = "\n"; - if (process.platform === "win32") { - nativeLineEnding = "\r\n"; + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor, { ...opts, allowShared: false }); } - return s.replace(/\r?\n/g, nativeLineEnding); - } - function isFileLike(object) { - return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; - } - module2.exports = { File, FileLike, isFileLike }; + if (types.isDataView(V)) { + return webidl.converters.DataView(V, opts, { ...opts, allowShared: false }); + } + throw new TypeError(`Could not convert ${webidl.util.Stringify(V)} to a BufferSource.`); + }; + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.ByteString + ); + webidl.converters["sequence>"] = webidl.sequenceConverter( + webidl.converters["sequence"] + ); + webidl.converters["record"] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString + ); + module2.exports = { + webidl + }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/formdata.js -var require_formdata = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/formdata.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/util.js +var require_util3 = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/util.js"(exports, module2) { "use strict"; - var { isBlobLike, toUSVString, makeIterator } = require_util2(); - var { kState } = require_symbols2(); - var { kEnumerableProperty } = require_util(); - var { File: UndiciFile, FileLike, isFileLike } = require_file(); + var { Transform } = require("node:stream"); + var zlib = require("node:zlib"); + var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants4(); + var { getGlobalOrigin } = require_global(); + var { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require_data_url(); + var { performance } = require("node:perf_hooks"); + var { isBlobLike, ReadableStreamFrom, isValidHTTPToken } = require_util(); + var assert3 = require("node:assert"); + var { isUint8Array } = require("node:util/types"); var { webidl } = require_webidl(); - var { File: NativeFile } = require("node:buffer"); - var File = NativeFile ?? UndiciFile; - var FormData = class _FormData { - constructor(form) { - if (form !== void 0) { - throw webidl.errors.conversionFailed({ - prefix: "FormData constructor", - argument: "Argument 1", - types: ["undefined"] - }); + var supportedHashes = []; + var crypto; + try { + crypto = require("node:crypto"); + const possibleRelevantHashes = ["sha256", "sha384", "sha512"]; + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); + } catch { + } + function responseURL(response) { + const urlList = response.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString(); + } + function responseLocationURL(response, requestFragment) { + if (!redirectStatusSet.has(response.status)) { + return null; + } + let location = response.headersList.get("location", true); + if (location !== null && isValidHeaderValue(location)) { + if (!isValidEncodedURL(location)) { + location = normalizeBinaryStringToUtf8(location); } - this[kState] = []; + location = new URL(location, responseURL(response)); } - append(name, value, filename = void 0) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" - ); + if (location && !location.hash) { + location.hash = requestFragment; + } + return location; + } + function isValidEncodedURL(url) { + for (let i = 0; i < url.length; ++i) { + const code = url.charCodeAt(i); + if (code > 126 || // Non-US-ASCII + DEL + code < 32) { + return false; } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? webidl.converters.USVString(filename) : void 0; - const entry = makeEntry(name, value, filename); - this[kState].push(entry); } - delete(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); - name = webidl.converters.USVString(name); - this[kState] = this[kState].filter((entry) => entry.name !== name); + return true; + } + function normalizeBinaryStringToUtf8(value) { + return Buffer.from(value, "binary").toString("utf8"); + } + function requestCurrentURL(request) { + return request.urlList[request.urlList.length - 1]; + } + function requestBadPort(request) { + const url = requestCurrentURL(request); + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return "blocked"; } - get(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); - name = webidl.converters.USVString(name); - const idx = this[kState].findIndex((entry) => entry.name === name); - if (idx === -1) { - return null; + return "allowed"; + } + function isErrorLike(object) { + return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); + } + function isValidReasonPhrase(statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if (!(c === 9 || // HTAB + c >= 32 && c <= 126 || // SP / VCHAR + c >= 128 && c <= 255)) { + return false; } - return this[kState][idx].value; } - getAll(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); - name = webidl.converters.USVString(name); - return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); + return true; + } + var isValidHeaderName = isValidHTTPToken; + function isValidHeaderValue(potentialValue) { + return (potentialValue[0] === " " || potentialValue[0] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue.includes("\n") || potentialValue.includes("\r") || potentialValue.includes("\0")) === false; + } + function setRequestReferrerPolicyOnRedirect(request, actualResponse) { + const { headersList } = actualResponse; + const policyHeader = (headersList.get("referrer-policy", true) ?? "").split(","); + let policy = ""; + if (policyHeader.length > 0) { + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break; + } + } } - has(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); - name = webidl.converters.USVString(name); - return this[kState].findIndex((entry) => entry.name === name) !== -1; + if (policy !== "") { + request.referrerPolicy = policy; } - set(name, value, filename = void 0) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" - ); + } + function crossOriginResourcePolicyCheck() { + return "allowed"; + } + function corsCheck() { + return "success"; + } + function TAOCheck() { + return "success"; + } + function appendFetchMetadata(httpRequest) { + let header = null; + header = httpRequest.mode; + httpRequest.headersList.set("sec-fetch-mode", header, true); + } + function appendRequestOriginHeader(request) { + let serializedOrigin = request.origin; + if (request.responseTainting === "cors" || request.mode === "websocket") { + if (serializedOrigin) { + request.headersList.append("origin", serializedOrigin, true); } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? toUSVString(filename) : void 0; - const entry = makeEntry(name, value, filename); - const idx = this[kState].findIndex((entry2) => entry2.name === name); - if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), - entry, - ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) - ]; - } else { - this[kState].push(entry); + } else if (request.method !== "GET" && request.method !== "HEAD") { + switch (request.referrerPolicy) { + case "no-referrer": + serializedOrigin = null; + break; + case "no-referrer-when-downgrade": + case "strict-origin": + case "strict-origin-when-cross-origin": + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null; + } + break; + case "same-origin": + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null; + } + break; + default: + } + if (serializedOrigin) { + request.headersList.append("origin", serializedOrigin, true); + } + } + } + function coarsenTime(timestamp, crossOriginIsolatedCapability) { + return timestamp; + } + function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { + if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { + return { + domainLookupStartTime: defaultStartTime, + domainLookupEndTime: defaultStartTime, + connectionStartTime: defaultStartTime, + connectionEndTime: defaultStartTime, + secureConnectionStartTime: defaultStartTime, + ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol + }; + } + return { + domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability), + domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability), + connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability), + connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability), + secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability), + ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol + }; + } + function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { + return coarsenTime(performance.now(), crossOriginIsolatedCapability); + } + function createOpaqueTimingInfo(timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + }; + } + function makePolicyContainer() { + return { + referrerPolicy: "strict-origin-when-cross-origin" + }; + } + function clonePolicyContainer(policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + }; + } + function determineRequestsReferrer(request) { + const policy = request.referrerPolicy; + assert3(policy); + let referrerSource = null; + if (request.referrer === "client") { + const globalOrigin = getGlobalOrigin(); + if (!globalOrigin || globalOrigin.origin === "null") { + return "no-referrer"; } + referrerSource = new URL(globalOrigin); + } else if (request.referrer instanceof URL) { + referrerSource = request.referrer; } - entries() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState], - "FormData", - "key+value", - "name", - "value" - ); - } - keys() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState], - "FormData", - "key", - "name", - "value" - ); - } - values() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState], - "FormData", - "value", - "name", - "value" - ); + let referrerURL = stripURLForReferrer(referrerSource); + const referrerOrigin = stripURLForReferrer(referrerSource, true); + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; } - /** - * @param {(value: string, key: string, self: FormData) => void} callbackFn - * @param {unknown} thisArg - */ - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError( - "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." - ); - } - for (const [key, value] of this) { - callbackFn.call(thisArg, value, key, this); + const areSameOrigin = sameOrigin(request, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); + switch (policy) { + case "origin": + return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); + case "unsafe-url": + return referrerURL; + case "same-origin": + return areSameOrigin ? referrerOrigin : "no-referrer"; + case "origin-when-cross-origin": + return areSameOrigin ? referrerURL : referrerOrigin; + case "strict-origin-when-cross-origin": { + const currentURL = requestCurrentURL(request); + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL; + } + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; } + case "strict-origin": + case "no-referrer-when-downgrade": + default: + return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; } - }; - FormData.prototype[Symbol.iterator] = FormData.prototype.entries; - Object.defineProperties(FormData.prototype, { - append: kEnumerableProperty, - delete: kEnumerableProperty, - get: kEnumerableProperty, - getAll: kEnumerableProperty, - has: kEnumerableProperty, - set: kEnumerableProperty, - entries: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, - [Symbol.toStringTag]: { - value: "FormData", - configurable: true + } + function stripURLForReferrer(url, originOnly) { + assert3(url instanceof URL); + url = new URL(url); + if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { + return "no-referrer"; } - }); - function makeEntry(name, value, filename) { - name = Buffer.from(name).toString("utf8"); - if (typeof value === "string") { - value = Buffer.from(value).toString("utf8"); - } else { - if (!isFileLike(value)) { - value = value instanceof Blob ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); - } - if (filename !== void 0) { - const options = { - type: value.type, - lastModified: value.lastModified - }; - value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options) : new FileLike(value, filename, options); - } + url.username = ""; + url.password = ""; + url.hash = ""; + if (originOnly) { + url.pathname = ""; + url.search = ""; } - return { name, value }; + return url; } - module2.exports = { FormData }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/body.js -var require_body = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/body.js"(exports, module2) { - "use strict"; - var Busboy = require_main(); - var util = require_util(); - var { - ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, - readableStreamClose, - createDeferredPromise, - fullyReadBody, - extractMimeType - } = require_util2(); - var { FormData } = require_formdata(); - var { kState } = require_symbols2(); - var { webidl } = require_webidl(); - var { Blob: Blob2, File: NativeFile } = require("node:buffer"); - var { kBodyUsed } = require_symbols(); - var assert3 = require("node:assert"); - var { isErrored } = require_util(); - var { isUint8Array, isArrayBuffer } = require("util/types"); - var { File: UndiciFile } = require_file(); - var { serializeAMimeType } = require_dataURL(); - var File = NativeFile ?? UndiciFile; - var textEncoder = new TextEncoder(); - var textDecoder = new TextDecoder(); - function extractBody(object, keepalive = false) { - let stream = null; - if (object instanceof ReadableStream) { - stream = object; - } else if (isBlobLike(object)) { - stream = object.stream(); - } else { - stream = new ReadableStream({ - async pull(controller) { - const buffer = typeof source === "string" ? textEncoder.encode(source) : source; - if (buffer.byteLength) { - controller.enqueue(buffer); - } - queueMicrotask(() => readableStreamClose(controller)); - }, - start() { - }, - type: "bytes" - }); - } - assert3(isReadableStreamLike(stream)); - let action = null; - let source = null; - let length = null; - let type = null; - if (typeof object === "string") { - source = object; - type = "text/plain;charset=UTF-8"; - } else if (object instanceof URLSearchParams) { - source = object.toString(); - type = "application/x-www-form-urlencoded;charset=UTF-8"; - } else if (isArrayBuffer(object)) { - source = new Uint8Array(object.slice()); - } else if (ArrayBuffer.isView(object)) { - source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); - } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, "0")}`; - const prefix = `--${boundary}\r -Content-Disposition: form-data`; - const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); - const blobParts = []; - const rn = new Uint8Array([13, 10]); - length = 0; - let hasUnknownSizeValue = false; - for (const [name, value] of object) { - if (typeof value === "string") { - const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r -\r -${normalizeLinefeeds(value)}\r -`); - blobParts.push(chunk2); - length += chunk2.byteLength; - } else { - const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r -Content-Type: ${value.type || "application/octet-stream"}\r -\r -`); - blobParts.push(chunk2, value, rn); - if (typeof value.size === "number") { - length += chunk2.byteLength + value.size + rn.byteLength; - } else { - hasUnknownSizeValue = true; - } - } - } - const chunk = textEncoder.encode(`--${boundary}--`); - blobParts.push(chunk); - length += chunk.byteLength; - if (hasUnknownSizeValue) { - length = null; - } - source = object; - action = async function* () { - for (const part of blobParts) { - if (part.stream) { - yield* part.stream(); - } else { - yield part; - } - } - }; - type = `multipart/form-data; boundary=${boundary}`; - } else if (isBlobLike(object)) { - source = object; - length = object.size; - if (object.type) { - type = object.type; - } - } else if (typeof object[Symbol.asyncIterator] === "function") { - if (keepalive) { - throw new TypeError("keepalive"); - } - if (util.isDisturbed(object) || object.locked) { - throw new TypeError( - "Response body object should not be disturbed or locked" - ); - } - stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); + function isURLPotentiallyTrustworthy(url) { + if (!(url instanceof URL)) { + return false; } - if (typeof source === "string" || util.isBuffer(source)) { - length = Buffer.byteLength(source); + if (url.href === "about:blank" || url.href === "about:srcdoc") { + return true; } - if (action != null) { - let iterator; - stream = new ReadableStream({ - async start() { - iterator = action(object)[Symbol.asyncIterator](); - }, - async pull(controller) { - const { value, done } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - controller.byobRequest?.respond(0); - }); - } else { - if (!isErrored(stream)) { - const buffer = new Uint8Array(value); - if (buffer.byteLength) { - controller.enqueue(buffer); - } - } - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - }, - type: "bytes" - }); + if (url.protocol === "data:") + return true; + if (url.protocol === "file:") + return true; + return isOriginPotentiallyTrustworthy(url.origin); + function isOriginPotentiallyTrustworthy(origin) { + if (origin == null || origin === "null") + return false; + const originAsURL = new URL(origin); + if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { + return true; + } + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { + return true; + } + return false; } - const body = { stream, source, length }; - return [body, type]; } - function safelyExtractBody(object, keepalive = false) { - if (object instanceof ReadableStream) { - assert3(!util.isDisturbed(object), "The body has already been consumed."); - assert3(!object.locked, "The stream is locked."); + function bytesMatch(bytes, metadataList) { + if (crypto === void 0) { + return true; } - return extractBody(object, keepalive); - } - function cloneBody(body) { - const [out1, out2] = body.stream.tee(); - const out2Clone = structuredClone(out2, { transfer: [out2] }); - const [, finalClone] = out2Clone.tee(); - body.stream = out1; - return { - stream: finalClone, - length: body.length, - source: body.source - }; - } - async function* consumeBody(body) { - if (body) { - if (isUint8Array(body)) { - yield body; - } else { - const stream = body.stream; - if (util.isDisturbed(stream)) { - throw new TypeError("The body has already been consumed."); - } - if (stream.locked) { - throw new TypeError("The stream is locked."); + const parsedMetadata = parseMetadata(metadataList); + if (parsedMetadata === "no metadata") { + return true; + } + if (parsedMetadata.length === 0) { + return true; + } + const strongest = getStrongestMetadata(parsedMetadata); + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + for (const item of metadata) { + const algorithm = item.algo; + const expectedValue = item.hash; + let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); + if (actualValue[actualValue.length - 1] === "=") { + if (actualValue[actualValue.length - 2] === "=") { + actualValue = actualValue.slice(0, -2); + } else { + actualValue = actualValue.slice(0, -1); } - stream[kBodyUsed] = true; - yield* stream; + } + if (compareBase64Mixed(actualValue, expectedValue)) { + return true; } } + return false; } - function throwIfAborted(state) { - if (state.aborted) { - throw new DOMException("The operation was aborted.", "AbortError"); + var parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; + function parseMetadata(metadata) { + const result = []; + let empty = true; + for (const token of metadata.split(" ")) { + empty = false; + const parsedToken = parseHashWithOptions.exec(token); + if (parsedToken === null || parsedToken.groups === void 0 || parsedToken.groups.algo === void 0) { + continue; + } + const algorithm = parsedToken.groups.algo.toLowerCase(); + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups); + } } + if (empty === true) { + return "no metadata"; + } + return result; } - function bodyMixinMethods(instance) { - const methods = { - blob() { - return specConsumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this); - if (mimeType === null) { - mimeType = ""; - } else if (mimeType) { - mimeType = serializeAMimeType(mimeType); - } - return new Blob2([bytes], { type: mimeType }); - }, instance); - }, - arrayBuffer() { - return specConsumeBody(this, (bytes) => { - return new Uint8Array(bytes).buffer; - }, instance); - }, - text() { - return specConsumeBody(this, utf8DecodeBytes, instance); - }, - json() { - return specConsumeBody(this, parseJSONFromBytes, instance); - }, - async formData() { - webidl.brandCheck(this, instance); - throwIfAborted(this[kState]); - const mimeType = bodyMimeType(this); - if (mimeType !== null && mimeType.essence === "multipart/form-data") { - const headers = {}; - for (const [key, value] of this.headers) - headers[key] = value; - const responseFormData = new FormData(); - let busboy; - try { - busboy = new Busboy({ - headers, - preservePath: true - }); - } catch (err) { - throw new DOMException(`${err}`, "AbortError"); - } - busboy.on("field", (name, value) => { - responseFormData.append(name, value); - }); - busboy.on("file", (name, value, filename, encoding, mimeType2) => { - const chunks = []; - if (encoding === "base64" || encoding.toLowerCase() === "base64") { - let base64chunk = ""; - value.on("data", (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); - const end = base64chunk.length - base64chunk.length % 4; - chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); - base64chunk = base64chunk.slice(end); - }); - value.on("end", () => { - chunks.push(Buffer.from(base64chunk, "base64")); - responseFormData.append(name, new File(chunks, filename, { type: mimeType2 })); - }); - } else { - value.on("data", (chunk) => { - chunks.push(chunk); - }); - value.on("end", () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType2 })); - }); - } - }); - const busboyResolve = new Promise((resolve, reject) => { - busboy.on("finish", resolve); - busboy.on("error", (err) => reject(new TypeError(err))); - }); - if (this.body !== null) - for await (const chunk of consumeBody(this[kState].body)) - busboy.write(chunk); - busboy.end(); - await busboyResolve; - return responseFormData; - } else if (mimeType !== null && mimeType.essence === "application/x-www-form-urlencoded") { - let entries; - try { - let text = ""; - const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError("Expected Uint8Array chunk"); - } - text += streamingDecoder.decode(chunk, { stream: true }); - } - text += streamingDecoder.decode(); - entries = new URLSearchParams(text); - } catch (err) { - throw new TypeError(void 0, { cause: err }); - } - const formData = new FormData(); - for (const [name, value] of entries) { - formData.append(name, value); - } - return formData; - } else { - await Promise.resolve(); - throwIfAborted(this[kState]); - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: "Could not parse content as FormData." - }); - } + function getStrongestMetadata(metadataList) { + let algorithm = metadataList[0].algo; + if (algorithm[3] === "5") { + return algorithm; + } + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i]; + if (metadata.algo[3] === "5") { + algorithm = "sha512"; + break; + } else if (algorithm[3] === "3") { + continue; + } else if (metadata.algo[3] === "3") { + algorithm = "sha384"; } - }; - return methods; + } + return algorithm; } - function mixinBody(prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + function filterMetadataListByAlgorithm(metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList; + } + let pos = 0; + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i]; + } + } + metadataList.length = pos; + return metadataList; } - async function specConsumeBody(object, convertBytesToJSValue, instance) { - webidl.brandCheck(object, instance); - throwIfAborted(object[kState]); - if (bodyUnusable(object[kState].body)) { - throw new TypeError("Body is unusable"); + function compareBase64Mixed(actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false; } - const promise = createDeferredPromise(); - const errorSteps = (error) => promise.reject(error); - const successSteps = (data) => { - try { - promise.resolve(convertBytesToJSValue(data)); - } catch (e) { - errorSteps(e); + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if (actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { + continue; + } + return false; } - }; - if (object[kState].body == null) { - successSteps(new Uint8Array()); - return promise.promise; } - await fullyReadBody(object[kState].body, successSteps, errorSteps); - return promise.promise; + return true; } - function bodyUnusable(body) { - return body != null && (body.stream.locked || util.isDisturbed(body.stream)); + function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { } - function utf8DecodeBytes(buffer) { - if (buffer.length === 0) { - return ""; + function sameOrigin(A, B) { + if (A.origin === B.origin && A.origin === "null") { + return true; } - if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { - buffer = buffer.subarray(3); + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true; } - const output = textDecoder.decode(buffer); - return output; + return false; } - function parseJSONFromBytes(bytes) { - return JSON.parse(utf8DecodeBytes(bytes)); + function createDeferredPromise() { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + return { promise, resolve: res, reject: rej }; } - function bodyMimeType(requestOrResponse) { - const headers = requestOrResponse[kState].headersList; - const mimeType = extractMimeType(headers); - if (mimeType === "failure") { - return null; - } - return mimeType; + function isAborted(fetchParams) { + return fetchParams.controller.state === "aborted"; } - module2.exports = { - extractBody, - safelyExtractBody, - cloneBody, - mixinBody - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/request.js -var require_request = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/request.js"(exports, module2) { - "use strict"; - var { - InvalidArgumentError, - NotSupportedError - } = require_errors(); - var assert3 = require("node:assert"); - var { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require_symbols(); - var util = require_util(); - var { channels } = require_diagnostics(); - var { headerNameLowerCasedRecord } = require_constants2(); - var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - var invalidPathRegex = /[^\u0021-\u00ff]/; - var kHandler = Symbol("handler"); - var extractBody; - var Request = class _Request { - constructor(origin, { - path: path10, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler) { - if (typeof path10 !== "string") { - throw new InvalidArgumentError("path must be a string"); - } else if (path10[0] !== "/" && !(path10.startsWith("http://") || path10.startsWith("https://")) && method !== "CONNECT") { - throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); - } else if (invalidPathRegex.exec(path10) !== null) { - throw new InvalidArgumentError("invalid request path"); - } - if (typeof method !== "string") { - throw new InvalidArgumentError("method must be a string"); - } else if (!util.isValidHTTPToken(method)) { - throw new InvalidArgumentError("invalid request method"); - } - if (upgrade && typeof upgrade !== "string") { - throw new InvalidArgumentError("upgrade must be a string"); - } - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("invalid headersTimeout"); - } - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("invalid bodyTimeout"); - } - if (reset != null && typeof reset !== "boolean") { - throw new InvalidArgumentError("invalid reset"); - } - if (expectContinue != null && typeof expectContinue !== "boolean") { - throw new InvalidArgumentError("invalid expectContinue"); - } - this.headersTimeout = headersTimeout; - this.bodyTimeout = bodyTimeout; - this.throwOnError = throwOnError === true; - this.method = method; - this.abort = null; - if (body == null) { - this.body = null; - } else if (util.isStream(body)) { - this.body = body; - const rState = this.body._readableState; - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy() { - util.destroy(this); + function isCancelled(fetchParams) { + return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; + } + var normalizeMethodRecordBase = { + delete: "DELETE", + DELETE: "DELETE", + get: "GET", + GET: "GET", + head: "HEAD", + HEAD: "HEAD", + options: "OPTIONS", + OPTIONS: "OPTIONS", + post: "POST", + POST: "POST", + put: "PUT", + PUT: "PUT" + }; + var normalizeMethodRecord = { + ...normalizeMethodRecordBase, + patch: "patch", + PATCH: "PATCH" + }; + Object.setPrototypeOf(normalizeMethodRecordBase, null); + Object.setPrototypeOf(normalizeMethodRecord, null); + function normalizeMethod(method) { + return normalizeMethodRecordBase[method.toLowerCase()] ?? method; + } + function serializeJavascriptValueToJSONString(value) { + const result = JSON.stringify(value); + if (result === void 0) { + throw new TypeError("Value is not JSON serializable"); + } + assert3(typeof result === "string"); + return result; + } + var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + function createIterator(name, kInternalIterator, keyIndex = 0, valueIndex = 1) { + class FastIterableIterator { + /** @type {any} */ + #target; + /** @type {'key' | 'value' | 'key+value'} */ + #kind; + /** @type {number} */ + #index; + /** + * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + */ + constructor(target, kind) { + this.#target = target; + this.#kind = kind; + this.#index = 0; + } + next() { + if (typeof this !== "object" || this === null || !(#target in this)) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ); + } + const index = this.#index; + const values = this.#target[kInternalIterator]; + const len = values.length; + if (index >= len) { + return { + value: void 0, + done: true }; - this.body.on("end", this.endHandler); } - this.errorHandler = (err) => { - if (this.abort) { - this.abort(err); - } else { - this.error = err; - } + const { [keyIndex]: key, [valueIndex]: value } = values[index]; + this.#index = index + 1; + let result; + switch (this.#kind) { + case "key": + result = key; + break; + case "value": + result = value; + break; + case "key+value": + result = [key, value]; + break; + } + return { + value: result, + done: false }; - this.body.on("error", this.errorHandler); - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null; - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null; - } else if (typeof body === "string") { - this.body = body.length ? Buffer.from(body) : null; - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body; - } else { - throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); } - this.completed = false; - this.aborted = false; - this.upgrade = upgrade || null; - this.path = query ? util.buildURL(path10, query) : path10; - this.origin = origin; - this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; - this.blocking = blocking == null ? false : blocking; - this.reset = reset == null ? null : reset; - this.host = null; - this.contentLength = null; - this.contentType = null; - this.headers = ""; - this.expectContinue = expectContinue != null ? expectContinue : false; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]); + } + delete FastIterableIterator.prototype.constructor; + Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype); + Object.defineProperties(FastIterableIterator.prototype, { + [Symbol.toStringTag]: { + writable: false, + enumerable: false, + configurable: true, + value: `${name} Iterator` + }, + next: { writable: true, enumerable: true, configurable: true } + }); + return function(target, kind) { + return new FastIterableIterator(target, kind); + }; + } + function iteratorMixin(name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) { + const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex); + const properties = { + keys: { + writable: true, + enumerable: true, + configurable: true, + value: function keys() { + webidl.brandCheck(this, object); + return makeIterator(this, "key"); } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(this, key, headers[key]); + }, + values: { + writable: true, + enumerable: true, + configurable: true, + value: function values() { + webidl.brandCheck(this, object); + return makeIterator(this, "value"); } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - if (util.isFormDataLike(this.body)) { - if (!extractBody) { - extractBody = require_body().extractBody; + }, + entries: { + writable: true, + enumerable: true, + configurable: true, + value: function entries() { + webidl.brandCheck(this, object); + return makeIterator(this, "key+value"); } - const [bodyStream, contentType] = extractBody(body); - if (this.contentType == null) { - this.contentType = contentType; - this.headers += `content-type: ${contentType}\r -`; + }, + forEach: { + writable: true, + enumerable: true, + configurable: true, + value: function forEach(callbackfn, thisArg = globalThis) { + webidl.brandCheck(this, object); + webidl.argumentLengthCheck(arguments, 1, { header: `${name}.forEach` }); + if (typeof callbackfn !== "function") { + throw new TypeError( + `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.` + ); + } + for (const { 0: key, 1: value } of makeIterator(this, "key+value")) { + callbackfn.call(thisArg, value, key, this); + } } - this.body = bodyStream.stream; - this.contentLength = bodyStream.length; - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type; - this.headers += `content-type: ${body.type}\r -`; } - util.validateHandler(handler, method, upgrade); - this.servername = util.getServerName(this.host); - this[kHandler] = handler; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); + }; + return Object.defineProperties(object.prototype, { + ...properties, + [Symbol.iterator]: { + writable: true, + enumerable: false, + configurable: true, + value: properties.entries.value + } + }); + } + async function fullyReadBody(body, processBody, processBodyError) { + const successSteps = processBody; + const errorSteps = processBodyError; + let reader; + try { + reader = body.stream.getReader(); + } catch (e) { + errorSteps(e); + return; + } + try { + const result = await readAllBytes(reader); + successSteps(result); + } catch (e) { + errorSteps(e); + } + } + function isReadableStreamLike(stream) { + return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; + } + function readableStreamClose(controller) { + try { + controller.close(); + controller.byobRequest?.respond(0); + } catch (err) { + if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) { + throw err; } } - onBodySent(chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk); - } catch (err) { - this.abort(err); - } + } + function isomorphicEncode(input) { + for (let i = 0; i < input.length; i++) { + assert3(input.charCodeAt(i) <= 255); + } + return input; + } + async function readAllBytes(reader) { + const bytes = []; + let byteLength = 0; + while (true) { + const { done, value: chunk } = await reader.read(); + if (done) { + return Buffer.concat(bytes, byteLength); + } + if (!isUint8Array(chunk)) { + throw new TypeError("Received non-Uint8Array chunk"); } + bytes.push(chunk); + byteLength += chunk.length; + } + } + function urlIsLocal(url) { + assert3("protocol" in url); + const protocol = url.protocol; + return protocol === "about:" || protocol === "blob:" || protocol === "data:"; + } + function urlHasHttpsScheme(url) { + return typeof url === "string" && url[5] === ":" && url[0] === "h" && url[1] === "t" && url[2] === "t" && url[3] === "p" && url[4] === "s" || url.protocol === "https:"; + } + function urlIsHttpHttpsScheme(url) { + assert3("protocol" in url); + const protocol = url.protocol; + return protocol === "http:" || protocol === "https:"; + } + function simpleRangeHeaderValue(value, allowWhitespace) { + const data = value; + if (!data.startsWith("bytes")) { + return "failure"; + } + const position = { position: 5 }; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + if (data.charCodeAt(position.position) !== 61) { + return "failure"; + } + position.position++; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + const rangeStart = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + return code >= 48 && code <= 57; + }, + data, + position + ); + const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + if (data.charCodeAt(position.position) !== 45) { + return "failure"; + } + position.position++; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + const rangeEnd = collectASequenceOfCodePoints( + (char) => { + const code = char.charCodeAt(0); + return code >= 48 && code <= 57; + }, + data, + position + ); + const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; + if (position.position < data.length) { + return "failure"; + } + if (rangeEndValue === null && rangeStartValue === null) { + return "failure"; } - onRequestSent() { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); - } - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent(); - } catch (err) { - this.abort(err); + if (rangeStartValue > rangeEndValue) { + return "failure"; + } + return { rangeStartValue, rangeEndValue }; + } + function buildContentRange(rangeStart, rangeEnd, fullLength) { + let contentRange = "bytes "; + contentRange += isomorphicEncode(`${rangeStart}`); + contentRange += "-"; + contentRange += isomorphicEncode(`${rangeEnd}`); + contentRange += "/"; + contentRange += isomorphicEncode(`${fullLength}`); + return contentRange; + } + var InflateStream = class extends Transform { + _transform(chunk, encoding, callback) { + if (!this._inflateStream) { + if (chunk.length === 0) { + callback(); + return; } + this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate() : zlib.createInflateRaw(); + this._inflateStream.on("data", this.push.bind(this)); + this._inflateStream.on("end", () => this.push(null)); + this._inflateStream.on("error", (err) => this.destroy(err)); } + this._inflateStream.write(chunk, encoding, callback); } - onConnect(abort) { - assert3(!this.aborted); - assert3(!this.completed); - if (this.error) { - abort(this.error); - } else { - this.abort = abort; - return this[kHandler].onConnect(abort); + _final(callback) { + if (this._inflateStream) { + this._inflateStream.end(); + this._inflateStream = null; } + callback(); } - onResponseStarted() { - return this[kHandler].onResponseStarted?.(); + }; + function createInflate() { + return new InflateStream(); + } + function extractMimeType(headers) { + let charset = null; + let essence = null; + let mimeType = null; + const values = getDecodeSplit("content-type", headers); + if (values === null) { + return "failure"; } - onHeaders(statusCode, headers, resume, statusText) { - assert3(!this.aborted); - assert3(!this.completed); - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + for (const value of values) { + const temporaryMimeType = parseMIMEType(value); + if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") { + continue; } - try { - return this[kHandler].onHeaders(statusCode, headers, resume, statusText); - } catch (err) { - this.abort(err); + mimeType = temporaryMimeType; + if (mimeType.essence !== essence) { + charset = null; + if (mimeType.parameters.has("charset")) { + charset = mimeType.parameters.get("charset"); + } + essence = mimeType.essence; + } else if (!mimeType.parameters.has("charset") && charset !== null) { + mimeType.parameters.set("charset", charset); } } - onData(chunk) { - assert3(!this.aborted); - assert3(!this.completed); - try { - return this[kHandler].onData(chunk); - } catch (err) { - this.abort(err); - return false; + if (mimeType == null) { + return "failure"; + } + return mimeType; + } + function gettingDecodingSplitting(value) { + const input = value; + const position = { position: 0 }; + const values = []; + let temporaryValue = ""; + while (position.position < input.length) { + temporaryValue += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== ",", + input, + position + ); + if (position.position < input.length) { + if (input.charCodeAt(position.position) === 34) { + temporaryValue += collectAnHTTPQuotedString( + input, + position + ); + if (position.position < input.length) { + continue; + } + } else { + assert3(input.charCodeAt(position.position) === 44); + position.position++; + } } + temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32); + values.push(temporaryValue); + temporaryValue = ""; } - onUpgrade(statusCode, headers, socket) { - assert3(!this.aborted); - assert3(!this.completed); - return this[kHandler].onUpgrade(statusCode, headers, socket); + return values; + } + function getDecodeSplit(name, list) { + const value = list.get(name, true); + if (value === null) { + return null; } - onComplete(trailers) { - this.onFinally(); - assert3(!this.aborted); - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } - try { - return this[kHandler].onComplete(trailers); - } catch (err) { - this.onError(err); - } + return gettingDecodingSplitting(value); + } + var textDecoder = new TextDecoder(); + function utf8DecodeBytes(buffer) { + if (buffer.length === 0) { + return ""; } - onError(error) { - this.onFinally(); - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }); - } - if (this.aborted) { - return; - } - this.aborted = true; - return this[kHandler].onError(error); + if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { + buffer = buffer.subarray(3); } - onFinally() { - if (this.errorHandler) { - this.body.off("error", this.errorHandler); - this.errorHandler = null; - } - if (this.endHandler) { - this.body.off("end", this.endHandler); - this.endHandler = null; + const output = textDecoder.decode(buffer); + return output; + } + module2.exports = { + isAborted, + isCancelled, + isValidEncodedURL, + createDeferredPromise, + ReadableStreamFrom, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + clampAndCoarsenConnectionTimingInfo, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + iteratorMixin, + createIterator, + isValidHeaderName, + isValidHeaderValue, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + normalizeMethodRecord, + simpleRangeHeaderValue, + buildContentRange, + parseMetadata, + createInflate, + extractMimeType, + getDecodeSplit, + utf8DecodeBytes + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/symbols.js +var require_symbols2 = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/symbols.js"(exports, module2) { + "use strict"; + module2.exports = { + kUrl: Symbol("url"), + kHeaders: Symbol("headers"), + kSignal: Symbol("signal"), + kState: Symbol("state"), + kGuard: Symbol("guard"), + kRealm: Symbol("realm"), + kDispatcher: Symbol("dispatcher") + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/file.js +var require_file = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/file.js"(exports, module2) { + "use strict"; + var { EOL } = require("node:os"); + var { Blob: Blob2, File: NativeFile } = require("node:buffer"); + var { types } = require("node:util"); + var { kState } = require_symbols2(); + var { isBlobLike } = require_util3(); + var { webidl } = require_webidl(); + var { parseMIMEType, serializeAMimeType } = require_data_url(); + var { kEnumerableProperty } = require_util(); + var encoder = new TextEncoder(); + var File = class _File extends Blob2 { + constructor(fileBits, fileName, options = {}) { + webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); + fileBits = webidl.converters["sequence"](fileBits); + fileName = webidl.converters.USVString(fileName); + options = webidl.converters.FilePropertyBag(options); + const n = fileName; + let t = options.type; + let d; + substep: { + if (t) { + t = parseMIMEType(t); + if (t === "failure") { + t = ""; + break substep; + } + t = serializeAMimeType(t).toLowerCase(); + } + d = options.lastModified; } + super(processBlobParts(fileBits, options), { type: t }); + this[kState] = { + name: n, + lastModified: d, + type: t + }; } - // TODO: adjust to support H2 - addHeader(key, value) { - processHeader(this, key, value); - return this; - } - static [kHTTP1BuildRequest](origin, opts, handler) { - return new _Request(origin, opts, handler); + get name() { + webidl.brandCheck(this, _File); + return this[kState].name; } - static [kHTTP2BuildRequest](origin, opts, handler) { - const headers = opts.headers; - opts = { ...opts, headers: null }; - const request = new _Request(origin, opts, handler); - request.headers = {}; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(request, headers[i], headers[i + 1], true); - } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(request, key, headers[key], true); - } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - return request; + get lastModified() { + webidl.brandCheck(this, _File); + return this[kState].lastModified; } - static [kHTTP2CopyHeaders](raw) { - const rawHeaders = raw.split("\r\n"); - const headers = {}; - for (const header of rawHeaders) { - const [key, value] = header.split(": "); - if (value == null || value.length === 0) - continue; - if (headers[key]) { - headers[key] += `,${value}`; - } else { - headers[key] = value; - } - } - return headers; + get type() { + webidl.brandCheck(this, _File); + return this[kState].type; } }; - function processHeaderValue(key, val, skipAppend) { - if (val && typeof val === "object") { - throw new InvalidArgumentError(`invalid ${key} header`); + var FileLike = class _FileLike { + constructor(blobLike, fileName, options = {}) { + const n = fileName; + const t = options.type; + const d = options.lastModified ?? Date.now(); + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d + }; } - val = val != null ? `${val}` : ""; - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); + stream(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.stream(...args); } - return skipAppend ? val : `${key}: ${val}\r -`; - } - function processHeader(request, key, val, skipAppend = false) { - if (val && (typeof val === "object" && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`); - } else if (val === void 0) { - return; + arrayBuffer(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.arrayBuffer(...args); } - let headerName = headerNameLowerCasedRecord[key]; - if (headerName === void 0) { - headerName = key.toLowerCase(); - if (headerNameLowerCasedRecord[headerName] === void 0 && !util.isValidHTTPToken(headerName)) { - throw new InvalidArgumentError("invalid header key"); - } + slice(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.slice(...args); } - if (request.host === null && headerName === "host") { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - request.host = val; - } else if (request.contentLength === null && headerName === "content-length") { - request.contentLength = parseInt(val, 10); - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError("invalid content-length header"); - } - } else if (request.contentType === null && headerName === "content-type") { - request.contentType = val; - if (skipAppend) - request.headers[key] = processHeaderValue(key, val, skipAppend); - else - request.headers += processHeaderValue(key, val); - } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") { - throw new InvalidArgumentError(`invalid ${headerName} header`); - } else if (headerName === "connection") { - const value = typeof val === "string" ? val.toLowerCase() : null; - if (value !== "close" && value !== "keep-alive") { - throw new InvalidArgumentError("invalid connection header"); - } else if (value === "close") { - request.reset = true; - } - } else if (headerName === "expect") { - throw new NotSupportedError("expect header not supported"); - } else if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (skipAppend) { - if (request.headers[key]) { - request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`; - } else { - request.headers[key] = processHeaderValue(key, val[i], skipAppend); - } - } else { - request.headers += processHeaderValue(key, val[i]); - } - } - } else if (skipAppend) { - request.headers[key] = processHeaderValue(key, val, skipAppend); - } else { - request.headers += processHeaderValue(key, val); + text(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.text(...args); } - } - module2.exports = Request; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/connect.js -var require_connect = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/connect.js"(exports, module2) { - "use strict"; - var net = require("node:net"); - var assert3 = require("node:assert"); - var util = require_util(); - var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); - var tls; - var SessionCache; - if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { - SessionCache = class WeakSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); - this._sessionRegistry = new global.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return; - } - const ref = this._sessionCache.get(key); - if (ref !== void 0 && ref.deref() === void 0) { - this._sessionCache.delete(key); - } - }); - } - get(sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null; - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } - }; - } else { - SessionCache = class SimpleSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); - } - get(sessionKey) { - return this._sessionCache.get(sessionKey); - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - if (this._sessionCache.size >= this._maxCachedSessions) { - const { value: oldestKey } = this._sessionCache.keys().next(); - this._sessionCache.delete(oldestKey); - } - this._sessionCache.set(sessionKey, session); - } - }; - } - function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); + get size() { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.size; } - const options = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 1e4 : timeout; - allowH2 = allowH2 != null ? allowH2 : false; - return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === "https:") { - if (!tls) { - tls = require("node:tls"); - } - servername = servername || options.servername || util.getServerName(host) || null; - const sessionKey = servername || hostname; - const session = sessionCache.get(sessionKey) || null; - assert3(sessionKey); - socket = tls.connect({ - highWaterMark: 16384, - // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - // TODO(HTTP/2): Add support for h2c - ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], - socket: httpSocket, - // upgrade socket connection - port: port || 443, - host: hostname - }); - socket.on("session", function(session2) { - sessionCache.set(sessionKey, session2); - }); - } else { - assert3(!httpSocket, "httpSocket can only be sent on TLS update"); - socket = net.connect({ - highWaterMark: 64 * 1024, - // Same as nodejs fs streams. - ...options, - localAddress, - port: port || 80, - host: hostname - }); - } - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); - } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); - socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }).on("error", function(err) { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); - return socket; - }; - } - function setupTimeout(onConnectTimeout2, timeout) { - if (!timeout) { - return () => { - }; + get type() { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.type; + } + get name() { + webidl.brandCheck(this, _FileLike); + return this[kState].name; + } + get lastModified() { + webidl.brandCheck(this, _FileLike); + return this[kState].lastModified; + } + get [Symbol.toStringTag]() { + return "File"; } - let s1 = null; - let s2 = null; - const timeoutId = setTimeout(() => { - s1 = setImmediate(() => { - if (process.platform === "win32") { - s2 = setImmediate(() => onConnectTimeout2()); - } else { - onConnectTimeout2(); - } - }); - }, timeout); - return () => { - clearTimeout(timeoutId); - clearImmediate(s1); - clearImmediate(s2); - }; - } - function onConnectTimeout(socket) { - let message = "Connect Timeout Error"; - if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { - message = +` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")})`; + }; + Object.defineProperties(File.prototype, { + [Symbol.toStringTag]: { + value: "File", + configurable: true + }, + name: kEnumerableProperty, + lastModified: kEnumerableProperty + }); + webidl.converters.Blob = webidl.interfaceConverter(Blob2); + webidl.converters.BlobPart = function(V, opts) { + if (webidl.util.Type(V) === "Object") { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V, opts); + } } - util.destroy(socket, new ConnectTimeoutError(message)); - } - module2.exports = buildConnector; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/utils.js -var require_utils = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/utils.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.enumToMap = void 0; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === "number") { - res[key] = value; + return webidl.converters.USVString(V, opts); + }; + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.BlobPart + ); + webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ + { + key: "lastModified", + converter: webidl.converters["long long"], + get defaultValue() { + return Date.now(); } - }); - return res; - } - exports.enumToMap = enumToMap; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/constants.js -var require_constants4 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; - var utils_1 = require_utils(); - var ERROR; - (function(ERROR2) { - ERROR2[ERROR2["OK"] = 0] = "OK"; - ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; - ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; - ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; - ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR2[ERROR2["USER"] = 24] = "USER"; - })(ERROR = exports.ERROR || (exports.ERROR = {})); - var TYPE; - (function(TYPE2) { - TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; - TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; - TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; - })(TYPE = exports.TYPE || (exports.TYPE = {})); - var FLAGS; - (function(FLAGS2) { - FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; - FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; - FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; - FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(FLAGS = exports.FLAGS || (exports.FLAGS = {})); - var LENIENT_FLAGS; - (function(LENIENT_FLAGS2) { - LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); - var METHODS; - (function(METHODS2) { - METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; - METHODS2[METHODS2["GET"] = 1] = "GET"; - METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; - METHODS2[METHODS2["POST"] = 3] = "POST"; - METHODS2[METHODS2["PUT"] = 4] = "PUT"; - METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; - METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; - METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; - METHODS2[METHODS2["COPY"] = 8] = "COPY"; - METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; - METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; - METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; - METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; - METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; - METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; - METHODS2[METHODS2["BIND"] = 16] = "BIND"; - METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; - METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; - METHODS2[METHODS2["ACL"] = 19] = "ACL"; - METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; - METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; - METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; - METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; - METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; - METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; - METHODS2[METHODS2["LINK"] = 31] = "LINK"; - METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; - METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; - METHODS2[METHODS2["PRI"] = 34] = "PRI"; - METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; - METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; - METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; - METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; - METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; - METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports.METHODS || (exports.METHODS = {})); - exports.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS["M-SEARCH"], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE - ]; - exports.METHODS_ICE = [ - METHODS.SOURCE - ]; - exports.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - // For AirPlay - METHODS.GET, - METHODS.POST - ]; - exports.METHOD_MAP = utils_1.enumToMap(METHODS); - exports.H_METHOD_MAP = {}; - Object.keys(exports.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; + }, + { + key: "type", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "endings", + converter: (value) => { + value = webidl.converters.DOMString(value); + value = value.toLowerCase(); + if (value !== "native") { + value = "transparent"; + } + return value; + }, + defaultValue: "transparent" } - }); - var FINISH; - (function(FINISH2) { - FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; - FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; - })(FINISH = exports.FINISH || (exports.FINISH = {})); - exports.ALPHA = []; - for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { - exports.ALPHA.push(String.fromCharCode(i)); - exports.ALPHA.push(String.fromCharCode(i + 32)); + ]); + function processBlobParts(parts, options) { + const bytes = []; + for (const element of parts) { + if (typeof element === "string") { + let s = element; + if (options.endings === "native") { + s = convertLineEndingsNative(s); + } + bytes.push(encoder.encode(s)); + } else if (ArrayBuffer.isView(element) || types.isArrayBuffer(element)) { + if (element.buffer) { + bytes.push( + new Uint8Array(element.buffer, element.byteOffset, element.byteLength) + ); + } else { + bytes.push(new Uint8Array(element)); + } + } else if (isBlobLike(element)) { + bytes.push(element); + } + } + return bytes; } - exports.NUM_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9 - }; - exports.HEX_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - A: 10, - B: 11, - C: 12, - D: 13, - E: 14, - F: 15, - a: 10, - b: 11, - c: 12, - d: 13, - e: 14, - f: 15 - }; - exports.NUM = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ]; - exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); - exports.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; - exports.USERINFO_CHARS = exports.ALPHANUM.concat(exports.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); - exports.STRICT_URL_CHAR = [ - "!", - '"', - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - ":", - ";", - "<", - "=", - ">", - "@", - "[", - "\\", - "]", - "^", - "_", - "`", - "{", - "|", - "}", - "~" - ].concat(exports.ALPHANUM); - exports.URL_CHAR = exports.STRICT_URL_CHAR.concat([" ", "\f"]); - for (let i = 128; i <= 255; i++) { - exports.URL_CHAR.push(i); + function convertLineEndingsNative(s) { + return s.replace(/\r?\n/g, EOL); } - exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); - exports.STRICT_TOKEN = [ - "!", - "#", - "$", - "%", - "&", - "'", - "*", - "+", - "-", - ".", - "^", - "_", - "`", - "|", - "~" - ].concat(exports.ALPHANUM); - exports.TOKEN = exports.STRICT_TOKEN.concat([" "]); - exports.HEADER_CHARS = [" "]; - for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports.HEADER_CHARS.push(i); + function isFileLike(object) { + return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; + } + module2.exports = { File, FileLike, isFileLike }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/formdata.js +var require_formdata = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/formdata.js"(exports, module2) { + "use strict"; + var { isBlobLike, iteratorMixin } = require_util3(); + var { kState } = require_symbols2(); + var { kEnumerableProperty } = require_util(); + var { File: UndiciFile, FileLike, isFileLike } = require_file(); + var { webidl } = require_webidl(); + var { File: NativeFile } = require("node:buffer"); + var nodeUtil = require("node:util"); + var File = NativeFile ?? UndiciFile; + var FormData = class _FormData { + constructor(form) { + if (form !== void 0) { + throw webidl.errors.conversionFailed({ + prefix: "FormData constructor", + argument: "Argument 1", + types: ["undefined"] + }); + } + this[kState] = []; + } + append(name, value, filename = void 0) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + ); + } + name = webidl.converters.USVString(name); + value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); + filename = arguments.length === 3 ? webidl.converters.USVString(filename) : void 0; + const entry = makeEntry(name, value, filename); + this[kState].push(entry); + } + delete(name) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); + name = webidl.converters.USVString(name); + this[kState] = this[kState].filter((entry) => entry.name !== name); + } + get(name) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); + name = webidl.converters.USVString(name); + const idx = this[kState].findIndex((entry) => entry.name === name); + if (idx === -1) { + return null; + } + return this[kState][idx].value; + } + getAll(name) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); + name = webidl.converters.USVString(name); + return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); + } + has(name) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); + name = webidl.converters.USVString(name); + return this[kState].findIndex((entry) => entry.name === name) !== -1; + } + set(name, value, filename = void 0) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" + ); + } + name = webidl.converters.USVString(name); + value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); + filename = arguments.length === 3 ? webidl.converters.USVString(filename) : void 0; + const entry = makeEntry(name, value, filename); + const idx = this[kState].findIndex((entry2) => entry2.name === name); + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) + ]; + } else { + this[kState].push(entry); + } + } + [nodeUtil.inspect.custom](depth, options) { + const state = this[kState].reduce((a, b) => { + if (a[b.name]) { + if (Array.isArray(a[b.name])) { + a[b.name].push(b.value); + } else { + a[b.name] = [a[b.name], b.value]; + } + } else { + a[b.name] = b.value; + } + return a; + }, { __proto__: null }); + options.depth ??= depth; + options.colors ??= true; + const output = nodeUtil.formatWithOptions(options, state); + return `FormData ${output.slice(output.indexOf("]") + 2)}`; + } + }; + iteratorMixin("FormData", FormData, kState, "name", "value"); + Object.defineProperties(FormData.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + getAll: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "FormData", + configurable: true + } + }); + function makeEntry(name, value, filename) { + if (typeof value === "string") { + } else { + if (!isFileLike(value)) { + value = value instanceof Blob ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); + } + if (filename !== void 0) { + const options = { + type: value.type, + lastModified: value.lastModified + }; + value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options) : new FileLike(value, filename, options); + } } + return { name, value }; } - exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); - exports.MAJOR = exports.NUM_MAP; - exports.MINOR = exports.MAJOR; - var HEADER_STATE; - (function(HEADER_STATE2) { - HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); - exports.SPECIAL_HEADERS = { - "connection": HEADER_STATE.CONNECTION, - "content-length": HEADER_STATE.CONTENT_LENGTH, - "proxy-connection": HEADER_STATE.CONNECTION, - "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, - "upgrade": HEADER_STATE.UPGRADE - }; + module2.exports = { FormData, makeEntry }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/handler/RedirectHandler.js -var require_RedirectHandler = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/handler/RedirectHandler.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js +var require_formdata_parser = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js"(exports, module2) { "use strict"; - var util = require_util(); - var { kBodyUsed } = require_symbols(); + var { isUSVString, bufferToLowerCasedHeaderName } = require_util(); + var { utf8DecodeBytes } = require_util3(); + var { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = require_data_url(); + var { isFileLike, File: UndiciFile } = require_file(); + var { makeEntry } = require_formdata(); var assert3 = require("node:assert"); - var { InvalidArgumentError } = require_errors(); - var EE = require("node:events"); - var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - var kBody = Symbol("body"); - var BodyAsyncIterable = class { - constructor(body) { - this[kBody] = body; - this[kBodyUsed] = false; + var { File: NodeFile } = require("node:buffer"); + var File = globalThis.File ?? NodeFile ?? UndiciFile; + var formDataNameBuffer = Buffer.from('form-data; name="'); + var filenameBuffer = Buffer.from("; filename"); + var dd = Buffer.from("--"); + var ddcrlf = Buffer.from("--\r\n"); + function isAsciiString(chars) { + for (let i = 0; i < chars.length; ++i) { + if ((chars.charCodeAt(i) & ~127) !== 0) { + return false; + } } - async *[Symbol.asyncIterator]() { - assert3(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; + return true; + } + function validateBoundary(boundary) { + const length = boundary.length; + if (length < 27 || length > 70) { + return false; } - }; - var RedirectHandler = class { - constructor(dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + for (let i = 0; i < length; ++i) { + const cp = boundary.charCodeAt(i); + if (!(cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 39 || cp === 45 || cp === 95)) { + return false; } - util.validateHandler(handler, opts.method, opts.upgrade); - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; - this.maxRedirections = maxRedirections; - this.handler = handler; - this.history = []; - this.redirectionLimitReached = false; - if (util.isStream(this.opts.body)) { - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body.on("data", function() { - assert3(false); - }); + } + return true; + } + function multipartFormDataParser(input, mimeType) { + assert3(mimeType !== "failure" && mimeType.essence === "multipart/form-data"); + const boundaryString = mimeType.parameters.get("boundary"); + if (boundaryString === void 0) { + return "failure"; + } + const boundary = Buffer.from(`--${boundaryString}`, "utf8"); + const entryList = []; + const position = { position: 0 }; + if (input[0] === 13 && input[1] === 10) { + position.position += 2; + } + while (true) { + if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { + position.position += boundary.length; + } else { + return "failure"; + } + if (position.position === input.length - 2 && bufferStartsWith(input, dd, position) || position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position)) { + return entryList; + } + if (input[position.position] !== 13 || input[position.position + 1] !== 10) { + return "failure"; + } + position.position += 2; + const result = parseMultipartFormDataHeaders(input, position); + if (result === "failure") { + return "failure"; + } + let { name, filename, contentType, encoding } = result; + position.position += 2; + let body; + { + const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); + if (boundaryIndex === -1) { + return "failure"; } - if (typeof this.opts.body.readableDidRead !== "boolean") { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, "data", function() { - this[kBodyUsed] = true; - }); + body = input.subarray(position.position, boundaryIndex - 4); + position.position += body.length; + if (encoding === "base64") { + body = Buffer.from(body.toString(), "base64"); } - } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { - this.opts.body = new BodyAsyncIterable(this.opts.body); } + if (input[position.position] !== 13 || input[position.position + 1] !== 10) { + return "failure"; + } else { + position.position += 2; + } + let value; + if (filename !== null) { + contentType ??= "text/plain"; + if (!isAsciiString(contentType)) { + contentType = ""; + } + value = new File([body], filename, { type: contentType }); + } else { + value = utf8DecodeBytes(Buffer.from(body)); + } + assert3(isUSVString(name)); + assert3(typeof value === "string" && isUSVString(value) || isFileLike(value)); + entryList.push(makeEntry(name, value, filename)); } - onConnect(abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); + } + function parseMultipartFormDataHeaders(input, position) { + let name = null; + let filename = null; + let contentType = null; + let encoding = null; + while (true) { + if (input[position.position] === 13 && input[position.position + 1] === 10) { + if (name === null) { + return "failure"; + } + return { name, filename, contentType, encoding }; + } + let headerName = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13 && char !== 58, + input, + position + ); + headerName = removeChars(headerName, true, true, (char) => char === 9 || char === 32); + if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { + return "failure"; + } + if (input[position.position] !== 58) { + return "failure"; + } + position.position++; + collectASequenceOfBytes( + (char) => char === 32 || char === 9, + input, + position + ); + switch (bufferToLowerCasedHeaderName(headerName)) { + case "content-disposition": { + name = filename = null; + if (!bufferStartsWith(input, formDataNameBuffer, position)) { + return "failure"; + } + position.position += 17; + name = parseMultipartFormDataName(input, position); + if (name === null) { + return "failure"; + } + if (bufferStartsWith(input, filenameBuffer, position)) { + let check = position.position + filenameBuffer.length; + if (input[check] === 42) { + position.position += 1; + check += 1; + } + if (input[check] !== 61 || input[check + 1] !== 34) { + return "failure"; + } + position.position += 12; + filename = parseMultipartFormDataName(input, position); + if (filename === null) { + return "failure"; + } + } + break; + } + case "content-type": { + let headerValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); + contentType = isomorphicDecode(headerValue); + break; + } + case "content-transfer-encoding": { + let headerValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); + encoding = isomorphicDecode(headerValue); + break; + } + default: { + collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + } + } + if (input[position.position] !== 13 && input[position.position + 1] !== 10) { + return "failure"; + } else { + position.position += 2; + } } - onUpgrade(statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket); + } + function parseMultipartFormDataName(input, position) { + assert3(input[position.position - 1] === 34); + let name = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13 && char !== 34, + input, + position + ); + if (input[position.position] !== 34) { + return null; + } else { + position.position++; } - onError(error) { - this.handler.onError(error); + name = new TextDecoder().decode(name).replace(/%0A/ig, "\n").replace(/%0D/ig, "\r").replace(/%22/g, '"'); + return name; + } + function collectASequenceOfBytes(condition, input, position) { + let start = position.position; + while (start < input.length && condition(input[start])) { + ++start; } - onHeaders(statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); - if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { - if (this.request) { - this.request.abort(new Error("max redirects")); + return input.subarray(position.position, position.position = start); + } + function removeChars(buf, leading, trailing, predicate) { + let lead = 0; + let trail = buf.length - 1; + if (leading) { + while (lead < buf.length && predicate(buf[lead])) + lead++; + } + if (trailing) { + while (trail > 0 && predicate(buf[trail])) + trail--; + } + return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1); + } + function bufferStartsWith(buffer, start, position) { + if (buffer.length < start.length) { + return false; + } + for (let i = 0; i < start.length; i++) { + if (start[i] !== buffer[position.position + i]) { + return false; + } + } + return true; + } + module2.exports = { + multipartFormDataParser, + validateBoundary + }; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/body.js +var require_body = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/web/fetch/body.js"(exports, module2) { + "use strict"; + var util = require_util(); + var { + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody, + extractMimeType, + utf8DecodeBytes + } = require_util3(); + var { FormData } = require_formdata(); + var { kState } = require_symbols2(); + var { webidl } = require_webidl(); + var { Blob: Blob2 } = require("node:buffer"); + var assert3 = require("node:assert"); + var { isErrored } = require_util(); + var { isArrayBuffer } = require("node:util/types"); + var { serializeAMimeType } = require_data_url(); + var { multipartFormDataParser } = require_formdata_parser(); + var textEncoder = new TextEncoder(); + function extractBody(object, keepalive = false) { + let stream = null; + if (object instanceof ReadableStream) { + stream = object; + } else if (isBlobLike(object)) { + stream = object.stream(); + } else { + stream = new ReadableStream({ + async pull(controller) { + const buffer = typeof source === "string" ? textEncoder.encode(source) : source; + if (buffer.byteLength) { + controller.enqueue(buffer); + } + queueMicrotask(() => readableStreamClose(controller)); + }, + start() { + }, + type: "bytes" + }); + } + assert3(isReadableStreamLike(stream)); + let action = null; + let source = null; + let length = null; + let type = null; + if (typeof object === "string") { + source = object; + type = "text/plain;charset=UTF-8"; + } else if (object instanceof URLSearchParams) { + source = object.toString(); + type = "application/x-www-form-urlencoded;charset=UTF-8"; + } else if (isArrayBuffer(object)) { + source = new Uint8Array(object.slice()); + } else if (ArrayBuffer.isView(object)) { + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); + } else if (util.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, "0")}`; + const prefix = `--${boundary}\r +Content-Disposition: form-data`; + const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); + const blobParts = []; + const rn = new Uint8Array([13, 10]); + length = 0; + let hasUnknownSizeValue = false; + for (const [name, value] of object) { + if (typeof value === "string") { + const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r +\r +${normalizeLinefeeds(value)}\r +`); + blobParts.push(chunk2); + length += chunk2.byteLength; + } else { + const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r +Content-Type: ${value.type || "application/octet-stream"}\r +\r +`); + blobParts.push(chunk2, value, rn); + if (typeof value.size === "number") { + length += chunk2.byteLength + value.size + rn.byteLength; + } else { + hasUnknownSizeValue = true; + } } - this.redirectionLimitReached = true; - this.abort(new Error("max redirects")); - return; - } - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); - } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText); } - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path10 = search ? `${pathname}${search}` : pathname; - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path10; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; - if (statusCode === 303 && this.opts.method !== "HEAD") { - this.opts.method = "GET"; - this.opts.body = null; + const chunk = textEncoder.encode(`--${boundary}--`); + blobParts.push(chunk); + length += chunk.byteLength; + if (hasUnknownSizeValue) { + length = null; } - } - onData(chunk) { - if (this.location) { - } else { - return this.handler.onData(chunk); + source = object; + action = async function* () { + for (const part of blobParts) { + if (part.stream) { + yield* part.stream(); + } else { + yield part; + } + } + }; + type = `multipart/form-data; boundary=${boundary}`; + } else if (isBlobLike(object)) { + source = object; + length = object.size; + if (object.type) { + type = object.type; } - } - onComplete(trailers) { - if (this.location) { - this.location = null; - this.abort = null; - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); + } else if (typeof object[Symbol.asyncIterator] === "function") { + if (keepalive) { + throw new TypeError("keepalive"); } - } - onBodySent(chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); + if (util.isDisturbed(object) || object.locked) { + throw new TypeError( + "Response body object should not be disturbed or locked" + ); } + stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); } - }; - function parseLocation(statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null; + if (typeof source === "string" || util.isBuffer(source)) { + length = Buffer.byteLength(source); } - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].length === 8 && util.headerNameToString(headers[i]) === "location") { - return headers[i + 1]; - } + if (action != null) { + let iterator; + stream = new ReadableStream({ + async start() { + iterator = action(object)[Symbol.asyncIterator](); + }, + async pull(controller) { + const { value, done } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + controller.byobRequest?.respond(0); + }); + } else { + if (!isErrored(stream)) { + const buffer = new Uint8Array(value); + if (buffer.byteLength) { + controller.enqueue(buffer); + } + } + } + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator.return(); + }, + type: "bytes" + }); } + const body = { stream, source, length }; + return [body, type]; } - function shouldRemoveHeader(header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util.headerNameToString(header) === "host"; - } - if (removeContent && util.headerNameToString(header).startsWith("content-")) { - return true; + function safelyExtractBody(object, keepalive = false) { + if (object instanceof ReadableStream) { + assert3(!util.isDisturbed(object), "The body has already been consumed."); + assert3(!object.locked, "The stream is locked."); } - if (unknownOrigin && (header.length === 13 || header.length === 6)) { - const name = util.headerNameToString(header); - return name === "authorization" || name === "cookie"; + return extractBody(object, keepalive); + } + function cloneBody(body) { + const [out1, out2] = body.stream.tee(); + body.stream = out1; + return { + stream: out2, + length: body.length, + source: body.source + }; + } + function throwIfAborted(state) { + if (state.aborted) { + throw new DOMException("The operation was aborted.", "AbortError"); } - return false; } - function cleanRequestHeaders(headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); - } + function bodyMixinMethods(instance) { + const methods = { + blob() { + return consumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this); + if (mimeType === null) { + mimeType = ""; + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType); + } + return new Blob2([bytes], { type: mimeType }); + }, instance); + }, + arrayBuffer() { + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer; + }, instance); + }, + text() { + return consumeBody(this, utf8DecodeBytes, instance); + }, + json() { + return consumeBody(this, parseJSONFromBytes, instance); + }, + formData() { + return consumeBody(this, (value) => { + const mimeType = bodyMimeType(this); + if (mimeType !== null) { + switch (mimeType.essence) { + case "multipart/form-data": { + const parsed = multipartFormDataParser(value, mimeType); + if (parsed === "failure") { + throw new TypeError("Failed to parse body as FormData."); + } + const fd = new FormData(); + fd[kState] = parsed; + return fd; + } + case "application/x-www-form-urlencoded": { + const entries = new URLSearchParams(value.toString()); + const fd = new FormData(); + for (const [name, value2] of entries) { + fd.append(name, value2); + } + return fd; + } + } + } + throw new TypeError( + 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' + ); + }, instance); } - } else if (headers && typeof headers === "object") { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]); - } + }; + return methods; + } + function mixinBody(prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + } + async function consumeBody(object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance); + if (bodyUnusable(object[kState].body)) { + throw new TypeError("Body is unusable"); + } + throwIfAborted(object[kState]); + const promise = createDeferredPromise(); + const errorSteps = (error) => promise.reject(error); + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)); + } catch (e) { + errorSteps(e); } - } else { - assert3(headers == null, "headers must be an object or an array"); + }; + if (object[kState].body == null) { + successSteps(new Uint8Array()); + return promise.promise; } - return ret; + await fullyReadBody(object[kState].body, successSteps, errorSteps); + return promise.promise; } - module2.exports = RedirectHandler; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/interceptor/redirectInterceptor.js -var require_redirectInterceptor = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/interceptor/redirectInterceptor.js"(exports, module2) { - "use strict"; - var RedirectHandler = require_RedirectHandler(); - function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept(opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts; - if (!maxRedirections) { - return dispatch(opts, handler); - } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); - opts = { ...opts, maxRedirections: 0 }; - return dispatch(opts, redirectHandler); - }; - }; + function bodyUnusable(body) { + return body != null && (body.stream.locked || util.isDisturbed(body.stream)); } - module2.exports = createRedirectInterceptor; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js -var require_llhttp_wasm = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports, module2) { - var { Buffer: Buffer2 } = require("node:buffer"); - module2.exports = Buffer2.from("AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQDscBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxweHyAhIyUoP0BBREVGR0hJSktMTU9QUVJT3gNXWVtcXWBiZWZnaGlqa2xtb3BxcnN0dXZ3eHl6e3x9foABggGFAYYBhwGJAYsBjAGNAY4BjwGQAZEBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAZkCpAKwAv4C/gILIAEiBCACRw3zAUHdASEQDP8DCyABIhAgAkcN3QFBwwEhEAz+AwsgASIBIAJHDZABQfcAIRAM/QMLIAEiASACRw2GAUHvACEQDPwDCyABIgEgAkcNf0HqACEQDPsDCyABIgEgAkcNe0HoACEQDPoDCyABIgEgAkcNeEHmACEQDPkDCyABIgEgAkcNGkEYIRAM+AMLIAEiASACRw0UQRIhEAz3AwsgASIBIAJHDVlBxQAhEAz2AwsgASIBIAJHDUpBPyEQDPUDCyABIgEgAkcNSEE8IRAM9AMLIAEiASACRw1BQTEhEAzzAwsgAC0ALkEBRg3rAwyHAgsgACABIgEgAhDAgICAAEEBRw3mASAAQgA3AyAM5wELIAAgASIBIAIQtICAgAAiEA3nASABIQEM9QILAkAgASIBIAJHDQBBBiEQDPADCyAAIAFBAWoiASACELuAgIAAIhAN6AEgASEBDDELIABCADcDIEESIRAM1QMLIAEiECACRw0rQR0hEAztAwsCQCABIgEgAkYNACABQQFqIQFBECEQDNQDC0EHIRAM7AMLIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN5QFBCCEQDOsDCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEUIRAM0gMLQQkhEAzqAwsgASEBIAApAyBQDeQBIAEhAQzyAgsCQCABIgEgAkcNAEELIRAM6QMLIAAgAUEBaiIBIAIQtoCAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3mASABIQEMDQsgACABIgEgAhC6gICAACIQDecBIAEhAQzwAgsCQCABIgEgAkcNAEEPIRAM5QMLIAEtAAAiEEE7Rg0IIBBBDUcN6AEgAUEBaiEBDO8CCyAAIAEiASACELqAgIAAIhAN6AEgASEBDPICCwNAAkAgAS0AAEHwtYCAAGotAAAiEEEBRg0AIBBBAkcN6wEgACgCBCEQIABBADYCBCAAIBAgAUEBaiIBELmAgIAAIhAN6gEgASEBDPQCCyABQQFqIgEgAkcNAAtBEiEQDOIDCyAAIAEiASACELqAgIAAIhAN6QEgASEBDAoLIAEiASACRw0GQRshEAzgAwsCQCABIgEgAkcNAEEWIRAM4AMLIABBioCAgAA2AgggACABNgIEIAAgASACELiAgIAAIhAN6gEgASEBQSAhEAzGAwsCQCABIgEgAkYNAANAAkAgAS0AAEHwt4CAAGotAAAiEEECRg0AAkAgEEF/ag4E5QHsAQDrAewBCyABQQFqIQFBCCEQDMgDCyABQQFqIgEgAkcNAAtBFSEQDN8DC0EVIRAM3gMLA0ACQCABLQAAQfC5gIAAai0AACIQQQJGDQAgEEF/ag4E3gHsAeAB6wHsAQsgAUEBaiIBIAJHDQALQRghEAzdAwsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBByEQDMQDC0EZIRAM3AMLIAFBAWohAQwCCwJAIAEiFCACRw0AQRohEAzbAwsgFCEBAkAgFC0AAEFzag4U3QLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gIA7gILQQAhECAAQQA2AhwgAEGvi4CAADYCECAAQQI2AgwgACAUQQFqNgIUDNoDCwJAIAEtAAAiEEE7Rg0AIBBBDUcN6AEgAUEBaiEBDOUCCyABQQFqIQELQSIhEAy/AwsCQCABIhAgAkcNAEEcIRAM2AMLQgAhESAQIQEgEC0AAEFQag435wHmAQECAwQFBgcIAAAAAAAAAAkKCwwNDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAREhMUAAtBHiEQDL0DC0ICIREM5QELQgMhEQzkAQtCBCERDOMBC0IFIREM4gELQgYhEQzhAQtCByERDOABC0IIIREM3wELQgkhEQzeAQtCCiERDN0BC0ILIREM3AELQgwhEQzbAQtCDSERDNoBC0IOIREM2QELQg8hEQzYAQtCCiERDNcBC0ILIREM1gELQgwhEQzVAQtCDSERDNQBC0IOIREM0wELQg8hEQzSAQtCACERAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQLQAAQVBqDjflAeQBAAECAwQFBgfmAeYB5gHmAeYB5gHmAQgJCgsMDeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gEODxAREhPmAQtCAiERDOQBC0IDIREM4wELQgQhEQziAQtCBSERDOEBC0IGIREM4AELQgchEQzfAQtCCCERDN4BC0IJIREM3QELQgohEQzcAQtCCyERDNsBC0IMIREM2gELQg0hEQzZAQtCDiERDNgBC0IPIREM1wELQgohEQzWAQtCCyERDNUBC0IMIREM1AELQg0hEQzTAQtCDiERDNIBC0IPIREM0QELIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN0gFBHyEQDMADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEkIRAMpwMLQSAhEAy/AwsgACABIhAgAhC+gICAAEF/ag4FtgEAxQIB0QHSAQtBESEQDKQDCyAAQQE6AC8gECEBDLsDCyABIgEgAkcN0gFBJCEQDLsDCyABIg0gAkcNHkHGACEQDLoDCyAAIAEiASACELKAgIAAIhAN1AEgASEBDLUBCyABIhAgAkcNJkHQACEQDLgDCwJAIAEiASACRw0AQSghEAy4AwsgAEEANgIEIABBjICAgAA2AgggACABIAEQsYCAgAAiEA3TASABIQEM2AELAkAgASIQIAJHDQBBKSEQDLcDCyAQLQAAIgFBIEYNFCABQQlHDdMBIBBBAWohAQwVCwJAIAEiASACRg0AIAFBAWohAQwXC0EqIRAMtQMLAkAgASIQIAJHDQBBKyEQDLUDCwJAIBAtAAAiAUEJRg0AIAFBIEcN1QELIAAtACxBCEYN0wEgECEBDJEDCwJAIAEiASACRw0AQSwhEAy0AwsgAS0AAEEKRw3VASABQQFqIQEMyQILIAEiDiACRw3VAUEvIRAMsgMLA0ACQCABLQAAIhBBIEYNAAJAIBBBdmoOBADcAdwBANoBCyABIQEM4AELIAFBAWoiASACRw0AC0ExIRAMsQMLQTIhECABIhQgAkYNsAMgAiAUayAAKAIAIgFqIRUgFCABa0EDaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfC7gIAAai0AAEcNAQJAIAFBA0cNAEEGIQEMlgMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLEDCyAAQQA2AgAgFCEBDNkBC0EzIRAgASIUIAJGDa8DIAIgFGsgACgCACIBaiEVIBQgAWtBCGohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUH0u4CAAGotAABHDQECQCABQQhHDQBBBSEBDJUDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAywAwsgAEEANgIAIBQhAQzYAQtBNCEQIAEiFCACRg2uAyACIBRrIAAoAgAiAWohFSAUIAFrQQVqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw0BAkAgAUEFRw0AQQchAQyUAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMrwMLIABBADYCACAUIQEM1wELAkAgASIBIAJGDQADQAJAIAEtAABBgL6AgABqLQAAIhBBAUYNACAQQQJGDQogASEBDN0BCyABQQFqIgEgAkcNAAtBMCEQDK4DC0EwIRAMrQMLAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AIBBBdmoOBNkB2gHaAdkB2gELIAFBAWoiASACRw0AC0E4IRAMrQMLQTghEAysAwsDQAJAIAEtAAAiEEEgRg0AIBBBCUcNAwsgAUEBaiIBIAJHDQALQTwhEAyrAwsDQAJAIAEtAAAiEEEgRg0AAkACQCAQQXZqDgTaAQEB2gEACyAQQSxGDdsBCyABIQEMBAsgAUEBaiIBIAJHDQALQT8hEAyqAwsgASEBDNsBC0HAACEQIAEiFCACRg2oAyACIBRrIAAoAgAiAWohFiAUIAFrQQZqIRcCQANAIBQtAABBIHIgAUGAwICAAGotAABHDQEgAUEGRg2OAyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAypAwsgAEEANgIAIBQhAQtBNiEQDI4DCwJAIAEiDyACRw0AQcEAIRAMpwMLIABBjICAgAA2AgggACAPNgIEIA8hASAALQAsQX9qDgTNAdUB1wHZAYcDCyABQQFqIQEMzAELAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgciAQIBBBv39qQf8BcUEaSRtB/wFxIhBBCUYNACAQQSBGDQACQAJAAkACQCAQQZ1/ag4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIRAMkQMLIAFBAWohAUEyIRAMkAMLIAFBAWohAUEzIRAMjwMLIAEhAQzQAQsgAUEBaiIBIAJHDQALQTUhEAylAwtBNSEQDKQDCwJAIAEiASACRg0AA0ACQCABLQAAQYC8gIAAai0AAEEBRg0AIAEhAQzTAQsgAUEBaiIBIAJHDQALQT0hEAykAwtBPSEQDKMDCyAAIAEiASACELCAgIAAIhAN1gEgASEBDAELIBBBAWohAQtBPCEQDIcDCwJAIAEiASACRw0AQcIAIRAMoAMLAkADQAJAIAEtAABBd2oOGAAC/gL+AoQD/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4CAP4CCyABQQFqIgEgAkcNAAtBwgAhEAygAwsgAUEBaiEBIAAtAC1BAXFFDb0BIAEhAQtBLCEQDIUDCyABIgEgAkcN0wFBxAAhEAydAwsDQAJAIAEtAABBkMCAgABqLQAAQQFGDQAgASEBDLcCCyABQQFqIgEgAkcNAAtBxQAhEAycAwsgDS0AACIQQSBGDbMBIBBBOkcNgQMgACgCBCEBIABBADYCBCAAIAEgDRCvgICAACIBDdABIA1BAWohAQyzAgtBxwAhECABIg0gAkYNmgMgAiANayAAKAIAIgFqIRYgDSABa0EFaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGQwoCAAGotAABHDYADIAFBBUYN9AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmgMLQcgAIRAgASINIAJGDZkDIAIgDWsgACgCACIBaiEWIA0gAWtBCWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBlsKAgABqLQAARw3/AgJAIAFBCUcNAEECIQEM9QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJkDCwJAIAEiDSACRw0AQckAIRAMmQMLAkACQCANLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwCAA4ADgAOAA4ADAYADCyANQQFqIQFBPiEQDIADCyANQQFqIQFBPyEQDP8CC0HKACEQIAEiDSACRg2XAyACIA1rIAAoAgAiAWohFiANIAFrQQFqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaDCgIAAai0AAEcN/QIgAUEBRg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyXAwtBywAhECABIg0gAkYNlgMgAiANayAAKAIAIgFqIRYgDSABa0EOaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGiwoCAAGotAABHDfwCIAFBDkYN8AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlgMLQcwAIRAgASINIAJGDZUDIAIgDWsgACgCACIBaiEWIA0gAWtBD2ohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBwMKAgABqLQAARw37AgJAIAFBD0cNAEEDIQEM8QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJUDC0HNACEQIAEiDSACRg2UAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQdDCgIAAai0AAEcN+gICQCABQQVHDQBBBCEBDPACCyABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyUAwsCQCABIg0gAkcNAEHOACEQDJQDCwJAAkACQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAP0C/QL9Av0C/QL9Av0C/QL9Av0C/QL9AgH9Av0C/QICA/0CCyANQQFqIQFBwQAhEAz9AgsgDUEBaiEBQcIAIRAM/AILIA1BAWohAUHDACEQDPsCCyANQQFqIQFBxAAhEAz6AgsCQCABIgEgAkYNACAAQY2AgIAANgIIIAAgATYCBCABIQFBxQAhEAz6AgtBzwAhEAySAwsgECEBAkACQCAQLQAAQXZqDgQBqAKoAgCoAgsgEEEBaiEBC0EnIRAM+AILAkAgASIBIAJHDQBB0QAhEAyRAwsCQCABLQAAQSBGDQAgASEBDI0BCyABQQFqIQEgAC0ALUEBcUUNxwEgASEBDIwBCyABIhcgAkcNyAFB0gAhEAyPAwtB0wAhECABIhQgAkYNjgMgAiAUayAAKAIAIgFqIRYgFCABa0EBaiEXA0AgFC0AACABQdbCgIAAai0AAEcNzAEgAUEBRg3HASABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAyOAwsCQCABIgEgAkcNAEHVACEQDI4DCyABLQAAQQpHDcwBIAFBAWohAQzHAQsCQCABIgEgAkcNAEHWACEQDI0DCwJAAkAgAS0AAEF2ag4EAM0BzQEBzQELIAFBAWohAQzHAQsgAUEBaiEBQcoAIRAM8wILIAAgASIBIAIQroCAgAAiEA3LASABIQFBzQAhEAzyAgsgAC0AKUEiRg2FAwymAgsCQCABIgEgAkcNAEHbACEQDIoDC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4K1AHTAQABAgMEBQYI1QELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMzAELQQkhEEEBIRRBACEXQQAhFgzLAQsCQCABIgEgAkcNAEHdACEQDIkDCyABLQAAQS5HDcwBIAFBAWohAQymAgsgASIBIAJHDcwBQd8AIRAMhwMLAkAgASIBIAJGDQAgAEGOgICAADYCCCAAIAE2AgQgASEBQdAAIRAM7gILQeAAIRAMhgMLQeEAIRAgASIBIAJGDYUDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHiwoCAAGotAABHDc0BIBRBA0YNzAEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhQMLQeIAIRAgASIBIAJGDYQDIAIgAWsgACgCACIUaiEWIAEgFGtBAmohFwNAIAEtAAAgFEHmwoCAAGotAABHDcwBIBRBAkYNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhAMLQeMAIRAgASIBIAJGDYMDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHpwoCAAGotAABHDcsBIBRBA0YNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMgwMLAkAgASIBIAJHDQBB5QAhEAyDAwsgACABQQFqIgEgAhCogICAACIQDc0BIAEhAUHWACEQDOkCCwJAIAEiASACRg0AA0ACQCABLQAAIhBBIEYNAAJAAkACQCAQQbh/ag4LAAHPAc8BzwHPAc8BzwHPAc8BAs8BCyABQQFqIQFB0gAhEAztAgsgAUEBaiEBQdMAIRAM7AILIAFBAWohAUHUACEQDOsCCyABQQFqIgEgAkcNAAtB5AAhEAyCAwtB5AAhEAyBAwsDQAJAIAEtAABB8MKAgABqLQAAIhBBAUYNACAQQX5qDgPPAdAB0QHSAQsgAUEBaiIBIAJHDQALQeYAIRAMgAMLAkAgASIBIAJGDQAgAUEBaiEBDAMLQecAIRAM/wILA0ACQCABLQAAQfDEgIAAai0AACIQQQFGDQACQCAQQX5qDgTSAdMB1AEA1QELIAEhAUHXACEQDOcCCyABQQFqIgEgAkcNAAtB6AAhEAz+AgsCQCABIgEgAkcNAEHpACEQDP4CCwJAIAEtAAAiEEF2ag4augHVAdUBvAHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHKAdUB1QEA0wELIAFBAWohAQtBBiEQDOMCCwNAAkAgAS0AAEHwxoCAAGotAABBAUYNACABIQEMngILIAFBAWoiASACRw0AC0HqACEQDPsCCwJAIAEiASACRg0AIAFBAWohAQwDC0HrACEQDPoCCwJAIAEiASACRw0AQewAIRAM+gILIAFBAWohAQwBCwJAIAEiASACRw0AQe0AIRAM+QILIAFBAWohAQtBBCEQDN4CCwJAIAEiFCACRw0AQe4AIRAM9wILIBQhAQJAAkACQCAULQAAQfDIgIAAai0AAEF/ag4H1AHVAdYBAJwCAQLXAQsgFEEBaiEBDAoLIBRBAWohAQzNAQtBACEQIABBADYCHCAAQZuSgIAANgIQIABBBzYCDCAAIBRBAWo2AhQM9gILAkADQAJAIAEtAABB8MiAgABqLQAAIhBBBEYNAAJAAkAgEEF/ag4H0gHTAdQB2QEABAHZAQsgASEBQdoAIRAM4AILIAFBAWohAUHcACEQDN8CCyABQQFqIgEgAkcNAAtB7wAhEAz2AgsgAUEBaiEBDMsBCwJAIAEiFCACRw0AQfAAIRAM9QILIBQtAABBL0cN1AEgFEEBaiEBDAYLAkAgASIUIAJHDQBB8QAhEAz0AgsCQCAULQAAIgFBL0cNACAUQQFqIQFB3QAhEAzbAgsgAUF2aiIEQRZLDdMBQQEgBHRBiYCAAnFFDdMBDMoCCwJAIAEiASACRg0AIAFBAWohAUHeACEQDNoCC0HyACEQDPICCwJAIAEiFCACRw0AQfQAIRAM8gILIBQhAQJAIBQtAABB8MyAgABqLQAAQX9qDgPJApQCANQBC0HhACEQDNgCCwJAIAEiFCACRg0AA0ACQCAULQAAQfDKgIAAai0AACIBQQNGDQACQCABQX9qDgLLAgDVAQsgFCEBQd8AIRAM2gILIBRBAWoiFCACRw0AC0HzACEQDPECC0HzACEQDPACCwJAIAEiASACRg0AIABBj4CAgAA2AgggACABNgIEIAEhAUHgACEQDNcCC0H1ACEQDO8CCwJAIAEiASACRw0AQfYAIRAM7wILIABBj4CAgAA2AgggACABNgIEIAEhAQtBAyEQDNQCCwNAIAEtAABBIEcNwwIgAUEBaiIBIAJHDQALQfcAIRAM7AILAkAgASIBIAJHDQBB+AAhEAzsAgsgAS0AAEEgRw3OASABQQFqIQEM7wELIAAgASIBIAIQrICAgAAiEA3OASABIQEMjgILAkAgASIEIAJHDQBB+gAhEAzqAgsgBC0AAEHMAEcN0QEgBEEBaiEBQRMhEAzPAQsCQCABIgQgAkcNAEH7ACEQDOkCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRADQCAELQAAIAFB8M6AgABqLQAARw3QASABQQVGDc4BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQfsAIRAM6AILAkAgASIEIAJHDQBB/AAhEAzoAgsCQAJAIAQtAABBvX9qDgwA0QHRAdEB0QHRAdEB0QHRAdEB0QEB0QELIARBAWohAUHmACEQDM8CCyAEQQFqIQFB5wAhEAzOAgsCQCABIgQgAkcNAEH9ACEQDOcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDc8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH9ACEQDOcCCyAAQQA2AgAgEEEBaiEBQRAhEAzMAQsCQCABIgQgAkcNAEH+ACEQDOYCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUH2zoCAAGotAABHDc4BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH+ACEQDOYCCyAAQQA2AgAgEEEBaiEBQRYhEAzLAQsCQCABIgQgAkcNAEH/ACEQDOUCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUH8zoCAAGotAABHDc0BIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH/ACEQDOUCCyAAQQA2AgAgEEEBaiEBQQUhEAzKAQsCQCABIgQgAkcNAEGAASEQDOQCCyAELQAAQdkARw3LASAEQQFqIQFBCCEQDMkBCwJAIAEiBCACRw0AQYEBIRAM4wILAkACQCAELQAAQbJ/ag4DAMwBAcwBCyAEQQFqIQFB6wAhEAzKAgsgBEEBaiEBQewAIRAMyQILAkAgASIEIAJHDQBBggEhEAziAgsCQAJAIAQtAABBuH9qDggAywHLAcsBywHLAcsBAcsBCyAEQQFqIQFB6gAhEAzJAgsgBEEBaiEBQe0AIRAMyAILAkAgASIEIAJHDQBBgwEhEAzhAgsgAiAEayAAKAIAIgFqIRAgBCABa0ECaiEUAkADQCAELQAAIAFBgM+AgABqLQAARw3JASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBA2AgBBgwEhEAzhAgtBACEQIABBADYCACAUQQFqIQEMxgELAkAgASIEIAJHDQBBhAEhEAzgAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBg8+AgABqLQAARw3IASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhAEhEAzgAgsgAEEANgIAIBBBAWohAUEjIRAMxQELAkAgASIEIAJHDQBBhQEhEAzfAgsCQAJAIAQtAABBtH9qDggAyAHIAcgByAHIAcgBAcgBCyAEQQFqIQFB7wAhEAzGAgsgBEEBaiEBQfAAIRAMxQILAkAgASIEIAJHDQBBhgEhEAzeAgsgBC0AAEHFAEcNxQEgBEEBaiEBDIMCCwJAIAEiBCACRw0AQYcBIRAM3QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQYjPgIAAai0AAEcNxQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYcBIRAM3QILIABBADYCACAQQQFqIQFBLSEQDMIBCwJAIAEiBCACRw0AQYgBIRAM3AILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNxAEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYgBIRAM3AILIABBADYCACAQQQFqIQFBKSEQDMEBCwJAIAEiASACRw0AQYkBIRAM2wILQQEhECABLQAAQd8ARw3AASABQQFqIQEMgQILAkAgASIEIAJHDQBBigEhEAzaAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQA0AgBC0AACABQYzPgIAAai0AAEcNwQEgAUEBRg2vAiABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGKASEQDNkCCwJAIAEiBCACRw0AQYsBIRAM2QILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQY7PgIAAai0AAEcNwQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYsBIRAM2QILIABBADYCACAQQQFqIQFBAiEQDL4BCwJAIAEiBCACRw0AQYwBIRAM2AILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNwAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYwBIRAM2AILIABBADYCACAQQQFqIQFBHyEQDL0BCwJAIAEiBCACRw0AQY0BIRAM1wILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNvwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY0BIRAM1wILIABBADYCACAQQQFqIQFBCSEQDLwBCwJAIAEiBCACRw0AQY4BIRAM1gILAkACQCAELQAAQbd/ag4HAL8BvwG/Ab8BvwEBvwELIARBAWohAUH4ACEQDL0CCyAEQQFqIQFB+QAhEAy8AgsCQCABIgQgAkcNAEGPASEQDNUCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGRz4CAAGotAABHDb0BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGPASEQDNUCCyAAQQA2AgAgEEEBaiEBQRghEAy6AQsCQCABIgQgAkcNAEGQASEQDNQCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUGXz4CAAGotAABHDbwBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGQASEQDNQCCyAAQQA2AgAgEEEBaiEBQRchEAy5AQsCQCABIgQgAkcNAEGRASEQDNMCCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUGaz4CAAGotAABHDbsBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGRASEQDNMCCyAAQQA2AgAgEEEBaiEBQRUhEAy4AQsCQCABIgQgAkcNAEGSASEQDNICCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGhz4CAAGotAABHDboBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGSASEQDNICCyAAQQA2AgAgEEEBaiEBQR4hEAy3AQsCQCABIgQgAkcNAEGTASEQDNECCyAELQAAQcwARw24ASAEQQFqIQFBCiEQDLYBCwJAIAQgAkcNAEGUASEQDNACCwJAAkAgBC0AAEG/f2oODwC5AbkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AQG5AQsgBEEBaiEBQf4AIRAMtwILIARBAWohAUH/ACEQDLYCCwJAIAQgAkcNAEGVASEQDM8CCwJAAkAgBC0AAEG/f2oOAwC4AQG4AQsgBEEBaiEBQf0AIRAMtgILIARBAWohBEGAASEQDLUCCwJAIAQgAkcNAEGWASEQDM4CCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUGnz4CAAGotAABHDbYBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGWASEQDM4CCyAAQQA2AgAgEEEBaiEBQQshEAyzAQsCQCAEIAJHDQBBlwEhEAzNAgsCQAJAAkACQCAELQAAQVNqDiMAuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AQG4AbgBuAG4AbgBArgBuAG4AQO4AQsgBEEBaiEBQfsAIRAMtgILIARBAWohAUH8ACEQDLUCCyAEQQFqIQRBgQEhEAy0AgsgBEEBaiEEQYIBIRAMswILAkAgBCACRw0AQZgBIRAMzAILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQanPgIAAai0AAEcNtAEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZgBIRAMzAILIABBADYCACAQQQFqIQFBGSEQDLEBCwJAIAQgAkcNAEGZASEQDMsCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGuz4CAAGotAABHDbMBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGZASEQDMsCCyAAQQA2AgAgEEEBaiEBQQYhEAywAQsCQCAEIAJHDQBBmgEhEAzKAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBtM+AgABqLQAARw2yASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmgEhEAzKAgsgAEEANgIAIBBBAWohAUEcIRAMrwELAkAgBCACRw0AQZsBIRAMyQILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbbPgIAAai0AAEcNsQEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZsBIRAMyQILIABBADYCACAQQQFqIQFBJyEQDK4BCwJAIAQgAkcNAEGcASEQDMgCCwJAAkAgBC0AAEGsf2oOAgABsQELIARBAWohBEGGASEQDK8CCyAEQQFqIQRBhwEhEAyuAgsCQCAEIAJHDQBBnQEhEAzHAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBuM+AgABqLQAARw2vASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBnQEhEAzHAgsgAEEANgIAIBBBAWohAUEmIRAMrAELAkAgBCACRw0AQZ4BIRAMxgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbrPgIAAai0AAEcNrgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ4BIRAMxgILIABBADYCACAQQQFqIQFBAyEQDKsBCwJAIAQgAkcNAEGfASEQDMUCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDa0BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGfASEQDMUCCyAAQQA2AgAgEEEBaiEBQQwhEAyqAQsCQCAEIAJHDQBBoAEhEAzEAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBvM+AgABqLQAARw2sASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBoAEhEAzEAgsgAEEANgIAIBBBAWohAUENIRAMqQELAkAgBCACRw0AQaEBIRAMwwILAkACQCAELQAAQbp/ag4LAKwBrAGsAawBrAGsAawBrAGsAQGsAQsgBEEBaiEEQYsBIRAMqgILIARBAWohBEGMASEQDKkCCwJAIAQgAkcNAEGiASEQDMICCyAELQAAQdAARw2pASAEQQFqIQQM6QELAkAgBCACRw0AQaMBIRAMwQILAkACQCAELQAAQbd/ag4HAaoBqgGqAaoBqgEAqgELIARBAWohBEGOASEQDKgCCyAEQQFqIQFBIiEQDKYBCwJAIAQgAkcNAEGkASEQDMACCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHAz4CAAGotAABHDagBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGkASEQDMACCyAAQQA2AgAgEEEBaiEBQR0hEAylAQsCQCAEIAJHDQBBpQEhEAy/AgsCQAJAIAQtAABBrn9qDgMAqAEBqAELIARBAWohBEGQASEQDKYCCyAEQQFqIQFBBCEQDKQBCwJAIAQgAkcNAEGmASEQDL4CCwJAAkACQAJAAkAgBC0AAEG/f2oOFQCqAaoBqgGqAaoBqgGqAaoBqgGqAQGqAaoBAqoBqgEDqgGqAQSqAQsgBEEBaiEEQYgBIRAMqAILIARBAWohBEGJASEQDKcCCyAEQQFqIQRBigEhEAymAgsgBEEBaiEEQY8BIRAMpQILIARBAWohBEGRASEQDKQCCwJAIAQgAkcNAEGnASEQDL0CCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDaUBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGnASEQDL0CCyAAQQA2AgAgEEEBaiEBQREhEAyiAQsCQCAEIAJHDQBBqAEhEAy8AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBws+AgABqLQAARw2kASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqAEhEAy8AgsgAEEANgIAIBBBAWohAUEsIRAMoQELAkAgBCACRw0AQakBIRAMuwILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQcXPgIAAai0AAEcNowEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQakBIRAMuwILIABBADYCACAQQQFqIQFBKyEQDKABCwJAIAQgAkcNAEGqASEQDLoCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHKz4CAAGotAABHDaIBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGqASEQDLoCCyAAQQA2AgAgEEEBaiEBQRQhEAyfAQsCQCAEIAJHDQBBqwEhEAy5AgsCQAJAAkACQCAELQAAQb5/ag4PAAECpAGkAaQBpAGkAaQBpAGkAaQBpAGkAQOkAQsgBEEBaiEEQZMBIRAMogILIARBAWohBEGUASEQDKECCyAEQQFqIQRBlQEhEAygAgsgBEEBaiEEQZYBIRAMnwILAkAgBCACRw0AQawBIRAMuAILIAQtAABBxQBHDZ8BIARBAWohBAzgAQsCQCAEIAJHDQBBrQEhEAy3AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBzc+AgABqLQAARw2fASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrQEhEAy3AgsgAEEANgIAIBBBAWohAUEOIRAMnAELAkAgBCACRw0AQa4BIRAMtgILIAQtAABB0ABHDZ0BIARBAWohAUElIRAMmwELAkAgBCACRw0AQa8BIRAMtQILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNnQEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQa8BIRAMtQILIABBADYCACAQQQFqIQFBKiEQDJoBCwJAIAQgAkcNAEGwASEQDLQCCwJAAkAgBC0AAEGrf2oOCwCdAZ0BnQGdAZ0BnQGdAZ0BnQEBnQELIARBAWohBEGaASEQDJsCCyAEQQFqIQRBmwEhEAyaAgsCQCAEIAJHDQBBsQEhEAyzAgsCQAJAIAQtAABBv39qDhQAnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBAZwBCyAEQQFqIQRBmQEhEAyaAgsgBEEBaiEEQZwBIRAMmQILAkAgBCACRw0AQbIBIRAMsgILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQdnPgIAAai0AAEcNmgEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbIBIRAMsgILIABBADYCACAQQQFqIQFBISEQDJcBCwJAIAQgAkcNAEGzASEQDLECCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUHdz4CAAGotAABHDZkBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGzASEQDLECCyAAQQA2AgAgEEEBaiEBQRohEAyWAQsCQCAEIAJHDQBBtAEhEAywAgsCQAJAAkAgBC0AAEG7f2oOEQCaAZoBmgGaAZoBmgGaAZoBmgEBmgGaAZoBmgGaAQKaAQsgBEEBaiEEQZ0BIRAMmAILIARBAWohBEGeASEQDJcCCyAEQQFqIQRBnwEhEAyWAgsCQCAEIAJHDQBBtQEhEAyvAgsgAiAEayAAKAIAIgFqIRQgBCABa0EFaiEQAkADQCAELQAAIAFB5M+AgABqLQAARw2XASABQQVGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtQEhEAyvAgsgAEEANgIAIBBBAWohAUEoIRAMlAELAkAgBCACRw0AQbYBIRAMrgILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQerPgIAAai0AAEcNlgEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbYBIRAMrgILIABBADYCACAQQQFqIQFBByEQDJMBCwJAIAQgAkcNAEG3ASEQDK0CCwJAAkAgBC0AAEG7f2oODgCWAZYBlgGWAZYBlgGWAZYBlgGWAZYBlgEBlgELIARBAWohBEGhASEQDJQCCyAEQQFqIQRBogEhEAyTAgsCQCAEIAJHDQBBuAEhEAysAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB7c+AgABqLQAARw2UASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuAEhEAysAgsgAEEANgIAIBBBAWohAUESIRAMkQELAkAgBCACRw0AQbkBIRAMqwILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNkwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbkBIRAMqwILIABBADYCACAQQQFqIQFBICEQDJABCwJAIAQgAkcNAEG6ASEQDKoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHyz4CAAGotAABHDZIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG6ASEQDKoCCyAAQQA2AgAgEEEBaiEBQQ8hEAyPAQsCQCAEIAJHDQBBuwEhEAypAgsCQAJAIAQtAABBt39qDgcAkgGSAZIBkgGSAQGSAQsgBEEBaiEEQaUBIRAMkAILIARBAWohBEGmASEQDI8CCwJAIAQgAkcNAEG8ASEQDKgCCyACIARrIAAoAgAiAWohFCAEIAFrQQdqIRACQANAIAQtAAAgAUH0z4CAAGotAABHDZABIAFBB0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG8ASEQDKgCCyAAQQA2AgAgEEEBaiEBQRshEAyNAQsCQCAEIAJHDQBBvQEhEAynAgsCQAJAAkAgBC0AAEG+f2oOEgCRAZEBkQGRAZEBkQGRAZEBkQEBkQGRAZEBkQGRAZEBApEBCyAEQQFqIQRBpAEhEAyPAgsgBEEBaiEEQacBIRAMjgILIARBAWohBEGoASEQDI0CCwJAIAQgAkcNAEG+ASEQDKYCCyAELQAAQc4ARw2NASAEQQFqIQQMzwELAkAgBCACRw0AQb8BIRAMpQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBC0AAEG/f2oOFQABAgOcAQQFBpwBnAGcAQcICQoLnAEMDQ4PnAELIARBAWohAUHoACEQDJoCCyAEQQFqIQFB6QAhEAyZAgsgBEEBaiEBQe4AIRAMmAILIARBAWohAUHyACEQDJcCCyAEQQFqIQFB8wAhEAyWAgsgBEEBaiEBQfYAIRAMlQILIARBAWohAUH3ACEQDJQCCyAEQQFqIQFB+gAhEAyTAgsgBEEBaiEEQYMBIRAMkgILIARBAWohBEGEASEQDJECCyAEQQFqIQRBhQEhEAyQAgsgBEEBaiEEQZIBIRAMjwILIARBAWohBEGYASEQDI4CCyAEQQFqIQRBoAEhEAyNAgsgBEEBaiEEQaMBIRAMjAILIARBAWohBEGqASEQDIsCCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEGrASEQDIsCC0HAASEQDKMCCyAAIAUgAhCqgICAACIBDYsBIAUhAQxcCwJAIAYgAkYNACAGQQFqIQUMjQELQcIBIRAMoQILA0ACQCAQLQAAQXZqDgSMAQAAjwEACyAQQQFqIhAgAkcNAAtBwwEhEAygAgsCQCAHIAJGDQAgAEGRgICAADYCCCAAIAc2AgQgByEBQQEhEAyHAgtBxAEhEAyfAgsCQCAHIAJHDQBBxQEhEAyfAgsCQAJAIActAABBdmoOBAHOAc4BAM4BCyAHQQFqIQYMjQELIAdBAWohBQyJAQsCQCAHIAJHDQBBxgEhEAyeAgsCQAJAIActAABBdmoOFwGPAY8BAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAQCPAQsgB0EBaiEHC0GwASEQDIQCCwJAIAggAkcNAEHIASEQDJ0CCyAILQAAQSBHDY0BIABBADsBMiAIQQFqIQFBswEhEAyDAgsgASEXAkADQCAXIgcgAkYNASAHLQAAQVBqQf8BcSIQQQpPDcwBAkAgAC8BMiIUQZkzSw0AIAAgFEEKbCIUOwEyIBBB//8DcyAUQf7/A3FJDQAgB0EBaiEXIAAgFCAQaiIQOwEyIBBB//8DcUHoB0kNAQsLQQAhECAAQQA2AhwgAEHBiYCAADYCECAAQQ02AgwgACAHQQFqNgIUDJwCC0HHASEQDJsCCyAAIAggAhCugICAACIQRQ3KASAQQRVHDYwBIABByAE2AhwgACAINgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAyaAgsCQCAJIAJHDQBBzAEhEAyaAgtBACEUQQEhF0EBIRZBACEQAkACQAJAAkACQAJAAkACQAJAIAktAABBUGoOCpYBlQEAAQIDBAUGCJcBC0ECIRAMBgtBAyEQDAULQQQhEAwEC0EFIRAMAwtBBiEQDAILQQchEAwBC0EIIRALQQAhF0EAIRZBACEUDI4BC0EJIRBBASEUQQAhF0EAIRYMjQELAkAgCiACRw0AQc4BIRAMmQILIAotAABBLkcNjgEgCkEBaiEJDMoBCyALIAJHDY4BQdABIRAMlwILAkAgCyACRg0AIABBjoCAgAA2AgggACALNgIEQbcBIRAM/gELQdEBIRAMlgILAkAgBCACRw0AQdIBIRAMlgILIAIgBGsgACgCACIQaiEUIAQgEGtBBGohCwNAIAQtAAAgEEH8z4CAAGotAABHDY4BIBBBBEYN6QEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB0gEhEAyVAgsgACAMIAIQrICAgAAiAQ2NASAMIQEMuAELAkAgBCACRw0AQdQBIRAMlAILIAIgBGsgACgCACIQaiEUIAQgEGtBAWohDANAIAQtAAAgEEGB0ICAAGotAABHDY8BIBBBAUYNjgEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB1AEhEAyTAgsCQCAEIAJHDQBB1gEhEAyTAgsgAiAEayAAKAIAIhBqIRQgBCAQa0ECaiELA0AgBC0AACAQQYPQgIAAai0AAEcNjgEgEEECRg2QASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHWASEQDJICCwJAIAQgAkcNAEHXASEQDJICCwJAAkAgBC0AAEG7f2oOEACPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAY8BCyAEQQFqIQRBuwEhEAz5AQsgBEEBaiEEQbwBIRAM+AELAkAgBCACRw0AQdgBIRAMkQILIAQtAABByABHDYwBIARBAWohBAzEAQsCQCAEIAJGDQAgAEGQgICAADYCCCAAIAQ2AgRBvgEhEAz3AQtB2QEhEAyPAgsCQCAEIAJHDQBB2gEhEAyPAgsgBC0AAEHIAEYNwwEgAEEBOgAoDLkBCyAAQQI6AC8gACAEIAIQpoCAgAAiEA2NAUHCASEQDPQBCyAALQAoQX9qDgK3AbkBuAELA0ACQCAELQAAQXZqDgQAjgGOAQCOAQsgBEEBaiIEIAJHDQALQd0BIRAMiwILIABBADoALyAALQAtQQRxRQ2EAgsgAEEAOgAvIABBAToANCABIQEMjAELIBBBFUYN2gEgAEEANgIcIAAgATYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMiAILAkAgACAQIAIQtICAgAAiBA0AIBAhAQyBAgsCQCAEQRVHDQAgAEEDNgIcIAAgEDYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMiAILIABBADYCHCAAIBA2AhQgAEGnjoCAADYCECAAQRI2AgxBACEQDIcCCyAQQRVGDdYBIABBADYCHCAAIAE2AhQgAEHajYCAADYCECAAQRQ2AgxBACEQDIYCCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNjQEgAEEHNgIcIAAgEDYCFCAAIBQ2AgxBACEQDIUCCyAAIAAvATBBgAFyOwEwIAEhAQtBKiEQDOoBCyAQQRVGDdEBIABBADYCHCAAIAE2AhQgAEGDjICAADYCECAAQRM2AgxBACEQDIICCyAQQRVGDc8BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDIECCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyNAQsgAEEMNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDIACCyAQQRVGDcwBIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDP8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyMAQsgAEENNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDP4BCyAQQRVGDckBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDP0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyLAQsgAEEONgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPwBCyAAQQA2AhwgACABNgIUIABBwJWAgAA2AhAgAEECNgIMQQAhEAz7AQsgEEEVRg3FASAAQQA2AhwgACABNgIUIABBxoyAgAA2AhAgAEEjNgIMQQAhEAz6AQsgAEEQNgIcIAAgATYCFCAAIBA2AgxBACEQDPkBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQzxAQsgAEERNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPgBCyAQQRVGDcEBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPcBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyIAQsgAEETNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPYBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQztAQsgAEEUNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPUBCyAQQRVGDb0BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDPQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyGAQsgAEEWNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPMBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQt4CAgAAiBA0AIAFBAWohAQzpAQsgAEEXNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPIBCyAAQQA2AhwgACABNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzxAQtCASERCyAQQQFqIQECQCAAKQMgIhJC//////////8PVg0AIAAgEkIEhiARhDcDICABIQEMhAELIABBADYCHCAAIAE2AhQgAEGtiYCAADYCECAAQQw2AgxBACEQDO8BCyAAQQA2AhwgACAQNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzuAQsgACgCBCEXIABBADYCBCAQIBGnaiIWIQEgACAXIBAgFiAUGyIQELWAgIAAIhRFDXMgAEEFNgIcIAAgEDYCFCAAIBQ2AgxBACEQDO0BCyAAQQA2AhwgACAQNgIUIABBqpyAgAA2AhAgAEEPNgIMQQAhEAzsAQsgACAQIAIQtICAgAAiAQ0BIBAhAQtBDiEQDNEBCwJAIAFBFUcNACAAQQI2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAzqAQsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAM6QELIAFBAWohEAJAIAAvATAiAUGAAXFFDQACQCAAIBAgAhC7gICAACIBDQAgECEBDHALIAFBFUcNugEgAEEFNgIcIAAgEDYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAM6QELAkAgAUGgBHFBoARHDQAgAC0ALUECcQ0AIABBADYCHCAAIBA2AhQgAEGWk4CAADYCECAAQQQ2AgxBACEQDOkBCyAAIBAgAhC9gICAABogECEBAkACQAJAAkACQCAAIBAgAhCzgICAAA4WAgEABAQEBAQEBAQEBAQEBAQEBAQEAwQLIABBAToALgsgACAALwEwQcAAcjsBMCAQIQELQSYhEAzRAQsgAEEjNgIcIAAgEDYCFCAAQaWWgIAANgIQIABBFTYCDEEAIRAM6QELIABBADYCHCAAIBA2AhQgAEHVi4CAADYCECAAQRE2AgxBACEQDOgBCyAALQAtQQFxRQ0BQcMBIRAMzgELAkAgDSACRg0AA0ACQCANLQAAQSBGDQAgDSEBDMQBCyANQQFqIg0gAkcNAAtBJSEQDOcBC0ElIRAM5gELIAAoAgQhBCAAQQA2AgQgACAEIA0Qr4CAgAAiBEUNrQEgAEEmNgIcIAAgBDYCDCAAIA1BAWo2AhRBACEQDOUBCyAQQRVGDasBIABBADYCHCAAIAE2AhQgAEH9jYCAADYCECAAQR02AgxBACEQDOQBCyAAQSc2AhwgACABNgIUIAAgEDYCDEEAIRAM4wELIBAhAUEBIRQCQAJAAkACQAJAAkACQCAALQAsQX5qDgcGBQUDAQIABQsgACAALwEwQQhyOwEwDAMLQQIhFAwBC0EEIRQLIABBAToALCAAIAAvATAgFHI7ATALIBAhAQtBKyEQDMoBCyAAQQA2AhwgACAQNgIUIABBq5KAgAA2AhAgAEELNgIMQQAhEAziAQsgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDEEAIRAM4QELIABBADoALCAQIQEMvQELIBAhAUEBIRQCQAJAAkACQAJAIAAtACxBe2oOBAMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0EpIRAMxQELIABBADYCHCAAIAE2AhQgAEHwlICAADYCECAAQQM2AgxBACEQDN0BCwJAIA4tAABBDUcNACAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA5BAWohAQx1CyAAQSw2AhwgACABNgIMIAAgDkEBajYCFEEAIRAM3QELIAAtAC1BAXFFDQFBxAEhEAzDAQsCQCAOIAJHDQBBLSEQDNwBCwJAAkADQAJAIA4tAABBdmoOBAIAAAMACyAOQQFqIg4gAkcNAAtBLSEQDN0BCyAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA4hAQx0CyAAQSw2AhwgACAONgIUIAAgATYCDEEAIRAM3AELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHMLIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzbAQsgACgCBCEEIABBADYCBCAAIAQgDhCxgICAACIEDaABIA4hAQzOAQsgEEEsRw0BIAFBAWohEEEBIQECQAJAAkACQAJAIAAtACxBe2oOBAMBAgQACyAQIQEMBAtBAiEBDAELQQQhAQsgAEEBOgAsIAAgAC8BMCABcjsBMCAQIQEMAQsgACAALwEwQQhyOwEwIBAhAQtBOSEQDL8BCyAAQQA6ACwgASEBC0E0IRAMvQELIAAgAC8BMEEgcjsBMCABIQEMAgsgACgCBCEEIABBADYCBAJAIAAgBCABELGAgIAAIgQNACABIQEMxwELIABBNzYCHCAAIAE2AhQgACAENgIMQQAhEAzUAQsgAEEIOgAsIAEhAQtBMCEQDLkBCwJAIAAtAChBAUYNACABIQEMBAsgAC0ALUEIcUUNkwEgASEBDAMLIAAtADBBIHENlAFBxQEhEAy3AQsCQCAPIAJGDQACQANAAkAgDy0AAEFQaiIBQf8BcUEKSQ0AIA8hAUE1IRAMugELIAApAyAiEUKZs+bMmbPmzBlWDQEgACARQgp+IhE3AyAgESABrUL/AYMiEkJ/hVYNASAAIBEgEnw3AyAgD0EBaiIPIAJHDQALQTkhEAzRAQsgACgCBCECIABBADYCBCAAIAIgD0EBaiIEELGAgIAAIgINlQEgBCEBDMMBC0E5IRAMzwELAkAgAC8BMCIBQQhxRQ0AIAAtAChBAUcNACAALQAtQQhxRQ2QAQsgACABQff7A3FBgARyOwEwIA8hAQtBNyEQDLQBCyAAIAAvATBBEHI7ATAMqwELIBBBFUYNiwEgAEEANgIcIAAgATYCFCAAQfCOgIAANgIQIABBHDYCDEEAIRAMywELIABBwwA2AhwgACABNgIMIAAgDUEBajYCFEEAIRAMygELAkAgAS0AAEE6Rw0AIAAoAgQhECAAQQA2AgQCQCAAIBAgARCvgICAACIQDQAgAUEBaiEBDGMLIABBwwA2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMygELIABBADYCHCAAIAE2AhQgAEGxkYCAADYCECAAQQo2AgxBACEQDMkBCyAAQQA2AhwgACABNgIUIABBoJmAgAA2AhAgAEEeNgIMQQAhEAzIAQsgAEEANgIACyAAQYASOwEqIAAgF0EBaiIBIAIQqICAgAAiEA0BIAEhAQtBxwAhEAysAQsgEEEVRw2DASAAQdEANgIcIAAgATYCFCAAQeOXgIAANgIQIABBFTYCDEEAIRAMxAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDF4LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMwwELIABBADYCHCAAIBQ2AhQgAEHBqICAADYCECAAQQc2AgwgAEEANgIAQQAhEAzCAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAzBAQtBACEQIABBADYCHCAAIAE2AhQgAEGAkYCAADYCECAAQQk2AgwMwAELIBBBFUYNfSAAQQA2AhwgACABNgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAy/AQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgAUEBaiEBAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBAJAIAAgECABEK2AgIAAIhANACABIQEMXAsgAEHYADYCHCAAIAE2AhQgACAQNgIMQQAhEAy+AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMrQELIABB2QA2AhwgACABNgIUIAAgBDYCDEEAIRAMvQELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKsBCyAAQdoANgIcIAAgATYCFCAAIAQ2AgxBACEQDLwBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQypAQsgAEHcADYCHCAAIAE2AhQgACAENgIMQQAhEAy7AQsCQCABLQAAQVBqIhBB/wFxQQpPDQAgACAQOgAqIAFBAWohAUHPACEQDKIBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQynAQsgAEHeADYCHCAAIAE2AhQgACAENgIMQQAhEAy6AQsgAEEANgIAIBdBAWohAQJAIAAtAClBI08NACABIQEMWQsgAEEANgIcIAAgATYCFCAAQdOJgIAANgIQIABBCDYCDEEAIRAMuQELIABBADYCAAtBACEQIABBADYCHCAAIAE2AhQgAEGQs4CAADYCECAAQQg2AgwMtwELIABBADYCACAXQQFqIQECQCAALQApQSFHDQAgASEBDFYLIABBADYCHCAAIAE2AhQgAEGbioCAADYCECAAQQg2AgxBACEQDLYBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKSIQQV1qQQtPDQAgASEBDFULAkAgEEEGSw0AQQEgEHRBygBxRQ0AIAEhAQxVC0EAIRAgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDAy1AQsgEEEVRg1xIABBADYCHCAAIAE2AhQgAEG5jYCAADYCECAAQRo2AgxBACEQDLQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxUCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLMBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=", "base64"); - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js -var require_llhttp_simd_wasm = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports, module2) { - var { Buffer: Buffer2 } = require("node:buffer"); - module2.exports = Buffer2.from("AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64"); + function parseJSONFromBytes(bytes) { + return JSON.parse(utf8DecodeBytes(bytes)); + } + function bodyMimeType(requestOrResponse) { + const headers = requestOrResponse[kState].headersList; + const mimeType = extractMimeType(headers); + if (mimeType === "failure") { + return null; + } + return mimeType; + } + module2.exports = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody + }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/client.js -var require_client = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/client.js"(exports, module2) { +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client-h1.js +var require_client_h1 = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client-h1.js"(exports, module2) { "use strict"; var assert3 = require("node:assert"); - var net = require("node:net"); - var http = require("node:http"); - var { pipeline } = require("node:stream"); var util = require_util(); var { channels } = require_diagnostics(); var timers = require_timers(); - var Request = require_request(); - var DispatcherBase = require_dispatcher_base(); var { RequestContentLengthMismatchError, ResponseContentLengthMismatchError, - InvalidArgumentError, RequestAbortedError, HeadersTimeoutError, HeadersOverflowError, @@ -11411,28 +10693,19 @@ var require_client = __commonJS({ InformationalError, BodyTimeoutError, HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError + ResponseExceededMaxSizeError } = require_errors(); - var buildConnector = require_connect(); var { kUrl, kReset, - kServerName, kClient, - kBusy, kParser, - kConnect, kBlocking, - kResuming, kRunning, kPending, kSize, kWriting, kQueue, - kConnected, - kConnecting, - kNeedDrain, kNoRef, kKeepAliveDefaultTimeout, kHostHeader, @@ -11448,1664 +10721,2159 @@ var require_client = __commonJS({ kHeadersTimeout, kBodyTimeout, kStrictContentLength, - kConnector, - kMaxRedirections, kMaxRequests, kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, kMaxResponseSize, - kHTTPConnVersion, - // HTTP2 - kHost, - kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest + kOnError, + kResume, + kHTTPContext } = require_symbols(); - var http2; - try { - http2 = require("node:http2"); - } catch { - http2 = { constants: {} }; + var constants = require_constants3(); + var EMPTY_BUF = Buffer.alloc(0); + var FastBuffer = Buffer[Symbol.species]; + var addListener = util.addListener; + var removeAllListeners = util.removeAllListeners; + var extractBody; + async function lazyllhttp() { + const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0; + let mod; + try { + mod = await WebAssembly.compile(require_llhttp_simd_wasm()); + } catch (e) { + mod = await WebAssembly.compile(llhttpWasmData || require_llhttp_wasm()); + } + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ + wasm_on_url: (p, at, len) => { + return 0; + }, + wasm_on_status: (p, at, len) => { + assert3.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_begin: (p) => { + assert3.strictEqual(currentParser.ptr, p); + return currentParser.onMessageBegin() || 0; + }, + wasm_on_header_field: (p, at, len) => { + assert3.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_header_value: (p, at, len) => { + assert3.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert3.strictEqual(currentParser.ptr, p); + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; + }, + wasm_on_body: (p, at, len) => { + assert3.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_complete: (p) => { + assert3.strictEqual(currentParser.ptr, p); + return currentParser.onMessageComplete() || 0; + } + /* eslint-enable camelcase */ + } + }); } - var { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS + var llhttpInstance = null; + var llhttpPromise = lazyllhttp(); + llhttpPromise.catch(); + var currentParser = null; + var currentBufferRef = null; + var currentBufferSize = 0; + var currentBufferPtr = null; + var TIMEOUT_HEADERS = 1; + var TIMEOUT_BODY = 2; + var TIMEOUT_IDLE = 3; + var Parser = class { + constructor(client, socket, { exports: exports2 }) { + assert3(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); + this.llhttp = exports2; + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); + this.client = client; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = null; + this.statusText = ""; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); + this.bytesRead = 0; + this.keepAlive = ""; + this.contentLength = ""; + this.connection = ""; + this.maxResponseSize = client[kMaxResponseSize]; } - } = http2; - var h2ExperimentalWarned = false; - var FastBuffer = Buffer[Symbol.species]; - var kClosedResolve = Symbol("kClosedResolve"); - var Client = class extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../types/client').Client.Options} options - */ - constructor(url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect: connect2, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - allowH2, - maxConcurrentStreams - } = {}) { - super(); - if (keepAlive !== void 0) { - throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + setTimeout(value, type) { + this.timeoutType = type; + if (value !== this.timeoutValue) { + timers.clearTimeout(this.timeout); + if (value) { + this.timeout = timers.setTimeout(onParserTimeout, value, this); + if (this.timeout.unref) { + this.timeout.unref(); + } + } else { + this.timeout = null; + } + this.timeoutValue = value; + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } } - if (socketTimeout !== void 0) { - throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + } + resume() { + if (this.socket.destroyed || !this.paused) { + return; } - if (requestTimeout !== void 0) { - throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + assert3(this.ptr != null); + assert3(currentParser == null); + this.llhttp.llhttp_resume(this.ptr); + assert3(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); + this.readMore(); + } + readMore() { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break; + } + this.execute(chunk); + } + } + execute(data) { + assert3(this.ptr != null); + assert3(currentParser == null); + assert3(!this.paused); + const { socket, llhttp } = this; + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); + } + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); + try { + let ret; + try { + currentBufferRef = data; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + } catch (err) { + throw err; + } finally { + currentParser = null; + currentBufferRef = null; + } + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)); + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data.slice(offset)); + } else if (ret !== constants.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ""; + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; + } + throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); + } + } catch (err) { + util.destroy(socket, err); } - if (idleTimeout !== void 0) { - throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + } + destroy() { + assert3(this.ptr != null); + assert3(currentParser == null); + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; + timers.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.paused = false; + } + onStatus(buf) { + this.statusText = buf.toString(); + } + onMessageBegin() { + const { socket, client } = this; + if (socket.destroyed) { + return -1; } - if (maxKeepAliveTimeout !== void 0) { - throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1; } - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError("invalid maxHeaderSize"); + request.onResponseStarted(); + } + onHeaderField(buf) { + const len = this.headers.length; + if ((len & 1) === 0) { + this.headers.push(buf); + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } - if (socketPath != null && typeof socketPath !== "string") { - throw new InvalidArgumentError("invalid socketPath"); + this.trackHeader(buf.length); + } + onHeaderValue(buf) { + let len = this.headers.length; + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError("invalid connectTimeout"); + const key = this.headers[len - 2]; + if (key.length === 10) { + const headerName = util.bufferToLowerCasedHeaderName(key); + if (headerName === "keep-alive") { + this.keepAlive += buf.toString(); + } else if (headerName === "connection") { + this.connection += buf.toString(); + } + } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === "content-length") { + this.contentLength += buf.toString(); } - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveTimeout"); + this.trackHeader(buf.length); + } + trackHeader(len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError()); } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); + } + onUpgrade(head) { + const { upgrade, client, socket, headers, statusCode } = this; + assert3(upgrade); + const request = client[kQueue][client[kRunningIdx]]; + assert3(request); + assert3(!socket.destroyed); + assert3(socket === client[kSocket]); + assert3(!this.paused); + assert3(request.upgrade || request.method === "CONNECT"); + this.statusCode = null; + this.statusText = ""; + this.shouldKeepAlive = null; + assert3(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + socket.unshift(head); + socket[kParser].destroy(); + socket[kParser] = null; + socket[kClient] = null; + socket[kError] = null; + removeAllListeners(socket); + client[kSocket] = null; + client[kHTTPContext] = null; + client[kQueue][client[kRunningIdx]++] = null; + client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); + try { + request.onUpgrade(statusCode, headers, socket); + } catch (err) { + util.destroy(socket, err); } - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); + client[kResume](); + } + onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this; + if (socket.destroyed) { + return -1; } - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1; } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); + assert3(!this.upgrade); + assert3(this.statusCode < 200); + if (statusCode === 100) { + util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket))); + return -1; } - if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket))); + return -1; } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + assert3.strictEqual(this.timeoutType, TIMEOUT_HEADERS); + this.statusCode = statusCode; + this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. + request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); + if (request.method === "CONNECT") { + assert3(client[kRunning] === 1); + this.upgrade = true; + return 2; } - if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError("localAddress must be valid string IP address"); + if (upgrade) { + assert3(client[kRunning] === 1); + this.upgrade = true; + return 2; } - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError("maxResponseSize must be a positive number"); + assert3(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] + ); + if (timeout <= 0) { + socket[kReset] = true; + } else { + client[kKeepAliveTimeoutValue] = timeout; + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; + } + } else { + socket[kReset] = true; } - if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { - throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); + const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; + if (request.aborted) { + return -1; } - if (allowH2 != null && typeof allowH2 !== "boolean") { - throw new InvalidArgumentError("allowH2 must be a valid boolean value"); + if (request.method === "HEAD") { + return 1; } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); + if (statusCode < 200) { + return 1; } - if (typeof connect2 !== "function") { - connect2 = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect2 - }); + if (socket[kBlocking]) { + socket[kBlocking] = false; + client[kResume](); } - this[kInterceptors] = interceptors?.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; - this[kUrl] = util.parseOrigin(url); - this[kConnector] = connect2; - this[kSocket] = null; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; - this[kNeedDrain] = 0; - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r -`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kHTTPConnVersion] = "h1"; - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = !allowH2 ? null : { - // streams: null, // Fixed queue of streams - For future support of `push` - openStreams: 0, - // Keep track of them to decide whether or not unref the session - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 - // Max peerConcurrentStreams for a Node h2 server - }; - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}`; - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; - } - get pipelining() { - return this[kPipelining]; - } - set pipelining(value) { - this[kPipelining] = value; - resume(this, true); - } - get [kPending]() { - return this[kQueue].length - this[kPendingIdx]; - } - get [kRunning]() { - return this[kPendingIdx] - this[kRunningIdx]; - } - get [kSize]() { - return this[kQueue].length - this[kRunningIdx]; - } - get [kConnected]() { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; - } - get [kBusy]() { - const socket = this[kSocket]; - return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; + return pause ? constants.ERROR.PAUSED : 0; } - /* istanbul ignore: only used for test */ - [kConnect](cb) { - connect(this); - this.once("connect", cb); + onBody(buf) { + const { client, socket, statusCode, maxResponseSize } = this; + if (socket.destroyed) { + return -1; + } + const request = client[kQueue][client[kRunningIdx]]; + assert3(request); + assert3.strictEqual(this.timeoutType, TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + assert3(statusCode >= 200); + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError()); + return -1; + } + this.bytesRead += buf.length; + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED; + } } - [kDispatch](opts, handler) { - const origin = opts.origin || this[kUrl].origin; - const request = this[kHTTPConnVersion] === "h2" ? Request[kHTTP2BuildRequest](origin, opts, handler) : Request[kHTTP1BuildRequest](origin, opts, handler); - this[kQueue].push(request); - if (this[kResuming]) { - } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - this[kResuming] = 1; - process.nextTick(resume, this); - } else { - resume(this, true); + onMessageComplete() { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1; } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; + if (upgrade) { + return; + } + const request = client[kQueue][client[kRunningIdx]]; + assert3(request); + assert3(statusCode >= 100); + this.statusCode = null; + this.statusText = ""; + this.bytesRead = 0; + this.contentLength = ""; + this.keepAlive = ""; + this.connection = ""; + assert3(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + if (statusCode < 200) { + return; + } + if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()); + return -1; + } + request.onComplete(headers); + client[kQueue][client[kRunningIdx]++] = null; + if (socket[kWriting]) { + assert3.strictEqual(client[kRunning], 0); + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (socket[kReset] && client[kRunning] === 0) { + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (client[kPipelining] == null || client[kPipelining] === 1) { + setImmediate(() => client[kResume]()); + } else { + client[kResume](); } - return this[kNeedDrain] < 2; } - async [kClose]() { - return new Promise((resolve) => { - if (this[kSize]) { - this[kClosedResolve] = resolve; - } else { - resolve(null); - } - }); + }; + function onParserTimeout(parser) { + const { socket, timeoutType, client } = parser; + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert3(!parser.paused, "cannot be paused while waiting for headers"); + util.destroy(socket, new HeadersTimeoutError()); + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!parser.paused) { + util.destroy(socket, new BodyTimeoutError()); + } + } else if (timeoutType === TIMEOUT_IDLE) { + assert3(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); + util.destroy(socket, new InformationalError("socket idle timeout")); } - async [kDestroy](err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); + } + async function connectH1(client, socket) { + client[kSocket] = socket; + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; + } + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client, socket, llhttpInstance); + addListener(socket, "error", function(err) { + const parser = this[kParser]; + assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + this[kError] = err; + this[kClient][kOnError](err); + }); + addListener(socket, "readable", function() { + const parser = this[kParser]; + if (parser) { + parser.readMore(); + } + }); + addListener(socket, "end", function() { + const parser = this[kParser]; + if (parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); + }); + addListener(socket, "close", function() { + const client2 = this[kClient]; + const parser = this[kParser]; + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + } + this[kParser].destroy(); + this[kParser] = null; + } + const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); + client2[kSocket] = null; + client2[kHTTPContext] = null; + if (client2.destroyed) { + assert3(client2[kPending] === 0); + const requests = client2[kQueue].splice(client2[kRunningIdx]); for (let i = 0; i < requests.length; i++) { const request = requests[i]; - errorRequest(this, request, err); - } - const callback = () => { - if (this[kClosedResolve]) { - this[kClosedResolve](); - this[kClosedResolve] = null; - } - resolve(); - }; - if (this[kHTTP2Session] != null) { - util.destroy(this[kHTTP2Session], err); - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = null; + util.errorRequest(client2, request, err); } - if (this[kSocket]) { - util.destroy(this[kSocket].on("close", callback), err); - } else { + } else if (client2[kRunning] > 0 && err.code !== "UND_ERR_INFO") { + const request = client2[kQueue][client2[kRunningIdx]]; + client2[kQueue][client2[kRunningIdx]++] = null; + util.errorRequest(client2, request, err); + } + client2[kPendingIdx] = client2[kRunningIdx]; + assert3(client2[kRunning] === 0); + client2.emit("disconnect", client2[kUrl], [client2], err); + client2[kResume](); + }); + let closed = false; + socket.on("close", () => { + closed = true; + }); + return { + version: "h1", + defaultPipelining: 1, + write(...args) { + return writeH1(client, ...args); + }, + resume() { + resumeH1(client); + }, + destroy(err, callback) { + if (closed) { queueMicrotask(callback); + } else { + socket.destroy(err).on("close", callback); } - resume(this); - }); - } - }; - function onHttp2SessionError(err) { - assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - this[kSocket][kError] = err; - onError(this[kClient], err); + }, + get destroyed() { + return socket.destroyed; + }, + busy(request) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return true; + } + if (request) { + if (client[kRunning] > 0 && !request.idempotent) { + return true; + } + if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { + return true; + } + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) { + return true; + } + } + return false; + } + }; } - function onHttp2FrameError(type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - if (id === 0) { - this[kSocket][kError] = err; - onError(this[kClient], err); + function resumeH1(client) { + const socket = client[kSocket]; + if (socket && !socket.destroyed) { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]]; + const headersTimeout = request.headersTimeout != null ? request.headersTimeout : client[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); + } + } } } - function onHttp2SessionEnd() { - util.destroy(this, new SocketError("other side closed")); - util.destroy(this[kSocket], new SocketError("other side closed")); + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; } - function onHTTP2GoAway(code) { - const client = this[kClient]; - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); - client[kSocket] = null; - client[kHTTP2Session] = null; - if (client.destroyed) { - assert3(this[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); + function writeH1(client, request) { + const { method, path: path10, host, upgrade, blocking, reset } = request; + let { body, headers, contentLength } = request; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (util.isFormDataLike(body)) { + if (!extractBody) { + extractBody = require_body().extractBody; } - } else if (client[kRunning] > 0) { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } - client[kPendingIdx] = client[kRunningIdx]; - assert3(client[kRunning] === 0); - client.emit( - "disconnect", - client[kUrl], - [client], - err - ); - resume(client); - } - var constants = require_constants4(); - var createRedirectInterceptor = require_redirectInterceptor(); - var EMPTY_BUF = Buffer.alloc(0); - async function lazyllhttp() { - const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0; - let mod; - try { - mod = await WebAssembly.compile(require_llhttp_simd_wasm()); - } catch (e) { - mod = await WebAssembly.compile(llhttpWasmData || require_llhttp_wasm()); + const [bodyStream, contentType] = extractBody(body); + if (request.contentType == null) { + headers.push("content-type", contentType); + } + body = bodyStream.stream; + contentLength = bodyStream.length; + } else if (util.isBlobLike(body) && request.contentType == null && body.type) { + headers.push("content-type", body.type); } - return await WebAssembly.instantiate(mod, { - env: { - /* eslint-disable camelcase */ - wasm_on_url: (p, at, len) => { - return 0; - }, - wasm_on_status: (p, at, len) => { - assert3.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_begin: (p) => { - assert3.strictEqual(currentParser.ptr, p); - return currentParser.onMessageBegin() || 0; - }, - wasm_on_header_field: (p, at, len) => { - assert3.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_header_value: (p, at, len) => { - assert3.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert3.strictEqual(currentParser.ptr, p); - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; - }, - wasm_on_body: (p, at, len) => { - assert3.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_complete: (p) => { - assert3.strictEqual(currentParser.ptr, p); - return currentParser.onMessageComplete() || 0; - } - /* eslint-enable camelcase */ + if (body && typeof body.read === "function") { + body.read(0); + } + const bodyLength = util.bodyLength(body); + contentLength = bodyLength ?? contentLength; + if (contentLength === null) { + contentLength = request.contentLength; + } + if (contentLength === 0 && !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false; } - }); - } - var llhttpInstance = null; - var llhttpPromise = lazyllhttp(); - llhttpPromise.catch(); - var currentParser = null; - var currentBufferRef = null; - var currentBufferSize = 0; - var currentBufferPtr = null; - var TIMEOUT_HEADERS = 1; - var TIMEOUT_BODY = 2; - var TIMEOUT_IDLE = 3; - var Parser = class { - constructor(client, socket, { exports: exports2 }) { - assert3(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); - this.llhttp = exports2; - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); - this.client = client; - this.socket = socket; - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.statusCode = null; - this.statusText = ""; - this.upgrade = false; - this.headers = []; - this.headersSize = 0; - this.headersMaxSize = client[kMaxHeadersSize]; - this.shouldKeepAlive = false; - this.paused = false; - this.resume = this.resume.bind(this); - this.bytesRead = 0; - this.keepAlive = ""; - this.contentLength = ""; - this.connection = ""; - this.maxResponseSize = client[kMaxResponseSize]; + process.emitWarning(new RequestContentLengthMismatchError()); } - setTimeout(value, type) { - this.timeoutType = type; - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout); - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this); - if (this.timeout.unref) { - this.timeout.unref(); + const socket = client[kSocket]; + const abort = (err) => { + if (request.aborted || request.completed) { + return; + } + util.errorRequest(client, request, err || new RequestAbortedError()); + util.destroy(body); + util.destroy(socket, new InformationalError("aborted")); + }; + try { + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); + } + if (request.aborted) { + return false; + } + if (method === "HEAD") { + socket[kReset] = true; + } + if (upgrade || method === "CONNECT") { + socket[kReset] = true; + } + if (reset != null) { + socket[kReset] = reset; + } + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true; + } + if (blocking) { + socket[kBlocking] = true; + } + let header = `${method} ${path10} HTTP/1.1\r +`; + if (typeof host === "string") { + header += `host: ${host}\r +`; + } else { + header += client[kHostHeader]; + } + if (upgrade) { + header += `connection: upgrade\r +upgrade: ${upgrade}\r +`; + } else if (client[kPipelining] && !socket[kReset]) { + header += "connection: keep-alive\r\n"; + } else { + header += "connection: close\r\n"; + } + if (Array.isArray(headers)) { + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0]; + const val = headers[n + 1]; + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + header += `${key}: ${val[i]}\r +`; } } else { - this.timeout = null; - } - this.timeoutValue = value; - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); + header += `${key}: ${val}\r +`; } } } - resume() { - if (this.socket.destroyed || !this.paused) { + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }); + } + if (!body || bodyLength === 0) { + writeBuffer({ abort, body: null, client, request, socket, contentLength, header, expectsPayload }); + } else if (util.isBuffer(body)) { + writeBuffer({ abort, body, client, request, socket, contentLength, header, expectsPayload }); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === "function") { + writeIterable({ abort, body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); + } else { + writeBlob({ abort, body, client, request, socket, contentLength, header, expectsPayload }); + } + } else if (util.isStream(body)) { + writeStream({ abort, body, client, request, socket, contentLength, header, expectsPayload }); + } else if (util.isIterable(body)) { + writeIterable({ abort, body, client, request, socket, contentLength, header, expectsPayload }); + } else { + assert3(false); + } + return true; + } + function writeStream({ abort, body, client, request, socket, contentLength, header, expectsPayload }) { + assert3(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); + let finished = false; + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + const onData = function(chunk) { + if (finished) { return; } - assert3(this.ptr != null); - assert3(currentParser == null); - this.llhttp.llhttp_resume(this.ptr); - assert3(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); } + } catch (err) { + util.destroy(this, err); } - this.paused = false; - this.execute(this.socket.read() || EMPTY_BUF); - this.readMore(); - } - readMore() { - while (!this.paused && this.ptr) { - const chunk = this.socket.read(); - if (chunk === null) { - break; - } - this.execute(chunk); + }; + const onDrain = function() { + if (finished) { + return; } - } - execute(data) { - assert3(this.ptr != null); - assert3(currentParser == null); - assert3(!this.paused); - const { socket, llhttp } = this; - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr); - } - currentBufferSize = Math.ceil(data.length / 4096) * 4096; - currentBufferPtr = llhttp.malloc(currentBufferSize); + if (body.resume) { + body.resume(); } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); - try { - let ret; + }; + const onClose = function() { + queueMicrotask(() => { + body.removeListener("error", onFinished); + }); + if (!finished) { + const err = new RequestAbortedError(); + queueMicrotask(() => onFinished(err)); + } + }; + const onFinished = function(err) { + if (finished) { + return; + } + finished = true; + assert3(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); + socket.off("drain", onDrain).off("error", onFinished); + body.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose); + if (!err) { try { - currentBufferRef = data; - currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); - } catch (err) { - throw err; - } finally { - currentParser = null; - currentBufferRef = null; - } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)); - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data.slice(offset)); - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ""; - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); + writer.end(); + } catch (er) { + err = er; } - } catch (err) { - util.destroy(socket, err); } + writer.destroy(err); + if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { + util.destroy(body, err); + } else { + util.destroy(body); + } + }; + body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onClose); + if (body.resume) { + body.resume(); } - destroy() { - assert3(this.ptr != null); - assert3(currentParser == null); - this.llhttp.llhttp_free(this.ptr); - this.ptr = null; - timers.clearTimeout(this.timeout); - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.paused = false; + socket.on("drain", onDrain).on("error", onFinished); + if (body.errorEmitted ?? body.errored) { + setImmediate(() => onFinished(body.errored)); + } else if (body.endEmitted ?? body.readableEnded) { + setImmediate(() => onFinished(null)); } - onStatus(buf) { - this.statusText = buf.toString(); + if (body.closeEmitted ?? body.closed) { + setImmediate(onClose); } - onMessageBegin() { - const { socket, client } = this; - if (socket.destroyed) { - return -1; + } + async function writeBuffer({ abort, body, client, request, socket, contentLength, header, expectsPayload }) { + try { + if (!body) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + assert3(contentLength === null, "no body must not have content length"); + socket.write(`${header}\r +`, "latin1"); + } + } else if (util.isBuffer(body)) { + assert3(contentLength === body.byteLength, "buffer body must have content length"); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(body); + socket.uncork(); + request.onBodySent(body); + if (!expectsPayload) { + socket[kReset] = true; + } } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; + request.onRequestSent(); + client[kResume](); + } catch (err) { + abort(err); + } + } + async function writeBlob({ abort, body, client, request, socket, contentLength, header, expectsPayload }) { + assert3(contentLength === body.size, "blob body must have content length"); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError(); } - request.onResponseStarted(); + const buffer = Buffer.from(await body.arrayBuffer()); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(buffer); + socket.uncork(); + request.onBodySent(buffer); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + client[kResume](); + } catch (err) { + abort(err); } - onHeaderField(buf) { - const len = this.headers.length; - if ((len & 1) === 0) { - this.headers.push(buf); - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + async function writeIterable({ abort, body, client, request, socket, contentLength, header, expectsPayload }) { + assert3(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); } - this.trackHeader(buf.length); } - onHeaderValue(buf) { - let len = this.headers.length; - if ((len & 1) === 1) { - this.headers.push(buf); - len += 1; + const waitForDrain = () => new Promise((resolve, reject) => { + assert3(callback === null); + if (socket[kError]) { + reject(socket[kError]); } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + callback = resolve; } - const key = this.headers[len - 2]; - if (key.length === 10) { - const headerName = util.bufferToLowerCasedHeaderName(key); - if (headerName === "keep-alive") { - this.keepAlive += buf.toString(); - } else if (headerName === "connection") { - this.connection += buf.toString(); + }); + socket.on("close", onDrain).on("drain", onDrain); + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + try { + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError]; + } + if (!writer.write(chunk)) { + await waitForDrain(); } - } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === "content-length") { - this.contentLength += buf.toString(); } - this.trackHeader(buf.length); + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket.off("close", onDrain).off("drain", onDrain); } - trackHeader(len) { - this.headersSize += len; - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError()); - } + } + var AsyncWriter = class { + constructor({ abort, socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket; + this.request = request; + this.contentLength = contentLength; + this.client = client; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + this.abort = abort; + socket[kWriting] = true; } - onUpgrade(head) { - const { upgrade, client, socket, headers, statusCode } = this; - assert3(upgrade); - const request = client[kQueue][client[kRunningIdx]]; - assert3(request); - assert3(!socket.destroyed); - assert3(socket === client[kSocket]); - assert3(!this.paused); - assert3(request.upgrade || request.method === "CONNECT"); - this.statusCode = null; - this.statusText = ""; - this.shouldKeepAlive = null; - assert3(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - socket.unshift(head); - socket[kParser].destroy(); - socket[kParser] = null; - socket[kClient] = null; - socket[kError] = null; - socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); - client[kSocket] = null; - client[kQueue][client[kRunningIdx]++] = null; - client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); - try { - request.onUpgrade(statusCode, headers, socket); - } catch (err) { - util.destroy(socket, err); + write(chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + if (socket[kError]) { + throw socket[kError]; } - resume(client); - } - onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this; if (socket.destroyed) { - return -1; + return false; } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; + const len = Buffer.byteLength(chunk); + if (!len) { + return true; } - assert3(!this.upgrade); - assert3(this.statusCode < 200); - if (statusCode === 100) { - util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket))); - return -1; + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } + process.emitWarning(new RequestContentLengthMismatchError()); } - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket))); - return -1; + socket.cork(); + if (bytesWritten === 0) { + if (!expectsPayload) { + socket[kReset] = true; + } + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r +`, "latin1"); + } else { + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + } } - assert3.strictEqual(this.timeoutType, TIMEOUT_HEADERS); - this.statusCode = statusCode; - this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. - request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; - this.setTimeout(bodyTimeout, TIMEOUT_BODY); - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); + if (contentLength === null) { + socket.write(`\r +${len.toString(16)}\r +`, "latin1"); + } + this.bytesWritten += len; + const ret = socket.write(chunk); + socket.uncork(); + request.onBodySent(chunk); + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } } } - if (request.method === "CONNECT") { - assert3(client[kRunning] === 1); - this.upgrade = true; - return 2; + return ret; + } + end() { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; + request.onRequestSent(); + socket[kWriting] = false; + if (socket[kError]) { + throw socket[kError]; } - if (upgrade) { - assert3(client[kRunning] === 1); - this.upgrade = true; - return 2; + if (socket.destroyed) { + return; } - assert3(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client[kKeepAliveTimeoutThreshold], - client[kKeepAliveMaxTimeout] - ); - if (timeout <= 0) { - socket[kReset] = true; - } else { - client[kKeepAliveTimeoutValue] = timeout; - } + if (bytesWritten === 0) { + if (expectsPayload) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; + socket.write(`${header}\r +`, "latin1"); + } + } else if (contentLength === null) { + socket.write("\r\n0\r\n\r\n", "latin1"); + } + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } else { + process.emitWarning(new RequestContentLengthMismatchError()); + } + } + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + client[kResume](); + } + destroy(err) { + const { socket, client, abort } = this; + socket[kWriting] = false; + if (err) { + assert3(client[kRunning] <= 1, "pipeline should only contain this request"); + abort(err); + } + } + }; + module2.exports = connectH1; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client-h2.js +var require_client_h2 = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client-h2.js"(exports, module2) { + "use strict"; + var assert3 = require("node:assert"); + var { pipeline } = require("node:stream"); + var util = require_util(); + var { + RequestContentLengthMismatchError, + RequestAbortedError, + SocketError, + InformationalError + } = require_errors(); + var { + kUrl, + kReset, + kClient, + kRunning, + kPending, + kQueue, + kPendingIdx, + kRunningIdx, + kError, + kSocket, + kStrictContentLength, + kOnError, + kMaxConcurrentStreams, + kHTTP2Session, + kResume + } = require_symbols(); + var kOpenStreams = Symbol("open streams"); + var h2ExperimentalWarned = false; + var http2; + try { + http2 = require("node:http2"); + } catch { + http2 = { constants: {} }; + } + var { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS + } + } = http2; + function parseH2Headers(headers) { + const result = []; + for (const [name, value] of Object.entries(headers)) { + if (Array.isArray(value)) { + for (const subvalue of value) { + result.push(Buffer.from(name), Buffer.from(subvalue)); } } else { - socket[kReset] = true; - } - const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; - if (request.aborted) { - return -1; + result.push(Buffer.from(name), Buffer.from(value)); } - if (request.method === "HEAD") { - return 1; + } + return result; + } + async function connectH2(client, socket) { + client[kSocket] = socket; + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true; + process.emitWarning("H2 support is experimental, expect them to change at any time.", { + code: "UNDICI-H2" + }); + } + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kMaxConcurrentStreams] + }); + session[kOpenStreams] = 0; + session[kClient] = client; + session[kSocket] = socket; + util.addListener(session, "error", onHttp2SessionError); + util.addListener(session, "frameError", onHttp2FrameError); + util.addListener(session, "end", onHttp2SessionEnd); + util.addListener(session, "goaway", onHTTP2GoAway); + util.addListener(session, "close", function() { + const { [kClient]: client2 } = this; + const { [kSocket]: socket2 } = client2; + const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util.getSocketInfo(socket2)); + client2[kHTTP2Session] = null; + if (client2.destroyed) { + assert3(client2[kPending] === 0); + const requests = client2[kQueue].splice(client2[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client2, request, err); + } } - if (statusCode < 200) { - return 1; + }); + session.unref(); + client[kHTTP2Session] = session; + socket[kHTTP2Session] = session; + util.addListener(socket, "error", function(err) { + assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kError] = err; + this[kClient][kOnError](err); + }); + util.addListener(socket, "end", function() { + util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); + }); + util.addListener(socket, "close", function() { + const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); + client[kSocket] = null; + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); } - if (socket[kBlocking]) { - socket[kBlocking] = false; - resume(client); + client[kPendingIdx] = client[kRunningIdx]; + assert3(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + client[kResume](); + }); + let closed = false; + socket.on("close", () => { + closed = true; + }); + return { + version: "h2", + defaultPipelining: Infinity, + write(...args) { + writeH2(client, ...args); + }, + resume() { + }, + destroy(err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + socket.destroy(err).on("close", callback); + } + }, + get destroyed() { + return socket.destroyed; + }, + busy() { + return false; } - return pause ? constants.ERROR.PAUSED : 0; + }; + } + function onHttp2SessionError(err) { + assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kSocket][kError] = err; + this[kClient][kOnError](err); + } + function onHttp2FrameError(type, code, id) { + if (id === 0) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + this[kSocket][kError] = err; + this[kClient][kOnError](err); } - onBody(buf) { - const { client, socket, statusCode, maxResponseSize } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - assert3(request); - assert3.strictEqual(this.timeoutType, TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); + } + function onHttp2SessionEnd() { + const err = new SocketError("other side closed", util.getSocketInfo(this[kSocket])); + this.destroy(err); + util.destroy(this[kSocket], err); + } + function onHTTP2GoAway(code) { + const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); + this[kSocket][kError] = err; + this[kClient][kOnError](err); + this.unref(); + this.destroy(); + util.destroy(this[kSocket], err); + } + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function writeH2(client, request) { + const session = client[kHTTP2Session]; + const { body, method, path: path10, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + if (upgrade) { + util.errorRequest(client, request, new Error("Upgrade not supported for H2")); + return false; + } + if (request.aborted) { + return false; + } + const headers = {}; + for (let n = 0; n < reqHeaders.length; n += 2) { + const key = reqHeaders[n + 0]; + const val = reqHeaders[n + 1]; + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (headers[key]) { + headers[key] += `,${val[i]}`; + } else { + headers[key] = val[i]; + } } + } else { + headers[key] = val; } - assert3(statusCode >= 200); - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError()); - return -1; + } + let stream; + const { hostname, port } = client[kUrl]; + headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ""}`; + headers[HTTP2_HEADER_METHOD] = method; + const abort = (err) => { + if (request.aborted || request.completed) { + return; } - this.bytesRead += buf.length; - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED; + err = err || new RequestAbortedError(); + util.errorRequest(client, request, err); + if (stream != null) { + util.destroy(stream, err); } + util.destroy(body, err); + }; + try { + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); } - onMessageComplete() { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1; + if (method === "CONNECT") { + session.ref(); + stream = session.request(headers, { endStream: false, signal }); + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + } else { + stream.once("ready", () => { + request.onUpgrade(null, null, stream); + ++session[kOpenStreams]; + }); } - if (upgrade) { + stream.once("close", () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) + session.unref(); + }); + return true; + } + headers[HTTP2_HEADER_PATH] = path10; + headers[HTTP2_HEADER_SCHEME] = "https"; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (body && typeof body.read === "function") { + body.read(0); + } + let contentLength = util.bodyLength(body); + if (contentLength == null) { + contentLength = request.contentLength; + } + if (contentLength === 0 || !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false; + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + if (contentLength != null) { + assert3(body, "no body must not have content length"); + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + } + session.ref(); + const shouldEndStream = method === "GET" || method === "HEAD" || body === null; + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = "100-continue"; + stream = session.request(headers, { endStream: shouldEndStream, signal }); + stream.once("continue", writeBodyH2); + } else { + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }); + writeBodyH2(); + } + ++session[kOpenStreams]; + stream.once("response", (headers2) => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; + request.onResponseStarted(); + if (request.aborted) { + const err = new RequestAbortedError(); + util.errorRequest(client, request, err); + util.destroy(stream, err); return; } - const request = client[kQueue][client[kRunningIdx]]; - assert3(request); - assert3(statusCode >= 100); - this.statusCode = null; - this.statusText = ""; - this.bytesRead = 0; - this.contentLength = ""; - this.keepAlive = ""; - this.connection = ""; - assert3(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (statusCode < 200) { + if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) { + stream.pause(); + } + stream.on("data", (chunk) => { + if (request.onData(chunk) === false) { + stream.pause(); + } + }); + }); + stream.once("end", () => { + if (stream.state?.state == null || stream.state.state < 6) { + request.onComplete([]); return; } - if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError()); - return -1; + if (session[kOpenStreams] === 0) { + session.unref(); } - request.onComplete(headers); - client[kQueue][client[kRunningIdx]++] = null; - if (socket[kWriting]) { - assert3.strictEqual(client[kRunning], 0); - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (socket[kReset] && client[kRunning] === 0) { - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (client[kPipelining] === 1) { - setImmediate(resume, client); + abort(new InformationalError("HTTP/2: stream half-closed (remote)")); + }); + stream.once("close", () => { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { + session.unref(); + } + }); + stream.once("error", function(err) { + abort(err); + }); + stream.once("frameError", (type, code) => { + abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)); + }); + return true; + function writeBodyH2() { + if (!body || contentLength === 0) { + writeBuffer({ + abort, + client, + request, + contentLength, + expectsPayload, + h2stream: stream, + body: null, + socket: client[kSocket] + }); + } else if (util.isBuffer(body)) { + writeBuffer({ + abort, + client, + request, + contentLength, + body, + expectsPayload, + h2stream: stream, + socket: client[kSocket] + }); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === "function") { + writeIterable({ + abort, + client, + request, + contentLength, + expectsPayload, + h2stream: stream, + body: body.stream(), + socket: client[kSocket] + }); + } else { + writeBlob({ + abort, + body, + client, + request, + contentLength, + expectsPayload, + h2stream: stream, + socket: client[kSocket] + }); + } + } else if (util.isStream(body)) { + writeStream({ + body, + client, + request, + contentLength, + expectsPayload, + socket: client[kSocket], + h2stream: stream, + header: "" + }); + } else if (util.isIterable(body)) { + writeIterable({ + body, + client, + request, + contentLength, + expectsPayload, + header: "", + h2stream: stream, + socket: client[kSocket] + }); } else { - resume(client); + assert3(false); } } - }; - function onParserTimeout(parser) { - const { socket, timeoutType, client } = parser; - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert3(!parser.paused, "cannot be paused while waiting for headers"); - util.destroy(socket, new HeadersTimeoutError()); + } + function writeBuffer({ abort, h2stream, body, client, request, socket, contentLength, expectsPayload }) { + try { + if (body != null && util.isBuffer(body)) { + assert3(contentLength === body.byteLength, "buffer body must have content length"); + h2stream.cork(); + h2stream.write(body); + h2stream.uncork(); + h2stream.end(); + request.onBodySent(body); } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util.destroy(socket, new BodyTimeoutError()); + if (!expectsPayload) { + socket[kReset] = true; } - } else if (timeoutType === TIMEOUT_IDLE) { - assert3(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); - util.destroy(socket, new InformationalError("socket idle timeout")); - } - } - function onSocketReadable() { - const { [kParser]: parser } = this; - if (parser) { - parser.readMore(); + request.onRequestSent(); + client[kResume](); + } catch (error) { + abort(error); } } - function onSocketError(err) { - const { [kClient]: client, [kParser]: parser } = this; - assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - if (client[kHTTPConnVersion] !== "h2") { - if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; + function writeStream({ abort, socket, expectsPayload, h2stream, body, client, request, contentLength }) { + assert3(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); + const pipe = pipeline( + body, + h2stream, + (err) => { + if (err) { + util.destroy(pipe, err); + abort(err); + } else { + util.removeAllListeners(pipe); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + client[kResume](); + } } + ); + util.addListener(pipe, "data", onPipeData); + function onPipeData(chunk) { + request.onBodySent(chunk); } - this[kError] = err; - onError(this[kClient], err); } - function onError(client, err) { - if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { - assert3(client[kPendingIdx] === client[kRunningIdx]); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); + async function writeBlob({ abort, h2stream, body, client, request, socket, contentLength, expectsPayload }) { + assert3(contentLength === body.size, "blob body must have content length"); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError(); } - assert3(client[kSize] === 0); - } - } - function onSocketEnd() { - const { [kParser]: parser, [kClient]: client } = this; - if (client[kHTTPConnVersion] !== "h2") { - if (parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; + const buffer = Buffer.from(await body.arrayBuffer()); + h2stream.cork(); + h2stream.write(buffer); + h2stream.uncork(); + h2stream.end(); + request.onBodySent(buffer); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; } + client[kResume](); + } catch (err) { + abort(err); } - util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); } - function onSocketClose() { - const { [kClient]: client, [kParser]: parser } = this; - if (client[kHTTPConnVersion] === "h1" && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); + async function writeIterable({ abort, h2stream, body, client, request, socket, contentLength, expectsPayload }) { + assert3(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); } - this[kParser].destroy(); - this[kParser] = null; } - const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); - client[kSocket] = null; - if (client.destroyed) { - assert3(client[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); + const waitForDrain = () => new Promise((resolve, reject) => { + assert3(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; } - } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); + }); + h2stream.on("close", onDrain).on("drain", onDrain); + try { + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError]; + } + const res = h2stream.write(chunk); + request.onBodySent(chunk); + if (!res) { + await waitForDrain(); + } + } + h2stream.end(); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + client[kResume](); + } catch (err) { + abort(err); + } finally { + h2stream.off("close", onDrain).off("drain", onDrain); } - client[kPendingIdx] = client[kRunningIdx]; - assert3(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - resume(client); } - async function connect(client) { - assert3(!client[kConnecting]); - assert3(!client[kSocket]); - let { host, hostname, protocol, port } = client[kUrl]; - if (hostname[0] === "[") { - const idx = hostname.indexOf("]"); - assert3(idx !== -1); - const ip = hostname.substring(1, idx); - assert3(net.isIP(ip)); - hostname = ip; + module2.exports = connectH2; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/handler/redirect-handler.js +var require_redirect_handler = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/handler/redirect-handler.js"(exports, module2) { + "use strict"; + var util = require_util(); + var { kBodyUsed } = require_symbols(); + var assert3 = require("node:assert"); + var { InvalidArgumentError } = require_errors(); + var EE = require("node:events"); + var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + var kBody = Symbol("body"); + var BodyAsyncIterable = class { + constructor(body) { + this[kBody] = body; + this[kBodyUsed] = false; } - client[kConnecting] = true; - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPConnVersion], - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }); + async *[Symbol.asyncIterator]() { + assert3(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; } - try { - const socket = await new Promise((resolve, reject) => { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket2) => { - if (err) { - reject(err); - } else { - resolve(socket2); - } - }); - }); - if (client.destroyed) { - util.destroy(socket.on("error", () => { - }), new ClientDestroyedError()); - return; + }; + var RedirectHandler = class { + constructor(dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); } - client[kConnecting] = false; - assert3(socket); - const isH2 = socket.alpnProtocol === "h2"; - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true; - process.emitWarning("H2 support is experimental, expect them to change at any time.", { - code: "UNDICI-H2" + util.validateHandler(handler, opts.method, opts.upgrade); + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; + this.maxRedirections = maxRedirections; + this.handler = handler; + this.history = []; + this.redirectionLimitReached = false; + if (util.isStream(this.opts.body)) { + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body.on("data", function() { + assert3(false); }); } - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams - }); - client[kHTTPConnVersion] = "h2"; - session[kClient] = client; - session[kSocket] = socket; - session.on("error", onHttp2SessionError); - session.on("frameError", onHttp2FrameError); - session.on("end", onHttp2SessionEnd); - session.on("goaway", onHTTP2GoAway); - session.on("close", onSocketClose); - session.unref(); - client[kHTTP2Session] = session; - socket[kHTTP2Session] = session; - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; + if (typeof this.opts.body.readableDidRead !== "boolean") { + this.opts.body[kBodyUsed] = false; + EE.prototype.on.call(this.opts.body, "data", function() { + this[kBodyUsed] = true; + }); } - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client, socket, llhttpInstance); - } - socket[kCounter] = 0; - socket[kMaxRequests] = client[kMaxRequests]; - socket[kClient] = client; - socket[kError] = null; - socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); - client[kSocket] = socket; - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPConnVersion], - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }); + } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { + this.opts.body = new BodyAsyncIterable(this.opts.body); } - client.emit("connect", client[kUrl], [client]); - } catch (err) { - if (client.destroyed) { + } + onConnect(abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); + } + onUpgrade(statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket); + } + onError(error) { + this.handler.onError(error); + } + onHeaders(statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); + if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { + if (this.request) { + this.request.abort(new Error("max redirects")); + } + this.redirectionLimitReached = true; + this.abort(new Error("max redirects")); return; } - client[kConnecting] = false; - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPConnVersion], - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }); + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); + } + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText); } - if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { - assert3(client[kRunning] === 0); - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++]; - errorRequest(client, request, err); - } + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path10 = search ? `${pathname}${search}` : pathname; + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path10; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; + if (statusCode === 303 && this.opts.method !== "HEAD") { + this.opts.method = "GET"; + this.opts.body = null; + } + } + onData(chunk) { + if (this.location) { } else { - onError(client, err); + return this.handler.onData(chunk); + } + } + onComplete(trailers) { + if (this.location) { + this.location = null; + this.abort = null; + this.dispatch(this.opts, this); + } else { + this.handler.onComplete(trailers); + } + } + onBodySent(chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); + } + } + }; + function parseLocation(statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null; + } + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].length === 8 && util.headerNameToString(headers[i]) === "location") { + return headers[i + 1]; } - client.emit("connectionError", client[kUrl], [client], err); } - resume(client); - } - function emitDrain(client) { - client[kNeedDrain] = 0; - client.emit("drain", client[kUrl], [client]); } - function resume(client, sync) { - if (client[kResuming] === 2) { - return; + function shouldRemoveHeader(header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util.headerNameToString(header) === "host"; } - client[kResuming] = 2; - _resume(client, sync); - client[kResuming] = 0; - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]); - client[kPendingIdx] -= client[kRunningIdx]; - client[kRunningIdx] = 0; + if (removeContent && util.headerNameToString(header).startsWith("content-")) { + return true; + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header); + return name === "authorization" || name === "cookie" || name === "proxy-authorization"; } + return false; } - function _resume(client, sync) { - while (true) { - if (client.destroyed) { - assert3(client[kPending] === 0); - return; - } - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve](); - client[kClosedResolve] = null; - return; - } - const socket = client[kSocket]; - if (socket && !socket.destroyed && socket.alpnProtocol !== "h2") { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; + function cleanRequestHeaders(headers, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]); } - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request2 = client[kQueue][client[kRunningIdx]]; - const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } + } + } else if (headers && typeof headers === "object") { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]); } } - if (client[kBusy]) { - client[kNeedDrain] = 2; - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1; - process.nextTick(emitDrain, client); - } else { - emitDrain(client); + } else { + assert3(headers == null, "headers must be an object or an array"); + } + return ret; + } + module2.exports = RedirectHandler; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js +var require_redirect_interceptor = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js"(exports, module2) { + "use strict"; + var RedirectHandler = require_redirect_handler(); + function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept(opts, handler) { + const { maxRedirections = defaultMaxRedirections } = opts; + if (!maxRedirections) { + return dispatch(opts, handler); } - continue; + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); + opts = { ...opts, maxRedirections: 0 }; + return dispatch(opts, redirectHandler); + }; + }; + } + module2.exports = createRedirectInterceptor; + } +}); + +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client.js +var require_client = __commonJS({ + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/client.js"(exports, module2) { + "use strict"; + var assert3 = require("node:assert"); + var net = require("node:net"); + var http = require("node:http"); + var util = require_util(); + var { channels } = require_diagnostics(); + var Request = require_request(); + var DispatcherBase = require_dispatcher_base(); + var { + InvalidArgumentError, + InformationalError, + ClientDestroyedError + } = require_errors(); + var buildConnector = require_connect(); + var { + kUrl, + kServerName, + kClient, + kBusy, + kConnect, + kResuming, + kRunning, + kPending, + kSize, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kOnError, + kHTTPContext, + kMaxConcurrentStreams, + kResume + } = require_symbols(); + var connectH1 = require_client_h1(); + var connectH2 = require_client_h2(); + var deprecatedInterceptorWarned = false; + var kClosedResolve = Symbol("kClosedResolve"); + function getPipelining(client) { + return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1; + } + var Client = class extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../../types/client.js').Client.Options} options + */ + constructor(url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect: connect2, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + maxConcurrentStreams, + allowH2 + } = {}) { + super(); + if (keepAlive !== void 0) { + throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); } - if (client[kPending] === 0) { - return; + if (socketTimeout !== void 0) { + throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); } - if (client[kRunning] >= (client[kPipelining] || 1)) { - return; + if (requestTimeout !== void 0) { + throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); } - const request = client[kQueue][client[kPendingIdx]]; - if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return; - } - client[kServerName] = request.servername; - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError("servername changed")); - return; - } + if (idleTimeout !== void 0) { + throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + } + if (maxKeepAliveTimeout !== void 0) { + throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + } + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError("invalid maxHeaderSize"); + } + if (socketPath != null && typeof socketPath !== "string") { + throw new InvalidArgumentError("invalid socketPath"); + } + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError("invalid connectTimeout"); + } + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveTimeout"); + } + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); + } + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); } - if (client[kConnecting]) { - return; + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); } - if (!socket && !client[kHTTP2Session]) { - connect(client); - return; + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return; + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); } - if (client[kRunning] > 0 && !request.idempotent) { - return; + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); } - if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { - return; + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); } - if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - return; + if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError("localAddress must be valid string IP address"); } - if (!request.aborted && write(client, request)) { - client[kPendingIdx]++; - } else { - client[kQueue].splice(client[kPendingIdx], 1); + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError("maxResponseSize must be a positive number"); } - } - } - function shouldSendContentLength(method) { - return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; - } - function write(client, request) { - if (client[kHTTPConnVersion] === "h2") { - writeH2(client, client[kHTTP2Session], request); - return; - } - const { body, method, path: path10, host, upgrade, headers, blocking, reset } = request; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); - } - const bodyLength = util.bodyLength(body); - let contentLength = bodyLength; - if (contentLength === null) { - contentLength = request.contentLength; - } - if (contentLength === 0 && !expectsPayload) { - contentLength = null; - } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); - return false; + if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { + throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); } - process.emitWarning(new RequestContentLengthMismatchError()); - } - const socket = client[kSocket]; - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - errorRequest(client, request, err || new RequestAbortedError()); - util.destroy(socket, new InformationalError("aborted")); - }); - } catch (err) { - errorRequest(client, request, err); - } - if (request.aborted) { - return false; - } - if (method === "HEAD") { - socket[kReset] = true; - } - if (upgrade || method === "CONNECT") { - socket[kReset] = true; - } - if (reset != null) { - socket[kReset] = reset; - } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true; - } - if (blocking) { - socket[kBlocking] = true; - } - let header = `${method} ${path10} HTTP/1.1\r -`; - if (typeof host === "string") { - header += `host: ${host}\r -`; - } else { - header += client[kHostHeader]; - } - if (upgrade) { - header += `connection: upgrade\r -upgrade: ${upgrade}\r -`; - } else if (client[kPipelining] && !socket[kReset]) { - header += "connection: keep-alive\r\n"; - } else { - header += "connection: close\r\n"; - } - if (headers) { - header += headers; - } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }); - } - if (!body || bodyLength === 0) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - assert3(contentLength === null, "no body must not have content length"); - socket.write(`${header}\r -`, "latin1"); + if (allowH2 != null && typeof allowH2 !== "boolean") { + throw new InvalidArgumentError("allowH2 must be a valid boolean value"); } - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert3(contentLength === body.byteLength, "buffer body must have content length"); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(body); - socket.uncork(); - request.onBodySent(body); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); - } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); + if (typeof connect2 !== "function") { + connect2 = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect2 + }); } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); - } else { - assert3(false); - } - return true; - } - function writeH2(client, session, request) { - const { body, method, path: path10, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; - let headers; - if (typeof reqHeaders === "string") - headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()); - else - headers = reqHeaders; - if (upgrade) { - errorRequest(client, request, new Error("Upgrade not supported for H2")); - return false; - } - if (request.aborted) { - return false; - } - let stream; - const h2State = client[kHTTP2SessionState]; - headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]; - headers[HTTP2_HEADER_METHOD] = method; - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - err = err || new RequestAbortedError(); - if (stream != null) { - util.destroy(stream, err); - h2State.openStreams -= 1; - if (h2State.openStreams === 0) { - session.unref(); - } + if (interceptors?.Client && Array.isArray(interceptors.Client)) { + this[kInterceptors] = interceptors.Client; + if (!deprecatedInterceptorWarned) { + deprecatedInterceptorWarned = true; + process.emitWarning("Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.", { + code: "UNDICI-CLIENT-INTERCEPTOR-DEPRECATED" + }); } - errorRequest(client, request, err); - }); - } catch (err) { - errorRequest(client, request, err); - } - if (method === "CONNECT") { - session.ref(); - stream = session.request(headers, { endStream: false, signal }); - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; } else { - stream.once("ready", () => { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - }); + this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })]; } - stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) - session.unref(); - }); - return true; + this[kUrl] = util.parseOrigin(url); + this[kConnector] = connect2; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; + this[kNeedDrain] = 0; + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r +`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; + this[kHTTPContext] = null; + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + this[kResume] = (sync) => resume(this, sync); + this[kOnError] = (err) => onError(this, err); } - headers[HTTP2_HEADER_PATH] = path10; - headers[HTTP2_HEADER_SCHEME] = "https"; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); + get pipelining() { + return this[kPipelining]; } - let contentLength = util.bodyLength(body); - if (contentLength == null) { - contentLength = request.contentLength; + set pipelining(value) { + this[kPipelining] = value; + this[kResume](true); } - if (contentLength === 0 || !expectsPayload) { - contentLength = null; + get [kPending]() { + return this[kQueue].length - this[kPendingIdx]; } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); - return false; - } - process.emitWarning(new RequestContentLengthMismatchError()); + get [kRunning]() { + return this[kPendingIdx] - this[kRunningIdx]; } - if (contentLength != null) { - assert3(body, "no body must not have content length"); - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + get [kSize]() { + return this[kQueue].length - this[kRunningIdx]; } - session.ref(); - const shouldEndStream = method === "GET" || method === "HEAD" || body === null; - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = "100-continue"; - stream = session.request(headers, { endStream: shouldEndStream, signal }); - stream.once("continue", writeBodyH2); - } else { - stream = session.request(headers, { - endStream: shouldEndStream, - signal - }); - writeBodyH2(); + get [kConnected]() { + return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed; } - ++h2State.openStreams; - stream.once("response", (headers2) => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; - request.onResponseStarted(); - if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), "") === false) { - stream.pause(); - } - }); - stream.once("end", () => { - request.onComplete([]); - }); - stream.on("data", (chunk) => { - if (request.onData(chunk) === false) { - stream.pause(); - } - }); - stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) { - session.unref(); - } - }); - stream.once("error", function(err) { - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); + get [kBusy]() { + return Boolean( + this[kHTTPContext]?.busy(null) || this[kSize] >= (getPipelining(this) || 1) || this[kPending] > 0 + ); + } + /* istanbul ignore: only used for test */ + [kConnect](cb) { + connect(this); + this.once("connect", cb); + } + [kDispatch](opts, handler) { + const origin = opts.origin || this[kUrl].origin; + const request = new Request(origin, opts, handler); + this[kQueue].push(request); + if (this[kResuming]) { + } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + this[kResuming] = 1; + queueMicrotask(() => resume(this)); + } else { + this[kResume](true); } - }); - stream.once("frameError", (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - errorRequest(client, request, err); - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; } - }); - return true; - function writeBodyH2() { - if (!body) { - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert3(contentLength === body.byteLength, "buffer body must have content length"); - stream.cork(); - stream.write(body); - stream.uncork(); - stream.end(); - request.onBodySent(body); - request.onRequestSent(); - } else if (util.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable({ - client, - request, - contentLength, - h2stream: stream, - expectsPayload, - body: body.stream(), - socket: client[kSocket], - header: "" - }); + return this[kNeedDrain] < 2; + } + async [kClose]() { + return new Promise((resolve) => { + if (this[kSize]) { + this[kClosedResolve] = resolve; } else { - writeBlob({ - body, - client, - request, - contentLength, - expectsPayload, - h2stream: stream, - header: "", - socket: client[kSocket] - }); + resolve(null); } - } else if (util.isStream(body)) { - writeStream({ - body, - client, - request, - contentLength, - expectsPayload, - socket: client[kSocket], - h2stream: stream, - header: "" - }); - } else if (util.isIterable(body)) { - writeIterable({ - body, - client, - request, - contentLength, - expectsPayload, - header: "", - h2stream: stream, - socket: client[kSocket] - }); - } else { - assert3(false); + }); + } + async [kDestroy](err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(this, request, err); + } + const callback = () => { + if (this[kClosedResolve]) { + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(null); + }; + if (this[kHTTPContext]) { + this[kHTTPContext].destroy(err, callback); + this[kHTTPContext] = null; + } else { + queueMicrotask(callback); + } + this[kResume](); + }); + } + }; + var createRedirectInterceptor = require_redirect_interceptor(); + function onError(client, err) { + if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { + assert3(client[kPendingIdx] === client[kRunningIdx]); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); } + assert3(client[kSize] === 0); } } - function writeStream({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert3(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); - if (client[kHTTPConnVersion] === "h2") { - let onPipeData = function(chunk) { - request.onBodySent(chunk); - }; - const pipe = pipeline( - body, - h2stream, - (err) => { + async function connect(client) { + assert3(!client[kConnecting]); + assert3(!client[kHTTPContext]); + let { host, hostname, protocol, port } = client[kUrl]; + if (hostname[0] === "[") { + const idx = hostname.indexOf("]"); + assert3(idx !== -1); + const ip = hostname.substring(1, idx); + assert3(net.isIP(ip)); + hostname = ip; + } + client[kConnecting] = true; + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector] + }); + } + try { + const socket = await new Promise((resolve, reject) => { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket2) => { if (err) { - util.destroy(body, err); - util.destroy(h2stream, err); + reject(err); } else { - request.onRequestSent(); + resolve(socket2); } - } - ); - pipe.on("data", onPipeData); - pipe.once("end", () => { - pipe.removeListener("data", onPipeData); - util.destroy(pipe); + }); }); - return; - } - let finished = false; - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - const onData = function(chunk) { - if (finished) { + if (client.destroyed) { + util.destroy(socket.on("error", () => { + }), new ClientDestroyedError()); return; } + assert3(socket); try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } + client[kHTTPContext] = socket.alpnProtocol === "h2" ? await connectH2(client, socket) : await connectH1(client, socket); } catch (err) { - util.destroy(this, err); - } - }; - const onDrain = function() { - if (finished) { - return; - } - if (body.resume) { - body.resume(); - } - }; - const onClose = function() { - queueMicrotask(() => { - body.removeListener("error", onFinished); - }); - if (!finished) { - const err = new RequestAbortedError(); - queueMicrotask(() => onFinished(err)); - } - }; - const onFinished = function(err) { - if (finished) { - return; - } - finished = true; - assert3(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); - socket.off("drain", onDrain).off("error", onFinished); - body.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose); - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; - } - } - writer.destroy(err); - if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { - util.destroy(body, err); - } else { - util.destroy(body); - } - }; - body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onClose); - if (body.resume) { - body.resume(); - } - socket.on("drain", onDrain).on("error", onFinished); - } - async function writeBlob({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert3(contentLength === body.size, "blob body must have content length"); - const isH2 = client[kHTTPConnVersion] === "h2"; - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError(); - } - const buffer = Buffer.from(await body.arrayBuffer()); - if (isH2) { - h2stream.cork(); - h2stream.write(buffer); - h2stream.uncork(); - } else { - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(buffer); - socket.uncork(); - } - request.onBodySent(buffer); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; + socket.destroy().on("error", () => { + }); + throw err; } - resume(client); - } catch (err) { - util.destroy(isH2 ? h2stream : socket, err); - } - } - async function writeIterable({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert3(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); - let callback = null; - function onDrain() { - if (callback) { - const cb = callback; - callback = null; - cb(); + client[kConnecting] = false; + socket[kCounter] = 0; + socket[kMaxRequests] = client[kMaxRequests]; + socket[kClient] = client; + socket[kError] = null; + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }); } - } - const waitForDrain = () => new Promise((resolve, reject) => { - assert3(callback === null); - if (socket[kError]) { - reject(socket[kError]); - } else { - callback = resolve; + client.emit("connect", client[kUrl], [client]); + } catch (err) { + if (client.destroyed) { + return; } - }); - if (client[kHTTPConnVersion] === "h2") { - h2stream.on("close", onDrain).on("drain", onDrain); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - const res = h2stream.write(chunk); - request.onBodySent(chunk); - if (!res) { - await waitForDrain(); - } - } - } catch (err) { - h2stream.destroy(err); - } finally { - request.onRequestSent(); - h2stream.end(); - h2stream.off("close", onDrain).off("drain", onDrain); + client[kConnecting] = false; + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }); } - return; - } - socket.on("close", onDrain).on("drain", onDrain); - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - if (!writer.write(chunk)) { - await waitForDrain(); + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + assert3(client[kRunning] === 0); + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++]; + util.errorRequest(client, request, err); } + } else { + onError(client, err); } - writer.end(); - } catch (err) { - writer.destroy(err); - } finally { - socket.off("close", onDrain).off("drain", onDrain); + client.emit("connectionError", client[kUrl], [client], err); } + client[kResume](); } - var AsyncWriter = class { - constructor({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket; - this.request = request; - this.contentLength = contentLength; - this.client = client; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; - socket[kWriting] = true; + function emitDrain(client) { + client[kNeedDrain] = 0; + client.emit("drain", client[kUrl], [client]); + } + function resume(client, sync) { + if (client[kResuming] === 2) { + return; } - write(chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return false; + client[kResuming] = 2; + _resume(client, sync); + client[kResuming] = 0; + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]); + client[kPendingIdx] -= client[kRunningIdx]; + client[kRunningIdx] = 0; + } + } + function _resume(client, sync) { + while (true) { + if (client.destroyed) { + assert3(client[kPending] === 0); + return; } - const len = Buffer.byteLength(chunk); - if (!len) { - return true; + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve](); + client[kClosedResolve] = null; + return; } - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } - process.emitWarning(new RequestContentLengthMismatchError()); + if (client[kHTTPContext]) { + client[kHTTPContext].resume(); } - socket.cork(); - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true; - } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r -`, "latin1"); + if (client[kBusy]) { + client[kNeedDrain] = 2; + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1; + queueMicrotask(() => emitDrain(client)); } else { - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); + emitDrain(client); } + continue; } - if (contentLength === null) { - socket.write(`\r -${len.toString(16)}\r -`, "latin1"); + if (client[kPending] === 0) { + return; } - this.bytesWritten += len; - const ret = socket.write(chunk); - socket.uncork(); - request.onBodySent(chunk); - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } + if (client[kRunning] >= (getPipelining(client) || 1)) { + return; } - return ret; - } - end() { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; - request.onRequestSent(); - socket[kWriting] = false; - if (socket[kError]) { - throw socket[kError]; + const request = client[kQueue][client[kPendingIdx]]; + if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return; + } + client[kServerName] = request.servername; + client[kHTTPContext]?.destroy(new InformationalError("servername changed"), () => { + client[kHTTPContext] = null; + resume(client); + }); } - if (socket.destroyed) { + if (client[kConnecting]) { return; } - if (bytesWritten === 0) { - if (expectsPayload) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - socket.write(`${header}\r -`, "latin1"); - } - } else if (contentLength === null) { - socket.write("\r\n0\r\n\r\n", "latin1"); + if (!client[kHTTPContext]) { + connect(client); + return; } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } else { - process.emitWarning(new RequestContentLengthMismatchError()); - } + if (client[kHTTPContext].destroyed) { + return; } - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } + if (client[kHTTPContext].busy(request)) { + return; } - resume(client); - } - destroy(err) { - const { socket, client } = this; - socket[kWriting] = false; - if (err) { - assert3(client[kRunning] <= 1, "pipeline should only contain this request"); - util.destroy(socket, err); + if (!request.aborted && client[kHTTPContext].write(request)) { + client[kPendingIdx]++; + } else { + client[kQueue].splice(client[kPendingIdx], 1); } } - }; - function errorRequest(client, request, err) { - try { - request.onError(err); - assert3(request.aborted); - } catch (err2) { - client.emit("error", err2); - } } module2.exports = Client; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool.js +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool.js var require_pool = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool.js"(exports, module2) { + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/pool.js"(exports, module2) { "use strict"; var { PoolBase, @@ -13186,9 +12954,9 @@ var require_pool = __commonJS({ } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/agent.js +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/agent.js var require_agent = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/agent.js"(exports, module2) { + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/agent.js"(exports, module2) { "use strict"; var { InvalidArgumentError } = require_errors(); var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); @@ -13196,7 +12964,7 @@ var require_agent = __commonJS({ var Pool = require_pool(); var Client = require_client(); var util = require_util(); - var createRedirectInterceptor = require_redirectInterceptor(); + var createRedirectInterceptor = require_redirect_interceptor(); var kOnConnect = Symbol("onConnect"); var kOnDisconnect = Symbol("onDisconnect"); var kOnConnectionError = Symbol("onConnectionError"); @@ -13283,16 +13051,16 @@ var require_agent = __commonJS({ } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/proxy-agent.js +// .yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js var require_proxy_agent = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/proxy-agent.js"(exports, module2) { + ".yarn/cache/undici-npm-6.13.0-1545cd855e-b1b0456e7d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js"(exports, module2) { "use strict"; var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); var { URL: URL2 } = require("node:url"); var Agent = require_agent(); var Pool = require_pool(); var DispatcherBase = require_dispatcher_base(); - var { InvalidArgumentError, RequestAbortedError } = require_errors(); + var { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require_errors(); var buildConnector = require_connect(); var kAgent = Symbol("proxy agent"); var kClient = Symbol("proxy client"); @@ -13303,42 +13071,26 @@ var require_proxy_agent = __commonJS({ function defaultProtocolPort(protocol) { return protocol === "https:" ? 443 : 80; } - function buildProxyOptions(opts) { - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - return { - uri: opts.uri, - protocol: opts.protocol || "https" - }; - } function defaultFactory(origin, opts) { return new Pool(origin, opts); } - var ProxyAgent = class extends DispatcherBase { + var ProxyAgent2 = class extends DispatcherBase { constructor(opts) { - super(opts); - this[kProxy] = buildProxyOptions(opts); - this[kAgent] = new Agent(opts); - this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); + super(); + if (!opts || typeof opts === "object" && !(opts instanceof URL2) && !opts.uri) { + throw new InvalidArgumentError("Proxy uri is mandatory"); } const { clientFactory = defaultFactory } = opts; if (typeof clientFactory !== "function") { throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); } + const url = this.#getUrl(opts); + const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; + this[kProxy] = { uri: href, protocol }; + this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; this[kRequestTls] = opts.requestTls; this[kProxyTls] = opts.proxyTls; this[kProxyHeaders] = opts.headers || {}; - const resolvedUrl = new URL2(opts.uri); - const { origin, port, username, password } = resolvedUrl; if (opts.auth && opts.token) { throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); } else if (opts.auth) { @@ -13350,24 +13102,25 @@ var require_proxy_agent = __commonJS({ } const connect = buildConnector({ ...opts.proxyTls }); this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); - this[kClient] = clientFactory(resolvedUrl, { connect }); + this[kClient] = clientFactory(url, { connect }); this[kAgent] = new Agent({ ...opts, connect: async (opts2, callback) => { - let requestedHost = opts2.host; + let requestedPath = opts2.host; if (!opts2.port) { - requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; + requestedPath += `:${defaultProtocolPort(opts2.protocol)}`; } try { const { socket, statusCode } = await this[kClient].connect({ origin, port, - path: requestedHost, + path: requestedPath, signal: opts2.signal, headers: { ...this[kProxyHeaders], - host: requestedHost - } + host: opts2.host + }, + servername: this[kProxyTls]?.servername || proxyHostname }); if (statusCode !== 200) { socket.on("error", () => { @@ -13386,26 +13139,43 @@ var require_proxy_agent = __commonJS({ } this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); } catch (err) { - callback(err); + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + callback(new SecureProxyConnectionError(err)); + } else { + callback(err); + } } } }); } dispatch(opts, handler) { - const { host } = new URL2(opts.origin); const headers = buildHeaders(opts.headers); throwIfProxyAuthIsSent(headers); + if (headers && !("host" in headers) && !("Host" in headers)) { + const { host } = new URL2(opts.origin); + headers.host = host; + } return this[kAgent].dispatch( { ...opts, - headers: { - ...headers, - host - } + headers }, handler ); } + /** + * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts + * @returns {URL} + */ + #getUrl(opts) { + if (typeof opts === "string") { + return new URL2(opts); + } else if (opts instanceof URL2) { + return opts; + } else { + return new URL2(opts.uri); + } + } async [kClose]() { await this[kAgent].close(); await this[kClient].close(); @@ -13431,13 +13201,13 @@ var require_proxy_agent = __commonJS({ throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); } } - module2.exports = ProxyAgent; + module2.exports = ProxyAgent2; } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/high-level-opt.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/high-level-opt.js var require_high_level_opt = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/high-level-opt.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/high-level-opt.js"(exports, module2) { "use strict"; var argmap = /* @__PURE__ */ new Map([ ["C", "cwd"], @@ -14978,17 +14748,17 @@ var require_minizlib = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-windows-path.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/normalize-windows-path.js var require_normalize_windows_path = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-windows-path.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/normalize-windows-path.js"(exports, module2) { var platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; module2.exports = platform !== "win32" ? (p) => p : (p) => p && p.replace(/\\/g, "/"); } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/read-entry.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/read-entry.js var require_read_entry = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/read-entry.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/read-entry.js"(exports, module2) { "use strict"; var { Minipass } = require_minipass(); var normPath = require_normalize_windows_path(); @@ -15080,9 +14850,9 @@ var require_read_entry = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/types.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/types.js var require_types = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/types.js"(exports) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/types.js"(exports) { "use strict"; exports.name = /* @__PURE__ */ new Map([ ["0", "File"], @@ -15127,9 +14897,9 @@ var require_types = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/large-numbers.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/large-numbers.js var require_large_numbers = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/large-numbers.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/large-numbers.js"(exports, module2) { "use strict"; var encode = (num, buf) => { if (!Number.isSafeInteger(num)) { @@ -15217,9 +14987,9 @@ var require_large_numbers = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/header.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/header.js var require_header = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/header.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/header.js"(exports, module2) { "use strict"; var types = require_types(); var pathModule = require("path").posix; @@ -15437,9 +15207,9 @@ var require_header = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pax.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/pax.js var require_pax = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pax.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/pax.js"(exports, module2) { "use strict"; var Header = require_header(); var path10 = require("path"); @@ -15538,9 +15308,9 @@ var require_pax = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-trailing-slashes.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/strip-trailing-slashes.js var require_strip_trailing_slashes = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-trailing-slashes.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/strip-trailing-slashes.js"(exports, module2) { module2.exports = (str) => { let i = str.length - 1; let slashesStart = -1; @@ -15553,9 +15323,9 @@ var require_strip_trailing_slashes = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/warn-mixin.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/warn-mixin.js var require_warn_mixin = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/warn-mixin.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/warn-mixin.js"(exports, module2) { "use strict"; module2.exports = (Base) => class extends Base { warn(code, message, data = {}) { @@ -15583,9 +15353,9 @@ var require_warn_mixin = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/winchars.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/winchars.js var require_winchars = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/winchars.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/winchars.js"(exports, module2) { "use strict"; var raw = [ "|", @@ -15604,9 +15374,9 @@ var require_winchars = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-absolute-path.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/strip-absolute-path.js var require_strip_absolute_path = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-absolute-path.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/strip-absolute-path.js"(exports, module2) { var { isAbsolute, parse } = require("path").win32; module2.exports = (path10) => { let r = ""; @@ -15622,9 +15392,9 @@ var require_strip_absolute_path = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mode-fix.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/mode-fix.js var require_mode_fix = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mode-fix.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/mode-fix.js"(exports, module2) { "use strict"; module2.exports = (mode, isDir, portable) => { mode &= 4095; @@ -15647,14 +15417,14 @@ var require_mode_fix = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/write-entry.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/write-entry.js var require_write_entry = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/write-entry.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/write-entry.js"(exports, module2) { "use strict"; var { Minipass } = require_minipass(); var Pax = require_pax(); var Header = require_header(); - var fs9 = require("fs"); + var fs8 = require("fs"); var path10 = require("path"); var normPath = require_normalize_windows_path(); var stripSlash = require_strip_trailing_slashes(); @@ -15757,7 +15527,7 @@ var require_write_entry = __commonJS({ return super.emit(ev, ...data); } [LSTAT]() { - fs9.lstat(this.absolute, (er, stat) => { + fs8.lstat(this.absolute, (er, stat) => { if (er) { return this.emit("error", er); } @@ -15839,7 +15609,7 @@ var require_write_entry = __commonJS({ this.end(); } [SYMLINK]() { - fs9.readlink(this.absolute, (er, linkpath) => { + fs8.readlink(this.absolute, (er, linkpath) => { if (er) { return this.emit("error", er); } @@ -15876,7 +15646,7 @@ var require_write_entry = __commonJS({ this[OPENFILE](); } [OPENFILE]() { - fs9.open(this.absolute, "r", (er, fd) => { + fs8.open(this.absolute, "r", (er, fd) => { if (er) { return this.emit("error", er); } @@ -15900,7 +15670,7 @@ var require_write_entry = __commonJS({ } [READ]() { const { fd, buf, offset, length, pos } = this; - fs9.read(fd, buf, offset, length, pos, (er, bytesRead) => { + fs8.read(fd, buf, offset, length, pos, (er, bytesRead) => { if (er) { return this[CLOSE](() => this.emit("error", er)); } @@ -15908,7 +15678,7 @@ var require_write_entry = __commonJS({ }); } [CLOSE](cb) { - fs9.close(this.fd, cb); + fs8.close(this.fd, cb); } [ONREAD](bytesRead) { if (bytesRead <= 0 && this.remain > 0) { @@ -15972,19 +15742,19 @@ var require_write_entry = __commonJS({ }); var WriteEntrySync = class extends WriteEntry { [LSTAT]() { - this[ONLSTAT](fs9.lstatSync(this.absolute)); + this[ONLSTAT](fs8.lstatSync(this.absolute)); } [SYMLINK]() { - this[ONREADLINK](fs9.readlinkSync(this.absolute)); + this[ONREADLINK](fs8.readlinkSync(this.absolute)); } [OPENFILE]() { - this[ONOPENFILE](fs9.openSync(this.absolute, "r")); + this[ONOPENFILE](fs8.openSync(this.absolute, "r")); } [READ]() { let threw = true; try { const { fd, buf, offset, length, pos } = this; - const bytesRead = fs9.readSync(fd, buf, offset, length, pos); + const bytesRead = fs8.readSync(fd, buf, offset, length, pos); this[ONREAD](bytesRead); threw = false; } finally { @@ -16001,7 +15771,7 @@ var require_write_entry = __commonJS({ cb(); } [CLOSE](cb) { - fs9.closeSync(this.fd); + fs8.closeSync(this.fd); cb(); } }; @@ -16112,9 +15882,9 @@ var require_write_entry = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pack.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/pack.js var require_pack = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pack.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/pack.js"(exports, module2) { "use strict"; var PackJob = class { constructor(path11, absolute) { @@ -16156,7 +15926,7 @@ var require_pack = __commonJS({ var WRITEENTRYCLASS = Symbol("writeEntryClass"); var WRITE = Symbol("write"); var ONDRAIN = Symbol("ondrain"); - var fs9 = require("fs"); + var fs8 = require("fs"); var path10 = require("path"); var warner = require_warn_mixin(); var normPath = require_normalize_windows_path(); @@ -16266,7 +16036,7 @@ var require_pack = __commonJS({ job.pending = true; this[JOBS] += 1; const stat = this.follow ? "stat" : "lstat"; - fs9[stat](job.absolute, (er, stat2) => { + fs8[stat](job.absolute, (er, stat2) => { job.pending = false; this[JOBS] -= 1; if (er) { @@ -16287,7 +16057,7 @@ var require_pack = __commonJS({ [READDIR](job) { job.pending = true; this[JOBS] += 1; - fs9.readdir(job.absolute, (er, entries) => { + fs8.readdir(job.absolute, (er, entries) => { job.pending = false; this[JOBS] -= 1; if (er) { @@ -16449,10 +16219,10 @@ var require_pack = __commonJS({ } [STAT](job) { const stat = this.follow ? "statSync" : "lstatSync"; - this[ONSTAT](job, fs9[stat](job.absolute)); + this[ONSTAT](job, fs8[stat](job.absolute)); } [READDIR](job, stat) { - this[ONREADDIR](job, fs9.readdirSync(job.absolute)); + this[ONREADDIR](job, fs8.readdirSync(job.absolute)); } // gotta get it all in this tick [PIPE](job) { @@ -16487,8 +16257,8 @@ var require_fs_minipass = __commonJS({ "use strict"; var MiniPass = require_minipass2(); var EE = require("events").EventEmitter; - var fs9 = require("fs"); - var writev = fs9.writev; + var fs8 = require("fs"); + var writev = fs8.writev; if (!writev) { const binding = process.binding("fs"); const FSReqWrap = binding.FSReqWrap || binding.FSReqCallback; @@ -16561,7 +16331,7 @@ var require_fs_minipass = __commonJS({ throw new TypeError("this is a readable stream"); } [_open]() { - fs9.open(this[_path], "r", (er, fd) => this[_onopen](er, fd)); + fs8.open(this[_path], "r", (er, fd) => this[_onopen](er, fd)); } [_onopen](er, fd) { if (er) @@ -16581,7 +16351,7 @@ var require_fs_minipass = __commonJS({ const buf = this[_makeBuf](); if (buf.length === 0) return process.nextTick(() => this[_onread](null, 0, buf)); - fs9.read(this[_fd], buf, 0, buf.length, null, (er, br, buf2) => this[_onread](er, br, buf2)); + fs8.read(this[_fd], buf, 0, buf.length, null, (er, br, buf2) => this[_onread](er, br, buf2)); } } [_onread](er, br, buf) { @@ -16595,7 +16365,7 @@ var require_fs_minipass = __commonJS({ if (this[_autoClose] && typeof this[_fd] === "number") { const fd = this[_fd]; this[_fd] = null; - fs9.close(fd, (er) => er ? this.emit("error", er) : this.emit("close")); + fs8.close(fd, (er) => er ? this.emit("error", er) : this.emit("close")); } } [_onerror](er) { @@ -16638,7 +16408,7 @@ var require_fs_minipass = __commonJS({ [_open]() { let threw = true; try { - this[_onopen](null, fs9.openSync(this[_path], "r")); + this[_onopen](null, fs8.openSync(this[_path], "r")); threw = false; } finally { if (threw) @@ -16652,7 +16422,7 @@ var require_fs_minipass = __commonJS({ this[_reading] = true; do { const buf = this[_makeBuf](); - const br = buf.length === 0 ? 0 : fs9.readSync(this[_fd], buf, 0, buf.length, null); + const br = buf.length === 0 ? 0 : fs8.readSync(this[_fd], buf, 0, buf.length, null); if (!this[_handleChunk](br, buf)) break; } while (true); @@ -16668,7 +16438,7 @@ var require_fs_minipass = __commonJS({ if (this[_autoClose] && typeof this[_fd] === "number") { const fd = this[_fd]; this[_fd] = null; - fs9.closeSync(fd); + fs8.closeSync(fd); this.emit("close"); } } @@ -16715,7 +16485,7 @@ var require_fs_minipass = __commonJS({ this.emit("error", er); } [_open]() { - fs9.open( + fs8.open( this[_path], this[_flags], this[_mode], @@ -16759,7 +16529,7 @@ var require_fs_minipass = __commonJS({ return true; } [_write](buf) { - fs9.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw)); + fs8.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw)); } [_onwrite](er, bw) { if (er) @@ -16803,7 +16573,7 @@ var require_fs_minipass = __commonJS({ if (this[_autoClose] && typeof this[_fd] === "number") { const fd = this[_fd]; this[_fd] = null; - fs9.close(fd, (er) => er ? this.emit("error", er) : this.emit("close")); + fs8.close(fd, (er) => er ? this.emit("error", er) : this.emit("close")); } } }; @@ -16812,7 +16582,7 @@ var require_fs_minipass = __commonJS({ let fd; if (this[_defaultFlag] && this[_flags] === "r+") { try { - fd = fs9.openSync(this[_path], this[_flags], this[_mode]); + fd = fs8.openSync(this[_path], this[_flags], this[_mode]); } catch (er) { if (er.code === "ENOENT") { this[_flags] = "w"; @@ -16821,14 +16591,14 @@ var require_fs_minipass = __commonJS({ throw er; } } else - fd = fs9.openSync(this[_path], this[_flags], this[_mode]); + fd = fs8.openSync(this[_path], this[_flags], this[_mode]); this[_onopen](null, fd); } [_close]() { if (this[_autoClose] && typeof this[_fd] === "number") { const fd = this[_fd]; this[_fd] = null; - fs9.closeSync(fd); + fs8.closeSync(fd); this.emit("close"); } } @@ -16837,7 +16607,7 @@ var require_fs_minipass = __commonJS({ try { this[_onwrite]( null, - fs9.writeSync(this[_fd], buf, 0, buf.length, this[_pos]) + fs8.writeSync(this[_fd], buf, 0, buf.length, this[_pos]) ); threw = false; } finally { @@ -16856,9 +16626,9 @@ var require_fs_minipass = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/parse.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/parse.js var require_parse2 = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/parse.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/parse.js"(exports, module2) { "use strict"; var warner = require_warn_mixin(); var Header = require_header(); @@ -17280,13 +17050,13 @@ var require_parse2 = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/list.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/list.js var require_list = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/list.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/list.js"(exports, module2) { "use strict"; var hlo = require_high_level_opt(); var Parser = require_parse2(); - var fs9 = require("fs"); + var fs8 = require("fs"); var fsm = require_fs_minipass(); var path10 = require("path"); var stripSlash = require_strip_trailing_slashes(); @@ -17343,16 +17113,16 @@ var require_list = __commonJS({ let threw = true; let fd; try { - const stat = fs9.statSync(file); + const stat = fs8.statSync(file); const readSize = opt.maxReadSize || 16 * 1024 * 1024; if (stat.size < readSize) { - p.end(fs9.readFileSync(file)); + p.end(fs8.readFileSync(file)); } else { let pos = 0; const buf = Buffer.allocUnsafe(readSize); - fd = fs9.openSync(file, "r"); + fd = fs8.openSync(file, "r"); while (pos < stat.size) { - const bytesRead = fs9.readSync(fd, buf, 0, readSize, pos); + const bytesRead = fs8.readSync(fd, buf, 0, readSize, pos); pos += bytesRead; p.write(buf.slice(0, bytesRead)); } @@ -17362,7 +17132,7 @@ var require_list = __commonJS({ } finally { if (threw && fd) { try { - fs9.closeSync(fd); + fs8.closeSync(fd); } catch (er) { } } @@ -17375,7 +17145,7 @@ var require_list = __commonJS({ const p = new Promise((resolve, reject) => { parse.on("error", reject); parse.on("end", resolve); - fs9.stat(file, (er, stat) => { + fs8.stat(file, (er, stat) => { if (er) { reject(er); } else { @@ -17394,9 +17164,9 @@ var require_list = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/create.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/create.js var require_create = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/create.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/create.js"(exports, module2) { "use strict"; var hlo = require_high_level_opt(); var Pack = require_pack(); @@ -17488,13 +17258,13 @@ var require_create = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/replace.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/replace.js var require_replace = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/replace.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/replace.js"(exports, module2) { "use strict"; var hlo = require_high_level_opt(); var Pack = require_pack(); - var fs9 = require("fs"); + var fs8 = require("fs"); var fsm = require_fs_minipass(); var t = require_list(); var path10 = require("path"); @@ -17520,20 +17290,20 @@ var require_replace = __commonJS({ let position; try { try { - fd = fs9.openSync(opt.file, "r+"); + fd = fs8.openSync(opt.file, "r+"); } catch (er) { if (er.code === "ENOENT") { - fd = fs9.openSync(opt.file, "w+"); + fd = fs8.openSync(opt.file, "w+"); } else { throw er; } } - const st = fs9.fstatSync(fd); + const st = fs8.fstatSync(fd); const headBuf = Buffer.alloc(512); POSITION: for (position = 0; position < st.size; position += 512) { for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { - bytes = fs9.readSync( + bytes = fs8.readSync( fd, headBuf, bufPos, @@ -17565,7 +17335,7 @@ var require_replace = __commonJS({ } finally { if (threw) { try { - fs9.closeSync(fd); + fs8.closeSync(fd); } catch (er) { } } @@ -17585,7 +17355,7 @@ var require_replace = __commonJS({ const getPos = (fd, size, cb_) => { const cb2 = (er, pos) => { if (er) { - fs9.close(fd, (_) => cb_(er)); + fs8.close(fd, (_) => cb_(er)); } else { cb_(null, pos); } @@ -17602,7 +17372,7 @@ var require_replace = __commonJS({ } bufPos += bytes; if (bufPos < 512 && bytes) { - return fs9.read( + return fs8.read( fd, headBuf, bufPos, @@ -17633,9 +17403,9 @@ var require_replace = __commonJS({ opt.mtimeCache.set(h.path, h.mtime); } bufPos = 0; - fs9.read(fd, headBuf, 0, 512, position, onread); + fs8.read(fd, headBuf, 0, 512, position, onread); }; - fs9.read(fd, headBuf, 0, 512, position, onread); + fs8.read(fd, headBuf, 0, 512, position, onread); }; const promise = new Promise((resolve, reject) => { p.on("error", reject); @@ -17643,14 +17413,14 @@ var require_replace = __commonJS({ const onopen = (er, fd) => { if (er && er.code === "ENOENT" && flag === "r+") { flag = "w+"; - return fs9.open(opt.file, flag, onopen); + return fs8.open(opt.file, flag, onopen); } if (er) { return reject(er); } - fs9.fstat(fd, (er2, st) => { + fs8.fstat(fd, (er2, st) => { if (er2) { - return fs9.close(fd, () => reject(er2)); + return fs8.close(fd, () => reject(er2)); } getPos(fd, st.size, (er3, position) => { if (er3) { @@ -17667,7 +17437,7 @@ var require_replace = __commonJS({ }); }); }; - fs9.open(opt.file, flag, onopen); + fs8.open(opt.file, flag, onopen); }); return cb ? promise.then(cb, cb) : promise; }; @@ -17704,9 +17474,9 @@ var require_replace = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/update.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/update.js var require_update = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/update.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/update.js"(exports, module2) { "use strict"; var hlo = require_high_level_opt(); var r = require_replace(); @@ -17739,24 +17509,24 @@ var require_update = __commonJS({ var require_opts_arg = __commonJS({ ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/opts-arg.js"(exports, module2) { var { promisify } = require("util"); - var fs9 = require("fs"); + var fs8 = require("fs"); var optsArg = (opts) => { if (!opts) - opts = { mode: 511, fs: fs9 }; + opts = { mode: 511, fs: fs8 }; else if (typeof opts === "object") - opts = { mode: 511, fs: fs9, ...opts }; + opts = { mode: 511, fs: fs8, ...opts }; else if (typeof opts === "number") - opts = { mode: opts, fs: fs9 }; + opts = { mode: opts, fs: fs8 }; else if (typeof opts === "string") - opts = { mode: parseInt(opts, 8), fs: fs9 }; + opts = { mode: parseInt(opts, 8), fs: fs8 }; else throw new TypeError("invalid options argument"); - opts.mkdir = opts.mkdir || opts.fs.mkdir || fs9.mkdir; + opts.mkdir = opts.mkdir || opts.fs.mkdir || fs8.mkdir; opts.mkdirAsync = promisify(opts.mkdir); - opts.stat = opts.stat || opts.fs.stat || fs9.stat; + opts.stat = opts.stat || opts.fs.stat || fs8.stat; opts.statAsync = promisify(opts.stat); - opts.statSync = opts.statSync || opts.fs.statSync || fs9.statSync; - opts.mkdirSync = opts.mkdirSync || opts.fs.mkdirSync || fs9.mkdirSync; + opts.statSync = opts.statSync || opts.fs.statSync || fs8.statSync; + opts.mkdirSync = opts.mkdirSync || opts.fs.mkdirSync || fs8.mkdirSync; return opts; }; module2.exports = optsArg; @@ -17923,12 +17693,12 @@ var require_mkdirp_native = __commonJS({ // .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/use-native.js var require_use_native = __commonJS({ ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/use-native.js"(exports, module2) { - var fs9 = require("fs"); + var fs8 = require("fs"); var version2 = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; var versArr = version2.replace(/^v/, "").split("."); var hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12; - var useNative = !hasNative ? () => false : (opts) => opts.mkdir === fs9.mkdir; - var useNativeSync = !hasNative ? () => false : (opts) => opts.mkdirSync === fs9.mkdirSync; + var useNative = !hasNative ? () => false : (opts) => opts.mkdir === fs8.mkdir; + var useNativeSync = !hasNative ? () => false : (opts) => opts.mkdirSync === fs8.mkdirSync; module2.exports = { useNative, useNativeSync }; } }); @@ -17964,14 +17734,14 @@ var require_mkdirp = __commonJS({ var require_chownr = __commonJS({ ".yarn/cache/chownr-npm-2.0.0-638f1c9c61-594754e130.zip/node_modules/chownr/chownr.js"(exports, module2) { "use strict"; - var fs9 = require("fs"); + var fs8 = require("fs"); var path10 = require("path"); - var LCHOWN = fs9.lchown ? "lchown" : "chown"; - var LCHOWNSYNC = fs9.lchownSync ? "lchownSync" : "chownSync"; - var needEISDIRHandled = fs9.lchown && !process.version.match(/v1[1-9]+\./) && !process.version.match(/v10\.[6-9]/); + var LCHOWN = fs8.lchown ? "lchown" : "chown"; + var LCHOWNSYNC = fs8.lchownSync ? "lchownSync" : "chownSync"; + var needEISDIRHandled = fs8.lchown && !process.version.match(/v1[1-9]+\./) && !process.version.match(/v10\.[6-9]/); var lchownSync = (path11, uid, gid) => { try { - return fs9[LCHOWNSYNC](path11, uid, gid); + return fs8[LCHOWNSYNC](path11, uid, gid); } catch (er) { if (er.code !== "ENOENT") throw er; @@ -17979,7 +17749,7 @@ var require_chownr = __commonJS({ }; var chownSync = (path11, uid, gid) => { try { - return fs9.chownSync(path11, uid, gid); + return fs8.chownSync(path11, uid, gid); } catch (er) { if (er.code !== "ENOENT") throw er; @@ -17989,7 +17759,7 @@ var require_chownr = __commonJS({ if (!er || er.code !== "EISDIR") cb(er); else - fs9.chown(path11, uid, gid, cb); + fs8.chown(path11, uid, gid, cb); } : (_, __, ___, cb) => cb; var handleEISDirSync = needEISDIRHandled ? (path11, uid, gid) => { try { @@ -18001,18 +17771,18 @@ var require_chownr = __commonJS({ } } : (path11, uid, gid) => lchownSync(path11, uid, gid); var nodeVersion = process.version; - var readdir = (path11, options, cb) => fs9.readdir(path11, options, cb); - var readdirSync = (path11, options) => fs9.readdirSync(path11, options); + var readdir = (path11, options, cb) => fs8.readdir(path11, options, cb); + var readdirSync = (path11, options) => fs8.readdirSync(path11, options); if (/^v4\./.test(nodeVersion)) - readdir = (path11, options, cb) => fs9.readdir(path11, cb); + readdir = (path11, options, cb) => fs8.readdir(path11, cb); var chown = (cpath, uid, gid, cb) => { - fs9[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, (er) => { + fs8[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, (er) => { cb(er && er.code !== "ENOENT" ? er : null); })); }; var chownrKid = (p, child, uid, gid, cb) => { if (typeof child === "string") - return fs9.lstat(path10.resolve(p, child), (er, stats) => { + return fs8.lstat(path10.resolve(p, child), (er, stats) => { if (er) return cb(er.code !== "ENOENT" ? er : null); stats.name = child; @@ -18056,7 +17826,7 @@ var require_chownr = __commonJS({ var chownrKidSync = (p, child, uid, gid) => { if (typeof child === "string") { try { - const stats = fs9.lstatSync(path10.resolve(p, child)); + const stats = fs8.lstatSync(path10.resolve(p, child)); stats.name = child; child = stats; } catch (er) { @@ -18091,12 +17861,12 @@ var require_chownr = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mkdir.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/mkdir.js var require_mkdir = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mkdir.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/mkdir.js"(exports, module2) { "use strict"; var mkdirp = require_mkdirp(); - var fs9 = require("fs"); + var fs8 = require("fs"); var path10 = require("path"); var chownr = require_chownr(); var normPath = require_normalize_windows_path(); @@ -18123,7 +17893,7 @@ var require_mkdir = __commonJS({ var cGet = (cache, key) => cache.get(normPath(key)); var cSet = (cache, key, val) => cache.set(normPath(key), val); var checkCwd = (dir, cb) => { - fs9.stat(dir, (er, st) => { + fs8.stat(dir, (er, st) => { if (er || !st.isDirectory()) { er = new CwdError(dir, er && er.code || "ENOTDIR"); } @@ -18150,7 +17920,7 @@ var require_mkdir = __commonJS({ if (created && doChown) { chownr(created, uid, gid, (er2) => done(er2)); } else if (needChmod) { - fs9.chmod(dir, mode, cb); + fs8.chmod(dir, mode, cb); } else { cb(); } @@ -18178,22 +17948,22 @@ var require_mkdir = __commonJS({ if (cGet(cache, part)) { return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); } - fs9.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + fs8.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); }; var onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => { if (er) { - fs9.lstat(part, (statEr, st) => { + fs8.lstat(part, (statEr, st) => { if (statEr) { statEr.path = statEr.path && normPath(statEr.path); cb(statEr); } else if (st.isDirectory()) { mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); } else if (unlink) { - fs9.unlink(part, (er2) => { + fs8.unlink(part, (er2) => { if (er2) { return cb(er2); } - fs9.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + fs8.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); }); } else if (st.isSymbolicLink()) { return cb(new SymlinkError(part, part + "/" + parts.join("/"))); @@ -18210,7 +17980,7 @@ var require_mkdir = __commonJS({ let ok = false; let code = "ENOTDIR"; try { - ok = fs9.statSync(dir).isDirectory(); + ok = fs8.statSync(dir).isDirectory(); } catch (er) { code = er.code; } finally { @@ -18237,7 +18007,7 @@ var require_mkdir = __commonJS({ chownr.sync(created2, uid, gid); } if (needChmod) { - fs9.chmodSync(dir, mode); + fs8.chmodSync(dir, mode); } }; if (cache && cGet(cache, dir) === true) { @@ -18259,17 +18029,17 @@ var require_mkdir = __commonJS({ continue; } try { - fs9.mkdirSync(part, mode); + fs8.mkdirSync(part, mode); created = created || part; cSet(cache, part, true); } catch (er) { - const st = fs9.lstatSync(part); + const st = fs8.lstatSync(part); if (st.isDirectory()) { cSet(cache, part, true); continue; } else if (unlink) { - fs9.unlinkSync(part); - fs9.mkdirSync(part, mode); + fs8.unlinkSync(part); + fs8.mkdirSync(part, mode); created = created || part; cSet(cache, part, true); continue; @@ -18283,9 +18053,9 @@ var require_mkdir = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-unicode.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/normalize-unicode.js var require_normalize_unicode = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-unicode.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/normalize-unicode.js"(exports, module2) { var normalizeCache = /* @__PURE__ */ Object.create(null); var { hasOwnProperty } = Object.prototype; module2.exports = (s) => { @@ -18297,9 +18067,9 @@ var require_normalize_unicode = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/path-reservations.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/path-reservations.js var require_path_reservations = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/path-reservations.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/path-reservations.js"(exports, module2) { var assert3 = require("assert"); var normalize = require_normalize_unicode(); var stripSlashes = require_strip_trailing_slashes(); @@ -18411,13 +18181,13 @@ var require_path_reservations = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/get-write-flag.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/get-write-flag.js var require_get_write_flag = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/get-write-flag.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/get-write-flag.js"(exports, module2) { var platform = process.env.__FAKE_PLATFORM__ || process.platform; var isWindows = platform === "win32"; - var fs9 = global.__FAKE_TESTING_FS__ || require("fs"); - var { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs9.constants; + var fs8 = global.__FAKE_TESTING_FS__ || require("fs"); + var { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs8.constants; var fMapEnabled = isWindows && !!UV_FS_O_FILEMAP; var fMapLimit = 512 * 1024; var fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY; @@ -18425,13 +18195,13 @@ var require_get_write_flag = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/unpack.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/unpack.js var require_unpack = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/unpack.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/unpack.js"(exports, module2) { "use strict"; var assert3 = require("assert"); var Parser = require_parse2(); - var fs9 = require("fs"); + var fs8 = require("fs"); var fsm = require_fs_minipass(); var path10 = require("path"); var mkdir4 = require_mkdir(); @@ -18470,25 +18240,26 @@ var require_unpack = __commonJS({ var getFlag = require_get_write_flag(); var platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; var isWindows = platform === "win32"; + var DEFAULT_MAX_DEPTH = 1024; var unlinkFile = (path11, cb) => { if (!isWindows) { - return fs9.unlink(path11, cb); + return fs8.unlink(path11, cb); } const name = path11 + ".DELETE." + crypto.randomBytes(16).toString("hex"); - fs9.rename(path11, name, (er) => { + fs8.rename(path11, name, (er) => { if (er) { return cb(er); } - fs9.unlink(name, cb); + fs8.unlink(name, cb); }); }; var unlinkFileSync = (path11) => { if (!isWindows) { - return fs9.unlinkSync(path11); + return fs8.unlinkSync(path11); } const name = path11 + ".DELETE." + crypto.randomBytes(16).toString("hex"); - fs9.renameSync(path11, name); - fs9.unlinkSync(name); + fs8.renameSync(path11, name); + fs8.unlinkSync(name); }; var uint32 = (a, b, c) => a === a >>> 0 ? a : b === b >>> 0 ? b : c; var cacheKeyNormalize = (path11) => stripSlash(normPath(normalize(path11))).toLowerCase(); @@ -18548,6 +18319,7 @@ var require_unpack = __commonJS({ } this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? process.getuid() : null; this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ? process.getgid() : null; + this.maxDepth = typeof opt.maxDepth === "number" ? opt.maxDepth : DEFAULT_MAX_DEPTH; this.forceChown = opt.forceChown === true; this.win32 = !!opt.win32 || isWindows; this.newer = !!opt.newer; @@ -18580,12 +18352,12 @@ var require_unpack = __commonJS({ } } [CHECKPATH](entry) { + const p = normPath(entry.path); + const parts = p.split("/"); if (this.strip) { - const parts = normPath(entry.path).split("/"); if (parts.length < this.strip) { return false; } - entry.path = parts.slice(this.strip).join("/"); if (entry.type === "Link") { const linkparts = normPath(entry.linkpath).split("/"); if (linkparts.length >= this.strip) { @@ -18594,10 +18366,19 @@ var require_unpack = __commonJS({ return false; } } + parts.splice(0, this.strip); + entry.path = parts.join("/"); + } + if (isFinite(this.maxDepth) && parts.length > this.maxDepth) { + this.warn("TAR_ENTRY_ERROR", "path excessively deep", { + entry, + path: p, + depth: parts.length, + maxDepth: this.maxDepth + }); + return false; } if (!this.preservePaths) { - const p = normPath(entry.path); - const parts = p.split("/"); if (parts.includes("..") || isWindows && /^[a-z]:\.\.$/i.test(parts[0])) { this.warn("TAR_ENTRY_ERROR", `path contains '..'`, { entry, @@ -18705,7 +18486,7 @@ var require_unpack = __commonJS({ }); stream.on("error", (er) => { if (stream.fd) { - fs9.close(stream.fd, () => { + fs8.close(stream.fd, () => { }); } stream.write = () => true; @@ -18716,7 +18497,7 @@ var require_unpack = __commonJS({ const done = (er) => { if (er) { if (stream.fd) { - fs9.close(stream.fd, () => { + fs8.close(stream.fd, () => { }); } this[ONERROR](er, entry); @@ -18724,7 +18505,7 @@ var require_unpack = __commonJS({ return; } if (--actions === 0) { - fs9.close(stream.fd, (er2) => { + fs8.close(stream.fd, (er2) => { if (er2) { this[ONERROR](er2, entry); } else { @@ -18741,13 +18522,13 @@ var require_unpack = __commonJS({ actions++; const atime = entry.atime || /* @__PURE__ */ new Date(); const mtime = entry.mtime; - fs9.futimes(fd, atime, mtime, (er) => er ? fs9.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done()); + fs8.futimes(fd, atime, mtime, (er) => er ? fs8.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done()); } if (this[DOCHOWN](entry)) { actions++; const uid = this[UID](entry); const gid = this[GID](entry); - fs9.fchown(fd, uid, gid, (er) => er ? fs9.chown(abs, uid, gid, (er2) => done(er2 && er)) : done()); + fs8.fchown(fd, uid, gid, (er) => er ? fs8.chown(abs, uid, gid, (er2) => done(er2 && er)) : done()); } done(); }); @@ -18779,11 +18560,11 @@ var require_unpack = __commonJS({ }; if (entry.mtime && !this.noMtime) { actions++; - fs9.utimes(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done); + fs8.utimes(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done); } if (this[DOCHOWN](entry)) { actions++; - fs9.chown(entry.absolute, this[UID](entry), this[GID](entry), done); + fs8.chown(entry.absolute, this[UID](entry), this[GID](entry), done); } done(); }); @@ -18871,7 +18652,7 @@ var require_unpack = __commonJS({ afterMakeParent(); }; const afterMakeParent = () => { - fs9.lstat(entry.absolute, (lstatEr, st) => { + fs8.lstat(entry.absolute, (lstatEr, st) => { if (st && (this.keep || this.newer && st.mtime > entry.mtime)) { this[SKIP](entry); done(); @@ -18887,10 +18668,10 @@ var require_unpack = __commonJS({ if (!needChmod) { return afterChmod(); } - return fs9.chmod(entry.absolute, entry.mode, afterChmod); + return fs8.chmod(entry.absolute, entry.mode, afterChmod); } if (entry.absolute !== this.cwd) { - return fs9.rmdir(entry.absolute, (er) => this[MAKEFS](er, entry, done)); + return fs8.rmdir(entry.absolute, (er) => this[MAKEFS](er, entry, done)); } } if (entry.absolute === this.cwd) { @@ -18926,7 +18707,7 @@ var require_unpack = __commonJS({ } } [LINK](entry, linkpath, link, done) { - fs9[link](linkpath, entry.absolute, (er) => { + fs8[link](linkpath, entry.absolute, (er) => { if (er) { this[ONERROR](er, entry); } else { @@ -18967,7 +18748,7 @@ var require_unpack = __commonJS({ } } } - const [lstatEr, st] = callSync(() => fs9.lstatSync(entry.absolute)); + const [lstatEr, st] = callSync(() => fs8.lstatSync(entry.absolute)); if (st && (this.keep || this.newer && st.mtime > entry.mtime)) { return this[SKIP](entry); } @@ -18978,11 +18759,11 @@ var require_unpack = __commonJS({ if (entry.type === "Directory") { const needChmod = !this.noChmod && entry.mode && (st.mode & 4095) !== entry.mode; const [er3] = needChmod ? callSync(() => { - fs9.chmodSync(entry.absolute, entry.mode); + fs8.chmodSync(entry.absolute, entry.mode); }) : []; return this[MAKEFS](er3, entry); } - const [er2] = callSync(() => fs9.rmdirSync(entry.absolute)); + const [er2] = callSync(() => fs8.rmdirSync(entry.absolute)); this[MAKEFS](er2, entry); } const [er] = entry.absolute === this.cwd ? [] : callSync(() => unlinkFileSync(entry.absolute)); @@ -18993,7 +18774,7 @@ var require_unpack = __commonJS({ const oner = (er) => { let closeError; try { - fs9.closeSync(fd); + fs8.closeSync(fd); } catch (e) { closeError = e; } @@ -19004,7 +18785,7 @@ var require_unpack = __commonJS({ }; let fd; try { - fd = fs9.openSync(entry.absolute, getFlag(entry.size), mode); + fd = fs8.openSync(entry.absolute, getFlag(entry.size), mode); } catch (er) { return oner(er); } @@ -19015,7 +18796,7 @@ var require_unpack = __commonJS({ } tx.on("data", (chunk) => { try { - fs9.writeSync(fd, chunk, 0, chunk.length); + fs8.writeSync(fd, chunk, 0, chunk.length); } catch (er) { oner(er); } @@ -19026,10 +18807,10 @@ var require_unpack = __commonJS({ const atime = entry.atime || /* @__PURE__ */ new Date(); const mtime = entry.mtime; try { - fs9.futimesSync(fd, atime, mtime); + fs8.futimesSync(fd, atime, mtime); } catch (futimeser) { try { - fs9.utimesSync(entry.absolute, atime, mtime); + fs8.utimesSync(entry.absolute, atime, mtime); } catch (utimeser) { er = futimeser; } @@ -19039,10 +18820,10 @@ var require_unpack = __commonJS({ const uid = this[UID](entry); const gid = this[GID](entry); try { - fs9.fchownSync(fd, uid, gid); + fs8.fchownSync(fd, uid, gid); } catch (fchowner) { try { - fs9.chownSync(entry.absolute, uid, gid); + fs8.chownSync(entry.absolute, uid, gid); } catch (chowner) { er = er || fchowner; } @@ -19061,13 +18842,13 @@ var require_unpack = __commonJS({ } if (entry.mtime && !this.noMtime) { try { - fs9.utimesSync(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime); + fs8.utimesSync(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime); } catch (er2) { } } if (this[DOCHOWN](entry)) { try { - fs9.chownSync(entry.absolute, this[UID](entry), this[GID](entry)); + fs8.chownSync(entry.absolute, this[UID](entry), this[GID](entry)); } catch (er2) { } } @@ -19094,7 +18875,7 @@ var require_unpack = __commonJS({ } [LINK](entry, linkpath, link, done) { try { - fs9[link + "Sync"](linkpath, entry.absolute); + fs8[link + "Sync"](linkpath, entry.absolute); done(); entry.resume(); } catch (er) { @@ -19107,13 +18888,13 @@ var require_unpack = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/extract.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/extract.js var require_extract = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/extract.js"(exports, module2) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/lib/extract.js"(exports, module2) { "use strict"; var hlo = require_high_level_opt(); var Unpack = require_unpack(); - var fs9 = require("fs"); + var fs8 = require("fs"); var fsm = require_fs_minipass(); var path10 = require("path"); var stripSlash = require_strip_trailing_slashes(); @@ -19157,7 +18938,7 @@ var require_extract = __commonJS({ var extractFileSync = (opt) => { const u = new Unpack.Sync(opt); const file = opt.file; - const stat = fs9.statSync(file); + const stat = fs8.statSync(file); const readSize = opt.maxReadSize || 16 * 1024 * 1024; const stream = new fsm.ReadStreamSync(file, { readSize, @@ -19172,7 +18953,7 @@ var require_extract = __commonJS({ const p = new Promise((resolve, reject) => { u.on("error", reject); u.on("close", resolve); - fs9.stat(file, (er, stat) => { + fs8.stat(file, (er, stat) => { if (er) { reject(er); } else { @@ -19192,9 +18973,9 @@ var require_extract = __commonJS({ } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/index.js +// .yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/index.js var require_tar = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/index.js"(exports) { + ".yarn/cache/tar-npm-6.2.1-237800bb20-a5eca3eb50.zip/node_modules/tar/index.js"(exports) { "use strict"; exports.c = exports.create = require_create(); exports.r = exports.replace = require_replace(); @@ -19218,7 +18999,7 @@ var require_v8_compile_cache = __commonJS({ "use strict"; var Module2 = require("module"); var crypto = require("crypto"); - var fs9 = require("fs"); + var fs8 = require("fs"); var path10 = require("path"); var vm = require("vm"); var os3 = require("os"); @@ -19280,22 +19061,22 @@ var require_v8_compile_cache = __commonJS({ const mapToStore = JSON.stringify(dump[1]); try { mkdirpSync(this._directory); - fs9.writeFileSync(this._lockFilename, "LOCK", { flag: "wx" }); + fs8.writeFileSync(this._lockFilename, "LOCK", { flag: "wx" }); } catch (error) { return false; } try { - fs9.writeFileSync(this._blobFilename, blobToStore); - fs9.writeFileSync(this._mapFilename, mapToStore); + fs8.writeFileSync(this._blobFilename, blobToStore); + fs8.writeFileSync(this._mapFilename, mapToStore); } finally { - fs9.unlinkSync(this._lockFilename); + fs8.unlinkSync(this._lockFilename); } return true; } _load() { try { - this._storedBlob = fs9.readFileSync(this._blobFilename); - this._storedMap = JSON.parse(fs9.readFileSync(this._mapFilename)); + this._storedBlob = fs8.readFileSync(this._blobFilename); + this._storedMap = JSON.parse(fs8.readFileSync(this._mapFilename)); } catch (e) { this._storedBlob = Buffer.alloc(0); this._storedMap = {}; @@ -19416,14 +19197,14 @@ var require_v8_compile_cache = __commonJS({ } function _mkdirpSync(p, mode) { try { - fs9.mkdirSync(p, mode); + fs8.mkdirSync(p, mode); } catch (err0) { if (err0.code === "ENOENT") { _mkdirpSync(path10.dirname(p)); _mkdirpSync(p); } else { try { - const stat = fs9.statSync(p); + const stat = fs8.statSync(p); if (!stat.isDirectory()) { throw err0; } @@ -19810,56 +19591,56 @@ var require_polyfills = __commonJS({ } var chdir; module2.exports = patch; - function patch(fs9) { + function patch(fs8) { if (constants.hasOwnProperty("O_SYMLINK") && process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs9); - } - if (!fs9.lutimes) { - patchLutimes(fs9); - } - fs9.chown = chownFix(fs9.chown); - fs9.fchown = chownFix(fs9.fchown); - fs9.lchown = chownFix(fs9.lchown); - fs9.chmod = chmodFix(fs9.chmod); - fs9.fchmod = chmodFix(fs9.fchmod); - fs9.lchmod = chmodFix(fs9.lchmod); - fs9.chownSync = chownFixSync(fs9.chownSync); - fs9.fchownSync = chownFixSync(fs9.fchownSync); - fs9.lchownSync = chownFixSync(fs9.lchownSync); - fs9.chmodSync = chmodFixSync(fs9.chmodSync); - fs9.fchmodSync = chmodFixSync(fs9.fchmodSync); - fs9.lchmodSync = chmodFixSync(fs9.lchmodSync); - fs9.stat = statFix(fs9.stat); - fs9.fstat = statFix(fs9.fstat); - fs9.lstat = statFix(fs9.lstat); - fs9.statSync = statFixSync(fs9.statSync); - fs9.fstatSync = statFixSync(fs9.fstatSync); - fs9.lstatSync = statFixSync(fs9.lstatSync); - if (fs9.chmod && !fs9.lchmod) { - fs9.lchmod = function(path10, mode, cb) { + patchLchmod(fs8); + } + if (!fs8.lutimes) { + patchLutimes(fs8); + } + fs8.chown = chownFix(fs8.chown); + fs8.fchown = chownFix(fs8.fchown); + fs8.lchown = chownFix(fs8.lchown); + fs8.chmod = chmodFix(fs8.chmod); + fs8.fchmod = chmodFix(fs8.fchmod); + fs8.lchmod = chmodFix(fs8.lchmod); + fs8.chownSync = chownFixSync(fs8.chownSync); + fs8.fchownSync = chownFixSync(fs8.fchownSync); + fs8.lchownSync = chownFixSync(fs8.lchownSync); + fs8.chmodSync = chmodFixSync(fs8.chmodSync); + fs8.fchmodSync = chmodFixSync(fs8.fchmodSync); + fs8.lchmodSync = chmodFixSync(fs8.lchmodSync); + fs8.stat = statFix(fs8.stat); + fs8.fstat = statFix(fs8.fstat); + fs8.lstat = statFix(fs8.lstat); + fs8.statSync = statFixSync(fs8.statSync); + fs8.fstatSync = statFixSync(fs8.fstatSync); + fs8.lstatSync = statFixSync(fs8.lstatSync); + if (fs8.chmod && !fs8.lchmod) { + fs8.lchmod = function(path10, mode, cb) { if (cb) process.nextTick(cb); }; - fs9.lchmodSync = function() { + fs8.lchmodSync = function() { }; } - if (fs9.chown && !fs9.lchown) { - fs9.lchown = function(path10, uid, gid, cb) { + if (fs8.chown && !fs8.lchown) { + fs8.lchown = function(path10, uid, gid, cb) { if (cb) process.nextTick(cb); }; - fs9.lchownSync = function() { + fs8.lchownSync = function() { }; } if (platform === "win32") { - fs9.rename = typeof fs9.rename !== "function" ? fs9.rename : function(fs$rename) { + fs8.rename = typeof fs8.rename !== "function" ? fs8.rename : function(fs$rename) { function rename(from, to, cb) { var start = Date.now(); var backoff = 0; fs$rename(from, to, function CB(er) { if (er && (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY") && Date.now() - start < 6e4) { setTimeout(function() { - fs9.stat(to, function(stater, st) { + fs8.stat(to, function(stater, st) { if (stater && stater.code === "ENOENT") fs$rename(from, to, CB); else @@ -19877,9 +19658,9 @@ var require_polyfills = __commonJS({ if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename); return rename; - }(fs9.rename); + }(fs8.rename); } - fs9.read = typeof fs9.read !== "function" ? fs9.read : function(fs$read) { + fs8.read = typeof fs8.read !== "function" ? fs8.read : function(fs$read) { function read(fd, buffer, offset, length, position, callback_) { var callback; if (callback_ && typeof callback_ === "function") { @@ -19887,23 +19668,23 @@ var require_polyfills = __commonJS({ callback = function(er, _, __) { if (er && er.code === "EAGAIN" && eagCounter < 10) { eagCounter++; - return fs$read.call(fs9, fd, buffer, offset, length, position, callback); + return fs$read.call(fs8, fd, buffer, offset, length, position, callback); } callback_.apply(this, arguments); }; } - return fs$read.call(fs9, fd, buffer, offset, length, position, callback); + return fs$read.call(fs8, fd, buffer, offset, length, position, callback); } if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read); return read; - }(fs9.read); - fs9.readSync = typeof fs9.readSync !== "function" ? fs9.readSync : function(fs$readSync) { + }(fs8.read); + fs8.readSync = typeof fs8.readSync !== "function" ? fs8.readSync : function(fs$readSync) { return function(fd, buffer, offset, length, position) { var eagCounter = 0; while (true) { try { - return fs$readSync.call(fs9, fd, buffer, offset, length, position); + return fs$readSync.call(fs8, fd, buffer, offset, length, position); } catch (er) { if (er.code === "EAGAIN" && eagCounter < 10) { eagCounter++; @@ -19913,10 +19694,10 @@ var require_polyfills = __commonJS({ } } }; - }(fs9.readSync); - function patchLchmod(fs10) { - fs10.lchmod = function(path10, mode, callback) { - fs10.open( + }(fs8.readSync); + function patchLchmod(fs9) { + fs9.lchmod = function(path10, mode, callback) { + fs9.open( path10, constants.O_WRONLY | constants.O_SYMLINK, mode, @@ -19926,8 +19707,8 @@ var require_polyfills = __commonJS({ callback(err); return; } - fs10.fchmod(fd, mode, function(err2) { - fs10.close(fd, function(err22) { + fs9.fchmod(fd, mode, function(err2) { + fs9.close(fd, function(err22) { if (callback) callback(err2 || err22); }); @@ -19935,68 +19716,68 @@ var require_polyfills = __commonJS({ } ); }; - fs10.lchmodSync = function(path10, mode) { - var fd = fs10.openSync(path10, constants.O_WRONLY | constants.O_SYMLINK, mode); + fs9.lchmodSync = function(path10, mode) { + var fd = fs9.openSync(path10, constants.O_WRONLY | constants.O_SYMLINK, mode); var threw = true; var ret; try { - ret = fs10.fchmodSync(fd, mode); + ret = fs9.fchmodSync(fd, mode); threw = false; } finally { if (threw) { try { - fs10.closeSync(fd); + fs9.closeSync(fd); } catch (er) { } } else { - fs10.closeSync(fd); + fs9.closeSync(fd); } } return ret; }; } - function patchLutimes(fs10) { - if (constants.hasOwnProperty("O_SYMLINK") && fs10.futimes) { - fs10.lutimes = function(path10, at, mt, cb) { - fs10.open(path10, constants.O_SYMLINK, function(er, fd) { + function patchLutimes(fs9) { + if (constants.hasOwnProperty("O_SYMLINK") && fs9.futimes) { + fs9.lutimes = function(path10, at, mt, cb) { + fs9.open(path10, constants.O_SYMLINK, function(er, fd) { if (er) { if (cb) cb(er); return; } - fs10.futimes(fd, at, mt, function(er2) { - fs10.close(fd, function(er22) { + fs9.futimes(fd, at, mt, function(er2) { + fs9.close(fd, function(er22) { if (cb) cb(er2 || er22); }); }); }); }; - fs10.lutimesSync = function(path10, at, mt) { - var fd = fs10.openSync(path10, constants.O_SYMLINK); + fs9.lutimesSync = function(path10, at, mt) { + var fd = fs9.openSync(path10, constants.O_SYMLINK); var ret; var threw = true; try { - ret = fs10.futimesSync(fd, at, mt); + ret = fs9.futimesSync(fd, at, mt); threw = false; } finally { if (threw) { try { - fs10.closeSync(fd); + fs9.closeSync(fd); } catch (er) { } } else { - fs10.closeSync(fd); + fs9.closeSync(fd); } } return ret; }; - } else if (fs10.futimes) { - fs10.lutimes = function(_a, _b, _c, cb) { + } else if (fs9.futimes) { + fs9.lutimes = function(_a, _b, _c, cb) { if (cb) process.nextTick(cb); }; - fs10.lutimesSync = function() { + fs9.lutimesSync = function() { }; } } @@ -20004,7 +19785,7 @@ var require_polyfills = __commonJS({ if (!orig) return orig; return function(target, mode, cb) { - return orig.call(fs9, target, mode, function(er) { + return orig.call(fs8, target, mode, function(er) { if (chownErOk(er)) er = null; if (cb) @@ -20017,7 +19798,7 @@ var require_polyfills = __commonJS({ return orig; return function(target, mode) { try { - return orig.call(fs9, target, mode); + return orig.call(fs8, target, mode); } catch (er) { if (!chownErOk(er)) throw er; @@ -20028,7 +19809,7 @@ var require_polyfills = __commonJS({ if (!orig) return orig; return function(target, uid, gid, cb) { - return orig.call(fs9, target, uid, gid, function(er) { + return orig.call(fs8, target, uid, gid, function(er) { if (chownErOk(er)) er = null; if (cb) @@ -20041,7 +19822,7 @@ var require_polyfills = __commonJS({ return orig; return function(target, uid, gid) { try { - return orig.call(fs9, target, uid, gid); + return orig.call(fs8, target, uid, gid); } catch (er) { if (!chownErOk(er)) throw er; @@ -20066,14 +19847,14 @@ var require_polyfills = __commonJS({ if (cb) cb.apply(this, arguments); } - return options ? orig.call(fs9, target, options, callback) : orig.call(fs9, target, callback); + return options ? orig.call(fs8, target, options, callback) : orig.call(fs8, target, callback); }; } function statFixSync(orig) { if (!orig) return orig; return function(target, options) { - var stats = options ? orig.call(fs9, target, options) : orig.call(fs9, target); + var stats = options ? orig.call(fs8, target, options) : orig.call(fs8, target); if (stats) { if (stats.uid < 0) stats.uid += 4294967296; @@ -20104,7 +19885,7 @@ var require_legacy_streams = __commonJS({ ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/legacy-streams.js"(exports, module2) { var Stream = require("stream").Stream; module2.exports = legacy; - function legacy(fs9) { + function legacy(fs8) { return { ReadStream, WriteStream @@ -20149,7 +19930,7 @@ var require_legacy_streams = __commonJS({ }); return; } - fs9.open(this.path, this.flags, this.mode, function(err, fd) { + fs8.open(this.path, this.flags, this.mode, function(err, fd) { if (err) { self2.emit("error", err); self2.readable = false; @@ -20189,7 +19970,7 @@ var require_legacy_streams = __commonJS({ this.busy = false; this._queue = []; if (this.fd === null) { - this._open = fs9.open; + this._open = fs8.open; this._queue.push([this._open, this.path, this.flags, this.mode, void 0]); this.flush(); } @@ -20224,7 +20005,7 @@ var require_clone = __commonJS({ // .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/graceful-fs.js var require_graceful_fs = __commonJS({ ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/graceful-fs.js"(exports, module2) { - var fs9 = require("fs"); + var fs8 = require("fs"); var polyfills = require_polyfills(); var legacy = require_legacy_streams(); var clone = require_clone(); @@ -20256,12 +20037,12 @@ var require_graceful_fs = __commonJS({ m = "GFS4: " + m.split(/\n/).join("\nGFS4: "); console.error(m); }; - if (!fs9[gracefulQueue]) { + if (!fs8[gracefulQueue]) { queue = global[gracefulQueue] || []; - publishQueue(fs9, queue); - fs9.close = function(fs$close) { + publishQueue(fs8, queue); + fs8.close = function(fs$close) { function close(fd, cb) { - return fs$close.call(fs9, fd, function(err) { + return fs$close.call(fs8, fd, function(err) { if (!err) { resetQueue(); } @@ -20273,40 +20054,40 @@ var require_graceful_fs = __commonJS({ value: fs$close }); return close; - }(fs9.close); - fs9.closeSync = function(fs$closeSync) { + }(fs8.close); + fs8.closeSync = function(fs$closeSync) { function closeSync(fd) { - fs$closeSync.apply(fs9, arguments); + fs$closeSync.apply(fs8, arguments); resetQueue(); } Object.defineProperty(closeSync, previousSymbol, { value: fs$closeSync }); return closeSync; - }(fs9.closeSync); + }(fs8.closeSync); if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) { process.on("exit", function() { - debug2(fs9[gracefulQueue]); - require("assert").equal(fs9[gracefulQueue].length, 0); + debug2(fs8[gracefulQueue]); + require("assert").equal(fs8[gracefulQueue].length, 0); }); } } var queue; if (!global[gracefulQueue]) { - publishQueue(global, fs9[gracefulQueue]); - } - module2.exports = patch(clone(fs9)); - if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs9.__patched) { - module2.exports = patch(fs9); - fs9.__patched = true; - } - function patch(fs10) { - polyfills(fs10); - fs10.gracefulify = patch; - fs10.createReadStream = createReadStream; - fs10.createWriteStream = createWriteStream; - var fs$readFile = fs10.readFile; - fs10.readFile = readFile; + publishQueue(global, fs8[gracefulQueue]); + } + module2.exports = patch(clone(fs8)); + if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs8.__patched) { + module2.exports = patch(fs8); + fs8.__patched = true; + } + function patch(fs9) { + polyfills(fs9); + fs9.gracefulify = patch; + fs9.createReadStream = createReadStream; + fs9.createWriteStream = createWriteStream; + var fs$readFile = fs9.readFile; + fs9.readFile = readFile; function readFile(path10, options, cb) { if (typeof options === "function") cb = options, options = null; @@ -20322,8 +20103,8 @@ var require_graceful_fs = __commonJS({ }); } } - var fs$writeFile = fs10.writeFile; - fs10.writeFile = writeFile; + var fs$writeFile = fs9.writeFile; + fs9.writeFile = writeFile; function writeFile(path10, data, options, cb) { if (typeof options === "function") cb = options, options = null; @@ -20339,9 +20120,9 @@ var require_graceful_fs = __commonJS({ }); } } - var fs$appendFile = fs10.appendFile; + var fs$appendFile = fs9.appendFile; if (fs$appendFile) - fs10.appendFile = appendFile; + fs9.appendFile = appendFile; function appendFile(path10, data, options, cb) { if (typeof options === "function") cb = options, options = null; @@ -20357,9 +20138,9 @@ var require_graceful_fs = __commonJS({ }); } } - var fs$copyFile = fs10.copyFile; + var fs$copyFile = fs9.copyFile; if (fs$copyFile) - fs10.copyFile = copyFile; + fs9.copyFile = copyFile; function copyFile(src, dest, flags, cb) { if (typeof flags === "function") { cb = flags; @@ -20377,8 +20158,8 @@ var require_graceful_fs = __commonJS({ }); } } - var fs$readdir = fs10.readdir; - fs10.readdir = readdir; + var fs$readdir = fs9.readdir; + fs9.readdir = readdir; var noReaddirOptionVersions = /^v[0-5]\./; function readdir(path10, options, cb) { if (typeof options === "function") @@ -20419,21 +20200,21 @@ var require_graceful_fs = __commonJS({ } } if (process.version.substr(0, 4) === "v0.8") { - var legStreams = legacy(fs10); + var legStreams = legacy(fs9); ReadStream = legStreams.ReadStream; WriteStream = legStreams.WriteStream; } - var fs$ReadStream = fs10.ReadStream; + var fs$ReadStream = fs9.ReadStream; if (fs$ReadStream) { ReadStream.prototype = Object.create(fs$ReadStream.prototype); ReadStream.prototype.open = ReadStream$open; } - var fs$WriteStream = fs10.WriteStream; + var fs$WriteStream = fs9.WriteStream; if (fs$WriteStream) { WriteStream.prototype = Object.create(fs$WriteStream.prototype); WriteStream.prototype.open = WriteStream$open; } - Object.defineProperty(fs10, "ReadStream", { + Object.defineProperty(fs9, "ReadStream", { get: function() { return ReadStream; }, @@ -20443,7 +20224,7 @@ var require_graceful_fs = __commonJS({ enumerable: true, configurable: true }); - Object.defineProperty(fs10, "WriteStream", { + Object.defineProperty(fs9, "WriteStream", { get: function() { return WriteStream; }, @@ -20454,7 +20235,7 @@ var require_graceful_fs = __commonJS({ configurable: true }); var FileReadStream = ReadStream; - Object.defineProperty(fs10, "FileReadStream", { + Object.defineProperty(fs9, "FileReadStream", { get: function() { return FileReadStream; }, @@ -20465,7 +20246,7 @@ var require_graceful_fs = __commonJS({ configurable: true }); var FileWriteStream = WriteStream; - Object.defineProperty(fs10, "FileWriteStream", { + Object.defineProperty(fs9, "FileWriteStream", { get: function() { return FileWriteStream; }, @@ -20514,13 +20295,13 @@ var require_graceful_fs = __commonJS({ }); } function createReadStream(path10, options) { - return new fs10.ReadStream(path10, options); + return new fs9.ReadStream(path10, options); } function createWriteStream(path10, options) { - return new fs10.WriteStream(path10, options); + return new fs9.WriteStream(path10, options); } - var fs$open = fs10.open; - fs10.open = open; + var fs$open = fs9.open; + fs9.open = open; function open(path10, flags, mode, cb) { if (typeof mode === "function") cb = mode, mode = null; @@ -20536,20 +20317,20 @@ var require_graceful_fs = __commonJS({ }); } } - return fs10; + return fs9; } function enqueue(elem) { debug2("ENQUEUE", elem[0].name, elem[1]); - fs9[gracefulQueue].push(elem); + fs8[gracefulQueue].push(elem); retry(); } var retryTimer; function resetQueue() { var now = Date.now(); - for (var i = 0; i < fs9[gracefulQueue].length; ++i) { - if (fs9[gracefulQueue][i].length > 2) { - fs9[gracefulQueue][i][3] = now; - fs9[gracefulQueue][i][4] = now; + for (var i = 0; i < fs8[gracefulQueue].length; ++i) { + if (fs8[gracefulQueue][i].length > 2) { + fs8[gracefulQueue][i][3] = now; + fs8[gracefulQueue][i][4] = now; } } retry(); @@ -20557,9 +20338,9 @@ var require_graceful_fs = __commonJS({ function retry() { clearTimeout(retryTimer); retryTimer = void 0; - if (fs9[gracefulQueue].length === 0) + if (fs8[gracefulQueue].length === 0) return; - var elem = fs9[gracefulQueue].shift(); + var elem = fs8[gracefulQueue].shift(); var fn2 = elem[0]; var args = elem[1]; var err = elem[2]; @@ -20581,7 +20362,7 @@ var require_graceful_fs = __commonJS({ debug2("RETRY", fn2.name, args); fn2.apply(null, args.concat([startTime])); } else { - fs9[gracefulQueue].push(elem); + fs8[gracefulQueue].push(elem); } } if (retryTimer === void 0) { @@ -20618,15 +20399,15 @@ var require_cmd_shim = __commonJS({ ]); function ingestOptions(opts) { const opts_ = { ...DEFAULT_OPTIONS, ...opts }; - const fs9 = opts_.fs; + const fs8 = opts_.fs; opts_.fs_ = { - chmod: fs9.chmod ? (0, util_1.promisify)(fs9.chmod) : async () => { + chmod: fs8.chmod ? (0, util_1.promisify)(fs8.chmod) : async () => { }, - mkdir: (0, util_1.promisify)(fs9.mkdir), - readFile: (0, util_1.promisify)(fs9.readFile), - stat: (0, util_1.promisify)(fs9.stat), - unlink: (0, util_1.promisify)(fs9.unlink), - writeFile: (0, util_1.promisify)(fs9.writeFile) + mkdir: (0, util_1.promisify)(fs8.mkdir), + readFile: (0, util_1.promisify)(fs8.readFile), + stat: (0, util_1.promisify)(fs8.stat), + unlink: (0, util_1.promisify)(fs8.unlink), + writeFile: (0, util_1.promisify)(fs8.writeFile) }; return opts_; } @@ -20638,7 +20419,7 @@ var require_cmd_shim = __commonJS({ return cmdShim2(src, to, opts).catch(() => { }); } - function rm2(path11, opts) { + function rm(path11, opts) { return opts.fs_.unlink(path11).catch(() => { }); } @@ -20662,7 +20443,7 @@ var require_cmd_shim = __commonJS({ return Promise.all(generatorAndExts.map((generatorAndExt) => writeShim(src, to + generatorAndExt.extension, srcRuntimeInfo, generatorAndExt.generator, opts_))); } function writeShimPre(target, opts) { - return rm2(target, opts); + return rm(target, opts); } function writeShimPost(target, opts) { return chmodShim(target, opts); @@ -22636,19 +22417,19 @@ function String2(descriptor, ...args) { } // package.json -var version = "0.25.2"; +var version = "0.28.0"; // sources/Engine.ts -var import_fs3 = __toESM(require("fs")); -var import_path3 = __toESM(require("path")); +var import_fs4 = __toESM(require("fs")); +var import_path4 = __toESM(require("path")); var import_process3 = __toESM(require("process")); -var import_semver3 = __toESM(require_semver2()); +var import_semver4 = __toESM(require_semver2()); // config.json var config_default = { definitions: { npm: { - default: "10.4.0+sha1.904025b4d932cfaed8799e644a1c5ae7f02729fc", + default: "10.5.2+sha1.0e9b72afaf5ecf8249b2abb4b7417db6739c1475", fetchLatestFrom: { type: "npm", package: "npm" @@ -22685,7 +22466,7 @@ var config_default = { } }, pnpm: { - default: "8.15.3+sha1.64838798f519c18029c1e8a1310e16101fc2eda0", + default: "9.0.3+sha1.ff3ad37177cbd0843e533aab13d5e40a05803b47", fetchLatestFrom: { type: "npm", package: "pnpm" @@ -22743,14 +22524,18 @@ var config_default = { } }, yarn: { - default: "1.22.21+sha1.1959a18351b811cdeedbd484a8f86c3cc3bbaf72", + default: "1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610", fetchLatestFrom: { type: "npm", package: "yarn" }, transparent: { - default: "4.1.0+sha224.bc24d7f5afc738464f3d4e95f4e6e7829a35cee54a0fd527ea5baa83", + default: "4.1.1+sha224.00f08619463229f8ba40c4ee90e8c2e4ced1f11c3115c26f3b98432e", commands: [ + [ + "yarn", + "init" + ], [ "yarn", "dlx" @@ -22792,7 +22577,8 @@ var config_default = { }, npmRegistry: { type: "npm", - package: "@yarnpkg/cli-dist" + package: "@yarnpkg/cli-dist", + bin: "bin/yarn.js" }, commands: { use: [ @@ -22803,16 +22589,28 @@ var config_default = { } } } + }, + keys: { + npm: [ + { + expires: null, + keyid: "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + keytype: "ecdsa-sha2-nistp256", + scheme: "ecdsa-sha2-nistp256", + key: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1Olb3zMAFFxXKHiIkQO5cJ3Yhl5i6UPp+IhuteBJbuHcA5UogKo0EWtlWwW6KSaKoTNEYL7JlCQiVnkhBktUgg==" + } + ] } }; // sources/corepackUtils.ts -var import_crypto = require("crypto"); +var import_crypto2 = require("crypto"); var import_events2 = require("events"); var import_fs2 = __toESM(require("fs")); var import_module = __toESM(require("module")); var import_path2 = __toESM(require("path")); var import_semver = __toESM(require_semver2()); +var import_promises = require("timers/promises"); // sources/debugUtils.ts var import_debug = __toESM(require_src()); @@ -22856,27 +22654,109 @@ function getTemporaryFolder(target = (0, import_os.tmpdir)()) { } } } - -// sources/fsUtils.ts -var import_promises = require("fs/promises"); -async function rimraf(path10) { - return (0, import_promises.rm)(path10, { recursive: true, force: true }); + +// sources/httpUtils.ts +var import_assert = __toESM(require("assert")); +var import_events = require("events"); +var import_process2 = require("process"); +var import_stream = require("stream"); + +// sources/npmRegistryUtils.ts +var import_crypto = require("crypto"); +var DEFAULT_HEADERS = { + [`Accept`]: `application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8` +}; +var DEFAULT_NPM_REGISTRY_URL = `https://registry.npmjs.org`; +async function fetchAsJson2(packageName, version2) { + const npmRegistryUrl = process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL; + if (process.env.COREPACK_ENABLE_NETWORK === `0`) + throw new UsageError(`Network access disabled by the environment; can't reach npm repository ${npmRegistryUrl}`); + const headers = { ...DEFAULT_HEADERS }; + if (`COREPACK_NPM_TOKEN` in process.env) { + headers.authorization = `Bearer ${process.env.COREPACK_NPM_TOKEN}`; + } else if (`COREPACK_NPM_USERNAME` in process.env && `COREPACK_NPM_PASSWORD` in process.env) { + const encodedCreds = Buffer.from(`${process.env.COREPACK_NPM_USERNAME}:${process.env.COREPACK_NPM_PASSWORD}`, `utf8`).toString(`base64`); + headers.authorization = `Basic ${encodedCreds}`; + } + return fetchAsJson(`${npmRegistryUrl}/${packageName}${version2 ? `/${version2}` : ``}`, { headers }); +} +function verifySignature({ signatures, integrity, packageName, version: version2 }) { + const { npm: keys } = process.env.COREPACK_INTEGRITY_KEYS ? JSON.parse(process.env.COREPACK_INTEGRITY_KEYS) : config_default.keys; + const key = keys.find(({ keyid }) => signatures.some((s) => s.keyid === keyid)); + const signature = signatures.find(({ keyid }) => keyid === key?.keyid); + if (key == null || signature == null) + throw new Error(`Cannot find matching keyid: ${JSON.stringify({ signatures, keys })}`); + const verifier = (0, import_crypto.createVerify)(`SHA256`); + verifier.end(`${packageName}@${version2}:${integrity}`); + const valid = verifier.verify( + `-----BEGIN PUBLIC KEY----- +${key.key} +-----END PUBLIC KEY-----`, + signature.sig, + `base64` + ); + if (!valid) { + throw new Error(`Signature does not match`); + } +} +async function fetchLatestStableVersion(packageName) { + const metadata = await fetchAsJson2(packageName, `latest`); + const { version: version2, dist: { integrity, signatures } } = metadata; + if (process.env.COREPACK_INTEGRITY_KEYS !== ``) { + verifySignature({ + packageName, + version: version2, + integrity, + signatures + }); + } + return `${version2}+sha512.${Buffer.from(integrity.slice(7), `base64`).toString(`hex`)}`; +} +async function fetchAvailableTags(packageName) { + const metadata = await fetchAsJson2(packageName); + return metadata[`dist-tags`]; +} +async function fetchAvailableVersions(packageName) { + const metadata = await fetchAsJson2(packageName); + return Object.keys(metadata.versions); +} +async function fetchTarballURLAndSignature(packageName, version2) { + const versionMetadata = await fetchAsJson2(packageName, version2); + const { tarball, signatures, integrity } = versionMetadata.dist; + if (tarball === void 0 || !tarball.startsWith(`http`)) + throw new Error(`${packageName}@${version2} does not have a valid tarball.`); + return { tarball, signatures, integrity }; } // sources/httpUtils.ts -var import_assert = __toESM(require("assert")); -var import_events = require("events"); -var import_process2 = require("process"); -var import_stream = require("stream"); async function fetch(input, init) { if (process.env.COREPACK_ENABLE_NETWORK === `0`) throw new UsageError(`Network access disabled by the environment; can't reach ${input}`); const agent = await getProxyAgent(input); + if (typeof input === `string`) + input = new URL(input); + let headers = init?.headers; + const username = input.username ?? process.env.COREPACK_NPM_USERNAME; + const password = input.password ?? process.env.COREPACK_NPM_PASSWORD; + if (username || password) { + headers = { + ...headers, + authorization: `Basic ${Buffer.from(`${username}:${password}`).toString(`base64`)}` + }; + input.username = input.password = ``; + } + if (input.origin === (process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL) && process.env.COREPACK_NPM_TOKEN) { + headers = { + ...headers, + authorization: `Bearer ${process.env.COREPACK_NPM_TOKEN}` + }; + } let response; try { response = await globalThis.fetch(input, { ...init, - dispatcher: agent + dispatcher: agent, + headers }); } catch (error) { throw new Error( @@ -22898,17 +22778,15 @@ async function fetchAsJson(input, init) { } async function fetchUrlStream(input, init) { if (process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT === `1`) { - console.error(`Corepack is about to download ${input}.`); + console.error(`! Corepack is about to download ${input}`); if (import_process2.stdin.isTTY && !process.env.CI) { - import_process2.stderr.write(` -Do you want to continue? [Y/n] `); + import_process2.stderr.write(`? Do you want to continue? [Y/n] `); import_process2.stdin.resume(); const chars = await (0, import_events.once)(import_process2.stdin, `data`); import_process2.stdin.pause(); - if (chars[0][0] === 110 || // n - chars[0][0] === 78) { + if (chars[0][0] === 110 || chars[0][0] === 78) throw new UsageError(`Aborted by the user`); - } + console.error(); } } const response = await fetch(input, init); @@ -22917,48 +22795,25 @@ Do you want to continue? [Y/n] `); const stream = import_stream.Readable.fromWeb(webStream); return stream; } +var ProxyAgent; async function getProxyAgent(input) { const { getProxyForUrl } = await Promise.resolve().then(() => __toESM(require_proxy_from_env())); const proxy = getProxyForUrl(input); if (!proxy) return void 0; - const { default: ProxyAgent } = await Promise.resolve().then(() => __toESM(require_proxy_agent())); - return new ProxyAgent(proxy); -} - -// sources/npmRegistryUtils.ts -var DEFAULT_HEADERS = { - [`Accept`]: `application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8` -}; -var DEFAULT_NPM_REGISTRY_URL = `https://registry.npmjs.org`; -async function fetchAsJson2(packageName) { - const npmRegistryUrl = process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL; - if (process.env.COREPACK_ENABLE_NETWORK === `0`) - throw new UsageError(`Network access disabled by the environment; can't reach npm repository ${npmRegistryUrl}`); - const headers = { ...DEFAULT_HEADERS }; - if (`COREPACK_NPM_TOKEN` in process.env) { - headers.authorization = `Bearer ${process.env.COREPACK_NPM_TOKEN}`; - } else if (`COREPACK_NPM_USERNAME` in process.env && `COREPACK_NPM_PASSWORD` in process.env) { - const encodedCreds = Buffer.from(`${process.env.COREPACK_NPM_USERNAME}:${process.env.COREPACK_NPM_PASSWORD}`, `utf8`).toString(`base64`); - headers.authorization = `Basic ${encodedCreds}`; + if (ProxyAgent == null) { + const [api, Dispatcher, _ProxyAgent] = await Promise.all([ + // @ts-expect-error internal module is untyped + Promise.resolve().then(() => __toESM(require_api())), + // @ts-expect-error internal module is untyped + Promise.resolve().then(() => __toESM(require_dispatcher())), + // @ts-expect-error internal module is untyped + Promise.resolve().then(() => __toESM(require_proxy_agent())) + ]); + Object.assign(Dispatcher.default.prototype, api.default); + ProxyAgent = _ProxyAgent.default; } - return fetchAsJson(`${npmRegistryUrl}/${packageName}`, { headers }); -} -async function fetchLatestStableVersion(packageName) { - const metadata = await fetchAsJson2(packageName); - const { latest } = metadata[`dist-tags`]; - if (latest === void 0) - throw new Error(`${packageName} does not have a "latest" tag.`); - const { shasum } = metadata.versions[latest].dist; - return `${latest}+sha1.${shasum}`; -} -async function fetchAvailableTags(packageName) { - const metadata = await fetchAsJson2(packageName); - return metadata[`dist-tags`]; -} -async function fetchAvailableVersions(packageName) { - const metadata = await fetchAsJson2(packageName); - return Object.keys(metadata.versions); + return new ProxyAgent(proxy); } // sources/corepackUtils.ts @@ -23049,6 +22904,57 @@ function parseURLReference(locator) { } return { version: encodeURIComponent(href), build: [] }; } +function isValidBinList(x) { + return Array.isArray(x) && x.length > 0; +} +function isValidBinSpec(x) { + return typeof x === `object` && x !== null && !Array.isArray(x) && Object.keys(x).length > 0; +} +async function download(installTarget, url, algo, binPath = null) { + const tmpFolder = getTemporaryFolder(installTarget); + log(`Downloading to ${tmpFolder}`); + const stream = await fetchUrlStream(url); + const parsedUrl = new URL(url); + const ext = import_path2.default.posix.extname(parsedUrl.pathname); + let outputFile = null; + let sendTo; + if (ext === `.tgz`) { + const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar())); + sendTo = tar.x({ + strip: 1, + cwd: tmpFolder, + filter: binPath ? (path10) => { + const pos = path10.indexOf(`/`); + return pos !== -1 && path10.slice(pos + 1) === binPath; + } : void 0 + }); + } else if (ext === `.js`) { + outputFile = import_path2.default.join(tmpFolder, import_path2.default.posix.basename(parsedUrl.pathname)); + sendTo = import_fs2.default.createWriteStream(outputFile); + } + stream.pipe(sendTo); + let hash = !binPath ? stream.pipe((0, import_crypto2.createHash)(algo)) : null; + await (0, import_events2.once)(sendTo, `finish`); + if (binPath) { + const downloadedBin = import_path2.default.join(tmpFolder, binPath); + outputFile = import_path2.default.join(tmpFolder, import_path2.default.basename(downloadedBin)); + try { + await renameSafe(downloadedBin, outputFile); + } catch (err) { + if (err?.code === `ENOENT`) + throw new Error(`Cannot locate '${binPath}' in downloaded tarball`, { cause: err }); + throw err; + } + const fileStream = import_fs2.default.createReadStream(outputFile); + hash = fileStream.pipe((0, import_crypto2.createHash)(algo)); + await (0, import_events2.once)(fileStream, `close`); + } + return { + tmpFolder, + outputFile, + hash: hash.digest(`hex`) + }; +} async function installVersion(installTarget, locator, { spec }) { const locatorIsASupportedPackageManager = isSupportedPackageManagerLocator(locator); const locatorReference = locatorIsASupportedPackageManager ? import_semver.default.parse(locator.reference) : parseURLReference(locator); @@ -23070,42 +22976,68 @@ async function installVersion(installTarget, locator, { spec }) { } } let url; + let signatures; + let integrity; + let binPath = null; if (locatorIsASupportedPackageManager) { - const defaultNpmRegistryURL = spec.url.replace(`{}`, version2); - url = process.env.COREPACK_NPM_REGISTRY ? defaultNpmRegistryURL.replace( - DEFAULT_NPM_REGISTRY_URL, - () => process.env.COREPACK_NPM_REGISTRY - ) : defaultNpmRegistryURL; + url = spec.url.replace(`{}`, version2); + if (process.env.COREPACK_NPM_REGISTRY) { + const registry = getRegistryFromPackageManagerSpec(spec); + if (registry.type === `npm`) { + ({ tarball: url, signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2)); + if (registry.bin) { + binPath = registry.bin; + } + } else { + url = url.replace( + DEFAULT_NPM_REGISTRY_URL, + () => process.env.COREPACK_NPM_REGISTRY + ); + } + } } else { url = decodeURIComponent(version2); + if (process.env.COREPACK_NPM_REGISTRY && url.startsWith(DEFAULT_NPM_REGISTRY_URL)) { + url = url.replace( + DEFAULT_NPM_REGISTRY_URL, + () => process.env.COREPACK_NPM_REGISTRY + ); + } } - const tmpFolder = getTemporaryFolder(installTarget); - log(`Installing ${locator.name}@${version2} from ${url} to ${tmpFolder}`); - const stream = await fetchUrlStream(url); - const parsedUrl = new URL(url); - const ext = import_path2.default.posix.extname(parsedUrl.pathname); - let outputFile = null; - let sendTo; - if (ext === `.tgz`) { - const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar())); - sendTo = tar.x({ strip: 1, cwd: tmpFolder }); - } else if (ext === `.js`) { - outputFile = import_path2.default.join(tmpFolder, import_path2.default.posix.basename(parsedUrl.pathname)); - sendTo = import_fs2.default.createWriteStream(outputFile); - } - stream.pipe(sendTo); - const algo = build[0] ?? `sha256`; - const hash = stream.pipe((0, import_crypto.createHash)(algo)); - await (0, import_events2.once)(sendTo, `finish`); + log(`Installing ${locator.name}@${version2} from ${url}`); + const algo = build[0] ?? `sha512`; + const { tmpFolder, outputFile, hash: actualHash } = await download(installTarget, url, algo, binPath); let bin; - if (!locatorIsASupportedPackageManager) { - if (ext === `.tgz`) { - bin = require(import_path2.default.join(tmpFolder, `package.json`)).bin; - } else if (ext === `.js`) { + const isSingleFile = outputFile !== null; + if (isSingleFile) { + if (locatorIsASupportedPackageManager && isValidBinList(spec.bin)) { + bin = spec.bin; + } else { bin = [locator.name]; } + } else { + if (locatorIsASupportedPackageManager && isValidBinSpec(spec.bin)) { + bin = spec.bin; + } else { + const { name: packageName, bin: packageBin } = require(import_path2.default.join(tmpFolder, `package.json`)); + if (typeof packageBin === `string`) { + bin = { [packageName]: packageBin }; + } else if (isValidBinSpec(packageBin)) { + bin = packageBin; + } else { + throw new Error(`Unable to locate bin in package.json`); + } + } + } + if (!build[1]) { + const registry = getRegistryFromPackageManagerSpec(spec); + if (registry.type === `npm` && !registry.bin && process.env.COREPACK_INTEGRITY_KEYS !== ``) { + if (signatures == null || integrity == null) + ({ signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2)); + verifySignature({ signatures, integrity, packageName: registry.package, version: version2 }); + build[1] = Buffer.from(integrity.slice(`sha512-`.length), `base64`).toString(`hex`); + } } - const actualHash = hash.digest(`hex`); if (build[1] && actualHash !== build[1]) throw new Error(`Mismatch hashes. Expected ${build[1]}, got ${actualHash}`); const serializedHash = `${algo}.${actualHash}`; @@ -23116,35 +23048,29 @@ async function installVersion(installTarget, locator, { spec }) { })); await import_fs2.default.promises.mkdir(import_path2.default.dirname(installFolder), { recursive: true }); try { - await import_fs2.default.promises.rename(tmpFolder, installFolder); + if (process.platform === `win32`) { + await renameUnderWindows(tmpFolder, installFolder); + } else { + await import_fs2.default.promises.rename(tmpFolder, installFolder); + } } catch (err) { if (err.code === `ENOTEMPTY` || // On Windows the error code is EPERM so we check if it is a directory err.code === `EPERM` && (await import_fs2.default.promises.stat(installFolder)).isDirectory()) { log(`Another instance of corepack installed ${locator.name}@${locator.reference}`); - await rimraf(tmpFolder); + await import_fs2.default.promises.rm(tmpFolder, { recursive: true, force: true }); } else { throw err; } } if (locatorIsASupportedPackageManager && process.env.COREPACK_DEFAULT_TO_LATEST !== `0`) { - let lastKnownGoodFile; - try { - lastKnownGoodFile = await getLastKnownGoodFile(`r+`); - const lastKnownGood = await getJSONFileContent(lastKnownGoodFile); - const defaultVersion = getLastKnownGoodFromFileContent(lastKnownGood, locator.name); - if (defaultVersion) { - const currentDefault = import_semver.default.parse(defaultVersion); - const downloadedVersion = locatorReference; - if (currentDefault.major === downloadedVersion.major && import_semver.default.lt(currentDefault, downloadedVersion)) { - await activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, locator); - } - } - } catch (err) { - if (err?.code !== `ENOENT`) { - throw err; + const lastKnownGood = await getLastKnownGood(); + const defaultVersion = getLastKnownGoodFromFileContent(lastKnownGood, locator.name); + if (defaultVersion) { + const currentDefault = import_semver.default.parse(defaultVersion); + const downloadedVersion = locatorReference; + if (currentDefault.major === downloadedVersion.major && import_semver.default.lt(currentDefault, downloadedVersion)) { + await activatePackageManager(lastKnownGood, locator); } - } finally { - await lastKnownGoodFile?.close(); } } log(`Install finished`); @@ -23154,10 +23080,34 @@ async function installVersion(installTarget, locator, { spec }) { hash: serializedHash }; } +async function renameSafe(oldPath, newPath) { + if (process.platform === `win32`) { + await renameUnderWindows(oldPath, newPath); + } else { + await import_fs2.default.promises.rename(oldPath, newPath); + } +} +async function renameUnderWindows(oldPath, newPath) { + const retries = 5; + for (let i = 0; i < retries; i++) { + try { + await import_fs2.default.promises.rename(oldPath, newPath); + break; + } catch (err) { + if ((err.code === `ENOENT` || err.code === `EPERM`) && i < retries - 1) { + await (0, import_promises.setTimeout)(100 * 2 ** i); + continue; + } else { + throw err; + } + } + } +} async function runVersion(locator, installSpec, binName, args) { let binPath = null; - if (Array.isArray(installSpec.spec.bin)) { - if (installSpec.spec.bin.some((bin) => bin === binName)) { + const bin = installSpec.bin ?? installSpec.spec.bin; + if (Array.isArray(bin)) { + if (bin.some((name) => name === binName)) { const parsedUrl = new URL(installSpec.spec.url); const ext = import_path2.default.posix.extname(parsedUrl.pathname); if (ext === `.js`) { @@ -23165,7 +23115,7 @@ async function runVersion(locator, installSpec, binName, args) { } } } else { - for (const [name, dest] of Object.entries(installSpec.spec.bin)) { + for (const [name, dest] of Object.entries(bin)) { if (name === binName) { binPath = import_path2.default.join(installSpec.location, dest); break; @@ -23204,74 +23154,214 @@ function satisfiesWithPrereleases(version2, range, loose = false) { if (semverVersion.prerelease) { semverVersion.prerelease = []; } - } catch (err) { - return false; + } catch (err) { + return false; + } + return semverRange.set.some((comparatorSet) => { + for (const comparator of comparatorSet) + if (comparator.semver.prerelease) + comparator.semver.prerelease = []; + return comparatorSet.every((comparator) => { + return comparator.test(semverVersion); + }); + }); +} + +// sources/specUtils.ts +var import_fs3 = __toESM(require("fs")); +var import_path3 = __toESM(require("path")); +var import_semver3 = __toESM(require_semver2()); + +// sources/nodeUtils.ts +var import_os2 = __toESM(require("os")); +function getEndOfLine(content) { + const matches = content.match(/\r?\n/g); + if (matches === null) + return import_os2.default.EOL; + const crlf = matches.filter((nl) => nl === `\r +`).length; + const lf = matches.length - crlf; + return crlf > lf ? `\r +` : ` +`; +} +function normalizeLineEndings(originalContent, newContent) { + return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); +} +function getIndent(content) { + const indentMatch = content.match(/^[ \t]+/m); + if (indentMatch) { + return indentMatch[0]; + } else { + return ` `; + } +} +function stripBOM(content) { + if (content.charCodeAt(0) === 65279) { + return content.slice(1); + } else { + return content; + } +} +function readPackageJson(content) { + return { + data: JSON.parse(stripBOM(content) || `{}`), + indent: getIndent(content) + }; +} + +// sources/types.ts +var SupportedPackageManagers = /* @__PURE__ */ ((SupportedPackageManagers3) => { + SupportedPackageManagers3["Npm"] = `npm`; + SupportedPackageManagers3["Pnpm"] = `pnpm`; + SupportedPackageManagers3["Yarn"] = `yarn`; + return SupportedPackageManagers3; +})(SupportedPackageManagers || {}); +var SupportedPackageManagerSet = new Set( + Object.values(SupportedPackageManagers) +); +var SupportedPackageManagerSetWithoutNpm = new Set( + Object.values(SupportedPackageManagers) +); +SupportedPackageManagerSetWithoutNpm.delete("npm" /* Npm */); +function isSupportedPackageManager(value) { + return SupportedPackageManagerSet.has(value); +} + +// sources/specUtils.ts +var nodeModulesRegExp = /[\\/]node_modules[\\/](@[^\\/]*[\\/])?([^@\\/][^\\/]*)$/; +function parseSpec(raw, source, { enforceExactVersion = true } = {}) { + if (typeof raw !== `string`) + throw new UsageError(`Invalid package manager specification in ${source}; expected a string`); + const atIndex = raw.indexOf(`@`); + if (atIndex === -1 || atIndex === raw.length - 1) { + if (enforceExactVersion) + throw new UsageError(`No version specified for ${raw} in "packageManager" of ${source}`); + const name2 = atIndex === -1 ? raw : raw.slice(0, -1); + if (!isSupportedPackageManager(name2)) + throw new UsageError(`Unsupported package manager specification (${name2})`); + return { + name: name2, + range: `*` + }; + } + const name = raw.slice(0, atIndex); + const range = raw.slice(atIndex + 1); + const isURL = URL.canParse(range); + if (!isURL) { + if (enforceExactVersion && !import_semver3.default.valid(range)) + throw new UsageError(`Invalid package manager specification in ${source} (${raw}); expected a semver version${enforceExactVersion ? `` : `, range, or tag`}`); + if (!isSupportedPackageManager(name)) { + throw new UsageError(`Unsupported package manager specification (${raw})`); + } + } else if (isSupportedPackageManager(name) && process.env.COREPACK_ENABLE_UNSAFE_CUSTOM_URLS !== `1`) { + throw new UsageError(`Illegal use of URL for known package manager. Instead, select a specific version, or set COREPACK_ENABLE_UNSAFE_CUSTOM_URLS=1 in your environment (${raw})`); + } + return { + name, + range + }; +} +async function setLocalPackageManager(cwd, info) { + const lookup = await loadSpec(cwd); + const content = lookup.type !== `NoProject` ? await import_fs3.default.promises.readFile(lookup.target, `utf8`) : ``; + const { data, indent } = readPackageJson(content); + const previousPackageManager = data.packageManager ?? `unknown`; + data.packageManager = `${info.locator.name}@${info.locator.reference}`; + const newContent = normalizeLineEndings(content, `${JSON.stringify(data, null, indent)} +`); + await import_fs3.default.promises.writeFile(lookup.target, newContent, `utf8`); + return { + previousPackageManager + }; +} +async function loadSpec(initialCwd) { + let nextCwd = initialCwd; + let currCwd = ``; + let selection = null; + while (nextCwd !== currCwd && (!selection || !selection.data.packageManager)) { + currCwd = nextCwd; + nextCwd = import_path3.default.dirname(currCwd); + if (nodeModulesRegExp.test(currCwd)) + continue; + const manifestPath = import_path3.default.join(currCwd, `package.json`); + let content; + try { + content = await import_fs3.default.promises.readFile(manifestPath, `utf8`); + } catch (err) { + if (err?.code === `ENOENT`) + continue; + throw err; + } + let data; + try { + data = JSON.parse(content); + } catch { + } + if (typeof data !== `object` || data === null) + throw new UsageError(`Invalid package.json in ${import_path3.default.relative(initialCwd, manifestPath)}`); + selection = { data, manifestPath }; } - return semverRange.set.some((comparatorSet) => { - for (const comparator of comparatorSet) - if (comparator.semver.prerelease) - comparator.semver.prerelease = []; - return comparatorSet.every((comparator) => { - return comparator.test(semverVersion); - }); - }); -} - -// sources/types.ts -var SupportedPackageManagers = /* @__PURE__ */ ((SupportedPackageManagers3) => { - SupportedPackageManagers3["Npm"] = `npm`; - SupportedPackageManagers3["Pnpm"] = `pnpm`; - SupportedPackageManagers3["Yarn"] = `yarn`; - return SupportedPackageManagers3; -})(SupportedPackageManagers || {}); -var SupportedPackageManagerSet = new Set( - Object.values(SupportedPackageManagers) -); -var SupportedPackageManagerSetWithoutNpm = new Set( - Object.values(SupportedPackageManagers) -); -SupportedPackageManagerSetWithoutNpm.delete("npm" /* Npm */); -function isSupportedPackageManager(value) { - return SupportedPackageManagerSet.has(value); + if (selection === null) + return { type: `NoProject`, target: import_path3.default.join(initialCwd, `package.json`) }; + const rawPmSpec = selection.data.packageManager; + if (typeof rawPmSpec === `undefined`) + return { type: `NoSpec`, target: selection.manifestPath }; + return { + type: `Found`, + target: selection.manifestPath, + spec: parseSpec(rawPmSpec, import_path3.default.relative(initialCwd, selection.manifestPath)) + }; } // sources/Engine.ts -function getLastKnownGoodFile(flag = `r`) { - return import_fs3.default.promises.open(import_path3.default.join(getCorepackHomeFolder(), `lastKnownGood.json`), flag); +function getLastKnownGoodFilePath() { + return import_path4.default.join(getCorepackHomeFolder(), `lastKnownGood.json`); } -async function createLastKnownGoodFile() { - await import_fs3.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true }); - return getLastKnownGoodFile(`w`); -} -async function getJSONFileContent(fh) { - let lastKnownGood; +async function getLastKnownGood() { + let raw; + try { + raw = await import_fs4.default.promises.readFile(getLastKnownGoodFilePath(), `utf8`); + } catch (err) { + if (err?.code === `ENOENT`) + return {}; + throw err; + } try { - lastKnownGood = JSON.parse(await fh.readFile(`utf8`)); + const parsed = JSON.parse(raw); + if (!parsed) + return {}; + if (typeof parsed !== `object`) + return {}; + Object.entries(parsed).forEach(([key, value]) => { + if (typeof value !== `string`) { + delete parsed[key]; + } + }); + return parsed; } catch { - return void 0; + return {}; } - return lastKnownGood; } -async function overwriteJSONFileContent(fh, content) { - await fh.truncate(0); - await fh.write(`${JSON.stringify(content, null, 2)} -`, 0); +async function createLastKnownGoodFile(lastKnownGood) { + const content = `${JSON.stringify(lastKnownGood, null, 2)} +`; + await import_fs4.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true }); + await import_fs4.default.promises.writeFile(getLastKnownGoodFilePath(), content, `utf8`); } function getLastKnownGoodFromFileContent(lastKnownGood, packageManager) { - if (typeof lastKnownGood === `object` && lastKnownGood !== null && Object.hasOwn(lastKnownGood, packageManager)) { - const override = lastKnownGood[packageManager]; - if (typeof override === `string`) { - return override; - } - } + if (Object.hasOwn(lastKnownGood, packageManager)) + return lastKnownGood[packageManager]; return void 0; } -async function activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, locator) { - if (typeof lastKnownGood !== `object` || lastKnownGood === null) - lastKnownGood = {}; +async function activatePackageManager(lastKnownGood, locator) { + if (lastKnownGood[locator.name] === locator.reference) { + log(`${locator.name}@${locator.reference} is already Last Known Good version`); + return; + } lastKnownGood[locator.name] = locator.reference; log(`Setting ${locator.name}@${locator.reference} as Last Known Good version`); - await overwriteJSONFileContent(lastKnownGoodFile, lastKnownGood); + await createLastKnownGoodFile(lastKnownGood); } var Engine = class { constructor(config = config_default) { @@ -23334,60 +23424,126 @@ var Engine = class { const definition = this.config.definitions[packageManager]; if (typeof definition === `undefined`) throw new UsageError(`This package manager (${packageManager}) isn't supported by this corepack build`); - let lastKnownGoodFile = await getLastKnownGoodFile(`r+`).catch((err) => { - if (err?.code !== `ENOENT`) { - throw err; - } - }); + const lastKnownGood = await getLastKnownGood(); + const lastKnownGoodForThisPackageManager = getLastKnownGoodFromFileContent(lastKnownGood, packageManager); + if (lastKnownGoodForThisPackageManager) + return lastKnownGoodForThisPackageManager; + if (import_process3.default.env.COREPACK_DEFAULT_TO_LATEST === `0`) + return definition.default; + const reference = await fetchLatestStableVersion2(definition.fetchLatestFrom); try { - const lastKnownGood = lastKnownGoodFile == null || await getJSONFileContent(lastKnownGoodFile); - const lastKnownGoodForThisPackageManager = getLastKnownGoodFromFileContent(lastKnownGood, packageManager); - if (lastKnownGoodForThisPackageManager) - return lastKnownGoodForThisPackageManager; - if (import_process3.default.env.COREPACK_DEFAULT_TO_LATEST === `0`) - return definition.default; - const reference = await fetchLatestStableVersion2(definition.fetchLatestFrom); - try { - lastKnownGoodFile ??= await createLastKnownGoodFile(); - await activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, { - name: packageManager, - reference - }); - } catch { - } - return reference; - } finally { - await lastKnownGoodFile?.close(); + await activatePackageManager(lastKnownGood, { + name: packageManager, + reference + }); + } catch { } + return reference; } async activatePackageManager(locator) { - let emptyFile = false; - const lastKnownGoodFile = await getLastKnownGoodFile(`r+`).catch((err) => { - if (err?.code === `ENOENT`) { - emptyFile = true; - return getLastKnownGoodFile(`w`); - } - throw err; - }); - try { - await activatePackageManagerFromFileHandle(lastKnownGoodFile, emptyFile || await getJSONFileContent(lastKnownGoodFile), locator); - } finally { - await lastKnownGoodFile.close(); - } + const lastKnownGood = await getLastKnownGood(); + await activatePackageManager(lastKnownGood, locator); } async ensurePackageManager(locator) { const spec = this.getPackageManagerSpecFor(locator); const packageManagerInfo = await installVersion(getInstallFolder(), locator, { spec }); - spec.bin ??= packageManagerInfo.bin; + const noHashReference = locator.reference.replace(/\+.*/, ``); + const fixedHashReference = `${noHashReference}+${packageManagerInfo.hash}`; + const fixedHashLocator = { + name: locator.name, + reference: fixedHashReference + }; return { ...packageManagerInfo, - locator, + locator: fixedHashLocator, spec }; } - async fetchAvailableVersions() { + /** + * Locates the active project's package manager specification. + * + * If the specification exists but doesn't match the active package manager, + * an error is thrown to prevent users from using the wrong package manager, + * which would lead to inconsistent project layouts. + * + * If the project doesn't include a specification file, we just assume that + * whatever the user uses is exactly what they want to use. Since the version + * isn't explicited, we fallback on known good versions. + * + * Finally, if the project doesn't exist at all, we ask the user whether they + * want to create one in the current project. If they do, we initialize a new + * project using the default package managers, and configure it so that we + * don't need to ask again in the future. + */ + async findProjectSpec(initialCwd, locator, { transparent = false } = {}) { + const fallbackDescriptor = { name: locator.name, range: `${locator.reference}` }; + if (import_process3.default.env.COREPACK_ENABLE_PROJECT_SPEC === `0`) + return fallbackDescriptor; + if (import_process3.default.env.COREPACK_ENABLE_STRICT === `0`) + transparent = true; + while (true) { + const result = await loadSpec(initialCwd); + switch (result.type) { + case `NoProject`: + return fallbackDescriptor; + case `NoSpec`: { + if (import_process3.default.env.COREPACK_ENABLE_AUTO_PIN !== `0`) { + const resolved = await this.resolveDescriptor(fallbackDescriptor, { allowTags: true }); + if (resolved === null) + throw new UsageError(`Failed to successfully resolve '${fallbackDescriptor.range}' to a valid ${fallbackDescriptor.name} release`); + const installSpec = await this.ensurePackageManager(resolved); + console.error(`! The local project doesn't define a 'packageManager' field. Corepack will now add one referencing ${installSpec.locator.name}@${installSpec.locator.reference}.`); + console.error(`! For more details about this field, consult the documentation at https://nodejs.org/api/packages.html#packagemanager`); + console.error(); + await setLocalPackageManager(import_path4.default.dirname(result.target), installSpec); + } + return fallbackDescriptor; + } + case `Found`: { + if (result.spec.name !== locator.name) { + if (transparent) { + return fallbackDescriptor; + } else { + throw new UsageError(`This project is configured to use ${result.spec.name} because ${result.target} has a "packageManager" field`); + } + } else { + return result.spec; + } + } + } + } + } + async executePackageManagerRequest({ packageManager, binaryName, binaryVersion }, { cwd, args }) { + let fallbackLocator = { + name: binaryName, + reference: void 0 + }; + let isTransparentCommand = false; + if (packageManager != null) { + const defaultVersion = binaryVersion || await this.getDefaultVersion(packageManager); + const definition = this.config.definitions[packageManager]; + for (const transparentPath of definition.transparent.commands) { + if (transparentPath[0] === binaryName && transparentPath.slice(1).every((segment, index) => segment === args[index])) { + isTransparentCommand = true; + break; + } + } + const fallbackReference = isTransparentCommand ? definition.transparent.default ?? defaultVersion : defaultVersion; + fallbackLocator = { + name: packageManager, + reference: fallbackReference + }; + } + const descriptor = await this.findProjectSpec(cwd, fallbackLocator, { transparent: isTransparentCommand }); + if (binaryVersion) + descriptor.range = binaryVersion; + const resolved = await this.resolveDescriptor(descriptor, { allowTags: true }); + if (resolved === null) + throw new UsageError(`Failed to successfully resolve '${descriptor.range}' to a valid ${descriptor.name} release`); + const installSpec = await this.ensurePackageManager(resolved); + return await runVersion(resolved, installSpec, binaryName, args); } async resolveDescriptor(descriptor, { allowTags = false, useCache = true } = {}) { if (!isSupportedPackageManagerDescriptor(descriptor)) { @@ -23402,7 +23558,7 @@ var Engine = class { if (typeof definition === `undefined`) throw new UsageError(`This package manager (${descriptor.name}) isn't supported by this corepack build`); let finalDescriptor = descriptor; - if (!import_semver3.default.valid(descriptor.range) && !import_semver3.default.validRange(descriptor.range)) { + if (!import_semver4.default.valid(descriptor.range) && !import_semver4.default.validRange(descriptor.range)) { if (!allowTags) throw new UsageError(`Packages managers can't be referenced via tags in this context`); const ranges = Object.keys(definition.ranges); @@ -23420,7 +23576,7 @@ var Engine = class { const cachedVersion = await findInstalledVersion(getInstallFolder(), finalDescriptor); if (cachedVersion !== null && useCache) return { name: finalDescriptor.name, reference: cachedVersion }; - if (import_semver3.default.valid(finalDescriptor.range)) + if (import_semver4.default.valid(finalDescriptor.range)) return { name: finalDescriptor.name, reference: finalDescriptor.range }; const versions = await Promise.all(Object.keys(definition.ranges).map(async (range) => { const packageManagerSpec = definition.ranges[range]; @@ -23428,7 +23584,7 @@ var Engine = class { const versions2 = await fetchAvailableVersions2(registry); return versions2.filter((version2) => satisfiesWithPrereleases(version2, finalDescriptor.range)); })); - const highestVersion = [...new Set(versions.flat())].sort(import_semver3.default.rcompare); + const highestVersion = [...new Set(versions.flat())].sort(import_semver4.default.rcompare); if (highestVersion.length === 0) return null; return { name: finalDescriptor.name, reference: highestVersion[0] }; @@ -23436,7 +23592,7 @@ var Engine = class { }; // sources/commands/Cache.ts -var import_fs4 = __toESM(require("fs")); +var import_fs5 = __toESM(require("fs")); var CacheCommand = class extends Command { static paths = [ [`cache`, `clean`], @@ -23449,13 +23605,13 @@ var CacheCommand = class extends Command { ` }); async execute() { - await import_fs4.default.promises.rm(getInstallFolder(), { recursive: true, force: true }); + await import_fs5.default.promises.rm(getInstallFolder(), { recursive: true, force: true }); } }; // sources/commands/Disable.ts -var import_fs5 = __toESM(require("fs")); -var import_path4 = __toESM(require("path")); +var import_fs6 = __toESM(require("fs")); +var import_path5 = __toESM(require("path")); var import_which = __toESM(require_lib()); var DisableCommand = class extends Command { static paths = [ @@ -23486,7 +23642,7 @@ var DisableCommand = class extends Command { async execute() { let installDirectory = this.installDirectory; if (typeof installDirectory === `undefined`) - installDirectory = import_path4.default.dirname(await (0, import_which.default)(`corepack`)); + installDirectory = import_path5.default.dirname(await (0, import_which.default)(`corepack`)); const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names; for (const name of new Set(names)) { if (!isSupportedPackageManager(name)) @@ -23501,9 +23657,9 @@ var DisableCommand = class extends Command { } } async removePosixLink(installDirectory, binName) { - const file = import_path4.default.join(installDirectory, binName); + const file = import_path5.default.join(installDirectory, binName); try { - await import_fs5.default.promises.unlink(file); + await import_fs6.default.promises.unlink(file); } catch (err) { if (err.code !== `ENOENT`) { throw err; @@ -23512,9 +23668,9 @@ var DisableCommand = class extends Command { } async removeWin32Link(installDirectory, binName) { for (const ext of [``, `.ps1`, `.cmd`]) { - const file = import_path4.default.join(installDirectory, `${binName}${ext}`); + const file = import_path5.default.join(installDirectory, `${binName}${ext}`); try { - await import_fs5.default.promises.unlink(file); + await import_fs6.default.promises.unlink(file); } catch (err) { if (err.code !== `ENOENT`) { throw err; @@ -23526,8 +23682,8 @@ var DisableCommand = class extends Command { // sources/commands/Enable.ts var import_cmd_shim = __toESM(require_cmd_shim()); -var import_fs6 = __toESM(require("fs")); -var import_path5 = __toESM(require("path")); +var import_fs7 = __toESM(require("fs")); +var import_path6 = __toESM(require("path")); var import_which2 = __toESM(require_lib()); var EnableCommand = class extends Command { static paths = [ @@ -23558,11 +23714,11 @@ var EnableCommand = class extends Command { async execute() { let installDirectory = this.installDirectory; if (typeof installDirectory === `undefined`) - installDirectory = import_path5.default.dirname(await (0, import_which2.default)(`corepack`)); - installDirectory = import_fs6.default.realpathSync(installDirectory); + installDirectory = import_path6.default.dirname(await (0, import_which2.default)(`corepack`)); + installDirectory = import_fs7.default.realpathSync(installDirectory); const manifestPath = require.resolve("corepack/package.json"); - const distFolder = import_path5.default.join(import_path5.default.dirname(manifestPath), `dist`); - if (!import_fs6.default.existsSync(distFolder)) + const distFolder = import_path6.default.join(import_path6.default.dirname(manifestPath), `dist`); + if (!import_fs7.default.existsSync(distFolder)) throw new Error(`Assertion failed: The stub folder doesn't exist`); const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names; for (const name of new Set(names)) { @@ -23578,173 +23734,29 @@ var EnableCommand = class extends Command { } } async generatePosixLink(installDirectory, distFolder, binName) { - const file = import_path5.default.join(installDirectory, binName); - const symlink = import_path5.default.relative(installDirectory, import_path5.default.join(distFolder, `${binName}.js`)); - if (import_fs6.default.existsSync(file)) { - const currentSymlink = await import_fs6.default.promises.readlink(file); + const file = import_path6.default.join(installDirectory, binName); + const symlink = import_path6.default.relative(installDirectory, import_path6.default.join(distFolder, `${binName}.js`)); + if (import_fs7.default.existsSync(file)) { + const currentSymlink = await import_fs7.default.promises.readlink(file); if (currentSymlink !== symlink) { - await import_fs6.default.promises.unlink(file); + await import_fs7.default.promises.unlink(file); } else { return; } } - await import_fs6.default.promises.symlink(symlink, file); + await import_fs7.default.promises.symlink(symlink, file); } async generateWin32Link(installDirectory, distFolder, binName) { - const file = import_path5.default.join(installDirectory, binName); - await (0, import_cmd_shim.default)(import_path5.default.join(distFolder, `${binName}.js`), file, { + const file = import_path6.default.join(installDirectory, binName); + await (0, import_cmd_shim.default)(import_path6.default.join(distFolder, `${binName}.js`), file, { createCmdFile: true }); } }; // sources/commands/InstallGlobal.ts -var import_fs9 = __toESM(require("fs")); -var import_path7 = __toESM(require("path")); - -// sources/specUtils.ts -var import_fs7 = __toESM(require("fs")); -var import_path6 = __toESM(require("path")); -var import_semver4 = __toESM(require_semver2()); -var nodeModulesRegExp = /[\\/]node_modules[\\/](@[^\\/]*[\\/])?([^@\\/][^\\/]*)$/; -function parseSpec(raw, source, { enforceExactVersion = true } = {}) { - if (typeof raw !== `string`) - throw new UsageError(`Invalid package manager specification in ${source}; expected a string`); - const atIndex = raw.indexOf(`@`); - if (atIndex === -1 || atIndex === raw.length - 1) { - if (enforceExactVersion) - throw new UsageError(`No version specified for ${raw} in "packageManager" of ${source}`); - const name2 = atIndex === -1 ? raw : raw.slice(0, -1); - if (!isSupportedPackageManager(name2)) - throw new UsageError(`Unsupported package manager specification (${name2})`); - return { - name: name2, - range: `*` - }; - } - const name = raw.slice(0, atIndex); - const range = raw.slice(atIndex + 1); - const isURL = URL.canParse(range); - if (!isURL) { - if (enforceExactVersion && !import_semver4.default.valid(range)) - throw new UsageError(`Invalid package manager specification in ${source} (${raw}); expected a semver version${enforceExactVersion ? `` : `, range, or tag`}`); - if (!isSupportedPackageManager(name)) { - throw new UsageError(`Unsupported package manager specification (${raw})`); - } - } else if (isSupportedPackageManager(name) && process.env.COREPACK_ENABLE_UNSAFE_CUSTOM_URLS !== `1`) { - throw new UsageError(`Illegal use of URL for known package manager. Instead, select a specific version, or set COREPACK_ENABLE_UNSAFE_CUSTOM_URLS=1 in your environment (${raw})`); - } - return { - name, - range - }; -} -async function findProjectSpec(initialCwd, locator, { transparent = false } = {}) { - const fallbackLocator = { name: locator.name, range: `${locator.reference}` }; - if (process.env.COREPACK_ENABLE_PROJECT_SPEC === `0`) - return fallbackLocator; - if (process.env.COREPACK_ENABLE_STRICT === `0`) - transparent = true; - while (true) { - const result = await loadSpec(initialCwd); - switch (result.type) { - case `NoProject`: - case `NoSpec`: { - return fallbackLocator; - } - case `Found`: { - if (result.spec.name !== locator.name) { - if (transparent) { - return fallbackLocator; - } else { - throw new UsageError(`This project is configured to use ${result.spec.name}`); - } - } else { - return result.spec; - } - } - } - } -} -async function loadSpec(initialCwd) { - let nextCwd = initialCwd; - let currCwd = ``; - let selection = null; - while (nextCwd !== currCwd && (!selection || !selection.data.packageManager)) { - currCwd = nextCwd; - nextCwd = import_path6.default.dirname(currCwd); - if (nodeModulesRegExp.test(currCwd)) - continue; - const manifestPath = import_path6.default.join(currCwd, `package.json`); - let content; - try { - content = await import_fs7.default.promises.readFile(manifestPath, `utf8`); - } catch (err) { - if (err?.code === `ENOENT`) - continue; - throw err; - } - let data; - try { - data = JSON.parse(content); - } catch { - } - if (typeof data !== `object` || data === null) - throw new UsageError(`Invalid package.json in ${import_path6.default.relative(initialCwd, manifestPath)}`); - selection = { data, manifestPath }; - } - if (selection === null) - return { type: `NoProject`, target: import_path6.default.join(initialCwd, `package.json`) }; - const rawPmSpec = selection.data.packageManager; - if (typeof rawPmSpec === `undefined`) - return { type: `NoSpec`, target: selection.manifestPath }; - return { - type: `Found`, - target: selection.manifestPath, - spec: parseSpec(rawPmSpec, import_path6.default.relative(initialCwd, selection.manifestPath)) - }; -} - -// sources/commands/Base.ts var import_fs8 = __toESM(require("fs")); - -// sources/nodeUtils.ts -var import_os2 = __toESM(require("os")); -function getEndOfLine(content) { - const matches = content.match(/\r?\n/g); - if (matches === null) - return import_os2.default.EOL; - const crlf = matches.filter((nl) => nl === `\r -`).length; - const lf = matches.length - crlf; - return crlf > lf ? `\r -` : ` -`; -} -function normalizeLineEndings(originalContent, newContent) { - return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); -} -function getIndent(content) { - const indentMatch = content.match(/^[ \t]+/m); - if (indentMatch) { - return indentMatch[0]; - } else { - return ` `; - } -} -function stripBOM(content) { - if (content.charCodeAt(0) === 65279) { - return content.slice(1); - } else { - return content; - } -} -function readPackageJson(content) { - return { - data: JSON.parse(stripBOM(content) || `{}`), - indent: getIndent(content) - }; -} +var import_path7 = __toESM(require("path")); // sources/commands/Base.ts var BaseCommand = class extends Command { @@ -23764,15 +23776,10 @@ var BaseCommand = class extends Command { } return resolvedSpecs; } - async setLocalPackageManager(info) { - const lookup = await loadSpec(this.context.cwd); - const content = lookup.type !== `NoProject` ? await import_fs8.default.promises.readFile(lookup.target, `utf8`) : ``; - const { data, indent } = readPackageJson(content); - const previousPackageManager = data.packageManager ?? `unknown`; - data.packageManager = `${info.locator.name}@${info.locator.reference}+${info.hash}`; - const newContent = normalizeLineEndings(content, `${JSON.stringify(data, null, indent)} -`); - await import_fs8.default.promises.writeFile(lookup.target, newContent, `utf8`); + async setAndInstallLocalPackageManager(info) { + const { + previousPackageManager + } = await setLocalPackageManager(this.context.cwd, info); const command = this.context.engine.getPackageManagerSpecFor(info.locator).commands?.use ?? null; if (command === null) return 0; @@ -23866,7 +23873,7 @@ var InstallGlobalCommand = class extends BaseCommand { if (!isSupportedPackageManager(name)) throw new UsageError(`Unsupported package manager '${name}'`); this.log({ name, reference }); - await import_fs9.default.promises.mkdir(installFolder, { recursive: true }); + await import_fs8.default.promises.mkdir(installFolder, { recursive: true }); await tar.x({ file: p, cwd: installFolder }, [`${name}/${reference}`]); if (!this.cacheOnly) { await this.context.engine.activatePackageManager({ name, reference }); @@ -24009,7 +24016,7 @@ var UpCommand = class extends BaseCommand { this.context.stdout.write(`Installing ${highestVersion.name}@${highestVersion.reference} in the project... `); const packageManagerInfo = await this.context.engine.ensurePackageManager(highestVersion); - await this.setLocalPackageManager(packageManagerInfo); + await this.setAndInstallLocalPackageManager(packageManagerInfo); } }; @@ -24041,7 +24048,7 @@ var UseCommand = class extends BaseCommand { this.context.stdout.write(`Installing ${resolved.name}@${resolved.reference} in the project... `); const packageManagerInfo = await this.context.engine.ensurePackageManager(resolved); - await this.setLocalPackageManager(packageManagerInfo); + await this.setAndInstallLocalPackageManager(packageManagerInfo); } }; @@ -24173,22 +24180,15 @@ var PrepareCommand = class extends Command { } }; -// sources/miscUtils.ts -var Cancellation = class extends Error { - constructor() { - super(`Cancelled operation`); - } -}; - // sources/main.ts -function getPackageManagerRequestFromCli(parameter, context) { +function getPackageManagerRequestFromCli(parameter, engine) { if (!parameter) return null; const match = parameter.match(/^([^@]*)(?:@(.*))?$/); if (!match) return null; const [, binaryName, binaryVersion] = match; - const packageManager = context.engine.getPackageManagerFor(binaryName); + const packageManager = engine.getPackageManagerFor(binaryName); if (packageManager == null && binaryVersion == null) return null; return { @@ -24197,54 +24197,10 @@ function getPackageManagerRequestFromCli(parameter, context) { binaryVersion: binaryVersion || null }; } -async function executePackageManagerRequest({ packageManager, binaryName, binaryVersion }, args, context) { - let fallbackLocator = { - name: binaryName, - reference: void 0 - }; - let isTransparentCommand = false; - if (packageManager != null) { - const defaultVersion = await context.engine.getDefaultVersion(packageManager); - const definition = context.engine.config.definitions[packageManager]; - for (const transparentPath of definition.transparent.commands) { - if (transparentPath[0] === binaryName && transparentPath.slice(1).every((segment, index) => segment === args[index])) { - isTransparentCommand = true; - break; - } - } - const fallbackReference = isTransparentCommand ? definition.transparent.default ?? defaultVersion : defaultVersion; - fallbackLocator = { - name: packageManager, - reference: fallbackReference - }; - } - let descriptor; - try { - descriptor = await findProjectSpec(context.cwd, fallbackLocator, { transparent: isTransparentCommand }); - } catch (err) { - if (err instanceof Cancellation) { - return 1; - } else { - throw err; - } - } - if (binaryVersion) - descriptor.range = binaryVersion; - const resolved = await context.engine.resolveDescriptor(descriptor, { allowTags: true }); - if (resolved === null) - throw new UsageError(`Failed to successfully resolve '${descriptor.range}' to a valid ${descriptor.name} release`); - const installSpec = await context.engine.ensurePackageManager(resolved); - return await runVersion(resolved, installSpec, binaryName, args); -} async function runMain(argv) { - const context = { - ...Cli.defaultContext, - cwd: process.cwd(), - engine: new Engine() - }; + const engine = new Engine(); const [firstArg, ...restArgs] = argv; - const request = getPackageManagerRequestFromCli(firstArg, context); - let code; + const request = getPackageManagerRequestFromCli(firstArg, engine); if (!request) { const cli = new Cli({ binaryLabel: `Corepack`, @@ -24263,23 +24219,20 @@ async function runMain(argv) { cli.register(UseCommand); cli.register(HydrateCommand); cli.register(PrepareCommand); - code = await cli.run(argv, context); + const context = { + ...Cli.defaultContext, + cwd: process.cwd(), + engine + }; + const code = await cli.run(argv, context); + if (code !== 0) { + process.exitCode ??= code; + } } else { - const cli = new Cli({ - binaryLabel: `'${request.binaryName}', via Corepack`, - binaryName: request.binaryName, - binaryVersion: `corepack/${version}` - }); - cli.register(class BinaryCommand extends Command { - proxy = options_exports.Proxy(); - async execute() { - return executePackageManagerRequest(request, this.proxy, this.context); - } + await engine.executePackageManagerRequest(request, { + cwd: process.cwd(), + args: restArgs }); - code = await cli.run(restArgs, context); - } - if (code !== 0) { - process.exitCode ??= code; } } // Annotate the CommonJS export names for ESM import in node: @@ -24288,7 +24241,7 @@ async function runMain(argv) { }); /*! Bundled license information: -undici/lib/fetch/body.js: +undici/lib/web/fetch/body.js: (*! formdata-polyfill. MIT License. Jimmy Wärting *) is-windows/index.js: diff --git a/deps/corepack/package.json b/deps/corepack/package.json index 391eb749c82d65..5ca045e37041e0 100644 --- a/deps/corepack/package.json +++ b/deps/corepack/package.json @@ -1,6 +1,6 @@ { "name": "corepack", - "version": "0.25.2", + "version": "0.28.0", "homepage": "https://github.com/nodejs/corepack#readme", "bugs": { "url": "https://github.com/nodejs/corepack/issues" @@ -16,7 +16,7 @@ "./package.json": "./package.json" }, "license": "MIT", - "packageManager": "yarn@4.1.0+sha224.bc24d7f5afc738464f3d4e95f4e6e7829a35cee54a0fd527ea5baa83", + "packageManager": "yarn@4.1.1+sha224.00f08619463229f8ba40c4ee90e8c2e4ced1f11c3115c26f3b98432e", "devDependencies": { "@babel/core": "^7.14.3", "@babel/plugin-transform-modules-commonjs": "^7.14.0", @@ -35,6 +35,7 @@ "@yarnpkg/fslib": "^3.0.0-rc.48", "@zkochan/cmd-shim": "^6.0.0", "babel-plugin-dynamic-import-node": "^2.3.3", + "better-sqlite3": "^9.4.1", "clipanion": "^3.0.1", "debug": "^4.1.1", "esbuild": "0.19.5", @@ -44,13 +45,16 @@ "proxy-from-env": "^1.1.0", "semver": "^7.5.2", "supports-color": "^9.0.0", - "tar": "^6.0.1", + "tar": "^6.2.1", "ts-node": "^10.0.0", - "typescript": "^5.0.4", + "typescript": "^5.3.3", "undici": "^6.6.1", "v8-compile-cache": "^2.3.0", "which": "^4.0.0" }, + "resolutions": { + "undici-types": "6.x" + }, "scripts": { "build": "rm -rf dist shims && run build:bundle && ts-node ./mkshims.ts", "build:bundle": "esbuild ./sources/_lib.ts --bundle --platform=node --target=node18.17.0 --external:corepack --outfile='./dist/lib/corepack.cjs' --resolve-extensions='.ts,.mjs,.js'", diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index 9f54372febca06..d67e1c8c667be1 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -2,7 +2,7 @@ UNICODE LICENSE V3 COPYRIGHT AND PERMISSION NOTICE -Copyright © 2016-2023 Unicode, Inc. +Copyright © 2016-2024 Unicode, Inc. NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR @@ -38,6 +38,8 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. +SPDX-License-Identifier: Unicode-3.0 + ---------------------------------------------------------------------- Third-Party Software Licenses diff --git a/deps/icu-small/README-FULL-ICU.txt b/deps/icu-small/README-FULL-ICU.txt index 24c537d5b3adb0..0b0ba540be71aa 100644 --- a/deps/icu-small/README-FULL-ICU.txt +++ b/deps/icu-small/README-FULL-ICU.txt @@ -1,8 +1,8 @@ ICU sources - auto generated by shrink-icu-src.py This directory contains the ICU subset used by --with-intl=full-icu -It is a strict subset of ICU 74 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt74l.dat.bz2 : compressed data file +It is a strict subset of ICU 75 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt75l.dat.bz2 : compressed data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/source/common/brkeng.cpp b/deps/icu-small/source/common/brkeng.cpp index 3f58287532e780..e53a7b2ce4f584 100644 --- a/deps/icu-small/source/common/brkeng.cpp +++ b/deps/icu-small/source/common/brkeng.cpp @@ -114,13 +114,11 @@ UnhandledEngine::handleCharacter(UChar32 c) { */ ICULanguageBreakFactory::ICULanguageBreakFactory(UErrorCode &/*status*/) { - fEngines = 0; + fEngines = nullptr; } ICULanguageBreakFactory::~ICULanguageBreakFactory() { - if (fEngines != 0) { - delete fEngines; - } + delete fEngines; } void ICULanguageBreakFactory::ensureEngines(UErrorCode& status) { diff --git a/deps/icu-small/source/common/brkiter.cpp b/deps/icu-small/source/common/brkiter.cpp index b452cf2c050083..4f2f0f3ace884b 100644 --- a/deps/icu-small/source/common/brkiter.cpp +++ b/deps/icu-small/source/common/brkiter.cpp @@ -438,17 +438,14 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) UTRACE_ENTRY(UTRACE_UBRK_CREATE_LINE); uprv_strcpy(lb_lw, "line"); UErrorCode kvStatus = U_ZERO_ERROR; - CharString value; - CharStringByteSink valueSink(&value); - loc.getKeywordValue("lb", valueSink, kvStatus); + auto value = loc.getKeywordValue("lb", kvStatus); if (U_SUCCESS(kvStatus) && (value == "strict" || value == "normal" || value == "loose")) { uprv_strcat(lb_lw, "_"); uprv_strcat(lb_lw, value.data()); } // lw=phrase is only supported in Japanese and Korean if (uprv_strcmp(loc.getLanguage(), "ja") == 0 || uprv_strcmp(loc.getLanguage(), "ko") == 0) { - value.clear(); - loc.getKeywordValue("lw", valueSink, kvStatus); + value = loc.getKeywordValue("lw", kvStatus); if (U_SUCCESS(kvStatus) && value == "phrase") { uprv_strcat(lb_lw, "_"); uprv_strcat(lb_lw, value.data()); @@ -500,7 +497,7 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) Locale BreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const { if (type == ULOC_REQUESTED_LOCALE) { - return Locale(requestLocale); + return {requestLocale}; } U_LOCALE_BASED(locBased, *this); return locBased.getLocale(type, status); diff --git a/deps/icu-small/source/common/bytesinkutil.h b/deps/icu-small/source/common/bytesinkutil.h index 929c71fbee6bc7..b3bd487be1d690 100644 --- a/deps/icu-small/source/common/bytesinkutil.h +++ b/deps/icu-small/source/common/bytesinkutil.h @@ -7,18 +7,52 @@ #ifndef BYTESINKUTIL_H #define BYTESINKUTIL_H +#include + #include "unicode/utypes.h" #include "unicode/bytestream.h" #include "unicode/edits.h" +#include "charstr.h" #include "cmemory.h" #include "uassert.h" +#include "ustr_imp.h" U_NAMESPACE_BEGIN class ByteSink; -class CharString; class Edits; +class U_COMMON_API CharStringByteSink : public ByteSink { +public: + CharStringByteSink(CharString* dest); + ~CharStringByteSink() override; + + CharStringByteSink() = delete; + CharStringByteSink(const CharStringByteSink&) = delete; + CharStringByteSink& operator=(const CharStringByteSink&) = delete; + + void Append(const char* bytes, int32_t n) override; + + char* GetAppendBuffer(int32_t min_capacity, + int32_t desired_capacity_hint, + char* scratch, + int32_t scratch_capacity, + int32_t* result_capacity) override; + +private: + CharString& dest_; +}; + +// CharString doesn't provide the public API that StringByteSink requires a +// string class to have so this template specialization replaces the default +// implementation of StringByteSink with CharStringByteSink. +template<> +class StringByteSink : public CharStringByteSink { + public: + StringByteSink(CharString* dest) : CharStringByteSink(dest) { } + StringByteSink(CharString* dest, int32_t /*initialAppendCapacity*/) : CharStringByteSink(dest) { } +}; + class U_COMMON_API ByteSinkUtil { public: ByteSinkUtil() = delete; // all static @@ -57,30 +91,64 @@ class U_COMMON_API ByteSinkUtil { ByteSink &sink, uint32_t options, Edits *edits, UErrorCode &errorCode); -private: - static void appendNonEmptyUnchanged(const uint8_t *s, int32_t length, - ByteSink &sink, uint32_t options, Edits *edits); -}; - -class U_COMMON_API CharStringByteSink : public ByteSink { -public: - CharStringByteSink(CharString* dest); - ~CharStringByteSink() override; - - CharStringByteSink() = delete; - CharStringByteSink(const CharStringByteSink&) = delete; - CharStringByteSink& operator=(const CharStringByteSink&) = delete; - - void Append(const char* bytes, int32_t n) override; + /** + * Calls a lambda that writes to a ByteSink with a CheckedArrayByteSink + * and then returns through u_terminateChars(), in order to implement + * the classic ICU4C C API writing to a fix sized buffer on top of a + * contemporary C++ API. + * + * @param buffer receiving buffer + * @param capacity capacity of receiving buffer + * @param lambda that gets called with the sink as an argument + * @param status set to U_BUFFER_OVERFLOW_ERROR on overflow + * @return number of bytes written, or needed (in case of overflow) + * @internal + */ + template >> + static int32_t viaByteSinkToTerminatedChars(char* buffer, int32_t capacity, + F&& lambda, + UErrorCode& status) { + if (U_FAILURE(status)) { return 0; } + CheckedArrayByteSink sink(buffer, capacity); + lambda(sink, status); + if (U_FAILURE(status)) { return 0; } + + int32_t reslen = sink.NumberOfBytesAppended(); + + if (sink.Overflowed()) { + status = U_BUFFER_OVERFLOW_ERROR; + return reslen; + } + + return u_terminateChars(buffer, capacity, reslen, &status); + } - char* GetAppendBuffer(int32_t min_capacity, - int32_t desired_capacity_hint, - char* scratch, - int32_t scratch_capacity, - int32_t* result_capacity) override; + /** + * Calls a lambda that writes to a ByteSink with a CharStringByteSink and + * then returns a CharString, in order to implement a contemporary C++ API + * on top of a C/C++ compatibility ByteSink API. + * + * @param lambda that gets called with the sink as an argument + * @param status to check and report + * @return the resulting string, or an empty string (in case of error) + * @internal + */ + template >> + static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { + if (U_FAILURE(status)) { return {}; } + CharString result; + CharStringByteSink sink(&result); + lambda(sink, status); + return result; + } private: - CharString& dest_; + static void appendNonEmptyUnchanged(const uint8_t *s, int32_t length, + ByteSink &sink, uint32_t options, Edits *edits); }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/caniter.cpp b/deps/icu-small/source/common/caniter.cpp index 64a3c65d29a0f7..2c987306ec9ccb 100644 --- a/deps/icu-small/source/common/caniter.cpp +++ b/deps/icu-small/source/common/caniter.cpp @@ -64,6 +64,7 @@ U_NAMESPACE_BEGIN UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CanonicalIterator) + /** *@param source string to get results for */ @@ -73,10 +74,10 @@ CanonicalIterator::CanonicalIterator(const UnicodeString &sourceStr, UErrorCode pieces_lengths(nullptr), current(nullptr), current_length(0), - nfd(*Normalizer2::getNFDInstance(status)), - nfcImpl(*Normalizer2Factory::getNFCImpl(status)) + nfd(Normalizer2::getNFDInstance(status)), + nfcImpl(Normalizer2Factory::getNFCImpl(status)) { - if(U_SUCCESS(status) && nfcImpl.ensureCanonIterData(status)) { + if(U_SUCCESS(status) && nfcImpl->ensureCanonIterData(status)) { setSource(sourceStr, status); } } @@ -172,7 +173,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st int32_t i = 0; UnicodeString *list = nullptr; - nfd.normalize(newSource, source, status); + nfd->normalize(newSource, source, status); if(U_FAILURE(status)) { return; } @@ -194,7 +195,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st current[0] = 0; pieces[0] = new UnicodeString[1]; pieces_lengths[0] = 1; - if (pieces[0] == 0) { + if (pieces[0] == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; goto CleanPartialInitialization; } @@ -203,7 +204,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st list = new UnicodeString[source.length()]; - if (list == 0) { + if (list == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; goto CleanPartialInitialization; } @@ -219,7 +220,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st // on the NFD form - see above). for (; i < source.length(); i += U16_LENGTH(cp)) { cp = source.char32At(i); - if (nfcImpl.isCanonSegmentStarter(cp)) { + if (nfcImpl->isCanonSegmentStarter(cp)) { source.extract(start, i-start, list[list_length++]); // add up to i start = i; } @@ -252,9 +253,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st return; // Common section to cleanup all local variables and reset object variables. CleanPartialInitialization: - if (list != nullptr) { - delete[] list; - } + delete[] list; cleanPieces(); } @@ -264,10 +263,19 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st * @param source the string to find permutations for * @return the results in a set. */ -void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status) { +void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status, int32_t depth) { if(U_FAILURE(status)) { return; } + // To avoid infinity loop caused by permute, we limit the depth of recursive + // call to permute and return U_UNSUPPORTED_ERROR. + // We know in some unit test we need at least 4. Set to 8 just in case some + // unforseen use cases. + constexpr int32_t kPermuteDepthLimit = 8; + if (depth > kPermuteDepthLimit) { + status = U_UNSUPPORTED_ERROR; + return; + } //if (PROGRESS) printf("Permute: %s\n", UToS(Tr(source))); int32_t i = 0; @@ -277,7 +285,7 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros if (source.length() <= 2 && source.countChar32() <= 1) { UnicodeString *toPut = new UnicodeString(source); /* test for nullptr */ - if (toPut == 0) { + if (toPut == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -311,7 +319,7 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros // see what the permutations of the characters before and after this one are //Hashtable *subpermute = permute(source.substring(0,i) + source.substring(i + UTF16.getCharCount(cp))); - permute(subPermuteString.remove(i, U16_LENGTH(cp)), skipZeros, &subpermute, status); + permute(subPermuteString.remove(i, U16_LENGTH(cp)), skipZeros, &subpermute, status, depth+1); /* Test for buffer overflows */ if(U_FAILURE(status)) { return; @@ -346,7 +354,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i Hashtable permutations(status); Hashtable basic(status); if (U_FAILURE(status)) { - return 0; + return nullptr; } result.setValueDeleter(uprv_deleteUObject); permutations.setValueDeleter(uprv_deleteUObject); @@ -381,7 +389,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i //UnicodeString *possible = new UnicodeString(*((UnicodeString *)(ne2->value.pointer))); UnicodeString possible(*((UnicodeString *)(ne2->value.pointer))); UnicodeString attempt; - nfd.normalize(possible, attempt, status); + nfd->normalize(possible, attempt, status); // TODO: check if operator == is semanticaly the same as attempt.equals(segment) if (attempt==segment) { @@ -399,7 +407,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i /* Test for buffer overflows */ if(U_FAILURE(status)) { - return 0; + return nullptr; } // convert into a String[] to clean up storage //String[] finalResult = new String[result.size()]; @@ -407,7 +415,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i int32_t resultCount; if((resultCount = result.count()) != 0) { finalResult = new UnicodeString[resultCount]; - if (finalResult == 0) { + if (finalResult == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } @@ -448,7 +456,7 @@ Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const cha for (int32_t i = 0; i < segLen; i += U16_LENGTH(cp)) { // see if any character is at the start of some decomposition U16_GET(segment, 0, i, segLen, cp); - if (!nfcImpl.getCanonStartSet(cp, starts)) { + if (!nfcImpl->getCanonStartSet(cp, starts)) { continue; } // if so, see which decompositions match @@ -471,7 +479,7 @@ Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const cha UnicodeString item = *((UnicodeString *)(ne->value.pointer)); UnicodeString *toAdd = new UnicodeString(prefix); /* test for nullptr */ - if (toAdd == 0) { + if (toAdd == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } @@ -509,7 +517,7 @@ Hashtable *CanonicalIterator::extract(Hashtable *fillinResult, UChar32 comp, con UnicodeString temp(comp); int32_t inputLen=temp.length(); UnicodeString decompString; - nfd.normalize(temp, decompString, status); + nfd->normalize(temp, decompString, status); if (U_FAILURE(status)) { return nullptr; } @@ -573,7 +581,7 @@ Hashtable *CanonicalIterator::extract(Hashtable *fillinResult, UChar32 comp, con // brute force approach // check to make sure result is canonically equivalent UnicodeString trial; - nfd.normalize(temp, trial, status); + nfd->normalize(temp, trial, status); if(U_FAILURE(status) || trial.compare(segment+segmentPos, segLen - segmentPos) != 0) { return nullptr; } diff --git a/deps/icu-small/source/common/charstr.h b/deps/icu-small/source/common/charstr.h index 7749a804b931a9..08283ca452ce2b 100644 --- a/deps/icu-small/source/common/charstr.h +++ b/deps/icu-small/source/common/charstr.h @@ -104,6 +104,13 @@ class U_COMMON_API CharString : public UMemory { */ int32_t extract(char *dest, int32_t capacity, UErrorCode &errorCode) const; + bool operator==(const CharString& other) const { + return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0); + } + bool operator!=(const CharString& other) const { + return !operator==(other); + } + bool operator==(StringPiece other) const { return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0); } diff --git a/deps/icu-small/source/common/filteredbrk.cpp b/deps/icu-small/source/common/filteredbrk.cpp index a705b037c47bc0..a1490b61213fe9 100644 --- a/deps/icu-small/source/common/filteredbrk.cpp +++ b/deps/icu-small/source/common/filteredbrk.cpp @@ -147,7 +147,7 @@ class SimpleFilteredSentenceBreakData : public UMemory { if(umtx_atomic_dec(&refcount) <= 0) { delete this; } - return 0; + return nullptr; } virtual ~SimpleFilteredSentenceBreakData(); diff --git a/deps/icu-small/source/common/hash.h b/deps/icu-small/source/common/hash.h index bc103ee72ca5f3..c1a1c5c65acae4 100644 --- a/deps/icu-small/source/common/hash.h +++ b/deps/icu-small/source/common/hash.h @@ -148,12 +148,12 @@ inline void Hashtable::initSize(UHashFunction *keyHash, UKeyComparator *keyComp, } inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, - UErrorCode& status) : hash(0) { + UErrorCode& status) : hash(nullptr) { init( uhash_hashUnicodeString, keyComp, valueComp, status); } inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) - : hash(0) + : hash(nullptr) { init(ignoreKeyCase ? uhash_hashCaselessUnicodeString : uhash_hashUnicodeString, @@ -164,7 +164,7 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) } inline Hashtable::Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status) - : hash(0) + : hash(nullptr) { initSize(ignoreKeyCase ? uhash_hashCaselessUnicodeString : uhash_hashUnicodeString, @@ -175,13 +175,13 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& statu } inline Hashtable::Hashtable(UErrorCode& status) - : hash(0) + : hash(nullptr) { init(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, status); } inline Hashtable::Hashtable() - : hash(0) + : hash(nullptr) { UErrorCode status = U_ZERO_ERROR; init(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, status); diff --git a/deps/icu-small/source/common/localebuilder.cpp b/deps/icu-small/source/common/localebuilder.cpp index c1e1f2ad682a87..e53065a8a605c9 100644 --- a/deps/icu-small/source/common/localebuilder.cpp +++ b/deps/icu-small/source/common/localebuilder.cpp @@ -3,21 +3,21 @@ #include -#include "bytesinkutil.h" // CharStringByteSink +#include "bytesinkutil.h" // StringByteSink #include "charstr.h" #include "cstring.h" #include "ulocimp.h" #include "unicode/localebuilder.h" #include "unicode/locid.h" -U_NAMESPACE_BEGIN +namespace { -#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) -#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) +inline bool UPRV_ISDIGIT(char c) { return c >= '0' && c <= '9'; } +inline bool UPRV_ISALPHANUM(char c) { return uprv_isASCIILetter(c) || UPRV_ISDIGIT(c); } constexpr const char* kAttributeKey = "attribute"; -static bool _isExtensionSubtags(char key, const char* s, int32_t len) { +bool _isExtensionSubtags(char key, const char* s, int32_t len) { switch (uprv_tolower(key)) { case 'u': return ultag_isUnicodeExtensionSubtags(s, len); @@ -30,6 +30,10 @@ static bool _isExtensionSubtags(char key, const char* s, int32_t len) { } } +} // namespace + +U_NAMESPACE_BEGIN + LocaleBuilder::LocaleBuilder() : UObject(), status_(U_ZERO_ERROR), language_(), script_(), region_(), variant_(nullptr), extensions_(nullptr) { @@ -68,8 +72,10 @@ LocaleBuilder& LocaleBuilder::setLanguageTag(StringPiece tag) return *this; } -static void setField(StringPiece input, char* dest, UErrorCode& errorCode, - UBool (*test)(const char*, int32_t)) { +namespace { + +void setField(StringPiece input, char* dest, UErrorCode& errorCode, + bool (*test)(const char*, int32_t)) { if (U_FAILURE(errorCode)) { return; } if (input.empty()) { dest[0] = '\0'; @@ -81,6 +87,8 @@ static void setField(StringPiece input, char* dest, UErrorCode& errorCode, } } +} // namespace + LocaleBuilder& LocaleBuilder::setLanguage(StringPiece language) { setField(language, language_, status_, &ultag_isLanguageSubtag); @@ -99,7 +107,9 @@ LocaleBuilder& LocaleBuilder::setRegion(StringPiece region) return *this; } -static void transform(char* data, int32_t len) { +namespace { + +void transform(char* data, int32_t len) { for (int32_t i = 0; i < len; i++, data++) { if (*data == '_') { *data = '-'; @@ -109,6 +119,8 @@ static void transform(char* data, int32_t len) { } } +} // namespace + LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) { if (U_FAILURE(status_)) { return *this; } @@ -134,7 +146,9 @@ LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) return *this; } -static bool +namespace { + +bool _isKeywordValue(const char* key, const char* value, int32_t value_len) { if (key[1] == '\0') { @@ -156,7 +170,7 @@ _isKeywordValue(const char* key, const char* value, int32_t value_len) ultag_isUnicodeLocaleType(unicode_locale_type, -1); } -static void +void _copyExtensions(const Locale& from, icu::StringEnumeration *keywords, Locale& to, bool validate, UErrorCode& errorCode) { @@ -169,9 +183,7 @@ _copyExtensions(const Locale& from, icu::StringEnumeration *keywords, } const char* key; while ((key = keywords->next(nullptr, errorCode)) != nullptr) { - CharString value; - CharStringByteSink sink(&value); - from.getKeywordValue(key, sink, errorCode); + auto value = from.getKeywordValue(key, errorCode); if (U_FAILURE(errorCode)) { return; } if (uprv_strcmp(key, kAttributeKey) == 0) { transform(value.data(), value.length()); @@ -186,9 +198,10 @@ _copyExtensions(const Locale& from, icu::StringEnumeration *keywords, } } -void static +void _clearUAttributesAndKeyType(Locale& locale, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { return; } // Clear Unicode attributes locale.setKeywordValue(kAttributeKey, "", errorCode); @@ -201,9 +214,10 @@ _clearUAttributesAndKeyType(Locale& locale, UErrorCode& errorCode) } } -static void +void _setUnicodeExtensions(Locale& locale, const CharString& value, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { return; } // Add the unicode extensions to extensions_ CharString locale_str("und-u-", errorCode); locale_str.append(value, errorCode); @@ -212,6 +226,8 @@ _setUnicodeExtensions(Locale& locale, const CharString& value, UErrorCode& error locale, false, errorCode); } +} // namespace + LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value) { if (U_FAILURE(status_)) { return *this; } @@ -289,10 +305,8 @@ LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute( return *this; } - CharString attributes; - CharStringByteSink sink(&attributes); UErrorCode localErrorCode = U_ZERO_ERROR; - extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode); + auto attributes = extensions_->getKeywordValue(kAttributeKey, localErrorCode); if (U_FAILURE(localErrorCode)) { CharString new_attributes(value_str.data(), status_); // No attributes, set the attribute. @@ -344,9 +358,7 @@ LocaleBuilder& LocaleBuilder::removeUnicodeLocaleAttribute( } if (extensions_ == nullptr) { return *this; } UErrorCode localErrorCode = U_ZERO_ERROR; - CharString attributes; - CharStringByteSink sink(&attributes); - extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode); + auto attributes = extensions_->getKeywordValue(kAttributeKey, localErrorCode); // get failure, just return if (U_FAILURE(localErrorCode)) { return *this; } // Do not have any attributes, just return. diff --git a/deps/icu-small/source/common/localefallback_data.h b/deps/icu-small/source/common/localefallback_data.h index c847edefff5828..7441ee307a9736 100644 --- a/deps/icu-small/source/common/localefallback_data.h +++ b/deps/icu-small/source/common/localefallback_data.h @@ -26,10 +26,10 @@ const char scriptCodeChars[] = const char dsLocaleIDChars[] = "aaf\0aao\0aat\0ab\0abh\0abl\0abv\0acm\0acq\0acw\0acx\0adf\0adx\0" "ady\0ae\0aeb\0aec\0aee\0aeq\0afb\0agi\0agj\0agx\0ahg\0aho\0ahr\0" - "aib\0aij\0ain\0aio\0aiq\0ajp\0akk\0akv\0alk\0all\0alr\0alt\0alw\0" - "am\0ams\0amw\0ani\0anp\0anr\0anu\0aot\0apc\0apd\0aph\0aqc\0ar\0" - "arc\0arq\0ars\0ary\0arz\0as\0ase\0ask\0atn\0atv\0auj\0auz\0av\0" - "avd\0avl\0awa\0awn\0axm\0ayh\0ayl\0ayn\0ayp\0az_IQ\0az_IR\0az_RU\0" + "aib\0aij\0ain\0aio\0aiq\0akk\0akv\0alk\0all\0alr\0alt\0alw\0am\0" + "ams\0amw\0ani\0anp\0anr\0anu\0aot\0apc\0apd\0aph\0aqc\0ar\0arc\0" + "arq\0ars\0ary\0arz\0as\0ase\0ask\0atn\0atv\0auj\0auz\0av\0avd\0" + "avl\0awa\0awn\0axm\0ayh\0ayl\0ayn\0ayp\0az_IQ\0az_IR\0az_RU\0" "azb\0ba\0bal\0bap\0bax\0bbl\0bcq\0bdv\0bdz\0be\0bee\0bej\0bfb\0" "bfq\0bft\0bfu\0bfw\0bfy\0bfz\0bg\0bgc\0bgd\0bgn\0bgp\0bgq\0bgw\0" "bgx\0bha\0bhb\0bhd\0bhe\0bhh\0bhi\0bhj\0bhm\0bhn\0bho\0bht\0bhu\0" @@ -78,33 +78,33 @@ const char dsLocaleIDChars[] = "otb\0otk\0oty\0pa\0pa_PK\0pal\0paq\0pbt\0pcb\0pce\0pcf\0pcg\0" "pch\0pci\0pcj\0peg\0peo\0pgd\0pgg\0pgl\0pgn\0phd\0phk\0phl\0phn\0" "pho\0phr\0pht\0phv\0phw\0pi\0pka\0pkr\0plk\0pll\0pmh\0pnt\0pra\0" - "prc\0prd\0prp\0prt\0prx\0ps\0psh\0psi\0pst\0pum\0pwo\0pwr\0pww\0" - "pyx\0qxq\0raa\0rab\0raf\0rah\0raj\0rav\0rbb\0rdb\0rei\0rhg\0rji\0" - "rjs\0rka\0rki\0rkt\0rmi\0rmt\0rmz\0rom_BG\0rsk\0rtw\0ru\0rue\0" - "rut\0rwr\0ryu\0sa\0sah\0sam\0sat\0saz\0sbn\0sbu\0sck\0scl\0scl_IN\0" + "prc\0prd\0prt\0prx\0ps\0psh\0psi\0pst\0pum\0pwo\0pwr\0pww\0pyx\0" + "qxq\0raa\0rab\0raf\0rah\0raj\0rav\0rbb\0rdb\0rei\0rhg\0rji\0rjs\0" + "rka\0rki\0rkt\0rmi\0rmt\0rmz\0rom_BG\0rsk\0rtw\0ru\0rue\0rut\0" + "rwr\0ryu\0sa\0sah\0sam\0sat\0saz\0sbn\0sbu\0sck\0scl\0scl_IN\0" "scp\0sct\0scu\0scx\0sd\0sd_IN\0sdb\0sdf\0sdg\0sdh\0sds\0sel\0" "sfm\0sga\0sgh\0sgj\0sgr\0sgt\0sgw\0sgy\0shd\0shi\0shm\0shn\0shu\0" - "shv\0si\0sia\0sip\0siy\0siz\0sjd\0sjp\0sjt\0skb\0skj\0skr\0slq\0" - "smh\0smp\0smu\0smy\0soa\0sog\0soi\0sou\0spt\0spv\0sqo\0sqq\0sqt\0" - "sr\0srb\0srh\0srx\0srz\0ssh\0sss\0sts\0stv\0sty\0suz\0sva\0swb\0" - "swi\0swv\0syc\0syl\0syn\0syr\0syw\0ta\0tab\0taj\0tbk\0tcn\0tco\0" - "tcx\0tcy\0tda\0tdb\0tdd\0tdg\0tdh\0te\0tes\0tg\0tg_PK\0tge\0tgf\0" - "th\0the\0thf\0thi\0thl\0thm\0thq\0thr\0ths\0ti\0tig\0tij\0tin\0" - "tjl\0tjo\0tkb\0tks\0tkt\0tmk\0tmr\0tnv\0tov\0tpu\0tra\0trg\0trm\0" - "trw\0tsd\0tsj\0tt\0tth\0tto\0tts\0tvn\0twm\0txg\0txo\0tyr\0tyv\0" - "ude\0udg\0udi\0udm\0ug\0ug_KZ\0ug_MN\0uga\0ugh\0ugo\0uk\0uki\0" - "ulc\0unr\0unr_NP\0unx\0ur\0urk\0ush\0uum\0uz_AF\0uz_CN\0uzs\0" - "vaa\0vaf\0vah\0vai\0vas\0vav\0vay\0vgr\0vmd\0vmh\0wal\0wbk\0wbq\0" - "wbr\0wlo\0wme\0wne\0wni\0wsg\0wsv\0wtm\0wuu\0xal\0xan\0xas\0xco\0" - "xcr\0xdq\0xhe\0xhm\0xis\0xka\0xkc\0xkj\0xkp\0xlc\0xld\0xly\0xmf\0" - "xmn\0xmr\0xna\0xnr\0xpg\0xpi\0xpm\0xpr\0xrm\0xrn\0xsa\0xsr\0xss\0" - "xub\0xuj\0xve\0xvi\0xwo\0xzh\0yai\0ybh\0ybi\0ydg\0yea\0yej\0yeu\0" - "ygp\0yhd\0yi\0yig\0yih\0yiv\0ykg\0yna\0ynk\0yoi\0yoy\0yrk\0ysd\0" - "ysn\0ysp\0ysr\0ysy\0yud\0yue\0yue_CN\0yug\0yux\0ywq\0ywu\0zau\0" - "zba\0zch\0zdj\0zeh\0zen\0zgb\0zgh\0zgm\0zgn\0zh\0zh_AU\0zh_BN\0" - "zh_GB\0zh_GF\0zh_HK\0zh_ID\0zh_MO\0zh_PA\0zh_PF\0zh_PH\0zh_SR\0" - "zh_TH\0zh_TW\0zh_US\0zh_VN\0zhd\0zhx\0zkb\0zko\0zkt\0zkz\0zlj\0" - "zln\0zlq\0zqe\0zrp\0zum\0zyg\0zyn\0zzj\0"; + "shv\0si\0sia\0sip\0siy\0siz\0sjd\0sjp\0sjt\0skb\0skj\0skr\0smh\0" + "smp\0smu\0smy\0soa\0sog\0soi\0sou\0spt\0spv\0sqo\0sqq\0sqt\0sr\0" + "srb\0srh\0srx\0srz\0ssh\0sss\0sts\0stv\0sty\0suz\0sva\0swb\0swi\0" + "swv\0syc\0syl\0syn\0syr\0syw\0ta\0tab\0taj\0tbk\0tcn\0tco\0tcx\0" + "tcy\0tda\0tdb\0tdd\0tdg\0tdh\0te\0tes\0tg\0tg_PK\0tge\0tgf\0th\0" + "the\0thf\0thi\0thl\0thm\0thq\0thr\0ths\0ti\0tig\0tij\0tin\0tjl\0" + "tjo\0tkb\0tks\0tkt\0tmr\0tnv\0tov\0tpu\0tra\0trg\0trm\0trw\0tsd\0" + "tsj\0tt\0tth\0tto\0tts\0tvn\0twm\0txg\0txo\0tyr\0tyv\0ude\0udg\0" + "udi\0udm\0ug\0ug_KZ\0ug_MN\0uga\0ugh\0ugo\0uk\0uki\0ulc\0unr\0" + "unr_NP\0unx\0ur\0urk\0ush\0uum\0uz_AF\0uz_CN\0uzs\0vaa\0vaf\0" + "vah\0vai\0vas\0vav\0vay\0vgr\0vmd\0vmh\0wal\0wbk\0wbq\0wbr\0wlo\0" + "wme\0wne\0wni\0wsg\0wsv\0wtm\0wuu\0xal\0xan\0xas\0xco\0xcr\0xdq\0" + "xhe\0xhm\0xis\0xka\0xkc\0xkj\0xkp\0xlc\0xld\0xly\0xmf\0xmn\0xmr\0" + "xna\0xnr\0xpg\0xpi\0xpm\0xpr\0xrm\0xrn\0xsa\0xsr\0xub\0xuj\0xve\0" + "xvi\0xwo\0xzh\0yai\0ybh\0ybi\0ydg\0yea\0yej\0yeu\0ygp\0yhd\0yi\0" + "yig\0yih\0yiv\0ykg\0yna\0ynk\0yoi\0yoy\0yrk\0ysd\0ysn\0ysp\0ysr\0" + "ysy\0yud\0yue\0yue_CN\0yug\0yux\0ywq\0ywu\0zau\0zba\0zch\0zdj\0" + "zeh\0zen\0zgb\0zgh\0zgm\0zgn\0zh\0zh_AU\0zh_BN\0zh_GB\0zh_GF\0" + "zh_HK\0zh_ID\0zh_MO\0zh_PA\0zh_PF\0zh_PH\0zh_SR\0zh_TH\0zh_TW\0" + "zh_US\0zh_VN\0zhd\0zhx\0zko\0zkt\0zkz\0zlj\0zln\0zlq\0zqe\0zrp\0" + "zum\0zyg\0zyn\0zzj\0"; const int32_t defaultScriptTable[] = { 0, 320, // aaf -> Mlym @@ -138,996 +138,990 @@ const int32_t defaultScriptTable[] = { 110, 220, // ain -> Kana 114, 345, // aio -> Mymr 118, 10, // aiq -> Arab - 122, 10, // ajp -> Arab - 126, 570, // akk -> Xsux - 130, 100, // akv -> Cyrl - 134, 260, // alk -> Laoo - 138, 320, // all -> Mlym - 142, 100, // alr -> Cyrl - 146, 100, // alt -> Cyrl - 150, 120, // alw -> Ethi - 154, 120, // am -> Ethi - 157, 210, // ams -> Jpan - 161, 475, // amw -> Syrc - 165, 100, // ani -> Cyrl - 169, 105, // anp -> Deva - 173, 105, // anr -> Deva - 177, 120, // anu -> Ethi - 181, 45, // aot -> Beng - 185, 10, // apc -> Arab - 189, 10, // apd -> Arab - 193, 105, // aph -> Deva - 197, 100, // aqc -> Cyrl - 201, 10, // ar -> Arab - 204, 15, // arc -> Armi - 208, 10, // arq -> Arab - 212, 10, // ars -> Arab - 216, 10, // ary -> Arab - 220, 10, // arz -> Arab - 224, 45, // as -> Beng - 227, 450, // ase -> Sgnw - 231, 10, // ask -> Arab - 235, 10, // atn -> Arab - 239, 100, // atv -> Cyrl - 243, 10, // auj -> Arab - 247, 10, // auz -> Arab - 251, 100, // av -> Cyrl - 254, 10, // avd -> Arab - 258, 10, // avl -> Arab - 262, 105, // awa -> Deva - 266, 120, // awn -> Ethi - 270, 20, // axm -> Armn - 274, 10, // ayh -> Arab - 278, 10, // ayl -> Arab - 282, 10, // ayn -> Arab - 286, 10, // ayp -> Arab - 290, 10, // az_IQ -> Arab - 296, 10, // az_IR -> Arab - 302, 100, // az_RU -> Cyrl - 308, 10, // azb -> Arab - 312, 100, // ba -> Cyrl - 315, 10, // bal -> Arab - 319, 105, // bap -> Deva - 323, 30, // bax -> Bamu - 327, 125, // bbl -> Geor - 331, 120, // bcq -> Ethi - 335, 385, // bdv -> Orya - 339, 10, // bdz -> Arab - 343, 100, // be -> Cyrl - 346, 105, // bee -> Deva - 350, 10, // bej -> Arab - 354, 105, // bfb -> Deva - 358, 500, // bfq -> Taml - 362, 10, // bft -> Arab - 366, 535, // bfu -> Tibt - 370, 385, // bfw -> Orya - 374, 105, // bfy -> Deva - 378, 105, // bfz -> Deva - 382, 100, // bg -> Cyrl - 385, 105, // bgc -> Deva - 389, 105, // bgd -> Deva - 393, 10, // bgn -> Arab - 397, 10, // bgp -> Arab - 401, 105, // bgq -> Deva - 405, 105, // bgw -> Deva - 409, 150, // bgx -> Grek - 413, 105, // bha -> Deva - 417, 105, // bhb -> Deva - 421, 105, // bhd -> Deva - 425, 10, // bhe -> Arab - 429, 100, // bhh -> Cyrl - 433, 105, // bhi -> Deva - 437, 105, // bhj -> Deva - 441, 10, // bhm -> Arab - 445, 475, // bhn -> Syrc - 449, 105, // bho -> Deva - 453, 485, // bht -> Takr - 457, 105, // bhu -> Deva - 461, 105, // biy -> Deva - 465, 475, // bjf -> Syrc - 469, 105, // bjj -> Deva - 473, 10, // bjm -> Arab - 477, 345, // blk -> Mymr - 481, 510, // blt -> Tavt - 485, 105, // bmj -> Deva - 489, 45, // bn -> Beng - 492, 105, // bns -> Deva - 496, 535, // bo -> Tibt - 499, 100, // bph -> Cyrl - 503, 105, // bpx -> Deva - 507, 45, // bpy -> Beng - 511, 10, // bqi -> Arab - 515, 105, // bra -> Deva - 519, 235, // brb -> Khmr - 523, 105, // brd -> Deva - 527, 10, // brh -> Arab - 531, 10, // brk -> Arab - 535, 260, // brv -> Laoo - 539, 105, // brx -> Deva - 543, 10, // bsh -> Arab - 547, 10, // bsk -> Arab - 551, 35, // bsq -> Bass - 555, 120, // bst -> Ethi - 559, 40, // btd -> Batk - 563, 40, // btm -> Batk - 567, 105, // btv -> Deva - 571, 100, // bua -> Cyrl - 575, 345, // bwe -> Mymr - 579, 100, // bxm -> Cyrl - 583, 330, // bxu -> Mong - 587, 105, // byh -> Deva - 591, 120, // byn -> Ethi - 595, 105, // byw -> Deva - 599, 530, // bzi -> Thai - 603, 530, // cbn -> Thai - 607, 60, // ccp -> Cakm - 611, 515, // cde -> Telu - 615, 105, // cdh -> Deva - 619, 155, // cdi -> Gujr - 623, 105, // cdj -> Deva - 627, 105, // cdm -> Deva - 631, 175, // cdo -> Hans - 635, 45, // cdz -> Beng - 639, 100, // ce -> Cyrl - 642, 535, // cgk -> Tibt - 646, 10, // chg -> Arab - 650, 100, // chm -> Cyrl - 654, 80, // chr -> Cher - 658, 105, // chx -> Deva - 662, 105, // cih -> Deva - 666, 10, // cja -> Arab - 670, 100, // cji -> Cyrl - 674, 75, // cjm -> Cham - 678, 175, // cjy -> Hans - 682, 10, // ckb -> Arab - 686, 100, // ckt -> Cyrl - 690, 10, // clh -> Arab - 694, 100, // clw -> Cyrl - 698, 470, // cmg -> Soyo - 702, 535, // cna -> Tibt - 706, 175, // cnp -> Hans - 710, 530, // cog -> Thai - 714, 90, // cop -> Copt - 718, 150, // cpg -> Grek - 722, 65, // cr -> Cans - 725, 100, // crh -> Cyrl - 729, 65, // crj -> Cans - 733, 65, // crk -> Cans - 737, 65, // crl -> Cans - 741, 65, // crm -> Cans - 745, 345, // csh -> Mymr - 749, 175, // csp -> Hans - 753, 65, // csw -> Cans - 757, 395, // ctd -> Pauc - 761, 45, // ctg -> Beng - 765, 105, // ctn -> Deva - 769, 500, // ctt -> Taml - 773, 100, // cu -> Cyrl - 776, 255, // cuu -> Lana - 780, 100, // cv -> Cyrl - 783, 175, // czh -> Hans - 787, 185, // czk -> Hebr - 791, 105, // daq -> Deva - 795, 100, // dar -> Cyrl - 799, 10, // dcc -> Arab - 803, 100, // ddo -> Cyrl - 807, 10, // def -> Arab - 811, 10, // deh -> Arab - 815, 45, // der -> Beng - 819, 105, // dhi -> Deva - 823, 155, // dhn -> Gujr - 827, 105, // dho -> Deva - 831, 105, // dhw -> Deva - 835, 535, // dka -> Tibt - 839, 100, // dlg -> Cyrl - 843, 310, // dmf -> Medf - 847, 10, // dmk -> Arab - 851, 10, // dml -> Arab - 855, 100, // dng -> Cyrl - 859, 345, // dnu -> Mymr - 863, 345, // dnv -> Mymr - 867, 105, // doi -> Deva - 871, 120, // dox -> Ethi - 875, 535, // dre -> Tibt - 879, 105, // drq -> Deva - 883, 120, // drs -> Ethi - 887, 105, // dry -> Deva - 891, 385, // dso -> Orya - 895, 105, // dty -> Deva - 899, 155, // dub -> Gujr - 903, 105, // duh -> Deva - 907, 105, // dus -> Deva - 911, 525, // dv -> Thaa - 914, 385, // dwk -> Orya - 918, 105, // dwz -> Deva - 922, 535, // dz -> Tibt - 925, 535, // dzl -> Tibt - 929, 150, // ecr -> Grek - 933, 95, // ecy -> Cprt - 937, 110, // egy -> Egyp - 941, 215, // eky -> Kali - 945, 150, // el -> Grek - 948, 105, // emg -> Deva - 952, 105, // emu -> Deva - 956, 100, // enf -> Cyrl - 960, 100, // enh -> Cyrl - 964, 500, // era -> Taml - 968, 135, // esg -> Gonm - 972, 10, // esh -> Arab - 976, 200, // ett -> Ital - 980, 100, // eve -> Cyrl - 984, 100, // evn -> Cyrl - 988, 10, // fa -> Arab - 991, 10, // fay -> Arab - 995, 10, // faz -> Arab - 999, 10, // fia -> Arab - 1003, 105, // fmu -> Deva - 1007, 10, // fub -> Arab - 1011, 175, // gan -> Hans - 1015, 385, // gaq -> Orya - 1019, 155, // gas -> Gujr - 1023, 515, // gau -> Telu - 1027, 385, // gbj -> Orya - 1031, 105, // gbk -> Deva - 1035, 155, // gbl -> Gujr - 1039, 105, // gbm -> Deva - 1043, 10, // gbz -> Arab - 1047, 385, // gdb -> Orya - 1051, 100, // gdo -> Cyrl - 1055, 105, // gdx -> Deva - 1059, 120, // gez -> Ethi - 1063, 10, // ggg -> Arab - 1067, 10, // gha -> Arab - 1071, 105, // ghe -> Deva - 1075, 10, // ghr -> Arab - 1079, 535, // ght -> Tibt - 1083, 10, // gig -> Arab - 1087, 100, // gin -> Cyrl - 1091, 10, // gjk -> Arab - 1095, 10, // gju -> Arab - 1099, 100, // gld -> Cyrl - 1103, 10, // glh -> Arab - 1107, 10, // glk -> Arab - 1111, 120, // gmv -> Ethi - 1115, 275, // gmy -> Linb - 1119, 535, // goe -> Tibt - 1123, 120, // gof -> Ethi - 1127, 105, // gok -> Deva - 1131, 105, // gom -> Deva - 1135, 515, // gon -> Telu - 1139, 140, // got -> Goth - 1143, 105, // gra -> Deva - 1147, 95, // grc -> Cprt - 1151, 45, // grt -> Beng - 1155, 120, // gru -> Ethi - 1159, 155, // gu -> Gujr - 1162, 105, // gvr -> Deva - 1166, 10, // gwc -> Arab - 1170, 10, // gwf -> Arab - 1174, 10, // gwt -> Arab - 1178, 105, // gyo -> Deva - 1182, 10, // gzi -> Arab - 1186, 10, // ha_CM -> Arab - 1192, 10, // ha_SD -> Arab - 1198, 10, // hac -> Arab - 1202, 175, // hak -> Hans - 1206, 120, // har -> Ethi - 1210, 10, // haz -> Arab - 1214, 185, // hbo -> Hebr - 1218, 120, // hdy -> Ethi - 1222, 185, // he -> Hebr - 1225, 105, // hi -> Deva - 1228, 485, // hii -> Takr - 1232, 570, // hit -> Xsux - 1236, 10, // hkh -> Arab - 1240, 105, // hlb -> Deva - 1244, 190, // hlu -> Hluw - 1248, 410, // hmd -> Plrd - 1252, 50, // hmj -> Bopo - 1256, 50, // hmq -> Bopo - 1260, 10, // hnd -> Arab - 1264, 105, // hne -> Deva - 1268, 195, // hnj -> Hmnp - 1272, 260, // hnj_AU -> Laoo - 1279, 260, // hnj_CN -> Laoo - 1286, 260, // hnj_FR -> Laoo - 1293, 260, // hnj_GF -> Laoo - 1300, 260, // hnj_LA -> Laoo - 1307, 260, // hnj_MM -> Laoo - 1314, 260, // hnj_SR -> Laoo - 1321, 260, // hnj_TH -> Laoo - 1328, 260, // hnj_VN -> Laoo - 1335, 10, // hno -> Arab - 1339, 105, // hoc -> Deva - 1343, 10, // hoh -> Arab - 1347, 105, // hoj -> Deva - 1351, 170, // how -> Hani - 1355, 105, // hoy -> Deva - 1359, 345, // hpo -> Mymr - 1363, 475, // hrt -> Syrc - 1367, 10, // hrz -> Arab - 1371, 175, // hsn -> Hans - 1375, 10, // hss -> Arab - 1379, 570, // htx -> Xsux - 1383, 105, // hut -> Deva - 1387, 185, // huy -> Hebr - 1391, 100, // huz -> Cyrl - 1395, 20, // hy -> Armn - 1398, 20, // hyw -> Armn - 1402, 575, // ii -> Yiii - 1405, 285, // imy -> Lyci - 1409, 100, // inh -> Cyrl - 1413, 345, // int -> Mymr - 1417, 120, // ior -> Ethi - 1421, 500, // iru -> Taml - 1425, 10, // isk -> Arab - 1429, 185, // itk -> Hebr - 1433, 100, // itl -> Cyrl - 1437, 65, // iu -> Cans - 1440, 185, // iw -> Hebr - 1443, 210, // ja -> Jpan - 1446, 10, // jad -> Arab - 1450, 10, // jat -> Arab - 1454, 185, // jbe -> Hebr - 1458, 10, // jbn -> Arab - 1462, 100, // jct -> Cyrl - 1466, 535, // jda -> Tibt - 1470, 10, // jdg -> Arab - 1474, 100, // jdt -> Cyrl - 1478, 105, // jee -> Deva - 1482, 125, // jge -> Geor - 1486, 185, // ji -> Hebr - 1489, 165, // jje -> Hang - 1493, 345, // jkm -> Mymr - 1497, 105, // jml -> Deva - 1501, 485, // jna -> Takr - 1505, 10, // jnd -> Arab - 1509, 105, // jnl -> Deva - 1513, 105, // jns -> Deva - 1517, 10, // jog -> Arab - 1521, 185, // jpa -> Hebr - 1525, 185, // jpr -> Hebr - 1529, 185, // jrb -> Hebr - 1533, 10, // jrb_MA -> Arab - 1540, 105, // jul -> Deva - 1544, 385, // jun -> Orya - 1548, 385, // juy -> Orya - 1552, 535, // jya -> Tibt - 1556, 185, // jye -> Hebr - 1560, 125, // ka -> Geor - 1563, 100, // kaa -> Cyrl - 1567, 100, // kap -> Cyrl - 1571, 225, // kaw -> Kawi - 1575, 100, // kbd -> Cyrl - 1579, 10, // kbu -> Arab - 1583, 10, // kby -> Arab - 1587, 100, // kca -> Cyrl - 1591, 45, // kdq -> Beng - 1595, 530, // kdt -> Thai - 1599, 100, // ket -> Cyrl - 1603, 105, // kex -> Deva - 1607, 515, // key -> Telu - 1611, 245, // kfa -> Knda - 1615, 105, // kfb -> Deva - 1619, 515, // kfc -> Telu - 1623, 245, // kfd -> Knda - 1627, 500, // kfe -> Taml - 1631, 320, // kfh -> Mlym - 1635, 500, // kfi -> Taml - 1639, 105, // kfk -> Deva - 1643, 10, // kfm -> Arab - 1647, 105, // kfp -> Deva - 1651, 105, // kfq -> Deva - 1655, 105, // kfr -> Deva - 1659, 105, // kfs -> Deva - 1663, 105, // kfx -> Deva - 1667, 105, // kfy -> Deva - 1671, 105, // kgj -> Deva - 1675, 105, // kgy -> Deva - 1679, 495, // khb -> Talu - 1683, 530, // khf -> Thai - 1687, 535, // khg -> Tibt - 1691, 105, // khn -> Deva - 1695, 345, // kht -> Mymr - 1699, 100, // khv -> Cyrl - 1703, 10, // khw -> Arab - 1707, 105, // kif -> Deva - 1711, 100, // kim -> Cyrl - 1715, 105, // kip -> Deva - 1719, 260, // kjg -> Laoo - 1723, 100, // kjh -> Cyrl - 1727, 105, // kjl -> Deva - 1731, 105, // kjo -> Deva - 1735, 345, // kjp -> Mymr - 1739, 530, // kjt -> Thai - 1743, 100, // kk -> Cyrl - 1746, 10, // kk_AF -> Arab - 1752, 10, // kk_CN -> Arab - 1758, 10, // kk_IR -> Arab - 1764, 10, // kk_MN -> Arab - 1770, 535, // kkf -> Tibt - 1774, 255, // kkh -> Lana - 1778, 105, // kkt -> Deva - 1782, 105, // kle -> Deva - 1786, 10, // klj -> Arab - 1790, 105, // klr -> Deva - 1794, 235, // km -> Khmr - 1797, 105, // kmj -> Deva - 1801, 10, // kmz -> Arab - 1805, 245, // kn -> Knda - 1808, 250, // ko -> Kore - 1811, 100, // koi -> Cyrl - 1815, 105, // kok -> Deva - 1819, 100, // kpt -> Cyrl - 1823, 100, // kpy -> Cyrl - 1827, 475, // kqd -> Syrc - 1831, 120, // kqy -> Ethi - 1835, 105, // kra -> Deva - 1839, 100, // krc -> Cyrl - 1843, 100, // krk -> Cyrl - 1847, 235, // krr -> Khmr - 1851, 105, // kru -> Deva - 1855, 235, // krv -> Khmr - 1859, 10, // ks -> Arab - 1862, 345, // ksu -> Mymr - 1866, 345, // ksw -> Mymr - 1870, 105, // ksz -> Deva - 1874, 120, // ktb -> Ethi - 1878, 10, // ktl -> Arab - 1882, 410, // ktp -> Plrd - 1886, 10, // ku_LB -> Arab - 1892, 260, // kuf -> Laoo - 1896, 100, // kum -> Cyrl - 1900, 100, // kv -> Cyrl - 1903, 100, // kva -> Cyrl - 1907, 345, // kvq -> Mymr - 1911, 345, // kvt -> Mymr - 1915, 10, // kvx -> Arab - 1919, 215, // kvy -> Kali - 1923, 345, // kxf -> Mymr - 1927, 345, // kxk -> Mymr - 1931, 530, // kxm -> Thai - 1935, 10, // kxp -> Arab - 1939, 100, // ky -> Cyrl - 1942, 10, // ky_CN -> Arab - 1948, 215, // kyu -> Kali - 1952, 105, // kyv -> Deva - 1956, 105, // kyw -> Deva - 1960, 270, // lab -> Lina - 1964, 185, // lad -> Hebr - 1968, 105, // lae -> Deva - 1972, 10, // lah -> Arab - 1976, 280, // lbc -> Lisu - 1980, 100, // lbe -> Cyrl - 1984, 105, // lbf -> Deva - 1988, 535, // lbj -> Tibt - 1992, 105, // lbm -> Deva - 1996, 260, // lbo -> Laoo - 2000, 105, // lbr -> Deva - 2004, 530, // lcp -> Thai - 2008, 265, // lep -> Lepc - 2012, 100, // lez -> Cyrl - 2016, 105, // lhm -> Deva - 2020, 475, // lhs -> Syrc - 2024, 105, // lif -> Deva - 2028, 280, // lis -> Lisu - 2032, 535, // lkh -> Tibt - 2036, 10, // lki -> Arab - 2040, 105, // lmh -> Deva - 2044, 515, // lmn -> Telu - 2048, 260, // lo -> Laoo - 2051, 105, // loy -> Deva - 2055, 410, // lpo -> Plrd - 2059, 10, // lrc -> Arab - 2063, 10, // lrk -> Arab - 2067, 10, // lrl -> Arab - 2071, 10, // lsa -> Arab - 2075, 185, // lsd -> Hebr - 2079, 10, // lss -> Arab - 2083, 535, // luk -> Tibt - 2087, 105, // luu -> Deva - 2091, 10, // luv -> Arab - 2095, 10, // luz -> Arab - 2099, 530, // lwl -> Thai - 2103, 530, // lwm -> Thai - 2107, 535, // lya -> Tibt - 2111, 175, // lzh -> Hans - 2115, 105, // mag -> Deva - 2119, 105, // mai -> Deva - 2123, 360, // man_GN -> Nkoo - 2130, 10, // mby -> Arab - 2134, 10, // mde -> Arab - 2138, 100, // mdf -> Cyrl - 2142, 120, // mdx -> Ethi - 2146, 120, // mdy -> Ethi - 2150, 10, // mfa -> Arab - 2154, 10, // mfi -> Arab - 2158, 105, // mgp -> Deva - 2162, 10, // mhj -> Arab - 2166, 295, // mid -> Mand - 2170, 105, // mjl -> Deva - 2174, 320, // mjq -> Mlym - 2178, 320, // mjr -> Mlym - 2182, 105, // mjt -> Deva - 2186, 515, // mju -> Telu - 2190, 320, // mjv -> Mlym - 2194, 105, // mjz -> Deva - 2198, 100, // mk -> Cyrl - 2201, 105, // mkb -> Deva - 2205, 105, // mke -> Deva - 2209, 10, // mki -> Arab - 2213, 530, // mkm -> Thai - 2217, 320, // ml -> Mlym - 2220, 530, // mlf -> Thai - 2224, 100, // mn -> Cyrl - 2227, 330, // mn_CN -> Mong - 2233, 45, // mni -> Beng - 2237, 10, // mnj -> Arab - 2241, 100, // mns -> Cyrl - 2245, 345, // mnw -> Mymr - 2249, 530, // mpz -> Thai - 2253, 105, // mr -> Deva - 2256, 530, // mra -> Thai - 2260, 105, // mrd -> Deva - 2264, 100, // mrj -> Cyrl - 2268, 335, // mro -> Mroo - 2272, 105, // mrr -> Deva - 2276, 10, // ms_CC -> Arab - 2282, 100, // mtm -> Cyrl - 2286, 105, // mtr -> Deva - 2290, 100, // mud -> Cyrl - 2294, 535, // muk -> Tibt - 2298, 105, // mut -> Deva - 2302, 500, // muv -> Taml - 2306, 120, // muz -> Ethi - 2310, 330, // mvf -> Mong - 2314, 10, // mvy -> Arab - 2318, 120, // mvz -> Ethi - 2322, 105, // mwr -> Deva - 2326, 345, // mwt -> Mymr - 2330, 195, // mww -> Hmnp - 2334, 345, // my -> Mymr - 2337, 120, // mym -> Ethi - 2341, 100, // myv -> Cyrl - 2345, 295, // myz -> Mand - 2349, 10, // mzn -> Arab - 2353, 175, // nan -> Hans - 2357, 105, // nao -> Deva - 2361, 105, // ncd -> Deva - 2365, 260, // ncq -> Laoo - 2369, 100, // ndf -> Cyrl - 2373, 105, // ne -> Deva - 2376, 100, // neg -> Cyrl - 2380, 535, // neh -> Tibt - 2384, 570, // nei -> Xsux - 2388, 105, // new -> Deva - 2392, 260, // ngt -> Laoo - 2396, 100, // nio -> Cyrl - 2400, 515, // nit -> Telu - 2404, 100, // niv -> Cyrl - 2408, 10, // nli -> Arab - 2412, 10, // nlm -> Arab - 2416, 105, // nlx -> Deva - 2420, 105, // nmm -> Deva - 2424, 560, // nnp -> Wcho - 2428, 255, // nod -> Lana - 2432, 105, // noe -> Deva - 2436, 100, // nog -> Cyrl - 2440, 105, // noi -> Deva - 2444, 430, // non -> Runr - 2448, 575, // nos -> Yiii - 2452, 535, // npb -> Tibt - 2456, 360, // nqo -> Nkoo - 2460, 575, // nsd -> Yiii - 2464, 575, // nsf -> Yiii - 2468, 65, // nsk -> Cans - 2472, 540, // nst -> Tnsa - 2476, 575, // nsv -> Yiii - 2480, 575, // nty -> Yiii - 2484, 10, // ntz -> Arab - 2488, 355, // nwc -> Newa - 2492, 105, // nwx -> Deva - 2496, 530, // nyl -> Thai - 2500, 10, // nyq -> Arab - 2504, 100, // oaa -> Cyrl - 2508, 100, // oac -> Cyrl - 2512, 475, // oar -> Syrc - 2516, 125, // oav -> Geor - 2520, 405, // obm -> Phnx - 2524, 345, // obr -> Mymr - 2528, 10, // odk -> Arab - 2532, 570, // oht -> Xsux - 2536, 65, // oj -> Cans - 2539, 65, // ojs -> Cans - 2543, 165, // okm -> Hang - 2547, 170, // oko -> Hani - 2551, 235, // okz -> Khmr - 2555, 105, // ola -> Deva - 2559, 535, // ole -> Tibt - 2563, 100, // omk -> Cyrl - 2567, 340, // omp -> Mtei - 2571, 325, // omr -> Modi - 2575, 105, // oon -> Deva - 2579, 385, // or -> Orya - 2582, 515, // ort -> Telu - 2586, 10, // oru -> Arab - 2590, 100, // orv -> Cyrl - 2594, 100, // os -> Cyrl - 2597, 390, // osa -> Osge - 2601, 200, // osc -> Ital - 2605, 205, // osi -> Java - 2609, 10, // ota -> Arab - 2613, 535, // otb -> Tibt - 2617, 380, // otk -> Orkh - 2621, 145, // oty -> Gran - 2625, 160, // pa -> Guru - 2628, 10, // pa_PK -> Arab - 2634, 400, // pal -> Phli - 2638, 100, // paq -> Cyrl - 2642, 10, // pbt -> Arab - 2646, 235, // pcb -> Khmr - 2650, 345, // pce -> Mymr - 2654, 320, // pcf -> Mlym - 2658, 320, // pcg -> Mlym - 2662, 105, // pch -> Deva - 2666, 105, // pci -> Deva - 2670, 515, // pcj -> Telu - 2674, 385, // peg -> Orya - 2678, 565, // peo -> Xpeo - 2682, 230, // pgd -> Khar - 2686, 105, // pgg -> Deva - 2690, 370, // pgl -> Ogam - 2694, 200, // pgn -> Ital - 2698, 105, // phd -> Deva - 2702, 345, // phk -> Mymr - 2706, 10, // phl -> Arab - 2710, 405, // phn -> Phnx - 2714, 260, // pho -> Laoo - 2718, 10, // phr -> Arab - 2722, 530, // pht -> Thai - 2726, 10, // phv -> Arab - 2730, 105, // phw -> Deva - 2734, 455, // pi -> Sinh - 2737, 55, // pka -> Brah - 2741, 320, // pkr -> Mlym - 2745, 10, // plk -> Arab - 2749, 345, // pll -> Mymr - 2753, 55, // pmh -> Brah - 2757, 150, // pnt -> Grek - 2761, 230, // pra -> Khar - 2765, 10, // prc -> Arab - 2769, 10, // prd -> Arab - 2773, 155, // prp -> Gujr - 2777, 530, // prt -> Thai - 2781, 10, // prx -> Arab - 2785, 10, // ps -> Arab - 2788, 10, // psh -> Arab - 2792, 10, // psi -> Arab - 2796, 10, // pst -> Arab - 2800, 105, // pum -> Deva - 2804, 345, // pwo -> Mymr - 2808, 105, // pwr -> Deva - 2812, 530, // pww -> Thai - 2816, 345, // pyx -> Mymr - 2820, 10, // qxq -> Arab - 2824, 105, // raa -> Deva - 2828, 105, // rab -> Deva - 2832, 105, // raf -> Deva - 2836, 45, // rah -> Beng - 2840, 105, // raj -> Deva - 2844, 105, // rav -> Deva - 2848, 345, // rbb -> Mymr - 2852, 10, // rdb -> Arab - 2856, 385, // rei -> Orya - 2860, 425, // rhg -> Rohg - 2864, 105, // rji -> Deva - 2868, 105, // rjs -> Deva - 2872, 235, // rka -> Khmr - 2876, 345, // rki -> Mymr - 2880, 45, // rkt -> Beng - 2884, 20, // rmi -> Armn - 2888, 10, // rmt -> Arab - 2892, 345, // rmz -> Mymr - 2896, 100, // rom_BG -> Cyrl - 2903, 100, // rsk -> Cyrl - 2907, 105, // rtw -> Deva - 2911, 100, // ru -> Cyrl - 2914, 100, // rue -> Cyrl - 2918, 100, // rut -> Cyrl - 2922, 105, // rwr -> Deva - 2926, 220, // ryu -> Kana - 2930, 105, // sa -> Deva - 2933, 100, // sah -> Cyrl - 2937, 435, // sam -> Samr - 2941, 375, // sat -> Olck - 2945, 445, // saz -> Saur - 2949, 10, // sbn -> Arab - 2953, 535, // sbu -> Tibt - 2957, 105, // sck -> Deva - 2961, 10, // scl -> Arab - 2965, 10, // scl_IN -> Arab - 2972, 105, // scp -> Deva - 2976, 260, // sct -> Laoo - 2980, 485, // scu -> Takr - 2984, 150, // scx -> Grek - 2988, 10, // sd -> Arab - 2991, 105, // sd_IN -> Deva - 2997, 10, // sdb -> Arab - 3001, 10, // sdf -> Arab - 3005, 10, // sdg -> Arab - 3009, 10, // sdh -> Arab - 3013, 10, // sds -> Arab - 3017, 100, // sel -> Cyrl - 3021, 410, // sfm -> Plrd - 3025, 370, // sga -> Ogam - 3029, 100, // sgh -> Cyrl - 3033, 105, // sgj -> Deva - 3037, 10, // sgr -> Arab - 3041, 535, // sgt -> Tibt - 3045, 120, // sgw -> Ethi - 3049, 10, // sgy -> Arab - 3053, 10, // shd -> Arab - 3057, 520, // shi -> Tfng - 3061, 10, // shm -> Arab - 3065, 345, // shn -> Mymr - 3069, 10, // shu -> Arab - 3073, 10, // shv -> Arab - 3077, 455, // si -> Sinh - 3080, 100, // sia -> Cyrl - 3084, 535, // sip -> Tibt - 3088, 10, // siy -> Arab - 3092, 10, // siz -> Arab - 3096, 100, // sjd -> Cyrl - 3100, 105, // sjp -> Deva - 3104, 100, // sjt -> Cyrl - 3108, 530, // skb -> Thai - 3112, 105, // skj -> Deva - 3116, 10, // skr -> Arab - 3120, 10, // slq -> Arab - 3124, 575, // smh -> Yiii - 3128, 435, // smp -> Samr - 3132, 235, // smu -> Khmr - 3136, 10, // smy -> Arab - 3140, 510, // soa -> Tavt - 3144, 460, // sog -> Sogd - 3148, 105, // soi -> Deva - 3152, 530, // sou -> Thai - 3156, 535, // spt -> Tibt - 3160, 385, // spv -> Orya - 3164, 10, // sqo -> Arab - 3168, 260, // sqq -> Laoo - 3172, 10, // sqt -> Arab - 3176, 100, // sr -> Cyrl - 3179, 465, // srb -> Sora - 3183, 10, // srh -> Arab - 3187, 105, // srx -> Deva - 3191, 10, // srz -> Arab - 3195, 10, // ssh -> Arab - 3199, 260, // sss -> Laoo - 3203, 10, // sts -> Arab - 3207, 120, // stv -> Ethi - 3211, 100, // sty -> Cyrl - 3215, 105, // suz -> Deva - 3219, 125, // sva -> Geor - 3223, 10, // swb -> Arab - 3227, 170, // swi -> Hani - 3231, 105, // swv -> Deva - 3235, 475, // syc -> Syrc - 3239, 45, // syl -> Beng - 3243, 475, // syn -> Syrc - 3247, 475, // syr -> Syrc - 3251, 105, // syw -> Deva - 3255, 500, // ta -> Taml - 3258, 100, // tab -> Cyrl - 3262, 105, // taj -> Deva - 3266, 480, // tbk -> Tagb - 3270, 535, // tcn -> Tibt - 3274, 345, // tco -> Mymr - 3278, 500, // tcx -> Taml - 3282, 245, // tcy -> Knda - 3286, 520, // tda -> Tfng - 3290, 105, // tdb -> Deva - 3294, 490, // tdd -> Tale - 3298, 105, // tdg -> Deva - 3302, 105, // tdh -> Deva - 3306, 515, // te -> Telu - 3309, 205, // tes -> Java - 3313, 100, // tg -> Cyrl - 3316, 10, // tg_PK -> Arab - 3322, 105, // tge -> Deva - 3326, 535, // tgf -> Tibt - 3330, 530, // th -> Thai - 3333, 105, // the -> Deva - 3337, 105, // thf -> Deva - 3341, 490, // thi -> Tale - 3345, 105, // thl -> Deva - 3349, 530, // thm -> Thai - 3353, 105, // thq -> Deva - 3357, 105, // thr -> Deva - 3361, 105, // ths -> Deva - 3365, 120, // ti -> Ethi - 3368, 120, // tig -> Ethi - 3372, 105, // tij -> Deva - 3376, 100, // tin -> Cyrl - 3380, 345, // tjl -> Mymr - 3384, 10, // tjo -> Arab - 3388, 105, // tkb -> Deva - 3392, 10, // tks -> Arab - 3396, 105, // tkt -> Deva - 3400, 105, // tmk -> Deva - 3404, 475, // tmr -> Syrc - 3408, 60, // tnv -> Cakm - 3412, 10, // tov -> Arab - 3416, 235, // tpu -> Khmr - 3420, 10, // tra -> Arab - 3424, 185, // trg -> Hebr - 3428, 10, // trm -> Arab - 3432, 10, // trw -> Arab - 3436, 150, // tsd -> Grek - 3440, 535, // tsj -> Tibt - 3444, 100, // tt -> Cyrl - 3447, 260, // tth -> Laoo - 3451, 260, // tto -> Laoo - 3455, 530, // tts -> Thai - 3459, 345, // tvn -> Mymr - 3463, 105, // twm -> Deva - 3467, 505, // txg -> Tang - 3471, 545, // txo -> Toto - 3475, 510, // tyr -> Tavt - 3479, 100, // tyv -> Cyrl - 3483, 100, // ude -> Cyrl - 3487, 320, // udg -> Mlym - 3491, 0, // udi -> Aghb - 3495, 100, // udm -> Cyrl - 3499, 10, // ug -> Arab - 3502, 100, // ug_KZ -> Cyrl - 3508, 100, // ug_MN -> Cyrl - 3514, 550, // uga -> Ugar - 3518, 100, // ugh -> Cyrl - 3522, 530, // ugo -> Thai - 3526, 100, // uk -> Cyrl - 3529, 385, // uki -> Orya - 3533, 100, // ulc -> Cyrl - 3537, 45, // unr -> Beng - 3541, 105, // unr_NP -> Deva - 3548, 45, // unx -> Beng - 3552, 10, // ur -> Arab - 3555, 530, // urk -> Thai - 3559, 10, // ush -> Arab - 3563, 150, // uum -> Grek - 3567, 10, // uz_AF -> Arab - 3573, 100, // uz_CN -> Cyrl - 3579, 10, // uzs -> Arab - 3583, 500, // vaa -> Taml - 3587, 10, // vaf -> Arab - 3591, 105, // vah -> Deva - 3595, 555, // vai -> Vaii - 3599, 105, // vas -> Deva - 3603, 105, // vav -> Deva - 3607, 105, // vay -> Deva - 3611, 10, // vgr -> Arab - 3615, 245, // vmd -> Knda - 3619, 10, // vmh -> Arab - 3623, 120, // wal -> Ethi - 3627, 10, // wbk -> Arab - 3631, 515, // wbq -> Telu - 3635, 105, // wbr -> Deva - 3639, 10, // wlo -> Arab - 3643, 105, // wme -> Deva - 3647, 10, // wne -> Arab - 3651, 10, // wni -> Arab - 3655, 130, // wsg -> Gong - 3659, 10, // wsv -> Arab - 3663, 105, // wtm -> Deva - 3667, 175, // wuu -> Hans - 3671, 100, // xal -> Cyrl - 3675, 120, // xan -> Ethi - 3679, 100, // xas -> Cyrl - 3683, 85, // xco -> Chrs - 3687, 70, // xcr -> Cari - 3691, 100, // xdq -> Cyrl - 3695, 10, // xhe -> Arab - 3699, 235, // xhm -> Khmr - 3703, 385, // xis -> Orya - 3707, 10, // xka -> Arab - 3711, 10, // xkc -> Arab - 3715, 10, // xkj -> Arab - 3719, 10, // xkp -> Arab - 3723, 285, // xlc -> Lyci - 3727, 290, // xld -> Lydi - 3731, 115, // xly -> Elym - 3735, 125, // xmf -> Geor - 3739, 300, // xmn -> Mani - 3743, 315, // xmr -> Merc - 3747, 350, // xna -> Narb - 3751, 105, // xnr -> Deva - 3755, 150, // xpg -> Grek - 3759, 370, // xpi -> Ogam - 3763, 100, // xpm -> Cyrl - 3767, 415, // xpr -> Prti - 3771, 100, // xrm -> Cyrl - 3775, 100, // xrn -> Cyrl - 3779, 440, // xsa -> Sarb - 3783, 105, // xsr -> Deva - 3787, 100, // xss -> Cyrl - 3791, 500, // xub -> Taml - 3795, 500, // xuj -> Taml - 3799, 200, // xve -> Ital - 3803, 10, // xvi -> Arab - 3807, 100, // xwo -> Cyrl - 3811, 305, // xzh -> Marc - 3815, 100, // yai -> Cyrl - 3819, 105, // ybh -> Deva - 3823, 105, // ybi -> Deva - 3827, 10, // ydg -> Arab - 3831, 320, // yea -> Mlym - 3835, 150, // yej -> Grek - 3839, 515, // yeu -> Telu - 3843, 410, // ygp -> Plrd - 3847, 185, // yhd -> Hebr - 3851, 185, // yi -> Hebr - 3854, 575, // yig -> Yiii - 3858, 185, // yih -> Hebr - 3862, 575, // yiv -> Yiii - 3866, 100, // ykg -> Cyrl - 3870, 410, // yna -> Plrd - 3874, 100, // ynk -> Cyrl - 3878, 210, // yoi -> Jpan - 3882, 530, // yoy -> Thai - 3886, 100, // yrk -> Cyrl - 3890, 575, // ysd -> Yiii - 3894, 575, // ysn -> Yiii - 3898, 575, // ysp -> Yiii - 3902, 100, // ysr -> Cyrl - 3906, 410, // ysy -> Plrd - 3910, 185, // yud -> Hebr - 3914, 180, // yue -> Hant - 3918, 175, // yue_CN -> Hans - 3925, 100, // yug -> Cyrl - 3929, 100, // yux -> Cyrl - 3933, 410, // ywq -> Plrd - 3937, 410, // ywu -> Plrd - 3941, 535, // zau -> Tibt - 3945, 10, // zba -> Arab - 3949, 170, // zch -> Hani - 3953, 10, // zdj -> Arab - 3957, 170, // zeh -> Hani - 3961, 520, // zen -> Tfng - 3965, 170, // zgb -> Hani - 3969, 520, // zgh -> Tfng - 3973, 170, // zgm -> Hani - 3977, 170, // zgn -> Hani - 3981, 175, // zh -> Hans - 3984, 180, // zh_AU -> Hant - 3990, 180, // zh_BN -> Hant - 3996, 180, // zh_GB -> Hant - 4002, 180, // zh_GF -> Hant - 4008, 180, // zh_HK -> Hant - 4014, 180, // zh_ID -> Hant - 4020, 180, // zh_MO -> Hant - 4026, 180, // zh_PA -> Hant - 4032, 180, // zh_PF -> Hant - 4038, 180, // zh_PH -> Hant - 4044, 180, // zh_SR -> Hant - 4050, 180, // zh_TH -> Hant - 4056, 180, // zh_TW -> Hant - 4062, 180, // zh_US -> Hant - 4068, 180, // zh_VN -> Hant - 4074, 170, // zhd -> Hani - 4078, 365, // zhx -> Nshu - 4082, 100, // zkb -> Cyrl - 4086, 100, // zko -> Cyrl - 4090, 240, // zkt -> Kits - 4094, 100, // zkz -> Cyrl - 4098, 170, // zlj -> Hani - 4102, 170, // zln -> Hani - 4106, 170, // zlq -> Hani - 4110, 170, // zqe -> Hani - 4114, 185, // zrp -> Hebr - 4118, 10, // zum -> Arab - 4122, 170, // zyg -> Hani - 4126, 170, // zyn -> Hani - 4130, 170, // zzj -> Hani + 122, 570, // akk -> Xsux + 126, 100, // akv -> Cyrl + 130, 260, // alk -> Laoo + 134, 320, // all -> Mlym + 138, 100, // alr -> Cyrl + 142, 100, // alt -> Cyrl + 146, 120, // alw -> Ethi + 150, 120, // am -> Ethi + 153, 210, // ams -> Jpan + 157, 475, // amw -> Syrc + 161, 100, // ani -> Cyrl + 165, 105, // anp -> Deva + 169, 105, // anr -> Deva + 173, 120, // anu -> Ethi + 177, 45, // aot -> Beng + 181, 10, // apc -> Arab + 185, 10, // apd -> Arab + 189, 105, // aph -> Deva + 193, 100, // aqc -> Cyrl + 197, 10, // ar -> Arab + 200, 15, // arc -> Armi + 204, 10, // arq -> Arab + 208, 10, // ars -> Arab + 212, 10, // ary -> Arab + 216, 10, // arz -> Arab + 220, 45, // as -> Beng + 223, 450, // ase -> Sgnw + 227, 10, // ask -> Arab + 231, 10, // atn -> Arab + 235, 100, // atv -> Cyrl + 239, 10, // auj -> Arab + 243, 10, // auz -> Arab + 247, 100, // av -> Cyrl + 250, 10, // avd -> Arab + 254, 10, // avl -> Arab + 258, 105, // awa -> Deva + 262, 120, // awn -> Ethi + 266, 20, // axm -> Armn + 270, 10, // ayh -> Arab + 274, 10, // ayl -> Arab + 278, 10, // ayn -> Arab + 282, 10, // ayp -> Arab + 286, 10, // az_IQ -> Arab + 292, 10, // az_IR -> Arab + 298, 100, // az_RU -> Cyrl + 304, 10, // azb -> Arab + 308, 100, // ba -> Cyrl + 311, 10, // bal -> Arab + 315, 105, // bap -> Deva + 319, 30, // bax -> Bamu + 323, 125, // bbl -> Geor + 327, 120, // bcq -> Ethi + 331, 385, // bdv -> Orya + 335, 10, // bdz -> Arab + 339, 100, // be -> Cyrl + 342, 105, // bee -> Deva + 346, 10, // bej -> Arab + 350, 105, // bfb -> Deva + 354, 500, // bfq -> Taml + 358, 10, // bft -> Arab + 362, 535, // bfu -> Tibt + 366, 385, // bfw -> Orya + 370, 105, // bfy -> Deva + 374, 105, // bfz -> Deva + 378, 100, // bg -> Cyrl + 381, 105, // bgc -> Deva + 385, 105, // bgd -> Deva + 389, 10, // bgn -> Arab + 393, 10, // bgp -> Arab + 397, 105, // bgq -> Deva + 401, 105, // bgw -> Deva + 405, 150, // bgx -> Grek + 409, 105, // bha -> Deva + 413, 105, // bhb -> Deva + 417, 105, // bhd -> Deva + 421, 10, // bhe -> Arab + 425, 100, // bhh -> Cyrl + 429, 105, // bhi -> Deva + 433, 105, // bhj -> Deva + 437, 10, // bhm -> Arab + 441, 475, // bhn -> Syrc + 445, 105, // bho -> Deva + 449, 485, // bht -> Takr + 453, 105, // bhu -> Deva + 457, 105, // biy -> Deva + 461, 475, // bjf -> Syrc + 465, 105, // bjj -> Deva + 469, 10, // bjm -> Arab + 473, 345, // blk -> Mymr + 477, 510, // blt -> Tavt + 481, 105, // bmj -> Deva + 485, 45, // bn -> Beng + 488, 105, // bns -> Deva + 492, 535, // bo -> Tibt + 495, 100, // bph -> Cyrl + 499, 105, // bpx -> Deva + 503, 45, // bpy -> Beng + 507, 10, // bqi -> Arab + 511, 105, // bra -> Deva + 515, 235, // brb -> Khmr + 519, 105, // brd -> Deva + 523, 10, // brh -> Arab + 527, 10, // brk -> Arab + 531, 260, // brv -> Laoo + 535, 105, // brx -> Deva + 539, 10, // bsh -> Arab + 543, 10, // bsk -> Arab + 547, 35, // bsq -> Bass + 551, 120, // bst -> Ethi + 555, 40, // btd -> Batk + 559, 40, // btm -> Batk + 563, 105, // btv -> Deva + 567, 100, // bua -> Cyrl + 571, 345, // bwe -> Mymr + 575, 100, // bxm -> Cyrl + 579, 330, // bxu -> Mong + 583, 105, // byh -> Deva + 587, 120, // byn -> Ethi + 591, 105, // byw -> Deva + 595, 530, // bzi -> Thai + 599, 530, // cbn -> Thai + 603, 60, // ccp -> Cakm + 607, 515, // cde -> Telu + 611, 105, // cdh -> Deva + 615, 155, // cdi -> Gujr + 619, 105, // cdj -> Deva + 623, 105, // cdm -> Deva + 627, 175, // cdo -> Hans + 631, 45, // cdz -> Beng + 635, 100, // ce -> Cyrl + 638, 535, // cgk -> Tibt + 642, 10, // chg -> Arab + 646, 100, // chm -> Cyrl + 650, 80, // chr -> Cher + 654, 105, // chx -> Deva + 658, 105, // cih -> Deva + 662, 10, // cja -> Arab + 666, 100, // cji -> Cyrl + 670, 75, // cjm -> Cham + 674, 175, // cjy -> Hans + 678, 10, // ckb -> Arab + 682, 100, // ckt -> Cyrl + 686, 10, // clh -> Arab + 690, 100, // clw -> Cyrl + 694, 470, // cmg -> Soyo + 698, 535, // cna -> Tibt + 702, 175, // cnp -> Hans + 706, 530, // cog -> Thai + 710, 90, // cop -> Copt + 714, 150, // cpg -> Grek + 718, 65, // cr -> Cans + 721, 100, // crh -> Cyrl + 725, 65, // crj -> Cans + 729, 65, // crk -> Cans + 733, 65, // crl -> Cans + 737, 65, // crm -> Cans + 741, 345, // csh -> Mymr + 745, 175, // csp -> Hans + 749, 65, // csw -> Cans + 753, 395, // ctd -> Pauc + 757, 45, // ctg -> Beng + 761, 105, // ctn -> Deva + 765, 500, // ctt -> Taml + 769, 100, // cu -> Cyrl + 772, 255, // cuu -> Lana + 776, 100, // cv -> Cyrl + 779, 175, // czh -> Hans + 783, 185, // czk -> Hebr + 787, 105, // daq -> Deva + 791, 100, // dar -> Cyrl + 795, 10, // dcc -> Arab + 799, 100, // ddo -> Cyrl + 803, 10, // def -> Arab + 807, 10, // deh -> Arab + 811, 45, // der -> Beng + 815, 105, // dhi -> Deva + 819, 155, // dhn -> Gujr + 823, 105, // dho -> Deva + 827, 105, // dhw -> Deva + 831, 535, // dka -> Tibt + 835, 100, // dlg -> Cyrl + 839, 310, // dmf -> Medf + 843, 10, // dmk -> Arab + 847, 10, // dml -> Arab + 851, 100, // dng -> Cyrl + 855, 345, // dnu -> Mymr + 859, 345, // dnv -> Mymr + 863, 105, // doi -> Deva + 867, 120, // dox -> Ethi + 871, 535, // dre -> Tibt + 875, 105, // drq -> Deva + 879, 120, // drs -> Ethi + 883, 105, // dry -> Deva + 887, 385, // dso -> Orya + 891, 105, // dty -> Deva + 895, 155, // dub -> Gujr + 899, 105, // duh -> Deva + 903, 105, // dus -> Deva + 907, 525, // dv -> Thaa + 910, 385, // dwk -> Orya + 914, 105, // dwz -> Deva + 918, 535, // dz -> Tibt + 921, 535, // dzl -> Tibt + 925, 150, // ecr -> Grek + 929, 95, // ecy -> Cprt + 933, 110, // egy -> Egyp + 937, 215, // eky -> Kali + 941, 150, // el -> Grek + 944, 105, // emg -> Deva + 948, 105, // emu -> Deva + 952, 100, // enf -> Cyrl + 956, 100, // enh -> Cyrl + 960, 500, // era -> Taml + 964, 135, // esg -> Gonm + 968, 10, // esh -> Arab + 972, 200, // ett -> Ital + 976, 100, // eve -> Cyrl + 980, 100, // evn -> Cyrl + 984, 10, // fa -> Arab + 987, 10, // fay -> Arab + 991, 10, // faz -> Arab + 995, 10, // fia -> Arab + 999, 105, // fmu -> Deva + 1003, 10, // fub -> Arab + 1007, 175, // gan -> Hans + 1011, 385, // gaq -> Orya + 1015, 155, // gas -> Gujr + 1019, 515, // gau -> Telu + 1023, 385, // gbj -> Orya + 1027, 105, // gbk -> Deva + 1031, 155, // gbl -> Gujr + 1035, 105, // gbm -> Deva + 1039, 10, // gbz -> Arab + 1043, 385, // gdb -> Orya + 1047, 100, // gdo -> Cyrl + 1051, 105, // gdx -> Deva + 1055, 120, // gez -> Ethi + 1059, 10, // ggg -> Arab + 1063, 10, // gha -> Arab + 1067, 105, // ghe -> Deva + 1071, 10, // ghr -> Arab + 1075, 535, // ght -> Tibt + 1079, 10, // gig -> Arab + 1083, 100, // gin -> Cyrl + 1087, 10, // gjk -> Arab + 1091, 10, // gju -> Arab + 1095, 100, // gld -> Cyrl + 1099, 10, // glh -> Arab + 1103, 10, // glk -> Arab + 1107, 120, // gmv -> Ethi + 1111, 275, // gmy -> Linb + 1115, 535, // goe -> Tibt + 1119, 120, // gof -> Ethi + 1123, 105, // gok -> Deva + 1127, 105, // gom -> Deva + 1131, 515, // gon -> Telu + 1135, 140, // got -> Goth + 1139, 105, // gra -> Deva + 1143, 95, // grc -> Cprt + 1147, 45, // grt -> Beng + 1151, 120, // gru -> Ethi + 1155, 155, // gu -> Gujr + 1158, 105, // gvr -> Deva + 1162, 10, // gwc -> Arab + 1166, 10, // gwf -> Arab + 1170, 10, // gwt -> Arab + 1174, 105, // gyo -> Deva + 1178, 10, // gzi -> Arab + 1182, 10, // ha_CM -> Arab + 1188, 10, // ha_SD -> Arab + 1194, 10, // hac -> Arab + 1198, 175, // hak -> Hans + 1202, 120, // har -> Ethi + 1206, 10, // haz -> Arab + 1210, 185, // hbo -> Hebr + 1214, 120, // hdy -> Ethi + 1218, 185, // he -> Hebr + 1221, 105, // hi -> Deva + 1224, 485, // hii -> Takr + 1228, 570, // hit -> Xsux + 1232, 10, // hkh -> Arab + 1236, 105, // hlb -> Deva + 1240, 190, // hlu -> Hluw + 1244, 410, // hmd -> Plrd + 1248, 50, // hmj -> Bopo + 1252, 50, // hmq -> Bopo + 1256, 10, // hnd -> Arab + 1260, 105, // hne -> Deva + 1264, 195, // hnj -> Hmnp + 1268, 260, // hnj_AU -> Laoo + 1275, 260, // hnj_CN -> Laoo + 1282, 260, // hnj_FR -> Laoo + 1289, 260, // hnj_GF -> Laoo + 1296, 260, // hnj_LA -> Laoo + 1303, 260, // hnj_MM -> Laoo + 1310, 260, // hnj_SR -> Laoo + 1317, 260, // hnj_TH -> Laoo + 1324, 260, // hnj_VN -> Laoo + 1331, 10, // hno -> Arab + 1335, 105, // hoc -> Deva + 1339, 10, // hoh -> Arab + 1343, 105, // hoj -> Deva + 1347, 170, // how -> Hani + 1351, 105, // hoy -> Deva + 1355, 345, // hpo -> Mymr + 1359, 475, // hrt -> Syrc + 1363, 10, // hrz -> Arab + 1367, 175, // hsn -> Hans + 1371, 10, // hss -> Arab + 1375, 570, // htx -> Xsux + 1379, 105, // hut -> Deva + 1383, 185, // huy -> Hebr + 1387, 100, // huz -> Cyrl + 1391, 20, // hy -> Armn + 1394, 20, // hyw -> Armn + 1398, 575, // ii -> Yiii + 1401, 285, // imy -> Lyci + 1405, 100, // inh -> Cyrl + 1409, 345, // int -> Mymr + 1413, 120, // ior -> Ethi + 1417, 500, // iru -> Taml + 1421, 10, // isk -> Arab + 1425, 185, // itk -> Hebr + 1429, 100, // itl -> Cyrl + 1433, 65, // iu -> Cans + 1436, 185, // iw -> Hebr + 1439, 210, // ja -> Jpan + 1442, 10, // jad -> Arab + 1446, 10, // jat -> Arab + 1450, 185, // jbe -> Hebr + 1454, 10, // jbn -> Arab + 1458, 100, // jct -> Cyrl + 1462, 535, // jda -> Tibt + 1466, 10, // jdg -> Arab + 1470, 100, // jdt -> Cyrl + 1474, 105, // jee -> Deva + 1478, 125, // jge -> Geor + 1482, 185, // ji -> Hebr + 1485, 165, // jje -> Hang + 1489, 345, // jkm -> Mymr + 1493, 105, // jml -> Deva + 1497, 485, // jna -> Takr + 1501, 10, // jnd -> Arab + 1505, 105, // jnl -> Deva + 1509, 105, // jns -> Deva + 1513, 10, // jog -> Arab + 1517, 185, // jpa -> Hebr + 1521, 185, // jpr -> Hebr + 1525, 185, // jrb -> Hebr + 1529, 10, // jrb_MA -> Arab + 1536, 105, // jul -> Deva + 1540, 385, // jun -> Orya + 1544, 385, // juy -> Orya + 1548, 535, // jya -> Tibt + 1552, 185, // jye -> Hebr + 1556, 125, // ka -> Geor + 1559, 100, // kaa -> Cyrl + 1563, 100, // kap -> Cyrl + 1567, 225, // kaw -> Kawi + 1571, 100, // kbd -> Cyrl + 1575, 10, // kbu -> Arab + 1579, 10, // kby -> Arab + 1583, 100, // kca -> Cyrl + 1587, 45, // kdq -> Beng + 1591, 530, // kdt -> Thai + 1595, 100, // ket -> Cyrl + 1599, 105, // kex -> Deva + 1603, 515, // key -> Telu + 1607, 245, // kfa -> Knda + 1611, 105, // kfb -> Deva + 1615, 515, // kfc -> Telu + 1619, 245, // kfd -> Knda + 1623, 500, // kfe -> Taml + 1627, 320, // kfh -> Mlym + 1631, 500, // kfi -> Taml + 1635, 105, // kfk -> Deva + 1639, 10, // kfm -> Arab + 1643, 105, // kfp -> Deva + 1647, 105, // kfq -> Deva + 1651, 105, // kfr -> Deva + 1655, 105, // kfs -> Deva + 1659, 105, // kfx -> Deva + 1663, 105, // kfy -> Deva + 1667, 105, // kgj -> Deva + 1671, 105, // kgy -> Deva + 1675, 495, // khb -> Talu + 1679, 530, // khf -> Thai + 1683, 535, // khg -> Tibt + 1687, 105, // khn -> Deva + 1691, 345, // kht -> Mymr + 1695, 100, // khv -> Cyrl + 1699, 10, // khw -> Arab + 1703, 105, // kif -> Deva + 1707, 100, // kim -> Cyrl + 1711, 105, // kip -> Deva + 1715, 260, // kjg -> Laoo + 1719, 100, // kjh -> Cyrl + 1723, 105, // kjl -> Deva + 1727, 105, // kjo -> Deva + 1731, 345, // kjp -> Mymr + 1735, 530, // kjt -> Thai + 1739, 100, // kk -> Cyrl + 1742, 10, // kk_AF -> Arab + 1748, 10, // kk_CN -> Arab + 1754, 10, // kk_IR -> Arab + 1760, 10, // kk_MN -> Arab + 1766, 535, // kkf -> Tibt + 1770, 255, // kkh -> Lana + 1774, 105, // kkt -> Deva + 1778, 105, // kle -> Deva + 1782, 10, // klj -> Arab + 1786, 105, // klr -> Deva + 1790, 235, // km -> Khmr + 1793, 105, // kmj -> Deva + 1797, 10, // kmz -> Arab + 1801, 245, // kn -> Knda + 1804, 250, // ko -> Kore + 1807, 100, // koi -> Cyrl + 1811, 105, // kok -> Deva + 1815, 100, // kpt -> Cyrl + 1819, 100, // kpy -> Cyrl + 1823, 475, // kqd -> Syrc + 1827, 120, // kqy -> Ethi + 1831, 105, // kra -> Deva + 1835, 100, // krc -> Cyrl + 1839, 100, // krk -> Cyrl + 1843, 235, // krr -> Khmr + 1847, 105, // kru -> Deva + 1851, 235, // krv -> Khmr + 1855, 10, // ks -> Arab + 1858, 345, // ksu -> Mymr + 1862, 345, // ksw -> Mymr + 1866, 105, // ksz -> Deva + 1870, 120, // ktb -> Ethi + 1874, 10, // ktl -> Arab + 1878, 410, // ktp -> Plrd + 1882, 10, // ku_LB -> Arab + 1888, 260, // kuf -> Laoo + 1892, 100, // kum -> Cyrl + 1896, 100, // kv -> Cyrl + 1899, 100, // kva -> Cyrl + 1903, 345, // kvq -> Mymr + 1907, 345, // kvt -> Mymr + 1911, 10, // kvx -> Arab + 1915, 215, // kvy -> Kali + 1919, 345, // kxf -> Mymr + 1923, 345, // kxk -> Mymr + 1927, 530, // kxm -> Thai + 1931, 10, // kxp -> Arab + 1935, 100, // ky -> Cyrl + 1938, 10, // ky_CN -> Arab + 1944, 215, // kyu -> Kali + 1948, 105, // kyv -> Deva + 1952, 105, // kyw -> Deva + 1956, 270, // lab -> Lina + 1960, 185, // lad -> Hebr + 1964, 105, // lae -> Deva + 1968, 10, // lah -> Arab + 1972, 280, // lbc -> Lisu + 1976, 100, // lbe -> Cyrl + 1980, 105, // lbf -> Deva + 1984, 535, // lbj -> Tibt + 1988, 105, // lbm -> Deva + 1992, 260, // lbo -> Laoo + 1996, 105, // lbr -> Deva + 2000, 530, // lcp -> Thai + 2004, 265, // lep -> Lepc + 2008, 100, // lez -> Cyrl + 2012, 105, // lhm -> Deva + 2016, 475, // lhs -> Syrc + 2020, 105, // lif -> Deva + 2024, 280, // lis -> Lisu + 2028, 535, // lkh -> Tibt + 2032, 10, // lki -> Arab + 2036, 105, // lmh -> Deva + 2040, 515, // lmn -> Telu + 2044, 260, // lo -> Laoo + 2047, 105, // loy -> Deva + 2051, 410, // lpo -> Plrd + 2055, 10, // lrc -> Arab + 2059, 10, // lrk -> Arab + 2063, 10, // lrl -> Arab + 2067, 10, // lsa -> Arab + 2071, 185, // lsd -> Hebr + 2075, 10, // lss -> Arab + 2079, 535, // luk -> Tibt + 2083, 105, // luu -> Deva + 2087, 10, // luv -> Arab + 2091, 10, // luz -> Arab + 2095, 530, // lwl -> Thai + 2099, 530, // lwm -> Thai + 2103, 535, // lya -> Tibt + 2107, 175, // lzh -> Hans + 2111, 105, // mag -> Deva + 2115, 105, // mai -> Deva + 2119, 360, // man_GN -> Nkoo + 2126, 10, // mby -> Arab + 2130, 10, // mde -> Arab + 2134, 100, // mdf -> Cyrl + 2138, 120, // mdx -> Ethi + 2142, 120, // mdy -> Ethi + 2146, 10, // mfa -> Arab + 2150, 10, // mfi -> Arab + 2154, 105, // mgp -> Deva + 2158, 10, // mhj -> Arab + 2162, 295, // mid -> Mand + 2166, 105, // mjl -> Deva + 2170, 320, // mjq -> Mlym + 2174, 320, // mjr -> Mlym + 2178, 105, // mjt -> Deva + 2182, 515, // mju -> Telu + 2186, 320, // mjv -> Mlym + 2190, 105, // mjz -> Deva + 2194, 100, // mk -> Cyrl + 2197, 105, // mkb -> Deva + 2201, 105, // mke -> Deva + 2205, 10, // mki -> Arab + 2209, 530, // mkm -> Thai + 2213, 320, // ml -> Mlym + 2216, 530, // mlf -> Thai + 2220, 100, // mn -> Cyrl + 2223, 330, // mn_CN -> Mong + 2229, 45, // mni -> Beng + 2233, 10, // mnj -> Arab + 2237, 100, // mns -> Cyrl + 2241, 345, // mnw -> Mymr + 2245, 530, // mpz -> Thai + 2249, 105, // mr -> Deva + 2252, 530, // mra -> Thai + 2256, 105, // mrd -> Deva + 2260, 100, // mrj -> Cyrl + 2264, 335, // mro -> Mroo + 2268, 105, // mrr -> Deva + 2272, 10, // ms_CC -> Arab + 2278, 100, // mtm -> Cyrl + 2282, 105, // mtr -> Deva + 2286, 100, // mud -> Cyrl + 2290, 535, // muk -> Tibt + 2294, 105, // mut -> Deva + 2298, 500, // muv -> Taml + 2302, 120, // muz -> Ethi + 2306, 330, // mvf -> Mong + 2310, 10, // mvy -> Arab + 2314, 120, // mvz -> Ethi + 2318, 105, // mwr -> Deva + 2322, 345, // mwt -> Mymr + 2326, 195, // mww -> Hmnp + 2330, 345, // my -> Mymr + 2333, 120, // mym -> Ethi + 2337, 100, // myv -> Cyrl + 2341, 295, // myz -> Mand + 2345, 10, // mzn -> Arab + 2349, 175, // nan -> Hans + 2353, 105, // nao -> Deva + 2357, 105, // ncd -> Deva + 2361, 260, // ncq -> Laoo + 2365, 100, // ndf -> Cyrl + 2369, 105, // ne -> Deva + 2372, 100, // neg -> Cyrl + 2376, 535, // neh -> Tibt + 2380, 570, // nei -> Xsux + 2384, 105, // new -> Deva + 2388, 260, // ngt -> Laoo + 2392, 100, // nio -> Cyrl + 2396, 515, // nit -> Telu + 2400, 100, // niv -> Cyrl + 2404, 10, // nli -> Arab + 2408, 10, // nlm -> Arab + 2412, 105, // nlx -> Deva + 2416, 105, // nmm -> Deva + 2420, 560, // nnp -> Wcho + 2424, 255, // nod -> Lana + 2428, 105, // noe -> Deva + 2432, 100, // nog -> Cyrl + 2436, 105, // noi -> Deva + 2440, 430, // non -> Runr + 2444, 575, // nos -> Yiii + 2448, 535, // npb -> Tibt + 2452, 360, // nqo -> Nkoo + 2456, 575, // nsd -> Yiii + 2460, 575, // nsf -> Yiii + 2464, 65, // nsk -> Cans + 2468, 540, // nst -> Tnsa + 2472, 575, // nsv -> Yiii + 2476, 575, // nty -> Yiii + 2480, 10, // ntz -> Arab + 2484, 355, // nwc -> Newa + 2488, 105, // nwx -> Deva + 2492, 530, // nyl -> Thai + 2496, 10, // nyq -> Arab + 2500, 100, // oaa -> Cyrl + 2504, 100, // oac -> Cyrl + 2508, 475, // oar -> Syrc + 2512, 125, // oav -> Geor + 2516, 405, // obm -> Phnx + 2520, 345, // obr -> Mymr + 2524, 10, // odk -> Arab + 2528, 570, // oht -> Xsux + 2532, 65, // oj -> Cans + 2535, 65, // ojs -> Cans + 2539, 165, // okm -> Hang + 2543, 170, // oko -> Hani + 2547, 235, // okz -> Khmr + 2551, 105, // ola -> Deva + 2555, 535, // ole -> Tibt + 2559, 100, // omk -> Cyrl + 2563, 340, // omp -> Mtei + 2567, 325, // omr -> Modi + 2571, 105, // oon -> Deva + 2575, 385, // or -> Orya + 2578, 515, // ort -> Telu + 2582, 10, // oru -> Arab + 2586, 100, // orv -> Cyrl + 2590, 100, // os -> Cyrl + 2593, 390, // osa -> Osge + 2597, 200, // osc -> Ital + 2601, 205, // osi -> Java + 2605, 10, // ota -> Arab + 2609, 535, // otb -> Tibt + 2613, 380, // otk -> Orkh + 2617, 145, // oty -> Gran + 2621, 160, // pa -> Guru + 2624, 10, // pa_PK -> Arab + 2630, 400, // pal -> Phli + 2634, 100, // paq -> Cyrl + 2638, 10, // pbt -> Arab + 2642, 235, // pcb -> Khmr + 2646, 345, // pce -> Mymr + 2650, 320, // pcf -> Mlym + 2654, 320, // pcg -> Mlym + 2658, 105, // pch -> Deva + 2662, 105, // pci -> Deva + 2666, 515, // pcj -> Telu + 2670, 385, // peg -> Orya + 2674, 565, // peo -> Xpeo + 2678, 230, // pgd -> Khar + 2682, 105, // pgg -> Deva + 2686, 370, // pgl -> Ogam + 2690, 200, // pgn -> Ital + 2694, 105, // phd -> Deva + 2698, 345, // phk -> Mymr + 2702, 10, // phl -> Arab + 2706, 405, // phn -> Phnx + 2710, 260, // pho -> Laoo + 2714, 10, // phr -> Arab + 2718, 530, // pht -> Thai + 2722, 10, // phv -> Arab + 2726, 105, // phw -> Deva + 2730, 455, // pi -> Sinh + 2733, 55, // pka -> Brah + 2737, 320, // pkr -> Mlym + 2741, 10, // plk -> Arab + 2745, 345, // pll -> Mymr + 2749, 55, // pmh -> Brah + 2753, 150, // pnt -> Grek + 2757, 230, // pra -> Khar + 2761, 10, // prc -> Arab + 2765, 10, // prd -> Arab + 2769, 530, // prt -> Thai + 2773, 10, // prx -> Arab + 2777, 10, // ps -> Arab + 2780, 10, // psh -> Arab + 2784, 10, // psi -> Arab + 2788, 10, // pst -> Arab + 2792, 105, // pum -> Deva + 2796, 345, // pwo -> Mymr + 2800, 105, // pwr -> Deva + 2804, 530, // pww -> Thai + 2808, 345, // pyx -> Mymr + 2812, 10, // qxq -> Arab + 2816, 105, // raa -> Deva + 2820, 105, // rab -> Deva + 2824, 105, // raf -> Deva + 2828, 45, // rah -> Beng + 2832, 105, // raj -> Deva + 2836, 105, // rav -> Deva + 2840, 345, // rbb -> Mymr + 2844, 10, // rdb -> Arab + 2848, 385, // rei -> Orya + 2852, 425, // rhg -> Rohg + 2856, 105, // rji -> Deva + 2860, 105, // rjs -> Deva + 2864, 235, // rka -> Khmr + 2868, 345, // rki -> Mymr + 2872, 45, // rkt -> Beng + 2876, 20, // rmi -> Armn + 2880, 10, // rmt -> Arab + 2884, 345, // rmz -> Mymr + 2888, 100, // rom_BG -> Cyrl + 2895, 100, // rsk -> Cyrl + 2899, 105, // rtw -> Deva + 2903, 100, // ru -> Cyrl + 2906, 100, // rue -> Cyrl + 2910, 100, // rut -> Cyrl + 2914, 105, // rwr -> Deva + 2918, 220, // ryu -> Kana + 2922, 105, // sa -> Deva + 2925, 100, // sah -> Cyrl + 2929, 435, // sam -> Samr + 2933, 375, // sat -> Olck + 2937, 445, // saz -> Saur + 2941, 10, // sbn -> Arab + 2945, 535, // sbu -> Tibt + 2949, 105, // sck -> Deva + 2953, 10, // scl -> Arab + 2957, 10, // scl_IN -> Arab + 2964, 105, // scp -> Deva + 2968, 260, // sct -> Laoo + 2972, 485, // scu -> Takr + 2976, 150, // scx -> Grek + 2980, 10, // sd -> Arab + 2983, 105, // sd_IN -> Deva + 2989, 10, // sdb -> Arab + 2993, 10, // sdf -> Arab + 2997, 10, // sdg -> Arab + 3001, 10, // sdh -> Arab + 3005, 10, // sds -> Arab + 3009, 100, // sel -> Cyrl + 3013, 410, // sfm -> Plrd + 3017, 370, // sga -> Ogam + 3021, 100, // sgh -> Cyrl + 3025, 105, // sgj -> Deva + 3029, 10, // sgr -> Arab + 3033, 535, // sgt -> Tibt + 3037, 120, // sgw -> Ethi + 3041, 10, // sgy -> Arab + 3045, 10, // shd -> Arab + 3049, 520, // shi -> Tfng + 3053, 10, // shm -> Arab + 3057, 345, // shn -> Mymr + 3061, 10, // shu -> Arab + 3065, 10, // shv -> Arab + 3069, 455, // si -> Sinh + 3072, 100, // sia -> Cyrl + 3076, 535, // sip -> Tibt + 3080, 10, // siy -> Arab + 3084, 10, // siz -> Arab + 3088, 100, // sjd -> Cyrl + 3092, 105, // sjp -> Deva + 3096, 100, // sjt -> Cyrl + 3100, 530, // skb -> Thai + 3104, 105, // skj -> Deva + 3108, 10, // skr -> Arab + 3112, 575, // smh -> Yiii + 3116, 435, // smp -> Samr + 3120, 235, // smu -> Khmr + 3124, 10, // smy -> Arab + 3128, 510, // soa -> Tavt + 3132, 460, // sog -> Sogd + 3136, 105, // soi -> Deva + 3140, 530, // sou -> Thai + 3144, 535, // spt -> Tibt + 3148, 385, // spv -> Orya + 3152, 10, // sqo -> Arab + 3156, 260, // sqq -> Laoo + 3160, 10, // sqt -> Arab + 3164, 100, // sr -> Cyrl + 3167, 465, // srb -> Sora + 3171, 10, // srh -> Arab + 3175, 105, // srx -> Deva + 3179, 10, // srz -> Arab + 3183, 10, // ssh -> Arab + 3187, 260, // sss -> Laoo + 3191, 10, // sts -> Arab + 3195, 120, // stv -> Ethi + 3199, 100, // sty -> Cyrl + 3203, 105, // suz -> Deva + 3207, 125, // sva -> Geor + 3211, 10, // swb -> Arab + 3215, 170, // swi -> Hani + 3219, 105, // swv -> Deva + 3223, 475, // syc -> Syrc + 3227, 45, // syl -> Beng + 3231, 475, // syn -> Syrc + 3235, 475, // syr -> Syrc + 3239, 105, // syw -> Deva + 3243, 500, // ta -> Taml + 3246, 100, // tab -> Cyrl + 3250, 105, // taj -> Deva + 3254, 480, // tbk -> Tagb + 3258, 535, // tcn -> Tibt + 3262, 345, // tco -> Mymr + 3266, 500, // tcx -> Taml + 3270, 245, // tcy -> Knda + 3274, 520, // tda -> Tfng + 3278, 105, // tdb -> Deva + 3282, 490, // tdd -> Tale + 3286, 105, // tdg -> Deva + 3290, 105, // tdh -> Deva + 3294, 515, // te -> Telu + 3297, 205, // tes -> Java + 3301, 100, // tg -> Cyrl + 3304, 10, // tg_PK -> Arab + 3310, 105, // tge -> Deva + 3314, 535, // tgf -> Tibt + 3318, 530, // th -> Thai + 3321, 105, // the -> Deva + 3325, 105, // thf -> Deva + 3329, 490, // thi -> Tale + 3333, 105, // thl -> Deva + 3337, 530, // thm -> Thai + 3341, 105, // thq -> Deva + 3345, 105, // thr -> Deva + 3349, 105, // ths -> Deva + 3353, 120, // ti -> Ethi + 3356, 120, // tig -> Ethi + 3360, 105, // tij -> Deva + 3364, 100, // tin -> Cyrl + 3368, 345, // tjl -> Mymr + 3372, 10, // tjo -> Arab + 3376, 105, // tkb -> Deva + 3380, 10, // tks -> Arab + 3384, 105, // tkt -> Deva + 3388, 475, // tmr -> Syrc + 3392, 60, // tnv -> Cakm + 3396, 10, // tov -> Arab + 3400, 235, // tpu -> Khmr + 3404, 10, // tra -> Arab + 3408, 185, // trg -> Hebr + 3412, 10, // trm -> Arab + 3416, 10, // trw -> Arab + 3420, 150, // tsd -> Grek + 3424, 535, // tsj -> Tibt + 3428, 100, // tt -> Cyrl + 3431, 260, // tth -> Laoo + 3435, 260, // tto -> Laoo + 3439, 530, // tts -> Thai + 3443, 345, // tvn -> Mymr + 3447, 105, // twm -> Deva + 3451, 505, // txg -> Tang + 3455, 545, // txo -> Toto + 3459, 510, // tyr -> Tavt + 3463, 100, // tyv -> Cyrl + 3467, 100, // ude -> Cyrl + 3471, 320, // udg -> Mlym + 3475, 0, // udi -> Aghb + 3479, 100, // udm -> Cyrl + 3483, 10, // ug -> Arab + 3486, 100, // ug_KZ -> Cyrl + 3492, 100, // ug_MN -> Cyrl + 3498, 550, // uga -> Ugar + 3502, 100, // ugh -> Cyrl + 3506, 530, // ugo -> Thai + 3510, 100, // uk -> Cyrl + 3513, 385, // uki -> Orya + 3517, 100, // ulc -> Cyrl + 3521, 45, // unr -> Beng + 3525, 105, // unr_NP -> Deva + 3532, 45, // unx -> Beng + 3536, 10, // ur -> Arab + 3539, 530, // urk -> Thai + 3543, 10, // ush -> Arab + 3547, 150, // uum -> Grek + 3551, 10, // uz_AF -> Arab + 3557, 100, // uz_CN -> Cyrl + 3563, 10, // uzs -> Arab + 3567, 500, // vaa -> Taml + 3571, 10, // vaf -> Arab + 3575, 105, // vah -> Deva + 3579, 555, // vai -> Vaii + 3583, 105, // vas -> Deva + 3587, 105, // vav -> Deva + 3591, 105, // vay -> Deva + 3595, 10, // vgr -> Arab + 3599, 245, // vmd -> Knda + 3603, 10, // vmh -> Arab + 3607, 120, // wal -> Ethi + 3611, 10, // wbk -> Arab + 3615, 515, // wbq -> Telu + 3619, 105, // wbr -> Deva + 3623, 10, // wlo -> Arab + 3627, 105, // wme -> Deva + 3631, 10, // wne -> Arab + 3635, 10, // wni -> Arab + 3639, 130, // wsg -> Gong + 3643, 10, // wsv -> Arab + 3647, 105, // wtm -> Deva + 3651, 175, // wuu -> Hans + 3655, 100, // xal -> Cyrl + 3659, 120, // xan -> Ethi + 3663, 100, // xas -> Cyrl + 3667, 85, // xco -> Chrs + 3671, 70, // xcr -> Cari + 3675, 100, // xdq -> Cyrl + 3679, 10, // xhe -> Arab + 3683, 235, // xhm -> Khmr + 3687, 385, // xis -> Orya + 3691, 10, // xka -> Arab + 3695, 10, // xkc -> Arab + 3699, 10, // xkj -> Arab + 3703, 10, // xkp -> Arab + 3707, 285, // xlc -> Lyci + 3711, 290, // xld -> Lydi + 3715, 115, // xly -> Elym + 3719, 125, // xmf -> Geor + 3723, 300, // xmn -> Mani + 3727, 315, // xmr -> Merc + 3731, 350, // xna -> Narb + 3735, 105, // xnr -> Deva + 3739, 150, // xpg -> Grek + 3743, 370, // xpi -> Ogam + 3747, 100, // xpm -> Cyrl + 3751, 415, // xpr -> Prti + 3755, 100, // xrm -> Cyrl + 3759, 100, // xrn -> Cyrl + 3763, 440, // xsa -> Sarb + 3767, 105, // xsr -> Deva + 3771, 500, // xub -> Taml + 3775, 500, // xuj -> Taml + 3779, 200, // xve -> Ital + 3783, 10, // xvi -> Arab + 3787, 100, // xwo -> Cyrl + 3791, 305, // xzh -> Marc + 3795, 100, // yai -> Cyrl + 3799, 105, // ybh -> Deva + 3803, 105, // ybi -> Deva + 3807, 10, // ydg -> Arab + 3811, 320, // yea -> Mlym + 3815, 150, // yej -> Grek + 3819, 515, // yeu -> Telu + 3823, 410, // ygp -> Plrd + 3827, 185, // yhd -> Hebr + 3831, 185, // yi -> Hebr + 3834, 575, // yig -> Yiii + 3838, 185, // yih -> Hebr + 3842, 575, // yiv -> Yiii + 3846, 100, // ykg -> Cyrl + 3850, 410, // yna -> Plrd + 3854, 100, // ynk -> Cyrl + 3858, 210, // yoi -> Jpan + 3862, 530, // yoy -> Thai + 3866, 100, // yrk -> Cyrl + 3870, 575, // ysd -> Yiii + 3874, 575, // ysn -> Yiii + 3878, 575, // ysp -> Yiii + 3882, 100, // ysr -> Cyrl + 3886, 410, // ysy -> Plrd + 3890, 185, // yud -> Hebr + 3894, 180, // yue -> Hant + 3898, 175, // yue_CN -> Hans + 3905, 100, // yug -> Cyrl + 3909, 100, // yux -> Cyrl + 3913, 410, // ywq -> Plrd + 3917, 410, // ywu -> Plrd + 3921, 535, // zau -> Tibt + 3925, 10, // zba -> Arab + 3929, 170, // zch -> Hani + 3933, 10, // zdj -> Arab + 3937, 170, // zeh -> Hani + 3941, 520, // zen -> Tfng + 3945, 170, // zgb -> Hani + 3949, 520, // zgh -> Tfng + 3953, 170, // zgm -> Hani + 3957, 170, // zgn -> Hani + 3961, 175, // zh -> Hans + 3964, 180, // zh_AU -> Hant + 3970, 180, // zh_BN -> Hant + 3976, 180, // zh_GB -> Hant + 3982, 180, // zh_GF -> Hant + 3988, 180, // zh_HK -> Hant + 3994, 180, // zh_ID -> Hant + 4000, 180, // zh_MO -> Hant + 4006, 180, // zh_PA -> Hant + 4012, 180, // zh_PF -> Hant + 4018, 180, // zh_PH -> Hant + 4024, 180, // zh_SR -> Hant + 4030, 180, // zh_TH -> Hant + 4036, 180, // zh_TW -> Hant + 4042, 180, // zh_US -> Hant + 4048, 180, // zh_VN -> Hant + 4054, 170, // zhd -> Hani + 4058, 365, // zhx -> Nshu + 4062, 100, // zko -> Cyrl + 4066, 240, // zkt -> Kits + 4070, 100, // zkz -> Cyrl + 4074, 170, // zlj -> Hani + 4078, 170, // zln -> Hani + 4082, 170, // zlq -> Hani + 4086, 170, // zqe -> Hani + 4090, 185, // zrp -> Hebr + 4094, 10, // zum -> Arab + 4098, 170, // zyg -> Hani + 4102, 170, // zyn -> Hani + 4106, 170, // zzj -> Hani }; //====================================================================== diff --git a/deps/icu-small/source/common/localematcher.cpp b/deps/icu-small/source/common/localematcher.cpp index 6fc578af118bc0..8aae596bc8d7c1 100644 --- a/deps/icu-small/source/common/localematcher.cpp +++ b/deps/icu-small/source/common/localematcher.cpp @@ -4,6 +4,8 @@ // localematcher.cpp // created: 2019may08 Markus W. Scherer +#include + #include "unicode/utypes.h" #include "unicode/localebuilder.h" #include "unicode/localematcher.h" @@ -302,7 +304,7 @@ LocaleMatcher LocaleMatcher::Builder::build(UErrorCode &errorCode) const { namespace { -LSR getMaximalLsrOrUnd(const XLikelySubtags &likelySubtags, const Locale &locale, +LSR getMaximalLsrOrUnd(const LikelySubtags &likelySubtags, const Locale &locale, UErrorCode &errorCode) { if (U_FAILURE(errorCode) || locale.isBogus() || *locale.getName() == 0 /* "und" */) { return UND_LSR; @@ -338,7 +340,7 @@ int32_t LocaleMatcher::putIfAbsent(const LSR &lsr, int32_t i, int32_t suppLength } LocaleMatcher::LocaleMatcher(const Builder &builder, UErrorCode &errorCode) : - likelySubtags(*XLikelySubtags::getSingleton(errorCode)), + likelySubtags(*LikelySubtags::getSingleton(errorCode)), localeDistance(*LocaleDistance::getSingleton(errorCode)), thresholdDistance(builder.thresholdDistance_), demotionPerDesiredLocale(0), @@ -551,7 +553,7 @@ LocaleMatcher &LocaleMatcher::operator=(LocaleMatcher &&src) noexcept { class LocaleLsrIterator { public: - LocaleLsrIterator(const XLikelySubtags &likelySubtags, Locale::Iterator &locales, + LocaleLsrIterator(const LikelySubtags &likelySubtags, Locale::Iterator &locales, ULocMatchLifetime lifetime) : likelySubtags(likelySubtags), locales(locales), lifetime(lifetime) {} @@ -596,7 +598,7 @@ class LocaleLsrIterator { } private: - const XLikelySubtags &likelySubtags; + const LikelySubtags &likelySubtags; Locale::Iterator &locales; ULocMatchLifetime lifetime; const Locale *current = nullptr, *remembered = nullptr; @@ -605,10 +607,11 @@ class LocaleLsrIterator { const Locale *LocaleMatcher::getBestMatch(const Locale &desiredLocale, UErrorCode &errorCode) const { if (U_FAILURE(errorCode)) { return nullptr; } - int32_t suppIndex = getBestSuppIndex( + std::optional suppIndex = getBestSuppIndex( getMaximalLsrOrUnd(likelySubtags, desiredLocale, errorCode), nullptr, errorCode); - return U_SUCCESS(errorCode) && suppIndex >= 0 ? supportedLocales[suppIndex] : defaultLocale; + return U_SUCCESS(errorCode) && suppIndex.has_value() ? supportedLocales[*suppIndex] + : defaultLocale; } const Locale *LocaleMatcher::getBestMatch(Locale::Iterator &desiredLocales, @@ -618,12 +621,14 @@ const Locale *LocaleMatcher::getBestMatch(Locale::Iterator &desiredLocales, return defaultLocale; } LocaleLsrIterator lsrIter(likelySubtags, desiredLocales, ULOCMATCH_TEMPORARY_LOCALES); - int32_t suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode); - return U_SUCCESS(errorCode) && suppIndex >= 0 ? supportedLocales[suppIndex] : defaultLocale; + std::optional suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode); + return U_SUCCESS(errorCode) && suppIndex.has_value() ? supportedLocales[*suppIndex] + : defaultLocale; } const Locale *LocaleMatcher::getBestMatchForListString( StringPiece desiredLocaleList, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return nullptr; } LocalePriorityList list(desiredLocaleList, errorCode); LocalePriorityList::Iterator iter = list.iterator(); return getBestMatch(iter, errorCode); @@ -634,13 +639,13 @@ LocaleMatcher::Result LocaleMatcher::getBestMatchResult( if (U_FAILURE(errorCode)) { return Result(nullptr, defaultLocale, -1, -1, false); } - int32_t suppIndex = getBestSuppIndex( + std::optional suppIndex = getBestSuppIndex( getMaximalLsrOrUnd(likelySubtags, desiredLocale, errorCode), nullptr, errorCode); - if (U_FAILURE(errorCode) || suppIndex < 0) { + if (U_FAILURE(errorCode) || !suppIndex.has_value()) { return Result(nullptr, defaultLocale, -1, -1, false); } else { - return Result(&desiredLocale, supportedLocales[suppIndex], 0, suppIndex, false); + return Result(&desiredLocale, supportedLocales[*suppIndex], 0, *suppIndex, false); } } @@ -650,18 +655,19 @@ LocaleMatcher::Result LocaleMatcher::getBestMatchResult( return Result(nullptr, defaultLocale, -1, -1, false); } LocaleLsrIterator lsrIter(likelySubtags, desiredLocales, ULOCMATCH_TEMPORARY_LOCALES); - int32_t suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode); - if (U_FAILURE(errorCode) || suppIndex < 0) { + std::optional suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode); + if (U_FAILURE(errorCode) || !suppIndex.has_value()) { return Result(nullptr, defaultLocale, -1, -1, false); } else { - return Result(lsrIter.orphanRemembered(), supportedLocales[suppIndex], - lsrIter.getBestDesiredIndex(), suppIndex, true); + return Result(lsrIter.orphanRemembered(), supportedLocales[*suppIndex], + lsrIter.getBestDesiredIndex(), *suppIndex, true); } } -int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remainingIter, - UErrorCode &errorCode) const { - if (U_FAILURE(errorCode)) { return -1; } +std::optional LocaleMatcher::getBestSuppIndex(LSR desiredLSR, + LocaleLsrIterator *remainingIter, + UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return std::nullopt; } int32_t desiredIndex = 0; int32_t bestSupportedLsrIndex = -1; for (int32_t bestShiftedDistance = LocaleDistance::shiftDistance(thresholdDistance);;) { @@ -684,7 +690,7 @@ int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remai bestShiftedDistance = LocaleDistance::getShiftedDistance(bestIndexAndDistance); if (remainingIter != nullptr) { remainingIter->rememberCurrent(desiredIndex, errorCode); - if (U_FAILURE(errorCode)) { return -1; } + if (U_FAILURE(errorCode)) { return std::nullopt; } } bestSupportedLsrIndex = LocaleDistance::getIndex(bestIndexAndDistance); } @@ -695,20 +701,21 @@ int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remai break; } desiredLSR = remainingIter->next(errorCode); - if (U_FAILURE(errorCode)) { return -1; } + if (U_FAILURE(errorCode)) { return std::nullopt; } ++desiredIndex; } if (bestSupportedLsrIndex < 0) { // no good match - return -1; + return std::nullopt; } return supportedIndexes[bestSupportedLsrIndex]; } UBool LocaleMatcher::isMatch(const Locale &desired, const Locale &supported, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return false; } LSR suppLSR = getMaximalLsrOrUnd(likelySubtags, supported, errorCode); - if (U_FAILURE(errorCode)) { return 0; } + if (U_FAILURE(errorCode)) { return false; } const LSR *pSuppLSR = &suppLSR; int32_t indexAndDistance = localeDistance.getBestIndexAndDistance( getMaximalLsrOrUnd(likelySubtags, desired, errorCode), @@ -718,9 +725,10 @@ UBool LocaleMatcher::isMatch(const Locale &desired, const Locale &supported, } double LocaleMatcher::internalMatch(const Locale &desired, const Locale &supported, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return 0.; } // Returns the inverse of the distance: That is, 1-distance(desired, supported). LSR suppLSR = getMaximalLsrOrUnd(likelySubtags, supported, errorCode); - if (U_FAILURE(errorCode)) { return 0; } + if (U_FAILURE(errorCode)) { return 0.; } const LSR *pSuppLSR = &suppLSR; int32_t indexAndDistance = localeDistance.getBestIndexAndDistance( getMaximalLsrOrUnd(likelySubtags, desired, errorCode), diff --git a/deps/icu-small/source/common/localeprioritylist.cpp b/deps/icu-small/source/common/localeprioritylist.cpp index e5ba0a3c777aea..8ca70b143240a3 100644 --- a/deps/icu-small/source/common/localeprioritylist.cpp +++ b/deps/icu-small/source/common/localeprioritylist.cpp @@ -21,13 +21,13 @@ U_NAMESPACE_BEGIN namespace { int32_t hashLocale(const UHashTok token) { - auto *locale = static_cast(token.pointer); + const auto* locale = static_cast(token.pointer); return locale->hashCode(); } UBool compareLocales(const UHashTok t1, const UHashTok t2) { - auto *l1 = static_cast(t1.pointer); - auto *l2 = static_cast(t2.pointer); + const auto* l1 = static_cast(t1.pointer); + const auto* l2 = static_cast(t2.pointer); return *l1 == *l2; } diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index 0ea20939888d0c..4a2600e88c5916 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -39,14 +39,10 @@ static icu::Locale* availableLocaleList = nullptr; static int32_t availableLocaleListCount; static icu::UInitOnce gInitOnceLocale {}; -U_NAMESPACE_END - -U_CDECL_BEGIN +namespace { -static UBool U_CALLCONV locale_available_cleanup() +UBool U_CALLCONV locale_available_cleanup() { - U_NAMESPACE_USE - if (availableLocaleList) { delete []availableLocaleList; availableLocaleList = nullptr; @@ -57,9 +53,7 @@ static UBool U_CALLCONV locale_available_cleanup() return true; } -U_CDECL_END - -U_NAMESPACE_BEGIN +} // namespace void U_CALLCONV locale_available_init() { // This function is a friend of class Locale. @@ -107,10 +101,9 @@ icu::UInitOnce ginstalledLocalesInitOnce {}; class AvailableLocalesSink : public ResourceSink { public: void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) override { + if (U_FAILURE(status)) { return; } ResourceTable resIndexTable = value.getTable(status); - if (U_FAILURE(status)) { - return; - } + if (U_FAILURE(status)) { return; } for (int32_t i = 0; resIndexTable.getKeyAndValue(i, key, value); ++i) { ULocAvailableType type; if (uprv_strcmp(key, "InstalledLocales") == 0) { @@ -144,7 +137,8 @@ class AvailableLocalesStringEnumeration : public StringEnumeration { AvailableLocalesStringEnumeration(ULocAvailableType type) : fType(type) { } - const char* next(int32_t *resultLength, UErrorCode&) override { + const char* next(int32_t *resultLength, UErrorCode &status) override { + if (U_FAILURE(status)) { return nullptr; } ULocAvailableType actualType = fType; int32_t actualIndex = fIndex++; @@ -176,11 +170,13 @@ class AvailableLocalesStringEnumeration : public StringEnumeration { return result; } - void reset(UErrorCode&) override { + void reset(UErrorCode &status) override { + if (U_FAILURE(status)) { return; } fIndex = 0; } - int32_t count(UErrorCode&) const override { + int32_t count(UErrorCode &status) const override { + if (U_FAILURE(status)) { return 0; } if (fType == ULOC_AVAILABLE_WITH_LEGACY_ALIASES) { return gAvailableLocaleCounts[ULOC_AVAILABLE_DEFAULT] + gAvailableLocaleCounts[ULOC_AVAILABLE_ONLY_LEGACY_ALIASES]; @@ -196,7 +192,7 @@ class AvailableLocalesStringEnumeration : public StringEnumeration { /* ### Get available **************************************************/ -static UBool U_CALLCONV uloc_cleanup() { +UBool U_CALLCONV uloc_cleanup() { for (int32_t i = 0; i < UPRV_LENGTHOF(gAvailableLocaleNames); i++) { uprv_free(gAvailableLocaleNames[i]); gAvailableLocaleNames[i] = nullptr; @@ -209,7 +205,7 @@ static UBool U_CALLCONV uloc_cleanup() { // Load Installed Locales. This function will be called exactly once // via the initOnce mechanism. -static void U_CALLCONV loadInstalledLocales(UErrorCode& status) { +void U_CALLCONV loadInstalledLocales(UErrorCode& status) { ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup); icu::LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "res_index", &status)); @@ -267,4 +263,3 @@ uloc_openAvailableByType(ULocAvailableType type, UErrorCode* status) { } return uenum_openFromStringEnumeration(result.orphan(), status); } - diff --git a/deps/icu-small/source/common/locbased.cpp b/deps/icu-small/source/common/locbased.cpp index adcf2f843c0b26..832bc3e88b142c 100644 --- a/deps/icu-small/source/common/locbased.cpp +++ b/deps/icu-small/source/common/locbased.cpp @@ -17,7 +17,7 @@ U_NAMESPACE_BEGIN Locale LocaleBased::getLocale(ULocDataLocaleType type, UErrorCode& status) const { const char* id = getLocaleID(type, status); - return Locale((id != 0) ? id : ""); + return Locale(id != nullptr ? id : ""); } const char* LocaleBased::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { @@ -37,11 +37,11 @@ const char* LocaleBased::getLocaleID(ULocDataLocaleType type, UErrorCode& status } void LocaleBased::setLocaleIDs(const char* validID, const char* actualID) { - if (validID != 0) { + if (validID != nullptr) { uprv_strncpy(valid, validID, ULOC_FULLNAME_CAPACITY); valid[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate } - if (actualID != 0) { + if (actualID != nullptr) { uprv_strncpy(actual, actualID, ULOC_FULLNAME_CAPACITY); actual[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate } diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index 3ec1b81c8127ab..0be069357af710 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -26,7 +26,6 @@ #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/ustring.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -60,7 +59,7 @@ Locale::getDisplayLanguage(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -72,7 +71,7 @@ Locale::getDisplayLanguage(const Locale &displayLocale, if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -100,7 +99,7 @@ Locale::getDisplayScript(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -112,7 +111,7 @@ Locale::getDisplayScript(const Locale &displayLocale, if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -140,7 +139,7 @@ Locale::getDisplayCountry(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -152,7 +151,7 @@ Locale::getDisplayCountry(const Locale &displayLocale, if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -180,7 +179,7 @@ Locale::getDisplayVariant(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -192,7 +191,7 @@ Locale::getDisplayVariant(const Locale &displayLocale, if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -220,7 +219,7 @@ Locale::getDisplayName(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -232,7 +231,7 @@ Locale::getDisplayName(const Locale &displayLocale, if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } @@ -276,50 +275,53 @@ U_NAMESPACE_END U_NAMESPACE_USE +namespace { + /* ### Constants **************************************************/ /* These strings describe the resources we attempt to load from the locale ResourceBundle data file.*/ -static const char _kLanguages[] = "Languages"; -static const char _kScripts[] = "Scripts"; -static const char _kScriptsStandAlone[] = "Scripts%stand-alone"; -static const char _kCountries[] = "Countries"; -static const char _kVariants[] = "Variants"; -static const char _kKeys[] = "Keys"; -static const char _kTypes[] = "Types"; -//static const char _kRootName[] = "root"; -static const char _kCurrency[] = "currency"; -static const char _kCurrencies[] = "Currencies"; -static const char _kLocaleDisplayPattern[] = "localeDisplayPattern"; -static const char _kPattern[] = "pattern"; -static const char _kSeparator[] = "separator"; +constexpr char _kLanguages[] = "Languages"; +constexpr char _kScripts[] = "Scripts"; +constexpr char _kScriptsStandAlone[] = "Scripts%stand-alone"; +constexpr char _kCountries[] = "Countries"; +constexpr char _kVariants[] = "Variants"; +constexpr char _kKeys[] = "Keys"; +constexpr char _kTypes[] = "Types"; +//constexpr char _kRootName[] = "root"; +constexpr char _kCurrency[] = "currency"; +constexpr char _kCurrencies[] = "Currencies"; +constexpr char _kLocaleDisplayPattern[] = "localeDisplayPattern"; +constexpr char _kPattern[] = "pattern"; +constexpr char _kSeparator[] = "separator"; /* ### Display name **************************************************/ -static int32_t +int32_t _getStringOrCopyKey(const char *path, const char *locale, const char *tableKey, const char* subTableKey, const char *itemKey, const char *substitute, char16_t *dest, int32_t destCapacity, - UErrorCode *pErrorCode) { + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return 0; } const char16_t *s = nullptr; int32_t length = 0; if(itemKey==nullptr) { /* top-level item: normal resource bundle access */ - icu::LocalUResourceBundlePointer rb(ures_open(path, locale, pErrorCode)); + icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode)); - if(U_SUCCESS(*pErrorCode)) { - s=ures_getStringByKey(rb.getAlias(), tableKey, &length, pErrorCode); + if(U_SUCCESS(errorCode)) { + s=ures_getStringByKey(rb.getAlias(), tableKey, &length, &errorCode); /* see comment about closing rb near "return item;" in _res_getTableStringWithFallback() */ } } else { bool isLanguageCode = (uprv_strncmp(tableKey, _kLanguages, 9) == 0); /* Language code should not be a number. If it is, set the error code. */ if (isLanguageCode && uprv_strtol(itemKey, nullptr, 10)) { - *pErrorCode = U_MISSING_RESOURCE_ERROR; + errorCode = U_MISSING_RESOURCE_ERROR; } else { /* second-level item, use special fallback */ s=uloc_getTableStringWithFallback(path, locale, @@ -327,22 +329,22 @@ _getStringOrCopyKey(const char *path, const char *locale, subTableKey, itemKey, &length, - pErrorCode); - if (U_FAILURE(*pErrorCode) && isLanguageCode && itemKey != nullptr) { + &errorCode); + if (U_FAILURE(errorCode) && isLanguageCode && itemKey != nullptr) { // convert itemKey locale code to canonical form and try again, ICU-20870 - *pErrorCode = U_ZERO_ERROR; + errorCode = U_ZERO_ERROR; Locale canonKey = Locale::createCanonical(itemKey); s=uloc_getTableStringWithFallback(path, locale, tableKey, subTableKey, canonKey.getName(), &length, - pErrorCode); + &errorCode); } } } - if(U_SUCCESS(*pErrorCode)) { + if(U_SUCCESS(errorCode)) { int32_t copyLength=uprv_min(length, destCapacity); if(copyLength>0 && s != nullptr) { u_memcpy(dest, s, copyLength); @@ -351,67 +353,63 @@ _getStringOrCopyKey(const char *path, const char *locale, /* no string from a resource bundle: convert the substitute */ length=(int32_t)uprv_strlen(substitute); u_charsToUChars(substitute, dest, uprv_min(length, destCapacity)); - *pErrorCode=U_USING_DEFAULT_WARNING; + errorCode = U_USING_DEFAULT_WARNING; } - return u_terminateUChars(dest, destCapacity, length, pErrorCode); + return u_terminateUChars(dest, destCapacity, length, &errorCode); } -typedef int32_t U_CALLCONV UDisplayNameGetter(const char *, char *, int32_t, UErrorCode *); +using UDisplayNameGetter = icu::CharString(const char*, UErrorCode&); -static int32_t +int32_t _getDisplayNameForComponent(const char *locale, const char *displayLocale, char16_t *dest, int32_t destCapacity, UDisplayNameGetter *getter, const char *tag, - UErrorCode *pErrorCode) { - char localeBuffer[ULOC_FULLNAME_CAPACITY*4]; - int32_t length; + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return 0; } UErrorCode localStatus; const char* root = nullptr; - /* argument checking */ - if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) { - return 0; - } - if(destCapacity<0 || (destCapacity>0 && dest==nullptr)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + errorCode = U_ILLEGAL_ARGUMENT_ERROR; return 0; } localStatus = U_ZERO_ERROR; - length=(*getter)(locale, localeBuffer, sizeof(localeBuffer), &localStatus); - if(U_FAILURE(localStatus) || localStatus==U_STRING_NOT_TERMINATED_WARNING) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + icu::CharString localeBuffer = (*getter)(locale, localStatus); + if (U_FAILURE(localStatus)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - if(length==0) { + if (localeBuffer.isEmpty()) { // For the display name, we treat this as unknown language (ICU-20273). - if (getter == uloc_getLanguage) { - uprv_strcpy(localeBuffer, "und"); + if (getter == ulocimp_getLanguage) { + localeBuffer.append("und", errorCode); } else { - return u_terminateUChars(dest, destCapacity, 0, pErrorCode); + return u_terminateUChars(dest, destCapacity, 0, &errorCode); } } root = tag == _kCountries ? U_ICUDATA_REGION : U_ICUDATA_LANG; return _getStringOrCopyKey(root, displayLocale, - tag, nullptr, localeBuffer, - localeBuffer, + tag, nullptr, localeBuffer.data(), + localeBuffer.data(), dest, destCapacity, - pErrorCode); + errorCode); } +} // namespace + U_CAPI int32_t U_EXPORT2 uloc_getDisplayLanguage(const char *locale, const char *displayLocale, char16_t *dest, int32_t destCapacity, UErrorCode *pErrorCode) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getLanguage, _kLanguages, pErrorCode); + ulocimp_getLanguage, _kLanguages, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -420,19 +418,20 @@ uloc_getDisplayScript(const char* locale, char16_t *dest, int32_t destCapacity, UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { return 0; } UErrorCode err = U_ZERO_ERROR; int32_t res = _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getScript, _kScriptsStandAlone, &err); + ulocimp_getScript, _kScriptsStandAlone, err); if (destCapacity == 0 && err == U_BUFFER_OVERFLOW_ERROR) { // For preflight, return the max of the value and the fallback. int32_t fallback_res = _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getScript, _kScripts, pErrorCode); + ulocimp_getScript, _kScripts, *pErrorCode); return (fallback_res > res) ? fallback_res : res; } if ( err == U_USING_DEFAULT_WARNING ) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getScript, _kScripts, pErrorCode); + ulocimp_getScript, _kScripts, *pErrorCode); } else { *pErrorCode = err; return res; @@ -446,7 +445,7 @@ uloc_getDisplayScriptInContext(const char* locale, UErrorCode *pErrorCode) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getScript, _kScripts, pErrorCode); + ulocimp_getScript, _kScripts, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -455,7 +454,7 @@ uloc_getDisplayCountry(const char *locale, char16_t *dest, int32_t destCapacity, UErrorCode *pErrorCode) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getCountry, _kCountries, pErrorCode); + ulocimp_getRegion, _kCountries, *pErrorCode); } /* @@ -469,7 +468,7 @@ uloc_getDisplayVariant(const char *locale, char16_t *dest, int32_t destCapacity, UErrorCode *pErrorCode) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getVariant, _kVariants, pErrorCode); + ulocimp_getVariant, _kVariants, *pErrorCode); } /* Instead of having a separate pass for 'special' patterns, reintegrate the two @@ -809,7 +808,7 @@ uloc_getDisplayKeyword(const char* keyword, keyword, keyword, dest, destCapacity, - status); + *status); } @@ -836,11 +835,7 @@ uloc_getDisplayKeywordValue( const char* locale, } /* get the keyword value */ - CharString keywordValue; - { - CharStringByteSink sink(&keywordValue); - ulocimp_getKeywordValue(locale, keyword, sink, status); - } + CharString keywordValue = ulocimp_getKeywordValue(locale, keyword, *status); /* * if the keyword is equal to currency .. then to get the display name @@ -897,6 +892,6 @@ uloc_getDisplayKeywordValue( const char* locale, keywordValue.data(), keywordValue.data(), dest, destCapacity, - status); + *status); } } diff --git a/deps/icu-small/source/common/locdistance.cpp b/deps/icu-small/source/common/locdistance.cpp index fb22fe79ed36a2..4dbfcc0095c848 100644 --- a/deps/icu-small/source/common/locdistance.cpp +++ b/deps/icu-small/source/common/locdistance.cpp @@ -59,7 +59,7 @@ UBool U_CALLCONV cleanup() { void U_CALLCONV LocaleDistance::initLocaleDistance(UErrorCode &errorCode) { // This function is invoked only via umtx_initOnce(). U_ASSERT(gLocaleDistance == nullptr); - const XLikelySubtags &likely = *XLikelySubtags::getSingleton(errorCode); + const LikelySubtags &likely = *LikelySubtags::getSingleton(errorCode); if (U_FAILURE(errorCode)) { return; } const LocaleDistanceData &data = likely.getDistanceData(); if (data.distanceTrieBytes == nullptr || @@ -83,7 +83,7 @@ const LocaleDistance *LocaleDistance::getSingleton(UErrorCode &errorCode) { return gLocaleDistance; } -LocaleDistance::LocaleDistance(const LocaleDistanceData &data, const XLikelySubtags &likely) : +LocaleDistance::LocaleDistance(const LocaleDistanceData &data, const LikelySubtags &likely) : likelySubtags(likely), trie(data.distanceTrieBytes), regionToPartitionsIndex(data.regionToPartitions), partitionArrays(data.partitions), @@ -119,7 +119,7 @@ int32_t LocaleDistance::getBestIndexAndDistance( uint64_t desLangState = desLangDistance >= 0 && supportedLSRsLength > 1 ? iter.getState64() : 0; // Index of the supported LSR with the lowest distance. int32_t bestIndex = -1; - // Cached lookup info from XLikelySubtags.compareLikely(). + // Cached lookup info from LikelySubtags.compareLikely(). int32_t bestLikelyInfo = -1; for (int32_t slIndex = 0; slIndex < supportedLSRsLength; ++slIndex) { const LSR &supported = *supportedLSRs[slIndex]; @@ -399,7 +399,7 @@ int32_t LocaleDistance::trieNext(BytesTrie &iter, const char *s, bool wantValue) } } -UBool LocaleDistance::isParadigmLSR(const LSR &lsr) const { +bool LocaleDistance::isParadigmLSR(const LSR &lsr) const { // Linear search for a very short list (length 6 as of 2019), // because we look for equivalence not equality, and // because it's easy. diff --git a/deps/icu-small/source/common/locdistance.h b/deps/icu-small/source/common/locdistance.h index 51b777e6272312..952f622e8e267a 100644 --- a/deps/icu-small/source/common/locdistance.h +++ b/deps/icu-small/source/common/locdistance.h @@ -62,7 +62,7 @@ class LocaleDistance final : public UMemory { ULocMatchFavorSubtag favorSubtag, ULocMatchDirection direction) const; - UBool isParadigmLSR(const LSR &lsr) const; + bool isParadigmLSR(const LSR &lsr) const; int32_t getDefaultScriptDistance() const { return defaultScriptDistance; @@ -83,14 +83,14 @@ class LocaleDistance final : public UMemory { // tic constexpr int32_t MAX_INDEX = 0x1fffff; // avoids sign bit static constexpr int32_t INDEX_NEG_1 = 0xfffffc00; - LocaleDistance(const LocaleDistanceData &data, const XLikelySubtags &likely); + LocaleDistance(const LocaleDistanceData &data, const LikelySubtags &likely); LocaleDistance(const LocaleDistance &other) = delete; LocaleDistance &operator=(const LocaleDistance &other) = delete; static void initLocaleDistance(UErrorCode &errorCode); - UBool isMatch(const LSR &desired, const LSR &supported, - int32_t shiftedThreshold, ULocMatchFavorSubtag favorSubtag) const { + bool isMatch(const LSR &desired, const LSR &supported, + int32_t shiftedThreshold, ULocMatchFavorSubtag favorSubtag) const { const LSR *pSupp = &supported; return getBestIndexAndDistance( desired, &pSupp, 1, @@ -119,7 +119,7 @@ class LocaleDistance final : public UMemory { return defaultRegionDistance; } - const XLikelySubtags &likelySubtags; + const LikelySubtags &likelySubtags; // The trie maps each dlang+slang+dscript+sscript+dregion+sregion // (encoded in ASCII with bit 7 set on the last character of each subtag) to a distance. diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index 73fe531c543932..c65a349dbd380b 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -18,45 +18,17 @@ #include "unicode/udisplaycontext.h" #include "unicode/brkiter.h" #include "unicode/ucurr.h" +#include "bytesinkutil.h" +#include "charstr.h" #include "cmemory.h" #include "cstring.h" #include "mutex.h" +#include "uassert.h" #include "ulocimp.h" #include "umutex.h" #include "ureslocs.h" #include "uresimp.h" -#include - -/** - * Concatenate a number of null-terminated strings to buffer, leaving a - * null-terminated string. The last argument should be the null pointer. - * Return the length of the string in the buffer, not counting the trailing - * null. Return -1 if there is an error (buffer is null, or buflen < 1). - */ -static int32_t ncat(char *buffer, uint32_t buflen, ...) { - va_list args; - char *str; - char *p = buffer; - const char* e = buffer + buflen - 1; - - if (buffer == nullptr || buflen < 1) { - return -1; - } - - va_start(args, buflen); - while ((str = va_arg(args, char *)) != 0) { - char c; - while (p != e && (c = *str++) != 0) { - *p++ = c; - } - } - *p = 0; - va_end(args); - - return static_cast(p - buffer); -} - U_NAMESPACE_BEGIN //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -64,12 +36,13 @@ U_NAMESPACE_BEGIN // Access resource data for locale components. // Wrap code in uloc.c for now. class ICUDataTable { - const char* path; + const char* const path; Locale locale; public: + // Note: path should be a pointer to a statically allocated string. ICUDataTable(const char* path, const Locale& locale); - ~ICUDataTable(); + ~ICUDataTable() = default; const Locale& getLocale(); @@ -95,23 +68,9 @@ ICUDataTable::getNoFallback(const char* tableKey, const char* itemKey, UnicodeSt } ICUDataTable::ICUDataTable(const char* path, const Locale& locale) - : path(nullptr), locale(Locale::getRoot()) + : path(path), locale(locale) { - if (path) { - int32_t len = static_cast(uprv_strlen(path)); - this->path = (const char*) uprv_malloc(len + 1); - if (this->path) { - uprv_strcpy((char *)this->path, path); - this->locale = locale; - } - } -} - -ICUDataTable::~ICUDataTable() { - if (path) { - uprv_free((void*) path); - path = nullptr; - } + U_ASSERT(path != nullptr); } const Locale& @@ -305,7 +264,7 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { }; // Capitalization transforms. For each usage type, indicates whether to titlecase for // the context specified in capitalizationContext (which we know at construction time) - UBool fCapitalization[kCapContextUsageCount]; + bool fCapitalization[kCapContextUsageCount]; public: // constructor @@ -341,12 +300,12 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { UnicodeString& result, bool substitute) const; UnicodeString& appendWithSep(UnicodeString& buffer, const UnicodeString& src) const; UnicodeString& adjustForUsageAndContext(CapContextUsage usage, UnicodeString& result) const; - UnicodeString& scriptDisplayName(const char* script, UnicodeString& result, UBool skipAdjust) const; - UnicodeString& regionDisplayName(const char* region, UnicodeString& result, UBool skipAdjust) const; - UnicodeString& variantDisplayName(const char* variant, UnicodeString& result, UBool skipAdjust) const; - UnicodeString& keyDisplayName(const char* key, UnicodeString& result, UBool skipAdjust) const; + UnicodeString& scriptDisplayName(const char* script, UnicodeString& result, bool skipAdjust) const; + UnicodeString& regionDisplayName(const char* region, UnicodeString& result, bool skipAdjust) const; + UnicodeString& variantDisplayName(const char* variant, UnicodeString& result, bool skipAdjust) const; + UnicodeString& keyDisplayName(const char* key, UnicodeString& result, bool skipAdjust) const; UnicodeString& keyValueDisplayName(const char* key, const char* value, - UnicodeString& result, UBool skipAdjust) const; + UnicodeString& result, bool skipAdjust) const; void initialize(); struct CapitalizationContextSink; @@ -399,7 +358,7 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, } struct LocaleDisplayNamesImpl::CapitalizationContextSink : public ResourceSink { - UBool hasCapitalizationUsage; + bool hasCapitalizationUsage; LocaleDisplayNamesImpl& parent; CapitalizationContextSink(LocaleDisplayNamesImpl& _parent) @@ -490,7 +449,7 @@ LocaleDisplayNamesImpl::initialize() { #if !UCONFIG_NO_BREAK_ITERATION // Only get the context data if we need it! This is a const object so we know now... // Also check whether we will need a break iterator (depends on the data) - UBool needBrkIter = false; + bool needBrkIter = false; if (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU || capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_STANDALONE) { LocalUResourceBundlePointer resource(ures_open(nullptr, locale.getName(), &status)); if (U_FAILURE(status)) { return; } @@ -582,36 +541,51 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc, const char* country = loc.getCountry(); const char* variant = loc.getVariant(); - UBool hasScript = uprv_strlen(script) > 0; - UBool hasCountry = uprv_strlen(country) > 0; - UBool hasVariant = uprv_strlen(variant) > 0; + bool hasScript = uprv_strlen(script) > 0; + bool hasCountry = uprv_strlen(country) > 0; + bool hasVariant = uprv_strlen(variant) > 0; if (dialectHandling == ULDN_DIALECT_NAMES) { - char buffer[ULOC_FULLNAME_CAPACITY]; + UErrorCode status = U_ZERO_ERROR; + CharString buffer; do { // loop construct is so we can break early out of search if (hasScript && hasCountry) { - ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, "_", country, (char *)0); - localeIdName(buffer, resultName, false); - if (!resultName.isBogus()) { - hasScript = false; - hasCountry = false; - break; + buffer.append(lang, status) + .append('_', status) + .append(script, status) + .append('_', status) + .append(country, status); + if (U_SUCCESS(status)) { + localeIdName(buffer.data(), resultName, false); + if (!resultName.isBogus()) { + hasScript = false; + hasCountry = false; + break; + } } } if (hasScript) { - ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, (char *)0); - localeIdName(buffer, resultName, false); - if (!resultName.isBogus()) { - hasScript = false; - break; + buffer.append(lang, status) + .append('_', status) + .append(script, status); + if (U_SUCCESS(status)) { + localeIdName(buffer.data(), resultName, false); + if (!resultName.isBogus()) { + hasScript = false; + break; + } } } if (hasCountry) { - ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", country, (char*)0); - localeIdName(buffer, resultName, false); - if (!resultName.isBogus()) { - hasCountry = false; - break; + buffer.append(lang, status) + .append('_', status) + .append(country, status); + if (U_SUCCESS(status)) { + localeIdName(buffer.data(), resultName, false); + if (!resultName.isBogus()) { + hasCountry = false; + break; + } } } } while (false); @@ -658,21 +632,19 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc, LocalPointer e(loc.createKeywords(status)); if (e.isValid() && U_SUCCESS(status)) { UnicodeString temp2; - char value[ULOC_KEYWORD_AND_VALUES_CAPACITY]; // sigh, no ULOC_VALUE_CAPACITY const char* key; - while ((key = e->next((int32_t *)0, status)) != nullptr) { - value[0] = 0; - loc.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); - if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { - return result; + while ((key = e->next((int32_t*)nullptr, status)) != nullptr) { + auto value = loc.getKeywordValue(key, status); + if (U_FAILURE(status)) { + return result; } keyDisplayName(key, temp, true); temp.findAndReplace(formatOpenParen, formatReplaceOpenParen); temp.findAndReplace(formatCloseParen, formatReplaceCloseParen); - keyValueDisplayName(key, value, temp2, true); + keyValueDisplayName(key, value.data(), temp2, true); temp2.findAndReplace(formatOpenParen, formatReplaceOpenParen); temp2.findAndReplace(formatCloseParen, formatReplaceCloseParen); - if (temp2 != UnicodeString(value, -1, US_INV)) { + if (temp2 != UnicodeString(value.data(), -1, US_INV)) { appendWithSep(resultRemainder, temp2); } else if (temp != UnicodeString(key, -1, US_INV)) { UnicodeString temp3; @@ -779,7 +751,7 @@ LocaleDisplayNamesImpl::languageDisplayName(const char* lang, UnicodeString& LocaleDisplayNamesImpl::scriptDisplayName(const char* script, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { if (nameLength == UDISPCTX_LENGTH_SHORT) { langData.getNoFallback("Scripts%short", script, result); if (!result.isBogus()) { @@ -809,7 +781,7 @@ LocaleDisplayNamesImpl::scriptDisplayName(UScriptCode scriptCode, UnicodeString& LocaleDisplayNamesImpl::regionDisplayName(const char* region, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { if (nameLength == UDISPCTX_LENGTH_SHORT) { regionData.getNoFallback("Countries%short", region, result); if (!result.isBogus()) { @@ -834,7 +806,7 @@ LocaleDisplayNamesImpl::regionDisplayName(const char* region, UnicodeString& LocaleDisplayNamesImpl::variantDisplayName(const char* variant, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { // don't have a resource for short variant names if (substitute == UDISPCTX_SUBSTITUTE) { langData.get("Variants", variant, result); @@ -853,7 +825,7 @@ LocaleDisplayNamesImpl::variantDisplayName(const char* variant, UnicodeString& LocaleDisplayNamesImpl::keyDisplayName(const char* key, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { // don't have a resource for short key names if (substitute == UDISPCTX_SUBSTITUTE) { langData.get("Keys", key, result); @@ -873,7 +845,7 @@ UnicodeString& LocaleDisplayNamesImpl::keyValueDisplayName(const char* key, const char* value, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { if (uprv_strcmp(key, "currency") == 0) { // ICU4C does not have ICU4J CurrencyDisplayInfo equivalent for now. UErrorCode sts = U_ZERO_ERROR; @@ -939,7 +911,7 @@ uldn_open(const char * locale, UDialectHandling dialectHandling, UErrorCode *pErrorCode) { if (U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } if (locale == nullptr) { locale = uloc_getDefault(); @@ -952,7 +924,7 @@ uldn_openForContext(const char * locale, UDisplayContext *contexts, int32_t length, UErrorCode *pErrorCode) { if (U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } if (locale == nullptr) { locale = uloc_getDefault(); diff --git a/deps/icu-small/source/common/locid.cpp b/deps/icu-small/source/common/locid.cpp index 64ff63f3611f58..37bbe4ba949e52 100644 --- a/deps/icu-small/source/common/locid.cpp +++ b/deps/icu-small/source/common/locid.cpp @@ -57,10 +57,6 @@ #include "ustr_imp.h" #include "uvector.h" -U_CDECL_BEGIN -static UBool U_CALLCONV locale_cleanup(); -U_CDECL_END - U_NAMESPACE_BEGIN static Locale *gLocaleCache = nullptr; @@ -106,16 +102,17 @@ typedef enum ELocalePos { eMAX_LOCALES } ELocalePos; -U_CDECL_BEGIN +namespace { + // // Deleter function for Locales owned by the default Locale hash table/ // -static void U_CALLCONV +void U_CALLCONV deleteLocale(void *obj) { delete (icu::Locale *) obj; } -static UBool U_CALLCONV locale_cleanup() +UBool U_CALLCONV locale_cleanup() { U_NAMESPACE_USE @@ -131,8 +128,7 @@ static UBool U_CALLCONV locale_cleanup() return true; } - -static void U_CALLCONV locale_init(UErrorCode &status) { +void U_CALLCONV locale_init(UErrorCode &status) { U_NAMESPACE_USE U_ASSERT(gLocaleCache == nullptr); @@ -163,7 +159,7 @@ static void U_CALLCONV locale_init(UErrorCode &status) { gLocaleCache[eCANADA_FRENCH] = Locale("fr", "CA"); } -U_CDECL_END +} // namespace U_NAMESPACE_BEGIN @@ -182,15 +178,8 @@ Locale *locale_set_default_internal(const char *id, UErrorCode& status) { canonicalize = true; // always canonicalize host ID } - CharString localeNameBuf; - { - CharStringByteSink sink(&localeNameBuf); - if (canonicalize) { - ulocimp_canonicalize(id, sink, &status); - } else { - ulocimp_getName(id, sink, &status); - } - } + CharString localeNameBuf = + canonicalize ? ulocimp_canonicalize(id, status) : ulocimp_getName(id, status); if (U_FAILURE(status)) { return gDefaultLocale; @@ -494,7 +483,7 @@ namespace { UInitOnce gKnownCanonicalizedInitOnce {}; UHashtable *gKnownCanonicalized = nullptr; -static const char* const KNOWN_CANONICALIZED[] = { +constexpr const char* KNOWN_CANONICALIZED[] = { "c", // Commonly used locales known are already canonicalized "af", "af_ZA", "am", "am_ET", "ar", "ar_001", "as", "as_IN", "az", "az_AZ", @@ -518,13 +507,13 @@ static const char* const KNOWN_CANONICALIZED[] = { "zh_Hant_TW", "zh_TW", "zu", "zu_ZA" }; -static UBool U_CALLCONV cleanupKnownCanonicalized() { +UBool U_CALLCONV cleanupKnownCanonicalized() { gKnownCanonicalizedInitOnce.reset(); if (gKnownCanonicalized) { uhash_close(gKnownCanonicalized); } return true; } -static void U_CALLCONV loadKnownCanonicalized(UErrorCode &status) { +void U_CALLCONV loadKnownCanonicalized(UErrorCode &status) { ucln_common_registerCleanup(UCLN_COMMON_LOCALE_KNOWN_CANONICALIZED, cleanupKnownCanonicalized); LocalUHashtablePointer newKnownCanonicalizedMap( @@ -920,6 +909,8 @@ AliasData::loadData(UErrorCode &status) */ AliasData* AliasDataBuilder::build(UErrorCode &status) { + if (U_FAILURE(status)) { return nullptr; } + LocalUResourceBundlePointer metadata( ures_openDirect(nullptr, "metadata", &status)); LocalUResourceBundlePointer metadataAlias( @@ -1065,7 +1056,7 @@ AliasDataBuilder::build(UErrorCode &status) { */ class AliasReplacer { public: - AliasReplacer(UErrorCode status) : + AliasReplacer(UErrorCode& status) : language(nullptr), script(nullptr), region(nullptr), extensions(nullptr), // store value in variants only once @@ -1130,12 +1121,12 @@ class AliasReplacer { } // Gather fields and generate locale ID into out. - CharString& outputToString(CharString& out, UErrorCode status); + CharString& outputToString(CharString& out, UErrorCode& status); // Generate the lookup key. CharString& generateKey(const char* language, const char* region, const char* variant, CharString& out, - UErrorCode status); + UErrorCode& status); void parseLanguageReplacement(const char* replacement, const char*& replaceLanguage, @@ -1172,8 +1163,9 @@ class AliasReplacer { CharString& AliasReplacer::generateKey( const char* language, const char* region, const char* variant, - CharString& out, UErrorCode status) + CharString& out, UErrorCode& status) { + if (U_FAILURE(status)) { return out; } out.append(language, status); if (notEmpty(region)) { out.append(SEP_CHAR, status) @@ -1529,13 +1521,12 @@ AliasReplacer::replaceTransformedExtensions( const char* tkey = ultag_getTKeyStart(str); int32_t tlangLen = (tkey == str) ? 0 : ((tkey == nullptr) ? len : static_cast((tkey - str - 1))); - CharStringByteSink sink(&output); if (tlangLen > 0) { Locale tlang = LocaleBuilder() .setLanguageTag(StringPiece(str, tlangLen)) .build(status); tlang.canonicalize(status); - tlang.toLanguageTag(sink, status); + output = tlang.toLanguageTag(status); if (U_FAILURE(status)) { return false; } @@ -1591,8 +1582,9 @@ AliasReplacer::replaceTransformedExtensions( CharString& AliasReplacer::outputToString( - CharString& out, UErrorCode status) + CharString& out, UErrorCode& status) { + if (U_FAILURE(status)) { return out; } out.append(language, status); if (notEmpty(script)) { out.append(SEP_CHAR, status) @@ -1735,9 +1727,7 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status while ((key = iter->next(nullptr, status)) != nullptr) { if (uprv_strcmp("sd", key) == 0 || uprv_strcmp("rg", key) == 0 || uprv_strcmp("t", key) == 0) { - CharString value; - CharStringByteSink valueSink(&value); - locale.getKeywordValue(key, valueSink, status); + auto value = locale.getKeywordValue(key, status); if (U_FAILURE(status)) { status = U_ZERO_ERROR; continue; @@ -1782,6 +1772,7 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status bool canonicalizeLocale(const Locale& locale, CharString& out, UErrorCode& status) { + if (U_FAILURE(status)) { return false; } AliasReplacer replacer(status); return replacer.replace(locale, out, status); } @@ -1791,6 +1782,8 @@ canonicalizeLocale(const Locale& locale, CharString& out, UErrorCode& status) bool isKnownCanonicalizedLocale(const char* locale, UErrorCode& status) { + if (U_FAILURE(status)) { return false; } + if ( uprv_strcmp(locale, "c") == 0 || uprv_strcmp(locale, "en") == 0 || uprv_strcmp(locale, "en_US") == 0) { @@ -1809,24 +1802,30 @@ isKnownCanonicalizedLocale(const char* locale, UErrorCode& status) } // namespace +U_NAMESPACE_END + // Function for testing. -U_CAPI const char* const* -ulocimp_getKnownCanonicalizedLocaleForTest(int32_t* length) +U_EXPORT const char* const* +ulocimp_getKnownCanonicalizedLocaleForTest(int32_t& length) { - *length = UPRV_LENGTHOF(KNOWN_CANONICALIZED); + U_NAMESPACE_USE + length = UPRV_LENGTHOF(KNOWN_CANONICALIZED); return KNOWN_CANONICALIZED; } // Function for testing. -U_CAPI bool +U_EXPORT bool ulocimp_isCanonicalizedLocaleForTest(const char* localeName) { + U_NAMESPACE_USE Locale l(localeName); UErrorCode status = U_ZERO_ERROR; CharString temp; return !canonicalizeLocale(l, temp, status) && U_SUCCESS(status); } +U_NAMESPACE_BEGIN + /*This function initializes a Locale from a C locale ID*/ Locale& Locale::init(const char* localeID, UBool canonicalize) { @@ -1846,7 +1845,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) // without goto and without another function do { char *separator; - char *field[5] = {0}; + char *field[5] = {nullptr}; int32_t fieldLen[5] = {0}; int32_t fieldIdx; int32_t variantField; @@ -1871,7 +1870,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) U_ASSERT(baseName == nullptr); /*Go to heap for the fullName if necessary*/ fullName = (char *)uprv_malloc(sizeof(char)*(length + 1)); - if(fullName == 0) { + if (fullName == nullptr) { fullName = fullNameBuffer; break; // error: out of memory } @@ -1892,7 +1891,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) separator = field[0] = fullName; fieldIdx = 1; char* at = uprv_strchr(fullName, '@'); - while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != 0 && + while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != nullptr && fieldIdx < UPRV_LENGTHOF(field)-1 && (at == nullptr || separator < at)) { field[fieldIdx] = separator + 1; @@ -2074,11 +2073,7 @@ Locale::addLikelySubtags(UErrorCode& status) { return; } - CharString maximizedLocaleID; - { - CharStringByteSink sink(&maximizedLocaleID); - ulocimp_addLikelySubtags(fullName, sink, &status); - } + CharString maximizedLocaleID = ulocimp_addLikelySubtags(fullName, status); if (U_FAILURE(status)) { return; @@ -2100,11 +2095,7 @@ Locale::minimizeSubtags(bool favorScript, UErrorCode& status) { return; } - CharString minimizedLocaleID; - { - CharStringByteSink sink(&minimizedLocaleID); - ulocimp_minimizeSubtags(fullName, sink, favorScript, &status); - } + CharString minimizedLocaleID = ulocimp_minimizeSubtags(fullName, favorScript, status); if (U_FAILURE(status)) { return; @@ -2155,17 +2146,12 @@ Locale::forLanguageTag(StringPiece tag, UErrorCode& status) // parsing. Therefore the code here explicitly calls uloc_forLanguageTag() // and then Locale::init(), instead of just calling the normal constructor. - CharString localeID; int32_t parsedLength; - { - CharStringByteSink sink(&localeID); - ulocimp_forLanguageTag( - tag.data(), - tag.length(), - sink, - &parsedLength, - &status); - } + CharString localeID = ulocimp_forLanguageTag( + tag.data(), + tag.length(), + &parsedLength, + status); if (U_FAILURE(status)) { return result; @@ -2195,7 +2181,7 @@ Locale::toLanguageTag(ByteSink& sink, UErrorCode& status) const return; } - ulocimp_toLanguageTag(fullName, sink, /*strict=*/false, &status); + ulocimp_toLanguageTag(fullName, sink, /*strict=*/false, status); } Locale U_EXPORT2 @@ -2420,33 +2406,23 @@ Locale::getLocaleCache() class KeywordEnumeration : public StringEnumeration { protected: - char *keywords; + CharString keywords; private: - char *current; - int32_t length; - UnicodeString currUSKey; - static const char fgClassID;/* Warning this is used beyond the typical RTTI usage. */ + const char *current; + static const char fgClassID; public: static UClassID U_EXPORT2 getStaticClassID() { return (UClassID)&fgClassID; } virtual UClassID getDynamicClassID() const override { return getStaticClassID(); } public: KeywordEnumeration(const char *keys, int32_t keywordLen, int32_t currentIndex, UErrorCode &status) - : keywords((char *)&fgClassID), current((char *)&fgClassID), length(0) { + : keywords(), current(keywords.data()) { if(U_SUCCESS(status) && keywordLen != 0) { if(keys == nullptr || keywordLen < 0) { status = U_ILLEGAL_ARGUMENT_ERROR; } else { - keywords = (char *)uprv_malloc(keywordLen+1); - if (keywords == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - } - else { - uprv_memcpy(keywords, keys, keywordLen); - keywords[keywordLen] = 0; - current = keywords + currentIndex; - length = keywordLen; - } + keywords.append(keys, keywordLen, status); + current = keywords.data() + currentIndex; } } } @@ -2456,11 +2432,14 @@ class KeywordEnumeration : public StringEnumeration { virtual StringEnumeration * clone() const override { UErrorCode status = U_ZERO_ERROR; - return new KeywordEnumeration(keywords, length, (int32_t)(current - keywords), status); + return new KeywordEnumeration( + keywords.data(), keywords.length(), + (int32_t)(current - keywords.data()), status); } - virtual int32_t count(UErrorCode &/*status*/) const override { - char *kw = keywords; + virtual int32_t count(UErrorCode& status) const override { + if (U_FAILURE(status)) { return 0; } + const char *kw = keywords.data(); int32_t result = 0; while(*kw) { result++; @@ -2489,21 +2468,22 @@ class KeywordEnumeration : public StringEnumeration { } virtual const UnicodeString* snext(UErrorCode& status) override { + if (U_FAILURE(status)) { return nullptr; } int32_t resultLength = 0; const char *s = next(&resultLength, status); return setChars(s, resultLength, status); } - virtual void reset(UErrorCode& /*status*/) override { - current = keywords; + virtual void reset(UErrorCode& status) override { + if (U_FAILURE(status)) { return; } + current = keywords.data(); } }; const char KeywordEnumeration::fgClassID = '\0'; -KeywordEnumeration::~KeywordEnumeration() { - uprv_free(keywords); -} +// Out-of-line virtual destructor to serve as the "key function". +KeywordEnumeration::~KeywordEnumeration() = default; // A wrapper around KeywordEnumeration that calls uloc_toUnicodeLocaleKey() in // the next() method for each keyword before returning it. @@ -2528,8 +2508,9 @@ class UnicodeKeywordEnumeration : public KeywordEnumeration { if (resultLength != nullptr) *resultLength = 0; return nullptr; } - virtual int32_t count(UErrorCode &/*status*/) const override { - char *kw = keywords; + virtual int32_t count(UErrorCode& status) const override { + if (U_FAILURE(status)) { return 0; } + const char *kw = keywords.data(); int32_t result = 0; while(*kw) { if (uloc_toUnicodeLocaleKey(kw) != nullptr) { @@ -2557,9 +2538,7 @@ Locale::createKeywords(UErrorCode &status) const const char* assignment = uprv_strchr(fullName, '='); if(variantStart) { if(assignment > variantStart) { - CharString keywords; - CharStringByteSink sink(&keywords); - ulocimp_getKeywords(variantStart+1, '@', sink, false, &status); + CharString keywords = ulocimp_getKeywords(variantStart + 1, '@', false, status); if (U_SUCCESS(status) && !keywords.isEmpty()) { result = new KeywordEnumeration(keywords.data(), keywords.length(), 0, status); if (!result) { @@ -2586,9 +2565,7 @@ Locale::createUnicodeKeywords(UErrorCode &status) const const char* assignment = uprv_strchr(fullName, '='); if(variantStart) { if(assignment > variantStart) { - CharString keywords; - CharStringByteSink sink(&keywords); - ulocimp_getKeywords(variantStart+1, '@', sink, false, &status); + CharString keywords = ulocimp_getKeywords(variantStart + 1, '@', false, status); if (U_SUCCESS(status) && !keywords.isEmpty()) { result = new UnicodeKeywordEnumeration(keywords.data(), keywords.length(), 0, status); if (!result) { @@ -2625,13 +2602,17 @@ Locale::getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& sta return; } - ulocimp_getKeywordValue(fullName, keywordName_nul.data(), sink, &status); + ulocimp_getKeywordValue(fullName, keywordName_nul.data(), sink, status); } void Locale::getUnicodeKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const { + if (U_FAILURE(status)) { + return; + } + // TODO: Remove the need for a const char* to a NUL terminated buffer. const CharString keywordName_nul(keywordName, status); if (U_FAILURE(status)) { @@ -2639,17 +2620,12 @@ Locale::getUnicodeKeywordValue(StringPiece keywordName, } const char* legacy_key = uloc_toLegacyKey(keywordName_nul.data()); - if (legacy_key == nullptr) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } - CharString legacy_value; - { - CharStringByteSink sink(&legacy_value); - getKeywordValue(legacy_key, sink, status); - } + auto legacy_value = getKeywordValue(legacy_key, status); if (U_FAILURE(status)) { return; @@ -2712,6 +2688,7 @@ void Locale::setKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status) { + if (U_FAILURE(status)) { return; } // TODO: Remove the need for a const char* to a NUL terminated buffer. const CharString keywordName_nul(keywordName, status); const CharString keywordValue_nul(keywordValue, status); @@ -2722,16 +2699,18 @@ void Locale::setUnicodeKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + // TODO: Remove the need for a const char* to a NUL terminated buffer. const CharString keywordName_nul(keywordName, status); const CharString keywordValue_nul(keywordValue, status); - if (U_FAILURE(status)) { return; } const char* legacy_key = uloc_toLegacyKey(keywordName_nul.data()); - if (legacy_key == nullptr) { status = U_ILLEGAL_ARGUMENT_ERROR; return; diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index eedfb8149e26d8..5aa929dc4b15e1 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -19,6 +19,8 @@ * that then do not depend on resource bundle code and likely-subtags data. */ +#include + #include "unicode/bytestream.h" #include "unicode/utypes.h" #include "unicode/locid.h" @@ -33,72 +35,31 @@ #include "cstring.h" #include "loclikelysubtags.h" #include "ulocimp.h" -#include "ustr_imp.h" - -/** - * Append a tag to a buffer, adding the separator if necessary. The buffer - * must be large enough to contain the resulting tag plus any separator - * necessary. The tag must not be a zero-length string. - * - * @param tag The tag to add. - * @param tagLength The length of the tag. - * @param buffer The output buffer. - * @param bufferLength The length of the output buffer. This is an input/output parameter. - **/ -static void U_CALLCONV -appendTag( - const char* tag, - int32_t tagLength, - char* buffer, - int32_t* bufferLength, - UBool withSeparator) { - - if (withSeparator) { - buffer[*bufferLength] = '_'; - ++(*bufferLength); - } - - uprv_memmove( - &buffer[*bufferLength], - tag, - tagLength); - *bufferLength += tagLength; -} +namespace { /** * Create a tag string from the supplied parameters. The lang, script and region * parameters may be nullptr pointers. If they are, their corresponding length parameters * must be less than or equal to 0. * - * If any of the language, script or region parameters are empty, and the alternateTags - * parameter is not nullptr, it will be parsed for potential language, script and region tags - * to be used when constructing the new tag. If the alternateTags parameter is nullptr, or - * it contains no language tag, the default tag for the unknown language is used. - * - * If the length of the new string exceeds the capacity of the output buffer, - * the function copies as many bytes to the output buffer as it can, and returns - * the error U_BUFFER_OVERFLOW_ERROR. - * * If an illegal argument is provided, the function returns the error * U_ILLEGAL_ARGUMENT_ERROR. * - * Note that this function can return the warning U_STRING_NOT_TERMINATED_WARNING if - * the tag string fits in the output buffer, but the null terminator doesn't. - * * @param lang The language tag to use. * @param langLength The length of the language tag. * @param script The script tag to use. * @param scriptLength The length of the script tag. * @param region The region tag to use. * @param regionLength The length of the region tag. + * @param variant The region tag to use. + * @param variantLength The length of the region tag. * @param trailing Any trailing data to append to the new tag. * @param trailingLength The length of the trailing data. - * @param alternateTags A string containing any alternate tags. * @param sink The output sink receiving the tag string. * @param err A pointer to a UErrorCode for error reporting. **/ -static void U_CALLCONV +void U_CALLCONV createTagStringWithAlternates( const char* lang, int32_t langLength, @@ -106,575 +67,240 @@ createTagStringWithAlternates( int32_t scriptLength, const char* region, int32_t regionLength, + const char* variant, + int32_t variantLength, const char* trailing, int32_t trailingLength, - const char* alternateTags, icu::ByteSink& sink, - UErrorCode* err) { - - if (U_FAILURE(*err)) { - goto error; - } - else if (langLength >= ULOC_LANG_CAPACITY || - scriptLength >= ULOC_SCRIPT_CAPACITY || - regionLength >= ULOC_COUNTRY_CAPACITY) { - goto error; - } - else { - /** - * ULOC_FULLNAME_CAPACITY will provide enough capacity - * that we can build a string that contains the language, - * script and region code without worrying about overrunning - * the user-supplied buffer. - **/ - char tagBuffer[ULOC_FULLNAME_CAPACITY]; - int32_t tagLength = 0; - UBool regionAppended = false; - - if (langLength > 0) { - appendTag( - lang, - langLength, - tagBuffer, - &tagLength, - /*withSeparator=*/false); - } - else if (alternateTags == nullptr) { - /* - * Use the empty string for an unknown language, if - * we found no language. - */ - } - else { - /* - * Parse the alternateTags string for the language. - */ - char alternateLang[ULOC_LANG_CAPACITY]; - int32_t alternateLangLength = sizeof(alternateLang); - - alternateLangLength = - uloc_getLanguage( - alternateTags, - alternateLang, - alternateLangLength, - err); - if(U_FAILURE(*err) || - alternateLangLength >= ULOC_LANG_CAPACITY) { - goto error; - } - else if (alternateLangLength == 0) { - /* - * Use the empty string for an unknown language, if - * we found no language. - */ - } - else { - appendTag( - alternateLang, - alternateLangLength, - tagBuffer, - &tagLength, - /*withSeparator=*/false); - } - } - - if (scriptLength > 0) { - appendTag( - script, - scriptLength, - tagBuffer, - &tagLength, - /*withSeparator=*/true); - } - else if (alternateTags != nullptr) { - /* - * Parse the alternateTags string for the script. - */ - char alternateScript[ULOC_SCRIPT_CAPACITY]; - - const int32_t alternateScriptLength = - uloc_getScript( - alternateTags, - alternateScript, - sizeof(alternateScript), - err); - - if (U_FAILURE(*err) || - alternateScriptLength >= ULOC_SCRIPT_CAPACITY) { - goto error; - } - else if (alternateScriptLength > 0) { - appendTag( - alternateScript, - alternateScriptLength, - tagBuffer, - &tagLength, - /*withSeparator=*/true); - } - } - - if (regionLength > 0) { - appendTag( - region, - regionLength, - tagBuffer, - &tagLength, - /*withSeparator=*/true); - - regionAppended = true; - } - else if (alternateTags != nullptr) { - /* - * Parse the alternateTags string for the region. - */ - char alternateRegion[ULOC_COUNTRY_CAPACITY]; - - const int32_t alternateRegionLength = - uloc_getCountry( - alternateTags, - alternateRegion, - sizeof(alternateRegion), - err); - if (U_FAILURE(*err) || - alternateRegionLength >= ULOC_COUNTRY_CAPACITY) { - goto error; - } - else if (alternateRegionLength > 0) { - appendTag( - alternateRegion, - alternateRegionLength, - tagBuffer, - &tagLength, - /*withSeparator=*/true); - - regionAppended = true; - } - } - - /** - * Copy the partial tag from our internal buffer to the supplied - * target. - **/ - sink.Append(tagBuffer, tagLength); - - if (trailingLength > 0) { - if (*trailing != '@') { - sink.Append("_", 1); - if (!regionAppended) { - /* extra separator is required */ - sink.Append("_", 1); - } - } - - /* - * Copy the trailing data into the supplied buffer. - */ - sink.Append(trailing, trailingLength); - } - + UErrorCode& err) { + if (U_FAILURE(err)) { return; } -error: - - /** - * An overflow indicates the locale ID passed in - * is ill-formed. If we got here, and there was - * no previous error, it's an implicit overflow. - **/ - if (*err == U_BUFFER_OVERFLOW_ERROR || - U_SUCCESS(*err)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + if (langLength >= ULOC_LANG_CAPACITY || + scriptLength >= ULOC_SCRIPT_CAPACITY || + regionLength >= ULOC_COUNTRY_CAPACITY) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } -} -/** - * Parse the language, script, and region subtags from a tag string, and copy the - * results into the corresponding output parameters. The buffers are null-terminated, - * unless overflow occurs. - * - * The langLength, scriptLength, and regionLength parameters are input/output - * parameters, and must contain the capacity of their corresponding buffers on - * input. On output, they will contain the actual length of the buffers, not - * including the null terminator. - * - * If the length of any of the output subtags exceeds the capacity of the corresponding - * buffer, the function copies as many bytes to the output buffer as it can, and returns - * the error U_BUFFER_OVERFLOW_ERROR. It will not parse any more subtags once overflow - * occurs. - * - * If an illegal argument is provided, the function returns the error - * U_ILLEGAL_ARGUMENT_ERROR. - * - * @param localeID The locale ID to parse. - * @param lang The language tag buffer. - * @param langLength The length of the language tag. - * @param script The script tag buffer. - * @param scriptLength The length of the script tag. - * @param region The region tag buffer. - * @param regionLength The length of the region tag. - * @param err A pointer to a UErrorCode for error reporting. - * @return The number of chars of the localeID parameter consumed. - **/ -static int32_t U_CALLCONV -parseTagString( - const char* localeID, - char* lang, - int32_t* langLength, - char* script, - int32_t* scriptLength, - char* region, - int32_t* regionLength, - UErrorCode* err) -{ - const char* position = localeID; - int32_t subtagLength = 0; - - if(U_FAILURE(*err) || - localeID == nullptr || - lang == nullptr || - langLength == nullptr || - script == nullptr || - scriptLength == nullptr || - region == nullptr || - regionLength == nullptr) { - goto error; + if (langLength > 0) { + sink.Append(lang, langLength); } - subtagLength = ulocimp_getLanguage(position, &position, *err).extract(lang, *langLength, *err); - - /* - * Note that we explicit consider U_STRING_NOT_TERMINATED_WARNING - * to be an error, because it indicates the user-supplied tag is - * not well-formed. - */ - if(U_FAILURE(*err)) { - goto error; + if (scriptLength > 0) { + sink.Append("_", 1); + sink.Append(script, scriptLength); } - *langLength = subtagLength; - - /* - * If no language was present, use the empty string instead. - * Otherwise, move past any separator. - */ - if (_isIDSeparator(*position)) { - ++position; + if (regionLength > 0) { + sink.Append("_", 1); + sink.Append(region, regionLength); } - subtagLength = ulocimp_getScript(position, &position, *err).extract(script, *scriptLength, *err); - - if(U_FAILURE(*err)) { - goto error; + if (variantLength > 0) { + if (regionLength == 0) { + /* extra separator is required */ + sink.Append("_", 1); + } + sink.Append("_", 1); + sink.Append(variant, variantLength); } - *scriptLength = subtagLength; - - if (*scriptLength > 0) { + if (trailingLength > 0) { /* - * Move past any separator. + * Copy the trailing data into the supplied buffer. */ - if (_isIDSeparator(*position)) { - ++position; - } + sink.Append(trailing, trailingLength); } +} - subtagLength = ulocimp_getCountry(position, &position, *err).extract(region, *regionLength, *err); - - if(U_FAILURE(*err)) { - goto error; - } - - *regionLength = subtagLength; - - if (*regionLength <= 0 && *position != 0 && *position != '@') { - /* back up over consumed trailing separator */ - --position; - } - -exit: - - return (int32_t)(position - localeID); - -error: - - /** - * If we get here, we have no explicit error, it's the result of an - * illegal argument. - **/ - if (!U_FAILURE(*err)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; +bool CHECK_TRAILING_VARIANT_SIZE(const char* variant, int32_t variantLength) { + int32_t count = 0; + for (int32_t i = 0; i < variantLength; i++) { + if (_isIDSeparator(variant[i])) { + count = 0; + } else if (count == 8) { + return false; + } else { + count++; + } } - - goto exit; + return true; } -#define CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength) UPRV_BLOCK_MACRO_BEGIN { \ - int32_t count = 0; \ - int32_t i; \ - for (i = 0; i < trailingLength; i++) { \ - if (trailing[i] == '-' || trailing[i] == '_') { \ - count = 0; \ - if (count > 8) { \ - goto error; \ - } \ - } else if (trailing[i] == '@') { \ - break; \ - } else if (count > 8) { \ - goto error; \ - } else { \ - count++; \ - } \ - } \ -} UPRV_BLOCK_MACRO_END - -static UBool +void _uloc_addLikelySubtags(const char* localeID, icu::ByteSink& sink, - UErrorCode* err) { - char lang[ULOC_LANG_CAPACITY]; - int32_t langLength = sizeof(lang); - char script[ULOC_SCRIPT_CAPACITY]; - int32_t scriptLength = sizeof(script); - char region[ULOC_COUNTRY_CAPACITY]; - int32_t regionLength = sizeof(region); - const char* trailing = ""; - int32_t trailingLength = 0; - int32_t trailingIndex = 0; - - if(U_FAILURE(*err)) { - goto error; + UErrorCode& err) { + if (U_FAILURE(err)) { + return; } + if (localeID == nullptr) { - goto error; + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - trailingIndex = parseTagString( - localeID, - lang, - &langLength, - script, - &scriptLength, - region, - ®ionLength, - err); - if(U_FAILURE(*err)) { - /* Overflow indicates an illegal argument error */ - if (*err == U_BUFFER_OVERFLOW_ERROR) { - *err = U_ILLEGAL_ARGUMENT_ERROR; - } - - goto error; - } - if (langLength > 3) { - goto error; + icu::CharString lang; + icu::CharString script; + icu::CharString region; + icu::CharString variant; + const char* trailing = nullptr; + ulocimp_getSubtags(localeID, &lang, &script, ®ion, &variant, &trailing, err); + if (U_FAILURE(err)) { + return; } - /* Find the length of the trailing portion. */ - while (_isIDSeparator(localeID[trailingIndex])) { - trailingIndex++; + if (!CHECK_TRAILING_VARIANT_SIZE(variant.data(), variant.length())) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - trailing = &localeID[trailingIndex]; - trailingLength = (int32_t)uprv_strlen(trailing); - - CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength); - { - const icu::XLikelySubtags* likelySubtags = icu::XLikelySubtags::getSingleton(*err); - if(U_FAILURE(*err)) { - goto error; - } - // We need to keep l on the stack because lsr may point into internal - // memory of l. - icu::Locale l = icu::Locale::createFromName(localeID); - if (l.isBogus()) { - goto error; - } - icu::LSR lsr = likelySubtags->makeMaximizedLsrFrom(l, true, *err); - if(U_FAILURE(*err)) { - goto error; - } - const char* language = lsr.language; - if (uprv_strcmp(language, "und") == 0) { - language = ""; - } - createTagStringWithAlternates( - language, - (int32_t)uprv_strlen(language), - lsr.script, - (int32_t)uprv_strlen(lsr.script), - lsr.region, - (int32_t)uprv_strlen(lsr.region), - trailing, - trailingLength, - nullptr, - sink, - err); - if(U_FAILURE(*err)) { - goto error; + + if (lang.length() == 4) { + if (script.isEmpty()) { + script = std::move(lang); + lang.clear(); + } else { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } + } else if (lang.length() > 8) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - return true; -error: + int32_t trailingLength = (int32_t)uprv_strlen(trailing); - if (!U_FAILURE(*err)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + const icu::LikelySubtags* likelySubtags = icu::LikelySubtags::getSingleton(err); + if (U_FAILURE(err)) { + return; + } + // We need to keep l on the stack because lsr may point into internal + // memory of l. + icu::Locale l = icu::Locale::createFromName(localeID); + if (l.isBogus()) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - return false; + icu::LSR lsr = likelySubtags->makeMaximizedLsrFrom(l, true, err); + if (U_FAILURE(err)) { + return; + } + const char* language = lsr.language; + if (uprv_strcmp(language, "und") == 0) { + language = ""; + } + createTagStringWithAlternates( + language, + (int32_t)uprv_strlen(language), + lsr.script, + (int32_t)uprv_strlen(lsr.script), + lsr.region, + (int32_t)uprv_strlen(lsr.region), + variant.data(), + variant.length(), + trailing, + trailingLength, + sink, + err); } -// Add likely subtags to the sink -// return true if the value in the sink is produced by a match during the lookup -// return false if the value in the sink is the same as input because there are -// no match after the lookup. -static UBool _ulocimp_addLikelySubtags(const char*, icu::ByteSink&, UErrorCode*); - -static void +void _uloc_minimizeSubtags(const char* localeID, icu::ByteSink& sink, bool favorScript, - UErrorCode* err) { - icu::CharString maximizedTagBuffer; - - char lang[ULOC_LANG_CAPACITY]; - int32_t langLength = sizeof(lang); - char script[ULOC_SCRIPT_CAPACITY]; - int32_t scriptLength = sizeof(script); - char region[ULOC_COUNTRY_CAPACITY]; - int32_t regionLength = sizeof(region); - const char* trailing = ""; - int32_t trailingLength = 0; - int32_t trailingIndex = 0; - - if(U_FAILURE(*err)) { - goto error; - } - else if (localeID == nullptr) { - goto error; + UErrorCode& err) { + if (U_FAILURE(err)) { + return; } - trailingIndex = - parseTagString( - localeID, - lang, - &langLength, - script, - &scriptLength, - region, - ®ionLength, - err); - if(U_FAILURE(*err)) { - - /* Overflow indicates an illegal argument error */ - if (*err == U_BUFFER_OVERFLOW_ERROR) { - *err = U_ILLEGAL_ARGUMENT_ERROR; - } - - goto error; + if (localeID == nullptr) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - /* Find the spot where the variants or the keywords begin, if any. */ - while (_isIDSeparator(localeID[trailingIndex])) { - trailingIndex++; + icu::CharString lang; + icu::CharString script; + icu::CharString region; + icu::CharString variant; + const char* trailing = nullptr; + ulocimp_getSubtags(localeID, &lang, &script, ®ion, &variant, &trailing, err); + if (U_FAILURE(err)) { + return; } - trailing = &localeID[trailingIndex]; - trailingLength = (int32_t)uprv_strlen(trailing); - - CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength); - { - const icu::XLikelySubtags* likelySubtags = icu::XLikelySubtags::getSingleton(*err); - if(U_FAILURE(*err)) { - goto error; - } - icu::LSR lsr = likelySubtags->minimizeSubtags( - {lang, langLength}, - {script, scriptLength}, - {region, regionLength}, - favorScript, - *err); - if(U_FAILURE(*err)) { - goto error; - } - const char* language = lsr.language; - if (uprv_strcmp(language, "und") == 0) { - language = ""; - } - createTagStringWithAlternates( - language, - (int32_t)uprv_strlen(language), - lsr.script, - (int32_t)uprv_strlen(lsr.script), - lsr.region, - (int32_t)uprv_strlen(lsr.region), - trailing, - trailingLength, - nullptr, - sink, - err); - if(U_FAILURE(*err)) { - goto error; - } + if (!CHECK_TRAILING_VARIANT_SIZE(variant.data(), variant.length())) { + err = U_ILLEGAL_ARGUMENT_ERROR; return; } -error: + int32_t trailingLength = (int32_t)uprv_strlen(trailing); - if (!U_FAILURE(*err)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + const icu::LikelySubtags* likelySubtags = icu::LikelySubtags::getSingleton(err); + if (U_FAILURE(err)) { + return; } + icu::LSR lsr = likelySubtags->minimizeSubtags( + lang.toStringPiece(), + script.toStringPiece(), + region.toStringPiece(), + favorScript, + err); + if (U_FAILURE(err)) { + return; + } + const char* language = lsr.language; + if (uprv_strcmp(language, "und") == 0) { + language = ""; + } + createTagStringWithAlternates( + language, + (int32_t)uprv_strlen(language), + lsr.script, + (int32_t)uprv_strlen(lsr.script), + lsr.region, + (int32_t)uprv_strlen(lsr.region), + variant.data(), + variant.length(), + trailing, + trailingLength, + sink, + err); } +} // namespace + U_CAPI int32_t U_EXPORT2 uloc_addLikelySubtags(const char* localeID, char* maximizedLocaleID, int32_t maximizedLocaleIDCapacity, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - icu::CheckedArrayByteSink sink( - maximizedLocaleID, maximizedLocaleIDCapacity); - - ulocimp_addLikelySubtags(localeID, sink, status); - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return sink.Overflowed() ? reslen : -1; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars( - maximizedLocaleID, maximizedLocaleIDCapacity, reslen, status); - } - - return reslen; + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + maximizedLocaleID, maximizedLocaleIDCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_addLikelySubtags(localeID, sink, status); + }, + *status); } -static UBool -_ulocimp_addLikelySubtags(const char* localeID, - icu::ByteSink& sink, - UErrorCode* status) { - icu::CharString localeBuffer; - { - icu::CharStringByteSink localeSink(&localeBuffer); - ulocimp_canonicalize(localeID, localeSink, status); - } - if (U_SUCCESS(*status)) { - return _uloc_addLikelySubtags(localeBuffer.data(), sink, status); - } else { - return false; - } +U_EXPORT icu::CharString +ulocimp_addLikelySubtags(const char* localeID, + UErrorCode& status) { + return icu::ByteSinkUtil::viaByteSinkToCharString( + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_addLikelySubtags(localeID, sink, status); + }, + status); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_addLikelySubtags(const char* localeID, icu::ByteSink& sink, - UErrorCode* status) { - _ulocimp_addLikelySubtags(localeID, sink, status); + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + icu::CharString localeBuffer = ulocimp_canonicalize(localeID, status); + _uloc_addLikelySubtags(localeBuffer.data(), sink, status); } U_CAPI int32_t U_EXPORT2 @@ -682,40 +308,32 @@ uloc_minimizeSubtags(const char* localeID, char* minimizedLocaleID, int32_t minimizedLocaleIDCapacity, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - icu::CheckedArrayByteSink sink( - minimizedLocaleID, minimizedLocaleIDCapacity); - - ulocimp_minimizeSubtags(localeID, sink, false, status); - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return sink.Overflowed() ? reslen : -1; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars( - minimizedLocaleID, minimizedLocaleIDCapacity, reslen, status); - } + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + minimizedLocaleID, minimizedLocaleIDCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_minimizeSubtags(localeID, sink, false, status); + }, + *status); +} - return reslen; +U_EXPORT icu::CharString +ulocimp_minimizeSubtags(const char* localeID, + bool favorScript, + UErrorCode& status) { + return icu::ByteSinkUtil::viaByteSinkToCharString( + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_minimizeSubtags(localeID, sink, favorScript, status); + }, + status); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_minimizeSubtags(const char* localeID, icu::ByteSink& sink, bool favorScript, - UErrorCode* status) { - icu::CharString localeBuffer; - { - icu::CharStringByteSink localeSink(&localeBuffer); - ulocimp_canonicalize(localeID, localeSink, status); - } + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + icu::CharString localeBuffer = ulocimp_canonicalize(localeID, status); _uloc_minimizeSubtags(localeBuffer.data(), sink, favorScript, status); } @@ -728,22 +346,16 @@ static const char LANG_DIR_STRING[] = U_CAPI UBool U_EXPORT2 uloc_isRightToLeft(const char *locale) { UErrorCode errorCode = U_ZERO_ERROR; - char script[8]; - int32_t scriptLength = uloc_getScript(locale, script, UPRV_LENGTHOF(script), &errorCode); - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING || - scriptLength == 0) { + icu::CharString lang; + icu::CharString script; + ulocimp_getSubtags(locale, &lang, &script, nullptr, nullptr, nullptr, errorCode); + if (U_FAILURE(errorCode) || script.isEmpty()) { // Fastpath: We know the likely scripts and their writing direction // for some common languages. - errorCode = U_ZERO_ERROR; - char lang[8]; - int32_t langLength = uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &errorCode); - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) { - return false; - } - if (langLength > 0) { - const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang); + if (!lang.isEmpty()) { + const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang.data()); if (langPtr != nullptr) { - switch (langPtr[langLength]) { + switch (langPtr[lang.length()]) { case '-': return false; case '+': return true; default: break; // partial match of a longer code @@ -752,21 +364,16 @@ uloc_isRightToLeft(const char *locale) { } // Otherwise, find the likely script. errorCode = U_ZERO_ERROR; - icu::CharString likely; - { - icu::CharStringByteSink sink(&likely); - ulocimp_addLikelySubtags(locale, sink, &errorCode); - } - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) { + icu::CharString likely = ulocimp_addLikelySubtags(locale, errorCode); + if (U_FAILURE(errorCode)) { return false; } - scriptLength = uloc_getScript(likely.data(), script, UPRV_LENGTHOF(script), &errorCode); - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING || - scriptLength == 0) { + ulocimp_getSubtags(likely.data(), nullptr, &script, nullptr, nullptr, nullptr, errorCode); + if (U_FAILURE(errorCode) || script.isEmpty()) { return false; } } - UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script); + UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script.data()); return uscript_isRightToLeft(scriptCode); } @@ -779,65 +386,52 @@ Locale::isRightToLeft() const { U_NAMESPACE_END -// The following must at least allow for rg key value (6) plus terminator (1). -#define ULOC_RG_BUFLEN 8 +namespace { +icu::CharString +GetRegionFromKey(const char* localeID, const char* key, UErrorCode& status) { + icu::CharString result; -U_CAPI int32_t U_EXPORT2 -ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, - char *region, int32_t regionCapacity, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - char rgBuf[ULOC_RG_BUFLEN]; - UErrorCode rgStatus = U_ZERO_ERROR; - - // First check for rg keyword value - icu::CharString rg; - { - icu::CharStringByteSink sink(&rg); - ulocimp_getKeywordValue(localeID, "rg", sink, &rgStatus); - } - int32_t rgLen = rg.length(); - if (U_FAILURE(rgStatus) || rgLen < 3 || rgLen > 7) { - rgLen = 0; - } else { + // First check for keyword value + icu::CharString kw = ulocimp_getKeywordValue(localeID, key, status); + int32_t len = kw.length(); + if (U_SUCCESS(status) && len >= 3 && len <= 7) { // chop off the subdivision code (which will generally be "zzzz" anyway) - const char* const data = rg.data(); + const char* const data = kw.data(); if (uprv_isASCIILetter(data[0])) { - rgLen = 2; - rgBuf[0] = uprv_toupper(data[0]); - rgBuf[1] = uprv_toupper(data[1]); + result.append(uprv_toupper(data[0]), status); + result.append(uprv_toupper(data[1]), status); } else { // assume three-digit region code - rgLen = 3; - uprv_memcpy(rgBuf, data, rgLen); + result.append(data, 3, status); } } + return result; +} +} // namespace - if (rgLen == 0) { +U_EXPORT icu::CharString +ulocimp_getRegionForSupplementalData(const char *localeID, bool inferRegion, + UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + icu::CharString rgBuf = GetRegionFromKey(localeID, "rg", status); + if (U_SUCCESS(status) && rgBuf.isEmpty()) { // No valid rg keyword value, try for unicode_region_subtag - rgLen = uloc_getCountry(localeID, rgBuf, ULOC_RG_BUFLEN, status); - if (U_FAILURE(*status)) { - rgLen = 0; - } else if (rgLen == 0 && inferRegion) { - // no unicode_region_subtag but inferRegion true, try likely subtags - rgStatus = U_ZERO_ERROR; - icu::CharString locBuf; - { - icu::CharStringByteSink sink(&locBuf); - ulocimp_addLikelySubtags(localeID, sink, &rgStatus); - } - if (U_SUCCESS(rgStatus)) { - rgLen = uloc_getCountry(locBuf.data(), rgBuf, ULOC_RG_BUFLEN, status); - if (U_FAILURE(*status)) { - rgLen = 0; + rgBuf = ulocimp_getRegion(localeID, status); + if (U_SUCCESS(status) && rgBuf.isEmpty() && inferRegion) { + // Second check for sd keyword value + rgBuf = GetRegionFromKey(localeID, "sd", status); + if (U_SUCCESS(status) && rgBuf.isEmpty()) { + // no unicode_region_subtag but inferRegion true, try likely subtags + UErrorCode rgStatus = U_ZERO_ERROR; + icu::CharString locBuf = ulocimp_addLikelySubtags(localeID, rgStatus); + if (U_SUCCESS(rgStatus)) { + rgBuf = ulocimp_getRegion(locBuf.data(), status); } } } } - rgBuf[rgLen] = 0; - uprv_strncpy(region, rgBuf, regionCapacity); - return u_terminateChars(region, regionCapacity, rgLen, status); + return rgBuf; } - diff --git a/deps/icu-small/source/common/loclikelysubtags.cpp b/deps/icu-small/source/common/loclikelysubtags.cpp index c2a7011b5093eb..c182191057f4f2 100644 --- a/deps/icu-small/source/common/loclikelysubtags.cpp +++ b/deps/icu-small/source/common/loclikelysubtags.cpp @@ -51,8 +51,7 @@ LocaleDistanceData::~LocaleDistanceData() { delete[] paradigms; } -// TODO(ICU-20777): Rename to just LikelySubtagsData. -struct XLikelySubtagsData { +struct LikelySubtagsData { UResourceBundle *langInfoBundle = nullptr; UniqueCharStrings strings; CharStringMap languageAliases; @@ -63,14 +62,15 @@ struct XLikelySubtagsData { LocaleDistanceData distanceData; - XLikelySubtagsData(UErrorCode &errorCode) : strings(errorCode) {} + LikelySubtagsData(UErrorCode &errorCode) : strings(errorCode) {} - ~XLikelySubtagsData() { + ~LikelySubtagsData() { ures_close(langInfoBundle); delete[] lsrs; } void load(UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return; } langInfoBundle = ures_openDirect(nullptr, "langInfo", &errorCode); if (U_FAILURE(errorCode)) { return; } StackUResourceBundle stackTempBundle; @@ -231,6 +231,7 @@ struct XLikelySubtagsData { private: bool readStrings(const ResourceTable &table, const char *key, ResourceValue &value, LocalMemory &indexes, int32_t &length, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return false; } if (table.findValue(key, value)) { ResourceArray stringArray = value.getArray(errorCode); if (U_FAILURE(errorCode)) { return false; } @@ -297,7 +298,7 @@ struct XLikelySubtagsData { } UnicodeString toRegion(const ResourceArray& m49Array, ResourceValue &value, int encoded, UErrorCode &errorCode) { - if (encoded == 0 || encoded == 1) { + if (U_FAILURE(errorCode) || encoded == 0 || encoded == 1) { return UNICODE_STRING_SIMPLE(""); } encoded &= 0x00ffffff; @@ -315,6 +316,7 @@ struct XLikelySubtagsData { bool readLSREncodedStrings(const ResourceTable &table, const char* key, ResourceValue &value, const ResourceArray& m49Array, LocalMemory &indexes, int32_t &length, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return false; } if (table.findValue(key, value)) { const int32_t* vectors = value.getIntVector(length, errorCode); if (U_FAILURE(errorCode)) { return false; } @@ -339,7 +341,7 @@ struct XLikelySubtagsData { namespace { -XLikelySubtags *gLikelySubtags = nullptr; +LikelySubtags *gLikelySubtags = nullptr; UVector *gMacroregions = nullptr; UInitOnce gInitOnce {}; @@ -352,8 +354,56 @@ UBool U_CALLCONV cleanup() { return true; } -static const char16_t RANGE_MARKER = 0x7E; /* '~' */ +constexpr const char16_t* MACROREGION_HARDCODE[] = { + u"001~3", + u"005", + u"009", + u"011", + u"013~5", + u"017~9", + u"021", + u"029", + u"030", + u"034~5", + u"039", + u"053~4", + u"057", + u"061", + u"142~3", + u"145", + u"150~1", + u"154~5", + u"202", + u"419", + u"EU", + u"EZ", + u"QO", + u"UN", +}; + +constexpr char16_t RANGE_MARKER = 0x7E; /* '~' */ +void processMacroregionRange(const UnicodeString& regionName, UVector* newMacroRegions, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER); + char16_t buf[6]; + regionName.extract(buf,6,status); + if ( rangeMarkerLocation > 0 ) { + char16_t endRange = regionName.charAt(rangeMarkerLocation+1); + buf[rangeMarkerLocation] = 0; + while ( buf[rangeMarkerLocation-1] <= endRange && U_SUCCESS(status)) { + LocalPointer newRegion(new UnicodeString(buf), status); + newMacroRegions->adoptElement(newRegion.orphan(),status); + buf[rangeMarkerLocation-1]++; + } + } else { + LocalPointer newRegion(new UnicodeString(regionName), status); + newMacroRegions->adoptElement(newRegion.orphan(),status); + } +} + +#if U_DEBUG UVector* loadMacroregions(UErrorCode &status) { + if (U_FAILURE(status)) { return nullptr; } LocalPointer newMacroRegions(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status); LocalUResourceBundlePointer supplementalData(ures_openDirect(nullptr,"supplementalData",&status)); @@ -365,37 +415,52 @@ UVector* loadMacroregions(UErrorCode &status) { return nullptr; } - while (U_SUCCESS(status) && ures_hasNext(regionMacro.getAlias())) { + while (ures_hasNext(regionMacro.getAlias())) { UnicodeString regionName = ures_getNextUnicodeString(regionMacro.getAlias(),nullptr,&status); - int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER); - char16_t buf[6]; - regionName.extract(buf,6,status); - if ( rangeMarkerLocation > 0 ) { - char16_t endRange = regionName.charAt(rangeMarkerLocation+1); - buf[rangeMarkerLocation] = 0; - while ( buf[rangeMarkerLocation-1] <= endRange && U_SUCCESS(status)) { - LocalPointer newRegion(new UnicodeString(buf), status); - newMacroRegions->adoptElement(newRegion.orphan(),status); - buf[rangeMarkerLocation-1]++; - } - } else { - LocalPointer newRegion(new UnicodeString(regionName), status); - newMacroRegions->adoptElement(newRegion.orphan(),status); + processMacroregionRange(regionName, newMacroRegions.getAlias(), status); + if (U_FAILURE(status)) { + return nullptr; } } + + return newMacroRegions.orphan(); +} +#endif // U_DEBUG + +UVector* getStaticMacroregions(UErrorCode &status) { + if (U_FAILURE(status)) { return nullptr; } + LocalPointer newMacroRegions(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status); + + if (U_FAILURE(status)) { + return nullptr; + } + + for (const auto *region : MACROREGION_HARDCODE) { + UnicodeString regionName(region); + processMacroregionRange(regionName, newMacroRegions.getAlias(), status); + if (U_FAILURE(status)) { + return nullptr; + } + } + return newMacroRegions.orphan(); } } // namespace -void U_CALLCONV XLikelySubtags::initLikelySubtags(UErrorCode &errorCode) { +void U_CALLCONV LikelySubtags::initLikelySubtags(UErrorCode &errorCode) { // This function is invoked only via umtx_initOnce(). U_ASSERT(gLikelySubtags == nullptr); - XLikelySubtagsData data(errorCode); + LikelySubtagsData data(errorCode); data.load(errorCode); if (U_FAILURE(errorCode)) { return; } - gLikelySubtags = new XLikelySubtags(data); - gMacroregions = loadMacroregions(errorCode); + gLikelySubtags = new LikelySubtags(data); + gMacroregions = getStaticMacroregions(errorCode); +#if U_DEBUG + auto macroregionsFromData = loadMacroregions(errorCode); + U_ASSERT((*gMacroregions) == (*macroregionsFromData)); + delete macroregionsFromData; +#endif if (U_FAILURE(errorCode) || gLikelySubtags == nullptr || gMacroregions == nullptr) { delete gLikelySubtags; delete gMacroregions; @@ -406,13 +471,13 @@ void U_CALLCONV XLikelySubtags::initLikelySubtags(UErrorCode &errorCode) { ucln_common_registerCleanup(UCLN_COMMON_LIKELY_SUBTAGS, cleanup); } -const XLikelySubtags *XLikelySubtags::getSingleton(UErrorCode &errorCode) { +const LikelySubtags *LikelySubtags::getSingleton(UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return nullptr; } - umtx_initOnce(gInitOnce, &XLikelySubtags::initLikelySubtags, errorCode); + umtx_initOnce(gInitOnce, &LikelySubtags::initLikelySubtags, errorCode); return gLikelySubtags; } -XLikelySubtags::XLikelySubtags(XLikelySubtagsData &data) : +LikelySubtags::LikelySubtags(LikelySubtagsData &data) : langInfoBundle(data.langInfoBundle), strings(data.strings.orphanCharStrings()), languageAliases(std::move(data.languageAliases)), @@ -421,7 +486,7 @@ XLikelySubtags::XLikelySubtags(XLikelySubtagsData &data) : lsrs(data.lsrs), #if U_DEBUG lsrsLength(data.lsrsLength), -#endif +#endif // U_DEBUG distanceData(std::move(data.distanceData)) { data.langInfoBundle = nullptr; data.lsrs = nullptr; @@ -447,18 +512,19 @@ XLikelySubtags::XLikelySubtags(XLikelySubtagsData &data) : } } -XLikelySubtags::~XLikelySubtags() { +LikelySubtags::~LikelySubtags() { ures_close(langInfoBundle); delete strings; delete[] lsrs; } -LSR XLikelySubtags::makeMaximizedLsrFrom(const Locale &locale, +LSR LikelySubtags::makeMaximizedLsrFrom(const Locale &locale, bool returnInputIfUnmatch, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return {}; } if (locale.isBogus()) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; - return LSR("", "", "", LSR::EXPLICIT_LSR); + return {}; } const char *name = locale.getName(); if (uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') { // name.startsWith("@x=") @@ -490,10 +556,11 @@ const char *getCanonical(const CharStringMap &aliases, const char *alias) { } // namespace -LSR XLikelySubtags::makeMaximizedLsr(const char *language, const char *script, const char *region, +LSR LikelySubtags::makeMaximizedLsr(const char *language, const char *script, const char *region, const char *variant, bool returnInputIfUnmatch, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return {}; } // Handle pseudolocales like en-XA, ar-XB, fr-PSCRACK. // They should match only themselves, // not other locales with what looks like the same language and script subtags. @@ -501,12 +568,21 @@ LSR XLikelySubtags::makeMaximizedLsr(const char *language, const char *script, c if (region[0] == 'X' && (c1 = region[1]) != 0 && region[2] == 0) { switch (c1) { case 'A': + if (returnInputIfUnmatch) { + return LSR(language, script, region, LSR::EXPLICIT_LSR); + } return LSR(PSEUDO_ACCENTS_PREFIX, language, script, region, LSR::EXPLICIT_LSR, errorCode); case 'B': + if (returnInputIfUnmatch) { + return LSR(language, script, region, LSR::EXPLICIT_LSR); + } return LSR(PSEUDO_BIDI_PREFIX, language, script, region, LSR::EXPLICIT_LSR, errorCode); case 'C': + if (returnInputIfUnmatch) { + return LSR(language, script, region, LSR::EXPLICIT_LSR); + } return LSR(PSEUDO_CRACKED_PREFIX, language, script, region, LSR::EXPLICIT_LSR, errorCode); default: // normal locale @@ -536,9 +612,10 @@ LSR XLikelySubtags::makeMaximizedLsr(const char *language, const char *script, c return maximize(language, script, region, returnInputIfUnmatch, errorCode); } -LSR XLikelySubtags::maximize(const char *language, const char *script, const char *region, +LSR LikelySubtags::maximize(const char *language, const char *script, const char *region, bool returnInputIfUnmatch, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return {}; } return maximize({language, (int32_t)uprv_strlen(language)}, {script, (int32_t)uprv_strlen(script)}, {region, (int32_t)uprv_strlen(region)}, @@ -546,23 +623,21 @@ LSR XLikelySubtags::maximize(const char *language, const char *script, const cha errorCode); } -bool XLikelySubtags::isMacroregion(StringPiece& region, UErrorCode& errorCode) const { +bool LikelySubtags::isMacroregion(StringPiece& region, UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { return false; } // In Java, we use Region class. In C++, since Region is under i18n, // we read the same data used by Region into gMacroregions avoid dependency // from common to i18n/region.cpp - if (U_FAILURE(errorCode)) { return false; } - umtx_initOnce(gInitOnce, &XLikelySubtags::initLikelySubtags, errorCode); + umtx_initOnce(gInitOnce, &LikelySubtags::initLikelySubtags, errorCode); if (U_FAILURE(errorCode)) { return false; } UnicodeString str(UnicodeString::fromUTF8(region)); return gMacroregions->contains((void *)&str); } -LSR XLikelySubtags::maximize(StringPiece language, StringPiece script, StringPiece region, +LSR LikelySubtags::maximize(StringPiece language, StringPiece script, StringPiece region, bool returnInputIfUnmatch, UErrorCode &errorCode) const { - if (U_FAILURE(errorCode)) { - return LSR(language, script, region, LSR::EXPLICIT_LSR, errorCode); - } + if (U_FAILURE(errorCode)) { return {}; } if (language.compare("und") == 0) { language = ""; } @@ -681,7 +756,7 @@ LSR XLikelySubtags::maximize(StringPiece language, StringPiece script, StringPie return LSR(language, script, region, retainMask, errorCode); } -int32_t XLikelySubtags::compareLikely(const LSR &lsr, const LSR &other, int32_t likelyInfo) const { +int32_t LikelySubtags::compareLikely(const LSR &lsr, const LSR &other, int32_t likelyInfo) const { // If likelyInfo >= 0: // likelyInfo bit 1 is set if the previous comparison with lsr // was for equal language and script. @@ -723,7 +798,7 @@ int32_t XLikelySubtags::compareLikely(const LSR &lsr, const LSR &other, int32_t } // Subset of maximize(). -int32_t XLikelySubtags::getLikelyIndex(const char *language, const char *script) const { +int32_t LikelySubtags::getLikelyIndex(const char *language, const char *script) const { if (uprv_strcmp(language, "und") == 0) { language = ""; } @@ -781,7 +856,7 @@ int32_t XLikelySubtags::getLikelyIndex(const char *language, const char *script) return value; } -int32_t XLikelySubtags::trieNext(BytesTrie &iter, const char *s, int32_t i) { +int32_t LikelySubtags::trieNext(BytesTrie &iter, const char *s, int32_t i) { UStringTrieResult result; uint8_t c; if ((c = s[i]) == 0) { @@ -814,7 +889,7 @@ int32_t XLikelySubtags::trieNext(BytesTrie &iter, const char *s, int32_t i) { default: return -1; } } -int32_t XLikelySubtags::trieNext(BytesTrie &iter, StringPiece s, int32_t i) { +int32_t LikelySubtags::trieNext(BytesTrie &iter, StringPiece s, int32_t i) { UStringTrieResult result; uint8_t c; if (s.length() == i) { @@ -848,14 +923,13 @@ int32_t XLikelySubtags::trieNext(BytesTrie &iter, StringPiece s, int32_t i) { } } -LSR XLikelySubtags::minimizeSubtags(StringPiece language, StringPiece script, +LSR LikelySubtags::minimizeSubtags(StringPiece language, StringPiece script, StringPiece region, bool favorScript, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return {}; } LSR max = maximize(language, script, region, true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } // If no match, return it. if (uprv_strlen(max.language) == 0 && uprv_strlen(max.script) == 0 && @@ -868,9 +942,7 @@ LSR XLikelySubtags::minimizeSubtags(StringPiece language, StringPiece script, } // try language LSR test = maximize(max.language, "", "", true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } if (test.isEquivalentTo(max)) { return LSR(max.language, "", "", LSR::DONT_CARE_FLAGS, errorCode); } @@ -879,27 +951,21 @@ LSR XLikelySubtags::minimizeSubtags(StringPiece language, StringPiece script, // favor Region // try language and region test = maximize(max.language, "", max.region, true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } if (test.isEquivalentTo(max)) { return LSR(max.language, "", max.region, LSR::DONT_CARE_FLAGS, errorCode); } } // try language and script test = maximize(max.language, max.script, "", true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } if (test.isEquivalentTo(max)) { return LSR(max.language, max.script, "", LSR::DONT_CARE_FLAGS, errorCode); } if (favorScript) { // try language and region test = maximize(max.language, "", max.region, true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } if (test.isEquivalentTo(max)) { return LSR(max.language, "", max.region, LSR::DONT_CARE_FLAGS, errorCode); } diff --git a/deps/icu-small/source/common/loclikelysubtags.h b/deps/icu-small/source/common/loclikelysubtags.h index ebd9c153068eb6..5c51e353c1e75d 100644 --- a/deps/icu-small/source/common/loclikelysubtags.h +++ b/deps/icu-small/source/common/loclikelysubtags.h @@ -19,7 +19,7 @@ U_NAMESPACE_BEGIN -struct XLikelySubtagsData; +struct LikelySubtagsData; struct LocaleDistanceData { LocaleDistanceData() = default; @@ -37,15 +37,14 @@ struct LocaleDistanceData { LocaleDistanceData &operator=(const LocaleDistanceData &) = delete; }; -// TODO(ICU-20777): Rename to just LikelySubtags. -class XLikelySubtags final : public UMemory { +class LikelySubtags final : public UMemory { public: - ~XLikelySubtags(); + ~LikelySubtags(); static constexpr int32_t SKIP_SCRIPT = 1; // VisibleForTesting - static const XLikelySubtags *getSingleton(UErrorCode &errorCode); + static const LikelySubtags *getSingleton(UErrorCode &errorCode); // VisibleForTesting LSR makeMaximizedLsrFrom(const Locale &locale, @@ -72,9 +71,9 @@ class XLikelySubtags final : public UMemory { const LocaleDistanceData &getDistanceData() const { return distanceData; } private: - XLikelySubtags(XLikelySubtagsData &data); - XLikelySubtags(const XLikelySubtags &other) = delete; - XLikelySubtags &operator=(const XLikelySubtags &other) = delete; + LikelySubtags(LikelySubtagsData &data); + LikelySubtags(const LikelySubtags &other) = delete; + LikelySubtags &operator=(const LikelySubtags &other) = delete; static void initLikelySubtags(UErrorCode &errorCode); @@ -120,7 +119,7 @@ class XLikelySubtags final : public UMemory { int32_t lsrsLength; #endif - // distance/matcher data: see comment in XLikelySubtagsData::load() + // distance/matcher data: see comment in LikelySubtagsData::load() LocaleDistanceData distanceData; }; diff --git a/deps/icu-small/source/common/locmap.cpp b/deps/icu-small/source/common/locmap.cpp index e41cfd1027d056..b95eb04428b52d 100644 --- a/deps/icu-small/source/common/locmap.cpp +++ b/deps/icu-small/source/common/locmap.cpp @@ -28,7 +28,6 @@ */ #include "locmap.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cstring.h" #include "cmemory.h" @@ -49,6 +48,8 @@ * [MS-LCID] Windows Language Code Identifier (LCID) Reference */ +namespace { + /* //////////////////////////////////////////////// // @@ -87,7 +88,7 @@ typedef struct ILcidPosixMap * @param posixID posix ID of the language_TERRITORY such as 'de_CH' */ #define ILCID_POSIX_ELEMENT_ARRAY(hostID, languageID, posixID) \ -static const ILcidPosixElement locmap_ ## languageID [] = { \ +constexpr ILcidPosixElement locmap_ ## languageID [] = { \ {LANGUAGE_LCID(hostID), #languageID}, /* parent locale */ \ {hostID, #posixID}, \ }; @@ -97,7 +98,7 @@ static const ILcidPosixElement locmap_ ## languageID [] = { \ * @param id the POSIX ID, either a language or language_TERRITORY */ #define ILCID_POSIX_SUBTABLE(id) \ -static const ILcidPosixElement locmap_ ## id [] = +constexpr ILcidPosixElement locmap_ ## id [] = /** @@ -796,7 +797,7 @@ ILCID_POSIX_SUBTABLE(zh) { ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) /* This must be static and grouped by LCID. */ -static const ILcidPosixMap gPosixIDmap[] = { +constexpr ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(af), /* af Afrikaans 0x36 */ ILCID_POSIX_MAP(am), /* am Amharic 0x5e */ ILCID_POSIX_MAP(ar), /* ar Arabic 0x01 */ @@ -945,14 +946,14 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(zu), /* zu Zulu 0x35 */ }; -static const uint32_t gLocaleCount = UPRV_LENGTHOF(gPosixIDmap); +constexpr uint32_t gLocaleCount = UPRV_LENGTHOF(gPosixIDmap); /** * Do not call this function. It is called by hostID. * The function is not private because this struct must stay as a C struct, * and this is an internal class. */ -static int32_t +int32_t idCmp(const char* id1, const char* id2) { int32_t diffIdx = 0; @@ -972,9 +973,10 @@ idCmp(const char* id1, const char* id2) * no equivalent Windows LCID. * @return the LCID */ -static uint32_t -getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) +uint32_t +getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode& status) { + if (U_FAILURE(status)) { return locmap_root->hostID; } int32_t bestIdx = 0; int32_t bestIdxDiff = 0; int32_t posixIDlen = (int32_t)uprv_strlen(posixID); @@ -996,16 +998,16 @@ getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) if ((posixID[bestIdxDiff] == '_' || posixID[bestIdxDiff] == '@') && this_0->regionMaps[bestIdx].posixID[bestIdxDiff] == 0) { - *status = U_USING_FALLBACK_WARNING; + status = U_USING_FALLBACK_WARNING; return this_0->regionMaps[bestIdx].hostID; } /*no match found */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return this_0->regionMaps->hostID; + status = U_ILLEGAL_ARGUMENT_ERROR; + return locmap_root->hostID; } -static const char* +const char* getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) { uint32_t i; @@ -1035,19 +1037,21 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) * quz -> qu * prs -> fa */ -#define FIX_LANGUAGE_ID_TAG(buffer, len) \ - if (len >= 3) { \ - if (buffer[0] == 'q' && buffer[1] == 'u' && buffer[2] == 'z') {\ - buffer[2] = 0; \ - uprv_strcat(buffer, buffer+3); \ - } else if (buffer[0] == 'p' && buffer[1] == 'r' && buffer[2] == 's') {\ - buffer[0] = 'f'; buffer[1] = 'a'; buffer[2] = 0; \ - uprv_strcat(buffer, buffer+3); \ - } \ +void FIX_LANGUAGE_ID_TAG(char* buffer, int32_t len) { + if (len >= 3) { + if (buffer[0] == 'q' && buffer[1] == 'u' && buffer[2] == 'z') { + buffer[2] = 0; + uprv_strcat(buffer, buffer+3); + } else if (buffer[0] == 'p' && buffer[1] == 'r' && buffer[2] == 's') { + buffer[0] = 'f'; buffer[1] = 'a'; buffer[2] = 0; + uprv_strcat(buffer, buffer+3); + } } - +} #endif +} // namespace + U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UErrorCode* status) { @@ -1147,7 +1151,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr /* no match found */ *status = U_ILLEGAL_ARGUMENT_ERROR; - return -1; + return 0; } /* @@ -1176,11 +1180,7 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) // Check any for keywords. if (uprv_strchr(localeID, '@')) { - icu::CharString collVal; - { - icu::CharStringByteSink sink(&collVal); - ulocimp_getKeywordValue(localeID, "collation", sink, status); - } + icu::CharString collVal = ulocimp_getKeywordValue(localeID, "collation", *status); if (U_SUCCESS(*status) && !collVal.isEmpty()) { // If it contains the keyword collation, return 0 so that the LCID lookup table will be used. @@ -1189,10 +1189,7 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) else { // If the locale ID contains keywords other than collation, just use the base name. - { - icu::CharStringByteSink sink(&baseName); - ulocimp_getBaseName(localeID, sink, status); - } + baseName = ulocimp_getBaseName(localeID, *status); if (U_SUCCESS(*status) && !baseName.isEmpty()) { mylocaleID = baseName.data(); @@ -1201,11 +1198,7 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) } // this will change it from de_DE@collation=phonebook to de-DE-u-co-phonebk form - icu::CharString asciiBCP47Tag; - { - icu::CharStringByteSink sink(&asciiBCP47Tag); - ulocimp_toLanguageTag(mylocaleID, sink, false, status); - } + icu::CharString asciiBCP47Tag = ulocimp_toLanguageTag(mylocaleID, false, *status); if (U_SUCCESS(*status)) { @@ -1253,6 +1246,14 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) { + if (U_FAILURE(*status) || + langID == nullptr || + posixID == nullptr || + uprv_strlen(langID) < 2 || + uprv_strlen(posixID) < 2) { + return locmap_root->hostID; + } + // This function does the table lookup when native platform name->lcid conversion isn't available, // or for locales that don't follow patterns the platform expects. uint32_t low = 0; @@ -1266,11 +1267,6 @@ uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) UErrorCode myStatus; uint32_t idx; - /* Check for incomplete id. */ - if (!langID || !posixID || uprv_strlen(langID) < 2 || uprv_strlen(posixID) < 2) { - return 0; - } - /*Binary search for the map entry for normal cases */ while (high > low) /*binary search*/{ @@ -1288,7 +1284,7 @@ uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) low = mid; } else /*we found it*/{ - return getHostID(&gPosixIDmap[mid], posixID, status); + return getHostID(&gPosixIDmap[mid], posixID, *status); } oldmid = mid; } @@ -1299,7 +1295,7 @@ uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) */ for (idx = 0; idx < gLocaleCount; idx++ ) { myStatus = U_ZERO_ERROR; - value = getHostID(&gPosixIDmap[idx], posixID, &myStatus); + value = getHostID(&gPosixIDmap[idx], posixID, myStatus); if (myStatus == U_ZERO_ERROR) { return value; } @@ -1315,5 +1311,5 @@ uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) /* no match found */ *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; /* return international (root) */ + return locmap_root->hostID; /* return international (root) */ } diff --git a/deps/icu-small/source/common/locresdata.cpp b/deps/icu-small/source/common/locresdata.cpp index c9d1cdddde4448..725e6609159896 100644 --- a/deps/icu-small/source/common/locresdata.cpp +++ b/deps/icu-small/source/common/locresdata.cpp @@ -24,7 +24,6 @@ #include "unicode/putil.h" #include "unicode/uloc.h" #include "unicode/ures.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cstring.h" #include "ulocimp.h" @@ -50,10 +49,10 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, int32_t *pLength, UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { return nullptr; } /* char localeBuffer[ULOC_FULLNAME_CAPACITY*4];*/ const char16_t *item=nullptr; UErrorCode errorCode; - char explicitFallbackName[ULOC_FULLNAME_CAPACITY] = {0}; /* * open the bundle for the current locale @@ -128,15 +127,16 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, *pErrorCode = errorCode; break; } - - u_UCharsToChars(fallbackLocale, explicitFallbackName, len); - + + icu::CharString explicitFallbackName; + explicitFallbackName.appendInvariantChars(fallbackLocale, len, errorCode); + /* guard against recursive fallback */ - if(uprv_strcmp(explicitFallbackName, locale)==0){ + if (explicitFallbackName == locale) { *pErrorCode = U_INTERNAL_PROGRAM_ERROR; break; } - rb.adoptInstead(ures_open(path, explicitFallbackName, &errorCode)); + rb.adoptInstead(ures_open(path, explicitFallbackName.data(), &errorCode)); if(U_FAILURE(errorCode)){ *pErrorCode = errorCode; break; @@ -150,63 +150,65 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, return item; } -static ULayoutType +namespace { + +ULayoutType _uloc_getOrientationHelper(const char* localeId, const char* key, - UErrorCode *status) + UErrorCode& status) { ULayoutType result = ULOC_LAYOUT_UNKNOWN; - if (!U_FAILURE(*status)) { - icu::CharString localeBuffer; - { - icu::CharStringByteSink sink(&localeBuffer); - ulocimp_canonicalize(localeId, sink, status); - } + if (U_FAILURE(status)) { return result; } - if (!U_FAILURE(*status)) { - int32_t length = 0; - const char16_t* const value = - uloc_getTableStringWithFallback( - nullptr, - localeBuffer.data(), - "layout", - nullptr, - key, - &length, - status); - - if (!U_FAILURE(*status) && length != 0) { - switch(value[0]) - { - case 0x0062: /* 'b' */ - result = ULOC_LAYOUT_BTT; - break; - case 0x006C: /* 'l' */ - result = ULOC_LAYOUT_LTR; - break; - case 0x0072: /* 'r' */ - result = ULOC_LAYOUT_RTL; - break; - case 0x0074: /* 't' */ - result = ULOC_LAYOUT_TTB; - break; - default: - *status = U_INTERNAL_PROGRAM_ERROR; - break; - } - } + icu::CharString localeBuffer = ulocimp_canonicalize(localeId, status); + + if (U_FAILURE(status)) { return result; } + + int32_t length = 0; + const char16_t* const value = + uloc_getTableStringWithFallback( + nullptr, + localeBuffer.data(), + "layout", + nullptr, + key, + &length, + &status); + + if (U_FAILURE(status)) { return result; } + + if (length != 0) { + switch(value[0]) + { + case 0x0062: /* 'b' */ + result = ULOC_LAYOUT_BTT; + break; + case 0x006C: /* 'l' */ + result = ULOC_LAYOUT_LTR; + break; + case 0x0072: /* 'r' */ + result = ULOC_LAYOUT_RTL; + break; + case 0x0074: /* 't' */ + result = ULOC_LAYOUT_TTB; + break; + default: + status = U_INTERNAL_PROGRAM_ERROR; + break; } } return result; } +} // namespace + U_CAPI ULayoutType U_EXPORT2 uloc_getCharacterOrientation(const char* localeId, UErrorCode *status) { - return _uloc_getOrientationHelper(localeId, "characters", status); + return _uloc_getOrientationHelper(localeId, "characters", *status); } /** @@ -220,5 +222,5 @@ U_CAPI ULayoutType U_EXPORT2 uloc_getLineOrientation(const char* localeId, UErrorCode *status) { - return _uloc_getOrientationHelper(localeId, "lines", status); + return _uloc_getOrientationHelper(localeId, "lines", *status); } diff --git a/deps/icu-small/source/common/locutil.cpp b/deps/icu-small/source/common/locutil.cpp index 776d1d59636be7..1abecef1c5b0a8 100644 --- a/deps/icu-small/source/common/locutil.cpp +++ b/deps/icu-small/source/common/locutil.cpp @@ -145,9 +145,7 @@ LocaleUtility::canonicalLocaleString(const UnicodeString* id, UnicodeString& res Locale& LocaleUtility::initLocaleFromName(const UnicodeString& id, Locale& result) { - enum { BUFLEN = 128 }; // larger than ever needed - - if (id.isBogus() || id.length() >= BUFLEN) { + if (id.isBogus()) { result.setToBogus(); } else { /* @@ -168,24 +166,29 @@ LocaleUtility::initLocaleFromName(const UnicodeString& id, Locale& result) * * There should be only at most one '@' in a locale ID. */ - char buffer[BUFLEN]; + CharString buffer; int32_t prev, i; prev = 0; - for(;;) { + UErrorCode status = U_ZERO_ERROR; + do { i = id.indexOf((char16_t)0x40, prev); if(i < 0) { // no @ between prev and the rest of the string - id.extract(prev, INT32_MAX, buffer + prev, BUFLEN - prev, US_INV); + buffer.appendInvariantChars(id.tempSubString(prev), status); break; // done } else { // normal invariant-character conversion for text between @s - id.extract(prev, i - prev, buffer + prev, BUFLEN - prev, US_INV); + buffer.appendInvariantChars(id.tempSubString(prev, i - prev), status); // manually "convert" U+0040 at id[i] into '@' at buffer[i] - buffer[i] = '@'; + buffer.append('@', status); prev = i + 1; } + } while (U_SUCCESS(status)); + if (U_FAILURE(status)) { + result.setToBogus(); + } else { + result = Locale::createFromName(buffer.data()); } - result = Locale::createFromName(buffer); } return result; } @@ -259,7 +262,7 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID) return htp; } -UBool +bool LocaleUtility::isFallbackOf(const UnicodeString& root, const UnicodeString& child) { return child.indexOf(root) == 0 && @@ -271,5 +274,3 @@ U_NAMESPACE_END /* !UCONFIG_NO_SERVICE */ #endif - - diff --git a/deps/icu-small/source/common/locutil.h b/deps/icu-small/source/common/locutil.h index 31bfffd7a5920f..8cf109c20636ab 100644 --- a/deps/icu-small/source/common/locutil.h +++ b/deps/icu-small/source/common/locutil.h @@ -28,7 +28,7 @@ class U_COMMON_API LocaleUtility { static Locale& initLocaleFromName(const UnicodeString& id, Locale& result); static UnicodeString& initNameFromLocale(const Locale& locale, UnicodeString& result); static const Hashtable* getAvailableLocaleNames(const UnicodeString& bundleID); - static UBool isFallbackOf(const UnicodeString& root, const UnicodeString& child); + static bool isFallbackOf(const UnicodeString& root, const UnicodeString& child); }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/messagepattern.cpp b/deps/icu-small/source/common/messagepattern.cpp index 82cb638e4ed7ef..9e318295f9a9d6 100644 --- a/deps/icu-small/source/common/messagepattern.cpp +++ b/deps/icu-small/source/common/messagepattern.cpp @@ -999,7 +999,6 @@ MessagePattern::parseDouble(int32_t start, int32_t limit, UBool allowInfinity, } setParseError(parseError, start /*, limit*/); // Bad syntax for numeric value. errorCode=U_PATTERN_SYNTAX_ERROR; - return; } int32_t diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index cdf570d76bdc9d..9c715ac3efaafc 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -1390,8 +1390,11 @@ Normalizer2Impl::composePair(UChar32 a, UChar32 b) const { } else if(norm16>OFFSET_SHIFT); } const uint16_t *getCompositionsListForDecompYes(uint16_t norm16) const { if(norm16hasDeleter()); if (U_FAILURE(status)) { delete fUnhandledBreakEngine; - fUnhandledBreakEngine = 0; + fUnhandledBreakEngine = nullptr; return nullptr; } } diff --git a/deps/icu-small/source/common/rbbi_cache.cpp b/deps/icu-small/source/common/rbbi_cache.cpp index f7a283f69e45b9..239345998bc4d0 100644 --- a/deps/icu-small/source/common/rbbi_cache.cpp +++ b/deps/icu-small/source/common/rbbi_cache.cpp @@ -246,7 +246,6 @@ void RuleBasedBreakIterator::BreakCache::following(int32_t startPos, UErrorCode fBI->fDone = false; next(); } - return; } @@ -265,7 +264,6 @@ void RuleBasedBreakIterator::BreakCache::preceding(int32_t startPos, UErrorCode current(); } } - return; } @@ -277,7 +275,6 @@ void RuleBasedBreakIterator::BreakCache::nextOL() { fBI->fDone = !populateFollowing(); fBI->fPosition = fTextIdx; fBI->fRuleStatusIndex = fStatuses[fBufIdx]; - return; } @@ -297,7 +294,6 @@ void RuleBasedBreakIterator::BreakCache::previous(UErrorCode &status) { fBI->fDone = (fBufIdx == initialBufIdx); fBI->fPosition = fTextIdx; fBI->fRuleStatusIndex = fStatuses[fBufIdx]; - return; } diff --git a/deps/icu-small/source/common/rbbinode.cpp b/deps/icu-small/source/common/rbbinode.cpp index 7aa75d5ffb7501..71407b9e684eea 100644 --- a/deps/icu-small/source/common/rbbinode.cpp +++ b/deps/icu-small/source/common/rbbinode.cpp @@ -123,19 +123,66 @@ RBBINode::~RBBINode() { break; default: - delete fLeftChild; + // Avoid using a recursive implementation because of stack overflow problems. + // See bug ICU-22584. + // delete fLeftChild; + NRDeleteNode(fLeftChild); fLeftChild = nullptr; - delete fRightChild; + // delete fRightChild; + NRDeleteNode(fRightChild); fRightChild = nullptr; } - delete fFirstPosSet; delete fLastPosSet; delete fFollowPos; - } +/** + * Non-recursive delete of a node + its children. Used from the node destructor + * instead of the more obvious recursive implementation to avoid problems with + * stack overflow with some perverse test rule data (from fuzzing). + */ +void RBBINode::NRDeleteNode(RBBINode *node) { + if (node == nullptr) { + return; + } + + RBBINode *stopNode = node->fParent; + RBBINode *nextNode = node; + while (nextNode != stopNode && nextNode != nullptr) { + RBBINode *currentNode = nextNode; + + if ((currentNode->fLeftChild == nullptr && currentNode->fRightChild == nullptr) || + currentNode->fType == varRef || // varRef and setRef nodes do not + currentNode->fType == setRef) { // own their children nodes. + // CurrentNode is effectively a leaf node; it's safe to go ahead and delete it. + nextNode = currentNode->fParent; + if (nextNode) { + if (nextNode->fLeftChild == currentNode) { + nextNode->fLeftChild = nullptr; + } else if (nextNode->fRightChild == currentNode) { + nextNode->fRightChild = nullptr; + } + } + delete currentNode; + } else if (currentNode->fLeftChild) { + nextNode = currentNode->fLeftChild; + if (nextNode->fParent == nullptr) { + nextNode->fParent = currentNode; + // fParent isn't always set; do it now if not. + } + U_ASSERT(nextNode->fParent == currentNode); + } else if (currentNode->fRightChild) { + nextNode = currentNode->fRightChild; + if (nextNode->fParent == nullptr) { + nextNode->fParent = currentNode; + // fParent isn't always set; do it now if not. + } + U_ASSERT(nextNode->fParent == currentNode); + } + } +} //------------------------------------------------------------------------- // @@ -192,7 +239,17 @@ RBBINode *RBBINode::cloneTree() { // nested references are handled by cloneTree(), not here. // //------------------------------------------------------------------------- -RBBINode *RBBINode::flattenVariables() { +constexpr int kRecursiveDepthLimit = 3500; +RBBINode *RBBINode::flattenVariables(UErrorCode& status, int depth) { + if (U_FAILURE(status)) { + return this; + } + // If the depth of the stack is too deep, we return U_INPUT_TOO_LONG_ERROR + // to avoid stack overflow crash. + if (depth > kRecursiveDepthLimit) { + status = U_INPUT_TOO_LONG_ERROR; + return this; + } if (fType == varRef) { RBBINode *retNode = fLeftChild->cloneTree(); if (retNode != nullptr) { @@ -204,11 +261,11 @@ RBBINode *RBBINode::flattenVariables() { } if (fLeftChild != nullptr) { - fLeftChild = fLeftChild->flattenVariables(); + fLeftChild = fLeftChild->flattenVariables(status, depth+1); fLeftChild->fParent = this; } if (fRightChild != nullptr) { - fRightChild = fRightChild->flattenVariables(); + fRightChild = fRightChild->flattenVariables(status, depth+1); fRightChild->fParent = this; } return this; diff --git a/deps/icu-small/source/common/rbbinode.h b/deps/icu-small/source/common/rbbinode.h index 4ed84d4e073fad..497a31b8d098b3 100644 --- a/deps/icu-small/source/common/rbbinode.h +++ b/deps/icu-small/source/common/rbbinode.h @@ -94,9 +94,10 @@ class RBBINode : public UMemory { RBBINode(NodeType t); RBBINode(const RBBINode &other); ~RBBINode(); + static void NRDeleteNode(RBBINode *node); RBBINode *cloneTree(); - RBBINode *flattenVariables(); + RBBINode *flattenVariables(UErrorCode &status, int depth=0); void flattenSets(); void findNodes(UVector *dest, RBBINode::NodeType kind, UErrorCode &status); diff --git a/deps/icu-small/source/common/rbbirb.cpp b/deps/icu-small/source/common/rbbirb.cpp index 92cccc1a3397f1..1b2ee67187b59f 100644 --- a/deps/icu-small/source/common/rbbirb.cpp +++ b/deps/icu-small/source/common/rbbirb.cpp @@ -86,7 +86,8 @@ RBBIRuleBuilder::RBBIRuleBuilder(const UnicodeString &rules, if (U_FAILURE(status)) { return; } - if(fSetBuilder == 0 || fScanner == 0 || fUSetNodes == 0 || fRuleStatusVals == 0) { + if (fSetBuilder == nullptr || fScanner == nullptr || + fUSetNodes == nullptr || fRuleStatusVals == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } } @@ -156,7 +157,7 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { int32_t statusTableSize = align8(fRuleStatusVals->size() * sizeof(int32_t)); int32_t rulesLengthInUTF8 = 0; - u_strToUTF8WithSub(0, 0, &rulesLengthInUTF8, + u_strToUTF8WithSub(nullptr, 0, &rulesLengthInUTF8, fStrippedRules.getBuffer(), fStrippedRules.length(), 0xfffd, nullptr, fStatus); *fStatus = U_ZERO_ERROR; diff --git a/deps/icu-small/source/common/rbbiscan.cpp b/deps/icu-small/source/common/rbbiscan.cpp index 844b0639099c06..f5fdba076f02a2 100644 --- a/deps/icu-small/source/common/rbbiscan.cpp +++ b/deps/icu-small/source/common/rbbiscan.cpp @@ -289,6 +289,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) // Terminate expression, leaves expression parse tree rooted in TOS node. fixOpStack(RBBINode::precStart); + if (U_FAILURE(*fRB->fStatus)) { + break; + } RBBINode *startExprNode = fNodeStack[fNodeStackPtr-2]; RBBINode *varRefNode = fNodeStack[fNodeStackPtr-1]; @@ -312,6 +315,11 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) UErrorCode t = *fRB->fStatus; *fRB->fStatus = U_ZERO_ERROR; error(t); + // When adding $variableRef to the symbol table fail, Delete + // both nodes because deleting varRefNode will not delete + // RHSExprNode internally. + delete RHSExprNode; + delete varRefNode; } // Clean up the stack. @@ -522,7 +530,13 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) n = fNodeStack[fNodeStackPtr]; uint32_t v = u_charDigitValue(fC.fChar); U_ASSERT(v < 10); - n->fVal = n->fVal*10 + v; + int64_t updated = static_cast(n->fVal)*10 + v; + // Avoid overflow n->fVal + if (updated > INT32_MAX) { + error(U_BRK_RULE_SYNTAX); + break; + } + n->fVal = static_cast(updated); break; } @@ -762,6 +776,7 @@ void RBBIRuleScanner::findSetFor(const UnicodeString &s, RBBINode *node, Unicode RBBINode *usetNode = new RBBINode(RBBINode::uset); if (usetNode == nullptr) { error(U_MEMORY_ALLOCATION_ERROR); + delete setToAdopt; return; } usetNode->fInputSet = setToAdopt; @@ -796,8 +811,6 @@ void RBBIRuleScanner::findSetFor(const UnicodeString &s, RBBINode *node, Unicode el->key = tkey; el->val = usetNode; uhash_put(fSetTable, el->key, el, fRB->fStatus); - - return; } @@ -926,6 +939,9 @@ void RBBIRuleScanner::nextChar(RBBIRuleChar &c) { } } + if (c.fChar == (UChar32)-1) { + return; + } if (fQuoteMode) { c.fEscaped = true; } @@ -1199,7 +1215,6 @@ RBBINode *RBBIRuleScanner::pushNewNode(RBBINode::NodeType t) { // //------------------------------------------------------------------------------ void RBBIRuleScanner::scanSet() { - UnicodeSet *uset; ParsePosition pos; int startPos; int i; @@ -1211,12 +1226,12 @@ void RBBIRuleScanner::scanSet() { pos.setIndex(fScanIndex); startPos = fScanIndex; UErrorCode localStatus = U_ZERO_ERROR; - uset = new UnicodeSet(); - if (uset == nullptr) { - localStatus = U_MEMORY_ALLOCATION_ERROR; - } else { - uset->applyPatternIgnoreSpace(fRB->fRules, pos, fSymbolTable, localStatus); + LocalPointer uset(new UnicodeSet(), localStatus); + if (U_FAILURE(localStatus)) { + error(localStatus); + return; } + uset->applyPatternIgnoreSpace(fRB->fRules, pos, fSymbolTable, localStatus); if (U_FAILURE(localStatus)) { // TODO: Get more accurate position of the error from UnicodeSet's return info. // UnicodeSet appears to not be reporting correctly at this time. @@ -1224,20 +1239,22 @@ void RBBIRuleScanner::scanSet() { RBBIDebugPrintf("UnicodeSet parse position.ErrorIndex = %d\n", pos.getIndex()); #endif error(localStatus); - delete uset; return; } // Verify that the set contains at least one code point. // - U_ASSERT(uset!=nullptr); - if (uset->isEmpty()) { + U_ASSERT(uset.isValid()); + UnicodeSet tempSet(*uset); + // Use tempSet to handle the case that the UnicodeSet contains + // only string element, such as [{ab}] and treat it as empty set. + tempSet.removeAllStrings(); + if (tempSet.isEmpty()) { // This set is empty. // Make it an error, because it almost certainly is not what the user wanted. // Also, avoids having to think about corner cases in the tree manipulation code // that occurs later on. error(U_BRK_RULE_EMPTY_SET); - delete uset; return; } @@ -1246,7 +1263,7 @@ void RBBIRuleScanner::scanSet() { // Don't just set fScanIndex because the line/char positions maintained // for error reporting would be thrown off. i = pos.getIndex(); - for (;;) { + for (;U_SUCCESS(*fRB->fStatus);) { if (fNextIndex >= i) { break; } @@ -1269,7 +1286,7 @@ void RBBIRuleScanner::scanSet() { // character categories for run time engine. // - Eliminates mulitiple instances of the same set. // - Creates a new uset node if necessary (if this isn't a duplicate.) - findSetFor(n->fText, n, uset); + findSetFor(n->fText, n, uset.orphan()); } } diff --git a/deps/icu-small/source/common/rbbistbl.cpp b/deps/icu-small/source/common/rbbistbl.cpp index 844351bd0dfbcc..bfaacf64254fdd 100644 --- a/deps/icu-small/source/common/rbbistbl.cpp +++ b/deps/icu-small/source/common/rbbistbl.cpp @@ -122,7 +122,7 @@ const UnicodeFunctor *RBBISymbolTable::lookupMatcher(UChar32 ch) const RBBISymbolTable *This = (RBBISymbolTable *)this; // cast off const if (ch == 0xffff) { retVal = fCachedSetLookup; - This->fCachedSetLookup = 0; + This->fCachedSetLookup = nullptr; } return retVal; } diff --git a/deps/icu-small/source/common/rbbitblb.cpp b/deps/icu-small/source/common/rbbitblb.cpp index 8b40136fc7c159..96a0b0338ded2b 100644 --- a/deps/icu-small/source/common/rbbitblb.cpp +++ b/deps/icu-small/source/common/rbbitblb.cpp @@ -81,7 +81,10 @@ void RBBITableBuilder::buildForwardTable() { // Walk through the tree, replacing any references to $variables with a copy of the // parse tree for the substitution expression. // - fTree = fTree->flattenVariables(); + fTree = fTree->flattenVariables(*fStatus, 0); + if (U_FAILURE(*fStatus)) { + return; + } #ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ftree")) { RBBIDebugPuts("\nParse tree after flattening variable references."); diff --git a/deps/icu-small/source/common/resbund.cpp b/deps/icu-small/source/common/resbund.cpp index 54383c981d118e..41337cdc155daf 100644 --- a/deps/icu-small/source/common/resbund.cpp +++ b/deps/icu-small/source/common/resbund.cpp @@ -179,7 +179,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ResourceBundle) ResourceBundle::ResourceBundle(UErrorCode &err) :UObject(), fLocale(nullptr) { - fResource = ures_open(0, Locale::getDefault().getName(), &err); + fResource = ures_open(nullptr, Locale::getDefault().getName(), &err); } ResourceBundle::ResourceBundle(const ResourceBundle &other) @@ -188,7 +188,7 @@ ResourceBundle::ResourceBundle(const ResourceBundle &other) UErrorCode status = U_ZERO_ERROR; if (other.fResource) { - fResource = ures_copyResb(0, other.fResource, &status); + fResource = ures_copyResb(nullptr, other.fResource, &status); } else { /* Copying a bad resource bundle */ fResource = nullptr; @@ -199,7 +199,7 @@ ResourceBundle::ResourceBundle(UResourceBundle *res, UErrorCode& err) :UObject(), fLocale(nullptr) { if (res) { - fResource = ures_copyResb(0, res, &err); + fResource = ures_copyResb(nullptr, res, &err); } else { /* Copying a bad resource bundle */ fResource = nullptr; @@ -218,7 +218,7 @@ ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) if(this == &other) { return *this; } - if(fResource != 0) { + if (fResource != nullptr) { ures_close(fResource); fResource = nullptr; } @@ -228,7 +228,7 @@ ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) } UErrorCode status = U_ZERO_ERROR; if (other.fResource) { - fResource = ures_copyResb(0, other.fResource, &status); + fResource = ures_copyResb(nullptr, other.fResource, &status); } else { /* Copying a bad resource bundle */ fResource = nullptr; @@ -238,12 +238,10 @@ ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) ResourceBundle::~ResourceBundle() { - if(fResource != 0) { + if (fResource != nullptr) { ures_close(fResource); } - if(fLocale != nullptr) { - delete(fLocale); - } + delete fLocale; } ResourceBundle * @@ -311,7 +309,7 @@ ResourceBundle ResourceBundle::getNext(UErrorCode& status) { UnicodeString ResourceBundle::getNextString(UErrorCode& status) { int32_t len = 0; - const char16_t* r = ures_getNextString(fResource, &len, 0, &status); + const char16_t* r = ures_getNextString(fResource, &len, nullptr, &status); return UnicodeString(true, r, len); } diff --git a/deps/icu-small/source/common/ruleiter.cpp b/deps/icu-small/source/common/ruleiter.cpp index 690635a9089780..0e665435a78524 100644 --- a/deps/icu-small/source/common/ruleiter.cpp +++ b/deps/icu-small/source/common/ruleiter.cpp @@ -27,12 +27,12 @@ RuleCharacterIterator::RuleCharacterIterator(const UnicodeString& theText, const text(theText), pos(thePos), sym(theSym), - buf(0), + buf(nullptr), bufPos(0) {} UBool RuleCharacterIterator::atEnd() const { - return buf == 0 && pos.getIndex() == text.length(); + return buf == nullptr && pos.getIndex() == text.length(); } UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCode& ec) { @@ -45,8 +45,8 @@ UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCod c = _current(); _advance(U16_LENGTH(c)); - if (c == SymbolTable::SYMBOL_REF && buf == 0 && - (options & PARSE_VARIABLES) != 0 && sym != 0) { + if (c == SymbolTable::SYMBOL_REF && buf == nullptr && + (options & PARSE_VARIABLES) != 0 && sym != nullptr) { UnicodeString name = sym->parseReference(text, pos, text.length()); // If name is empty there was an isolated SYMBOL_REF; // return it. Caller must be prepared for this. @@ -55,13 +55,13 @@ UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCod } bufPos = 0; buf = sym->lookup(name); - if (buf == 0) { + if (buf == nullptr) { ec = U_UNDEFINED_VARIABLE; return DONE; } // Handle empty variable value if (buf->length() == 0) { - buf = 0; + buf = nullptr; } continue; } @@ -114,7 +114,7 @@ UnicodeString& RuleCharacterIterator::lookahead(UnicodeString& result, int32_t m if (maxLookAhead < 0) { maxLookAhead = 0x7FFFFFFF; } - if (buf != 0) { + if (buf != nullptr) { buf->extract(bufPos, maxLookAhead, result); } else { text.extract(pos.getIndex(), maxLookAhead, result); @@ -135,7 +135,7 @@ UnicodeString& RuleCharacterIterator::toString(UnicodeString& result) const { */ UChar32 RuleCharacterIterator::_current() const { - if (buf != 0) { + if (buf != nullptr) { return buf->char32At(bufPos); } else { int i = pos.getIndex(); @@ -144,10 +144,10 @@ UChar32 RuleCharacterIterator::_current() const { } void RuleCharacterIterator::_advance(int32_t count) { - if (buf != 0) { + if (buf != nullptr) { bufPos += count; if (bufPos == buf->length()) { - buf = 0; + buf = nullptr; } } else { pos.setIndex(pos.getIndex() + count); diff --git a/deps/icu-small/source/common/ruleiter.h b/deps/icu-small/source/common/ruleiter.h index 41731407da25d7..22dec1e8cc8916 100644 --- a/deps/icu-small/source/common/ruleiter.h +++ b/deps/icu-small/source/common/ruleiter.h @@ -224,7 +224,7 @@ class RuleCharacterIterator : public UMemory { }; inline UBool RuleCharacterIterator::inVariable() const { - return buf != 0; + return buf != nullptr; } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/ubidiln.cpp b/deps/icu-small/source/common/ubidiln.cpp index 63c4f9190a9639..65e1212c7b26ef 100644 --- a/deps/icu-small/source/common/ubidiln.cpp +++ b/deps/icu-small/source/common/ubidiln.cpp @@ -244,7 +244,6 @@ ubidi_setLine(const UBiDi *pParaBiDi, } } pLineBiDi->pParaBiDi=pParaBiDi; /* mark successful setLine */ - return; } U_CAPI UBiDiLevel U_EXPORT2 diff --git a/deps/icu-small/source/common/ubrk.cpp b/deps/icu-small/source/common/ubrk.cpp index 46ec0d785adf13..712ce497161ced 100644 --- a/deps/icu-small/source/common/ubrk.cpp +++ b/deps/icu-small/source/common/ubrk.cpp @@ -38,9 +38,9 @@ ubrk_open(UBreakIteratorType type, UErrorCode *status) { - if(U_FAILURE(*status)) return 0; + if (U_FAILURE(*status)) return nullptr; - BreakIterator *result = 0; + BreakIterator *result = nullptr; switch(type) { @@ -70,11 +70,11 @@ ubrk_open(UBreakIteratorType type, // check for allocation error if (U_FAILURE(*status)) { - return 0; + return nullptr; } - if(result == 0) { + if (result == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } @@ -102,14 +102,14 @@ ubrk_openRules( const char16_t *rules, UErrorCode *status) { if (status == nullptr || U_FAILURE(*status)){ - return 0; + return nullptr; } - BreakIterator *result = 0; + BreakIterator *result = nullptr; UnicodeString ruleString(rules, rulesLength); result = RBBIRuleBuilder::createRuleBasedBreakIterator(ruleString, parseErr, *status); if(U_FAILURE(*status)) { - return 0; + return nullptr; } UBreakIterator *uBI = (UBreakIterator *)result; diff --git a/deps/icu-small/source/common/ucase.h b/deps/icu-small/source/common/ucase.h index e03b311870f8cd..af73873608809d 100644 --- a/deps/icu-small/source/common/ucase.h +++ b/deps/icu-small/source/common/ucase.h @@ -357,7 +357,7 @@ enum { /* definitions for 16-bit case properties word ------------------------------ */ U_CFUNC const UTrie2 * U_EXPORT2 -ucase_getTrie(); +ucase_getTrie(void); /* 2-bit constants for types of cased characters */ #define UCASE_TYPE_MASK 3 diff --git a/deps/icu-small/source/common/ucasemap.cpp b/deps/icu-small/source/common/ucasemap.cpp index f6a0106aecd9e5..f419f65c32a4cf 100644 --- a/deps/icu-small/source/common/ucasemap.cpp +++ b/deps/icu-small/source/common/ucasemap.cpp @@ -41,7 +41,6 @@ #include "uassert.h" #include "ucase.h" #include "ucasemap_imp.h" -#include "ustr_imp.h" U_NAMESPACE_USE @@ -917,21 +916,20 @@ ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_P return 0; } - CheckedArrayByteSink sink(dest, destCapacity); if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { edits->reset(); } - stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR - (const uint8_t *)src, srcLength, sink, edits, errorCode); - sink.Flush(); - if (U_SUCCESS(errorCode)) { - if (sink.Overflowed()) { - errorCode = U_BUFFER_OVERFLOW_ERROR; - } else if (edits != nullptr) { - edits->copyErrorTo(errorCode); - } + int32_t reslen = ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, destCapacity, + [&](ByteSink& sink, UErrorCode& status) { + stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + (const uint8_t *)src, srcLength, sink, edits, status); + }, + errorCode); + if (U_SUCCESS(errorCode) && edits != nullptr) { + edits->copyErrorTo(errorCode); } - return u_terminateChars(dest, destCapacity, sink.NumberOfBytesAppended(), &errorCode); + return reslen; } /* public API functions */ diff --git a/deps/icu-small/source/common/uchar_props_data.h b/deps/icu-small/source/common/uchar_props_data.h index 032422397534fe..0cacf142afa52c 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -1477,139 +1477,139 @@ static const UTrie2 propsTrie={ nullptr, 0, false, false, 0, nullptr }; -static const uint16_t propsVectorsTrie_index[32764]={ +static const uint16_t propsVectorsTrie_index[32784]={ 0x53e,0x546,0x54e,0x556,0x56e,0x576,0x57e,0x586,0x58e,0x596,0x59e,0x5a6,0x5ae,0x5b6,0x5be,0x5c6, -0x5cd,0x5d5,0x5dd,0x5e5,0x5e8,0x5f0,0x5f8,0x600,0x608,0x610,0x618,0x620,0x628,0x630,0x638,0x640, -0x648,0x650,0x657,0x65f,0x667,0x66f,0x677,0x67f,0x687,0x68f,0x694,0x69c,0x6a3,0x6ab,0x6b3,0x6bb, -0x6c3,0x6cb,0x6d3,0x6db,0x6e2,0x6ea,0x6f2,0x6fa,0x702,0x70a,0x712,0x71a,0x722,0x72a,0x732,0x73a, -0x1b43,0xd8f,0xe5b,0x1192,0x12d1,0x1d0b,0x1eaa,0x1d03,0x13f0,0x1400,0x13e8,0x13f8,0x80f,0x815,0x81d,0x825, -0x82d,0x833,0x83b,0x843,0x84b,0x851,0x859,0x861,0x869,0x86f,0x877,0x87f,0x887,0x88f,0x897,0x89e, -0x8a6,0x8ac,0x8b4,0x8bc,0x8c4,0x8ca,0x8d2,0x8da,0x8e2,0x1408,0x8ea,0x8f2,0x8fa,0x901,0x909,0x911, -0x919,0x91d,0x925,0x92c,0x934,0x93c,0x944,0x94c,0x1723,0x172b,0x954,0x95c,0x964,0x96c,0x974,0x97b, -0x1789,0x1779,0x1781,0x1a7e,0x1a86,0x1418,0x983,0x1410,0x166c,0x166c,0x166e,0x142c,0x142d,0x1420,0x1422,0x1424, -0x1791,0x1793,0x98b,0x1793,0x993,0x998,0x9a0,0x1798,0x9a6,0x1793,0x9ac,0x9b4,0xc6f,0x17a0,0x17a0,0x9bc, -0x17b0,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1, -0x17b1,0x17b1,0x17b1,0x17a8,0x9c4,0x17b9,0x17b9,0x9cc,0xb97,0xb9f,0xba7,0xbaf,0x17c9,0x17c1,0x9d4,0x9dc, -0x9e4,0x17d3,0x17db,0x9ec,0x17d1,0x9f4,0x1b4b,0xd97,0xbb7,0xbbf,0xbc7,0xbcc,0x19e4,0xc96,0xc9d,0x1940, -0xc47,0x1b53,0xd9f,0xda7,0xdaf,0xdb7,0xf65,0xf69,0x1a44,0x1a49,0xcd5,0xcdd,0x1aba,0x1ac2,0x1c23,0xe63, -0x1aca,0xd23,0xd2b,0x1ad2,0x110a,0x11ba,0xf3d,0xdbf,0x1960,0x1948,0x1958,0x1950,0x19fc,0x19f4,0x19b0,0x1a3c, -0x1435,0x1435,0x1435,0x1435,0x1438,0x1435,0x1435,0x1440,0x9fc,0x1448,0xa00,0xa08,0x1448,0xa10,0xa18,0xa20, -0x1458,0x1450,0x1460,0xa28,0xa30,0x1468,0xa38,0xa40,0x1470,0x1478,0x1480,0x1488,0xa48,0x1490,0x1497,0x149f, -0x14a7,0x14af,0x14b7,0x14bf,0x14c7,0x14ce,0x14d6,0x14de,0x14e6,0x14ee,0x14f1,0x14f3,0x17e3,0x18d6,0x18dc,0x1a2c, -0x14fb,0xa50,0xa58,0x1621,0x1626,0x1629,0x162f,0x1503,0x1637,0x1637,0x1513,0x150b,0x151b,0x1523,0x152b,0x1533, -0x153b,0x1543,0x154b,0x1553,0x18e4,0x1938,0x1a8e,0x1beb,0x1563,0x1569,0x1571,0x1579,0x155b,0x1581,0x18ec,0x18f3, -0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x18fb,0x18fb,0x18fb,0x18fb,0x1903,0x190a,0x190c,0x1913, -0x191b,0x191f,0x191f,0x1922,0x191f,0x191f,0x1928,0x191f,0x1968,0x1a34,0x1a96,0xbd4,0xbda,0x1d4f,0x1d57,0x1e35, -0x19d4,0x19c8,0x19cc,0x1a51,0x19b8,0x19b8,0x19b8,0xc57,0x19c0,0xc77,0x1a14,0xcc5,0xc5f,0xc67,0xc67,0x1ada, -0x1a04,0x1a9e,0xcad,0xcb5,0xa60,0x17f3,0x17f3,0xa68,0x17fb,0x17fb,0x17fb,0x17fb,0x17fb,0x17fb,0xa70,0x742, -0x1654,0x1676,0xa78,0x167e,0xa80,0x1686,0x168e,0x1696,0xa88,0xa8d,0x169e,0x16a5,0xa92,0x1803,0x1a24,0xc4f, -0xa9a,0x1700,0x1707,0x16ad,0x170f,0x1713,0x16b5,0x16b9,0x16d2,0x16d2,0x16d4,0x16c1,0x16c9,0x16c9,0x16ca,0x171b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180e,0x1970,0x1970, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16e3,0x1b3b,0x1f16, -0x1816,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c, -0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c, -0x181c,0x181c,0x181c,0x181c,0xaa2,0x1824,0xaaa,0x1b5b,0x1ae6,0x1ae6,0x1ae6,0x1ae6,0x1ae6,0x1ae6,0x1ae6,0x1ae6, -0x1ae2,0xd33,0x1af6,0x1aee,0x1af8,0x1b63,0x1b63,0xdc7,0x19dc,0x1a59,0x1aae,0x1ab2,0x1aa6,0x1c1b,0xce5,0xcec, -0x1a0c,0xcbd,0x1a61,0xcf4,0x1b00,0x1b03,0xd3b,0x1b6b,0x1b13,0x1b0b,0xd43,0xdcf,0x1b73,0x1b77,0xdd7,0x1014, -0x1b1b,0xd4b,0xd53,0x1b7f,0x1b8f,0x1b87,0xddf,0xf0d,0xe6b,0xe73,0x1da5,0xfc4,0x1e52,0x1e52,0x1b97,0xde7, -0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c, -0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e, -0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770, -0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b, -0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d, -0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f, -0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771, -0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c, -0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e, -0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770, -0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b, -0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d, -0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f, -0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771, -0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c, -0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e, -0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770, -0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b, -0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d, -0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f, -0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771, -0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0xab2,0xdef,0xdf2, +0x5cd,0x5d5,0x5dd,0x5e5,0x5ed,0x5f5,0x5fd,0x605,0x60d,0x615,0x61d,0x625,0x62d,0x635,0x63d,0x645, +0x64d,0x655,0x65c,0x664,0x66c,0x674,0x67c,0x684,0x68c,0x694,0x699,0x6a1,0x6a8,0x6b0,0x6b8,0x6c0, +0x6c8,0x6d0,0x6d8,0x6e0,0x6e7,0x6ef,0x6f7,0x6ff,0x707,0x70f,0x717,0x71f,0x727,0x72f,0x737,0x73f, +0x1b48,0xd94,0xe60,0x1197,0x12d6,0x1d10,0x1eaf,0x1d08,0x13f5,0x1405,0x13ed,0x13fd,0x814,0x81a,0x822,0x82a, +0x832,0x838,0x840,0x848,0x850,0x856,0x85e,0x866,0x86e,0x874,0x87c,0x884,0x88c,0x894,0x89c,0x8a3, +0x8ab,0x8b1,0x8b9,0x8c1,0x8c9,0x8cf,0x8d7,0x8df,0x8e7,0x140d,0x8ef,0x8f7,0x8ff,0x906,0x90e,0x916, +0x91e,0x922,0x92a,0x931,0x939,0x941,0x949,0x951,0x1727,0x172f,0x959,0x961,0x969,0x971,0x979,0x980, +0x178d,0x177d,0x1785,0x1a82,0x1a8a,0x141d,0x988,0x1415,0x1670,0x1670,0x1672,0x1431,0x1432,0x1425,0x1427,0x1429, +0x1795,0x1797,0x990,0x1797,0x998,0x99d,0x9a5,0x179c,0x9ab,0x1797,0x9b1,0x9b9,0xc74,0x17a4,0x17a4,0x9c1, +0x17b4,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, +0x17b5,0x17b5,0x17b5,0x17ac,0x9c9,0x17bd,0x17bd,0x9d1,0xb9c,0xba4,0xbac,0xbb4,0x17cd,0x17c5,0x9d9,0x9e1, +0x9e9,0x17d7,0x17df,0x9f1,0x17d5,0x9f9,0x1b50,0xd9c,0xbbc,0xbc4,0xbcc,0xbd1,0x19e8,0xc9b,0xca2,0x1944, +0xc4c,0x1b58,0xda4,0xdac,0xdb4,0xdbc,0xf6a,0xf6e,0x1a48,0x1a4d,0xcda,0xce2,0x1abe,0x1ac6,0x1c28,0xe68, +0x1ace,0xd28,0xd30,0x1ad6,0x110f,0x11bf,0xf42,0xdc4,0x1964,0x194c,0x195c,0x1954,0x1a00,0x19f8,0x19b4,0x1a40, +0x1442,0x1442,0x1442,0x1442,0x143a,0x1442,0x1442,0x1444,0xa01,0x144c,0xa05,0xa0d,0x144c,0xa15,0xa1d,0xa25, +0x145c,0x1454,0x1464,0xa2d,0xa35,0x146c,0xa3d,0xa45,0x1474,0x147c,0x1484,0x148c,0xa4d,0x1494,0x149b,0x14a3, +0x14ab,0x14b3,0x14bb,0x14c3,0x14cb,0x14d2,0x14da,0x14e2,0x14ea,0x14f2,0x14f5,0x14f7,0x17e7,0x18da,0x18e0,0x1a30, +0x14ff,0xa55,0xa5d,0x1625,0x162a,0x162d,0x1633,0x1507,0x163b,0x163b,0x1517,0x150f,0x151f,0x1527,0x152f,0x1537, +0x153f,0x1547,0x154f,0x1557,0x18e8,0x193c,0x1a92,0x1bf0,0x1567,0x156d,0x1575,0x157d,0x155f,0x1585,0x18f0,0x18f7, +0x17ef,0x17ef,0x17ef,0x17ef,0x17ef,0x17ef,0x17ef,0x17ef,0x18ff,0x18ff,0x18ff,0x18ff,0x1907,0x190e,0x1910,0x1917, +0x191f,0x1923,0x1923,0x1926,0x1923,0x1923,0x192c,0x1923,0x196c,0x1a38,0x1a9a,0xbd9,0xbdf,0x1d54,0x1d5c,0x1e3a, +0x19d8,0x19cc,0x19d0,0x1a55,0x19bc,0x19bc,0x19bc,0xc5c,0x19c4,0xc7c,0x1a18,0xcca,0xc64,0xc6c,0xc6c,0x1ade, +0x1a08,0x1aa2,0xcb2,0xcba,0xa65,0x17f7,0x17f7,0xa6d,0x17ff,0x17ff,0x17ff,0x17ff,0x17ff,0x17ff,0xa75,0x747, +0x1658,0x167a,0xa7d,0x1682,0xa85,0x168a,0x1692,0x169a,0xa8d,0xa92,0x16a2,0x16a9,0xa97,0x1807,0x1a28,0xc54, +0xa9f,0x1704,0x170b,0x16b1,0x1713,0x1717,0x16b9,0x16bd,0x16d6,0x16d6,0x16d8,0x16c5,0x16cd,0x16cd,0x16ce,0x171f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x1812,0x1974,0x1974, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e7,0x1b40,0x1f1b, +0x181a,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820, +0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820,0x1820, +0x1820,0x1820,0x1820,0x1820,0xaa7,0x1828,0xaaf,0x1b60,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb, +0x1ae6,0xd38,0x1afb,0x1af3,0x1afd,0x1b68,0x1b68,0xdcc,0x19e0,0x1a5d,0x1ab2,0x1ab6,0x1aaa,0x1c20,0xcea,0xcf1, +0x1a10,0xcc2,0x1a65,0xcf9,0x1b05,0x1b08,0xd40,0x1b70,0x1b18,0x1b10,0xd48,0xdd4,0x1b78,0x1b7c,0xddc,0x1019, +0x1b20,0xd50,0xd58,0x1b84,0x1b94,0x1b8c,0xde4,0xf12,0xe70,0xe78,0x1daa,0xfc9,0x1e57,0x1e57,0x1b9c,0xdec, +0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770, +0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772, +0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774, +0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f, +0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771, +0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773, +0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775, +0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770, +0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772, +0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774, +0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f, +0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771, +0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773, +0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775, +0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770, +0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772, +0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774, +0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f, +0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771, +0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773, +0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775, +0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0x1775,0x176f,0x1770,0x1771,0x1772,0x1773,0x1774,0xab7,0xdf4,0xdf7, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x16eb,0x16eb,0x16eb,0x16eb,0x16eb,0x16eb,0x16eb,0x16eb, -0x16f0,0x16f8,0x1930,0x139d,0x1a1c,0x1a1c,0x13a1,0x13a8,0xaba,0xac2,0xaca,0x15a1,0x15a8,0x15b0,0xad2,0x15b8, -0x15f6,0x15f6,0x1589,0x1591,0x15c0,0x15ed,0x15ee,0x15fe,0x15c8,0x15cd,0x15d5,0x15dd,0xada,0x15e5,0xae2,0x1599, -0xccd,0x1606,0xaea,0xaf2,0x160e,0x1614,0x1619,0xafa,0xb0a,0x165c,0x1664,0x1647,0x164c,0xb12,0xb1a,0xb02, -0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733, -0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x173b,0x173b,0x173b,0x173b, -0x1578,0x1578,0x15b8,0x15f8,0x1638,0x1678,0x16b8,0x16f8,0x1734,0x1774,0x17a0,0x17e0,0x1820,0x1860,0x18a0,0x18e0, -0x1920,0x195c,0x199c,0x19dc,0x1a1c,0x1a50,0x1a8c,0x1acc,0x1b0c,0x1b4c,0x1b88,0x1bc8,0x1c08,0x1c48,0x1c88,0x1cc8, +0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747, +0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747,0x1747, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643, +0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x1643,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef, +0x16f4,0x16fc,0x1934,0x13a2,0x1a20,0x1a20,0x13a6,0x13ad,0xabf,0xac7,0xacf,0x15a5,0x15ac,0x15b4,0xad7,0x15bc, +0x15fa,0x15fa,0x158d,0x1595,0x15c4,0x15f1,0x15f2,0x1602,0x15cc,0x15d1,0x15d9,0x15e1,0xadf,0x15e9,0xae7,0x159d, +0xcd2,0x160a,0xaef,0xaf7,0x1612,0x1618,0x161d,0xaff,0xb0f,0x1660,0x1668,0x164b,0x1650,0xb17,0xb1f,0xb07, +0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737, +0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x173f,0x173f,0x173f,0x173f, +0x1578,0x1578,0x15b8,0x15f8,0x1638,0x1678,0x16b8,0x16f8,0x1734,0x1774,0x17b4,0x17f4,0x1834,0x1874,0x18b4,0x18f4, +0x1934,0x1970,0x19b0,0x19f0,0x1a30,0x1a64,0x1aa0,0x1ae0,0x1b20,0x1b60,0x1b9c,0x1bdc,0x1c1c,0x1c5c,0x1c9c,0x1cdc, 0xe59,0xa80,0xac0,0xb00,0xb40,0xb6b,0xf99,0xa40,0xed9,0xa40,0xa40,0xa40,0xa40,0xbab,0x13f5,0x13f5, 0xf19,0xfd9,0xa40,0xa40,0xa40,0xbeb,0xf59,0xc2b,0xa40,0xc51,0xc91,0xcd1,0xd11,0xd51,0xe99,0xdc9, 0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, @@ -1646,1886 +1646,1887 @@ static const uint16_t propsVectorsTrie_index[32764]={ 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0xc2c,0xc2f,0xdfa,0x1df5,0x101c,0x74a,0x55e,0x10b6,0xcfc,0xd7b,0x55e,0x55e,0x1d1b,0xf15,0xf1d,0x1e3d, -0xc7f,0xc86,0xc8e,0x1b9f,0x1dd5,0x55e,0x1db5,0xfec,0x1ba7,0xe02,0xe0a,0xe12,0x1044,0x752,0x55e,0x55e, -0x1baf,0x1baf,0x75a,0x55e,0x1e6a,0x10ce,0x1e62,0x10d6,0x1f56,0x11d0,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0xe1a,0x1fae,0x12c9,0x134b,0x134c,0x1f76,0x11f8,0x11ff,0x1206,0x1308,0x130c,0x1280,0x1216, -0x1c2b,0x1c2d,0xe7b,0xe82,0x1bb7,0x1bbf,0xe22,0xf35,0x1d13,0xefd,0xf05,0xfe4,0x1d33,0x1d37,0x1d3f,0x1064, -0xfb4,0x1d95,0x762,0x55e,0x10be,0x10c6,0x1d9d,0xfbc,0xf96,0xf9c,0xfa4,0xfac,0x55e,0x55e,0x55e,0x55e, -0x1eda,0x1ed2,0x1140,0x1148,0x1e1d,0x1e15,0x108c,0x55e,0x55e,0x55e,0x55e,0x55e,0x1e05,0x104c,0x1054,0x105c, -0x1dcd,0x1dc5,0xffc,0x1138,0x1d47,0xf45,0x76a,0x55e,0x109c,0x10a4,0x772,0x55e,0x55e,0x55e,0x55e,0x55e, -0x1f4e,0x11b2,0x77a,0x55e,0x55e,0x1e2d,0x1e25,0x1094,0x1288,0x128e,0x1296,0x55e,0x55e,0x121e,0x1222,0x122a, -0x1f0e,0x1f06,0x119a,0x1efe,0x1ef6,0x118a,0x1dfd,0x103c,0x135c,0x135f,0x135f,0x55e,0x55e,0x55e,0x55e,0x55e, -0x10ee,0x10f3,0x10fb,0x1102,0x112a,0x1130,0x55e,0x55e,0x116e,0x1172,0x117a,0x11c2,0x11c8,0x782,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x11e0,0x136f,0x1374,0x137c,0x55e,0x55e,0x786,0x1f96,0x1270, -0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69, -0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a6e,0xd04,0xd0b,0xd0b,0xd0b, -0x1a76,0x1a76,0x1a76,0xd13,0x1e5a,0x1e5a,0x1e5a,0x1e5a,0x1e5a,0x1e5a,0x78e,0x55e,0x55e,0x55e,0x55e,0x55e, +0xc31,0xc34,0xdff,0x1dfa,0x1021,0x74f,0x55e,0x10bb,0xd01,0xd80,0x55e,0x55e,0x1d20,0xf1a,0xf22,0x1e42, +0xc84,0xc8b,0xc93,0x1ba4,0x1dda,0x55e,0x1dba,0xff1,0x1bac,0xe07,0xe0f,0xe17,0x1049,0x757,0x55e,0x55e, +0x1bb4,0x1bb4,0x75f,0x55e,0x1e6f,0x10d3,0x1e67,0x10db,0x1f5b,0x11d5,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0xe1f,0x1fb3,0x12ce,0x1350,0x1351,0x1f7b,0x11fd,0x1204,0x120b,0x130d,0x1311,0x1285,0x121b, +0x1c30,0x1c32,0xe80,0xe87,0x1bbc,0x1bc4,0xe27,0xf3a,0x1d18,0xf02,0xf0a,0xfe9,0x1d38,0x1d3c,0x1d44,0x1069, +0xfb9,0x1d9a,0x767,0x55e,0x10c3,0x10cb,0x1da2,0xfc1,0xf9b,0xfa1,0xfa9,0xfb1,0x55e,0x55e,0x55e,0x55e, +0x1edf,0x1ed7,0x1145,0x114d,0x1e22,0x1e1a,0x1091,0x55e,0x55e,0x55e,0x55e,0x55e,0x1e0a,0x1051,0x1059,0x1061, +0x1dd2,0x1dca,0x1001,0x113d,0x1d4c,0xf4a,0x76f,0x55e,0x10a1,0x10a9,0x777,0x55e,0x55e,0x55e,0x55e,0x55e, +0x1f53,0x11b7,0x77f,0x55e,0x55e,0x1e32,0x1e2a,0x1099,0x128d,0x1293,0x129b,0x55e,0x55e,0x1223,0x1227,0x122f, +0x1f13,0x1f0b,0x119f,0x1f03,0x1efb,0x118f,0x1e02,0x1041,0x1361,0x1364,0x1364,0x55e,0x55e,0x55e,0x55e,0x55e, +0x10f3,0x10f8,0x1100,0x1107,0x112f,0x1135,0x55e,0x55e,0x1173,0x1177,0x117f,0x11c7,0x11cd,0x787,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x11e5,0x1374,0x1379,0x1381,0x55e,0x55e,0x78b,0x1f9b,0x1275, +0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d, +0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a72,0xd09,0xd10,0xd10,0xd10, +0x1a7a,0x1a7a,0x1a7a,0xd18,0x1e5f,0x1e5f,0x1e5f,0x1e5f,0x1e5f,0x1e5f,0x793,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x792,0x1fc6,0x1fc6,0x12d9,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35, -0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0xe8a,0x1004,0x100c,0x1fce, -0x1314,0x131c,0xf4d,0x1ded,0x1de5,0x102c,0x1034,0x79a,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1f6e,0x1f66,0x11f0, -0x55e,0x55e,0x55e,0x1d2b,0x1d2b,0xf25,0x1d23,0xf2d,0x55e,0x55e,0x1122,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x797,0x1fcb,0x1fcb,0x12de,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a, +0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0x1c3a,0xe8f,0x1009,0x1011,0x1fd3, +0x1319,0x1321,0xf52,0x1df2,0x1dea,0x1031,0x1039,0x79f,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1f73,0x1f6b,0x11f5, +0x55e,0x55e,0x55e,0x1d30,0x1d30,0xf2a,0x1d28,0xf32,0x55e,0x55e,0x1127,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x79e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x7a3,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1d7d,0x1d7d,0x1d7d,0xf71,0xf76, -0x7a6,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1d82,0x1d82,0x1d82,0xf76,0xf7b, +0x7ab,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1fde,0x133c,0x1343,0x1fd6,0x1fd6,0x1fd6,0x7ae, -0x55e,0x1849,0x1849,0x1849,0x1849,0x1849,0x1849,0x1849,0xb30,0x1859,0xb38,0x185a,0x1851,0x1862,0x1868,0x1870, -0xb40,0x1998,0x1998,0x7b6,0x55e,0x55e,0x55e,0x1367,0x11e8,0x1988,0x1988,0xc37,0xd1b,0x55e,0x55e,0x55e, -0x55e,0x18a1,0x18a8,0xb48,0x18ab,0xb50,0xb58,0xb60,0x18a5,0xb68,0xb70,0xb78,0x18aa,0x18b2,0x18a1,0x18a8, -0x18a4,0x18ab,0x18b3,0x18a2,0x18a9,0x18a5,0xb7f,0x1878,0x1880,0x1887,0x188e,0x187b,0x1883,0x188a,0x1891,0xb87, -0x1899,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82, -0x1e82,0x1e72,0x1e75,0x1e72,0x1e7c,0x10de,0x7be,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1fe3,0x1341,0x1348,0x1fdb,0x1fdb,0x1fdb,0x7b3, +0x55e,0x184d,0x184d,0x184d,0x184d,0x184d,0x184d,0x184d,0xb35,0x185d,0xb3d,0x185e,0x1855,0x1866,0x186c,0x1874, +0xb45,0x199c,0x199c,0x7bb,0x55e,0x55e,0x55e,0x136c,0x11ed,0x198c,0x198c,0xc3c,0xd20,0x55e,0x55e,0x55e, +0x55e,0x18a5,0x18ac,0xb4d,0x18af,0xb55,0xb5d,0xb65,0x18a9,0xb6d,0xb75,0xb7d,0x18ae,0x18b6,0x18a5,0x18ac, +0x18a8,0x18af,0x18b7,0x18a6,0x18ad,0x18a9,0xb84,0x187c,0x1884,0x188b,0x1892,0x187f,0x1887,0x188e,0x1895,0xb8c, +0x189d,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87,0x1e87, +0x1e87,0x1e77,0x1e7a,0x1e77,0x1e81,0x10e3,0x7c3,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x12f5,0x12fd,0x1300,0x1300,0x1300,0x1300,0x1300, -0x1300,0x1112,0x111a,0x1fe6,0x1354,0x7c6,0x55e,0x55e,0x55e,0x1f8e,0x1232,0x7ce,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x7d2,0x1324,0x1f9e,0x1278,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x7da,0x1384,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x12fa,0x1302,0x1305,0x1305,0x1305,0x1305,0x1305, +0x1305,0x1117,0x111f,0x1feb,0x1359,0x7cb,0x55e,0x55e,0x55e,0x1f93,0x1237,0x7d3,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x7d7,0x1329,0x1fa3,0x127d,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x7df,0x1389,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x12e1,0x1dbd,0x1dbd,0x1dbd,0x1dbd,0x1dbd,0x1dbd,0xff4,0x55e,0x1eca,0x1ec2,0x10e6,0x55e,0x55e,0x55e,0x55e, +0x12e6,0x1dc2,0x1dc2,0x1dc2,0x1dc2,0x1dc2,0x1dc2,0xff9,0x55e,0x1ecf,0x1ec7,0x10eb,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x7e2,0x1f5e,0x11d8,0x55e,0x55e,0x123a,0x123b,0x7ea,0x55e,0x55e,0x55e,0x55e, -0x55e,0xec2,0xeca,0xed2,0xeda,0xee2,0xeea,0xef1,0xef5,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x7e7,0x1f63,0x11dd,0x55e,0x55e,0x123f,0x1240,0x7ef,0x55e,0x55e,0x55e,0x55e, +0x55e,0xec7,0xecf,0xed7,0xedf,0xee7,0xeef,0xef6,0xefa,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x7ee,0x106c,0x1e0d,0x1072,0x1e0d,0x107a,0x107f,0x1084, -0x1084,0x1e92,0x1eb2,0x1eba,0x1f26,0x1e9a,0x1f7e,0x1ea2,0x1f2e,0x1f86,0x1f86,0x11a2,0x11aa,0x1252,0x1258,0x1260, -0x1268,0x1fa6,0x1fa6,0x1fa6,0x1fa6,0x12ac,0x1fa6,0x12b2,0x12b6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6, -0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6, -0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f7,0xb8f,0x18bb,0x18bb,0x18bb,0x7ff,0x7ff,0x7ff, -0x7ff,0x1990,0x1990,0x1990,0x1990,0x1990,0x1990,0x1990,0x807,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff, -0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff, -0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff, -0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff, -0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0xbe2,0xbe9,0xbf1,0xbf9,0x1978,0x1978,0x1978, -0xc01,0xc09,0xc0c,0x19a8,0x19a0,0xc3f,0xd5b,0xd5f,0xd63,0x55e,0x55e,0x55e,0x55e,0xd6b,0x1b23,0xd73, -0xf5d,0x182c,0xb22,0xb28,0x1024,0xc14,0x19ec,0xca5,0x55e,0x1841,0x1834,0x1839,0x1980,0xc1c,0xc24,0x1150, -0x1156,0x1d85,0xf7e,0x1d75,0xf55,0x132c,0x1334,0x55e,0x55e,0x1dad,0x1dad,0x1dad,0x1dad,0x1dad,0x1dad,0x1dad, -0x1dad,0x1dad,0xfcc,0xfd4,0xfdc,0x12e9,0x12ed,0x55e,0x55e,0x1b2b,0xd83,0x1b33,0x1b33,0xd87,0xe92,0xe9a, -0xea2,0x1bfb,0x1be3,0x1c03,0x1c0b,0x1bf3,0xe2a,0xe2e,0xe35,0xe3d,0xe41,0xe49,0xe51,0xe53,0xe53,0xe53, -0xe53,0x1c6c,0x1c74,0x1c6c,0x1c7a,0x1c82,0x1c4d,0x1c8a,0x1c92,0x1c6c,0x1c9a,0x1ca2,0x1ca9,0x1cb1,0x1c55,0x1c6c, -0x1cb6,0x1c5d,0x1c64,0x1cbe,0x1cc4,0x1d66,0x1d6d,0x1d5f,0x1ccb,0x1cd3,0x1cdb,0x1ce3,0x1ddd,0x1ceb,0x1cf3,0xeaa, -0xeb2,0x1c3d,0x1c3d,0x1c3d,0xeba,0x1d8d,0x1d8d,0xf86,0xf8e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x7f3,0x1071,0x1e12,0x1077,0x1e12,0x107f,0x1084,0x1089, +0x1089,0x1e97,0x1eb7,0x1ebf,0x1f2b,0x1e9f,0x1f83,0x1ea7,0x1f33,0x1f8b,0x1f8b,0x11a7,0x11af,0x1257,0x125d,0x1265, +0x126d,0x1fab,0x1fab,0x1fab,0x1fab,0x12b1,0x1fab,0x12b7,0x12bb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb, +0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb, +0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fc,0xb94,0x18bf,0x18bf,0x18bf,0x804,0x804,0x804, +0x804,0x1994,0x1994,0x1994,0x1994,0x1994,0x1994,0x1994,0x80c,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xbe7,0xbee,0xbf6,0xbfe,0x197c,0x197c,0x197c, +0xc06,0xc0e,0xc11,0x19ac,0x19a4,0xc44,0xd60,0xd64,0xd68,0x55e,0x55e,0x55e,0x55e,0xd70,0x1b28,0xd78, +0xf62,0x1830,0xb27,0xb2d,0x1029,0xc19,0x19f0,0xcaa,0x55e,0x1845,0x1838,0x183d,0x1984,0xc21,0xc29,0x1155, +0x115b,0x1d8a,0xf83,0x1d7a,0xf5a,0x1331,0x1339,0x55e,0x55e,0x1db2,0x1db2,0x1db2,0x1db2,0x1db2,0x1db2,0x1db2, +0x1db2,0x1db2,0xfd1,0xfd9,0xfe1,0x12ee,0x12f2,0x55e,0x55e,0x1b30,0xd88,0x1b38,0x1b38,0xd8c,0xe97,0xe9f, +0xea7,0x1c00,0x1be8,0x1c08,0x1c10,0x1bf8,0xe2f,0xe33,0xe3a,0xe42,0xe46,0xe4e,0xe56,0xe58,0xe58,0xe58, +0xe58,0x1c71,0x1c79,0x1c71,0x1c7f,0x1c87,0x1c52,0x1c8f,0x1c97,0x1c71,0x1c9f,0x1ca7,0x1cae,0x1cb6,0x1c5a,0x1c71, +0x1cbb,0x1c62,0x1c69,0x1cc3,0x1cc9,0x1d6b,0x1d72,0x1d64,0x1cd0,0x1cd8,0x1ce0,0x1ce8,0x1de2,0x1cf0,0x1cf8,0xeaf, +0xeb7,0x1c42,0x1c42,0x1c42,0xebf,0x1d92,0x1d92,0xf8b,0xf93,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45, -0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e4a,0x1e45,0x1e45,0x1e45,0x10ac,0x10ae,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x115e,0x1c45,0x1f1e,0x1f1e,0x1f1e,0x1f1e,0x1f1e,0x1f1e, -0x1f1e,0x1f3e,0x1166,0x1243,0x124a,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46, -0x1182,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1e4a,0x1e4a,0x1e4a,0x1e4a,0x1e4a,0x1e4a,0x1e4a, +0x1e4a,0x1e4a,0x1e4a,0x1e4a,0x1e4a,0x1e4a,0x1e4a,0x1e4f,0x1e4a,0x1e4a,0x1e4a,0x10b1,0x10b3,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7, +0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7, +0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7, +0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7, +0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1163,0x1c4a,0x1f23,0x1f23,0x1f23,0x1f23,0x1f23,0x1f23, +0x1f23,0x1f43,0x116b,0x1248,0x124f,0x1f4b,0x1f4b,0x1f4b,0x1f4b,0x1f4b,0x1f4b,0x1f4b,0x1f4b,0x1f4b,0x1f4b,0x1f4b, +0x1187,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7, -0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc9,0x1bc7,0x1bd1,0x1bc7,0x1bc7, -0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bd4,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bdb,0x120e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc, +0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bce,0x1bcc,0x1bd6,0x1bcc,0x1bcc, +0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bd9,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1bcc,0x1be0,0x1213,0x55e,0x55e,0x55e,0x55e, 0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea, -0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea, -0x1eee,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x129e, -0x12a4,0x12be,0x12c1,0x12c1,0x12c1,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c6, -0x138c,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x13d0,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, -0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x13e0,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x18ce,0x18ce,0x18ce,0x18ce, -0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x13b0,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138d,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1395,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138d,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x13b8,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x13c0,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x13c8,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x13d8, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x174b,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1753,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x53d,0x53d,0x53d,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef, +0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef,0x1eef, +0x1ef3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x1fc3,0x12a3, +0x12a9,0x12c3,0x12c6,0x12c6,0x12c6,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, +0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7, +0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7, +0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7, +0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18ca, +0x1391,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b, +0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b, +0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x13d5,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb, +0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x1ffb,0x13e5,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x18d2,0x18d2,0x18d2,0x18d2, +0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x13b5,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1392,0x1ff3,0x1ff3,0x1ff3,0x1ff3, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x139a,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391, +0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1391,0x1392,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18, +0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18, +0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18, +0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18, +0x1c18,0x1c18,0x1c18,0x13bd,0x1d00,0x1d00,0x1d00,0x1d00,0x1d00,0x1d00,0x13c5,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f, +0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f, +0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f, +0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f, +0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x13cd,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b, +0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb, +0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x13dd, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f, +0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f, +0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f, +0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f, +0x175f,0x175f,0x175f,0x175f,0x174f,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1757,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f, +0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f, +0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f, +0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f,0x175f, +0x175f,0x175f,0x175f,0x175f,0x175f,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7, +0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7, +0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7, +0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7, +0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18, +0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18, +0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18, +0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1c18, +0x1c18,0x1c18,0x1c18,0x1c18,0x1c18,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f, +0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f, +0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f, +0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f, +0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1e8f,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7, +0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7, +0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7, +0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7, +0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1ee7,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b, +0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b, +0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b, +0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b, +0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1f3b,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb, +0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb, +0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb, +0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb, +0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1fbb,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3, +0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x1ff3,0x53d,0x53d,0x53d,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2, 0x2e2,0x2e5,0x2ee,0x2e8,0x2e8,0x2eb,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2, -0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x7da,0x7d4,0x7b9,0x79e,0x7aa,0x7a7,0x79e,0x7b6, -0x7a4,0x7b0,0x79e,0x7cb,0x7c2,0x7b3,0x7d7,0x7ad,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b, -0x79b,0x79b,0x7bf,0x7bc,0x7c5,0x7c5,0x7c5,0x7d4,0x79e,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e0, -0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0, -0x7e0,0x7e0,0x7e0,0x7a4,0x7aa,0x7b0,0x7d1,0x798,0x7ce,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7dd, -0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd, -0x7dd,0x7dd,0x7dd,0x7a4,0x7c8,0x7a1,0x7c5,0x2e2,0,0,0,0,0,0,0,0, +0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x828,0x822,0x804,0x7ec,0x7f8,0x7f5,0x7ec,0x807, +0x7f2,0x7fe,0x7ec,0x819,0x80d,0x801,0x825,0x7fb,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9, +0x7e9,0x7e9,0x810,0x80a,0x813,0x813,0x813,0x822,0x7ec,0x834,0x834,0x834,0x834,0x834,0x834,0x82e, +0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e, +0x82e,0x82e,0x82e,0x7f2,0x7f8,0x7fe,0x81f,0x7e6,0x81c,0x831,0x831,0x831,0x831,0x831,0x831,0x82b, +0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b, +0x82b,0x82b,0x82b,0x7f2,0x816,0x7ef,0x813,0x2e2,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x300,0x2f1,0x2f1, 0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1, -0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f4,0x64b,0x7ef,0x7f2,0x651,0x7f2,0x7ec,0x645, -0x63c,0x2fa,0x65a,0x2fd,0x7f5,0x633,0x648,0x7e9,0x64e,0x657,0x639,0x639,0x63f,0x2f7,0x645,0x642, -0x63c,0x639,0x65a,0x2fd,0x636,0x636,0x636,0x64b,0x306,0x306,0x306,0x306,0x306,0x306,0x663,0x306, -0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x663,0x306,0x306,0x306,0x306,0x306,0x306,0x654, -0x663,0x306,0x306,0x306,0x306,0x306,0x663,0x65d,0x660,0x660,0x303,0x303,0x303,0x303,0x65d,0x303, -0x660,0x660,0x660,0x303,0x660,0x660,0x303,0x303,0x65d,0x303,0x660,0x660,0x303,0x303,0x303,0x654, -0x65d,0x660,0x660,0x303,0x660,0x303,0x65d,0x303,0x312,0x669,0x312,0x309,0x312,0x309,0x312,0x309, -0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x30f,0x666,0x312,0x669,0x312,0x309,0x312,0x309, -0x312,0x309,0x312,0x669,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x66f,0x666, -0x312,0x309,0x312,0x669,0x312,0x309,0x312,0x309,0x312,0x666,0x672,0x66c,0x312,0x309,0x312,0x309, -0x666,0x312,0x309,0x312,0x309,0x312,0x309,0x672,0x66c,0x66f,0x666,0x312,0x669,0x312,0x309,0x312, -0x669,0x675,0x66f,0x666,0x312,0x669,0x312,0x309,0x312,0x309,0x66f,0x666,0x312,0x309,0x312,0x309, -0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x66f,0x666, -0x312,0x309,0x312,0x669,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309, -0x312,0x312,0x309,0x312,0x309,0x312,0x309,0x30c,0x315,0x321,0x321,0x315,0x321,0x315,0x321,0x321, -0x315,0x321,0x321,0x321,0x315,0x315,0x321,0x321,0x321,0x321,0x315,0x321,0x321,0x315,0x321,0x321, -0x321,0x315,0x315,0x315,0x321,0x321,0x315,0x321,0x324,0x318,0x321,0x315,0x321,0x315,0x321,0x321, -0x315,0x321,0x315,0x315,0x321,0x315,0x321,0x324,0x318,0x321,0x321,0x321,0x315,0x321,0x315,0x321, -0x321,0x315,0x315,0x31e,0x321,0x315,0x315,0x315,0x31e,0x31e,0x31e,0x31e,0x327,0x327,0x31b,0x327, -0x327,0x31b,0x327,0x327,0x31b,0x324,0x678,0x324,0x678,0x324,0x678,0x324,0x678,0x324,0x678,0x324, -0x678,0x324,0x678,0x324,0x678,0x315,0x324,0x318,0x324,0x318,0x324,0x318,0x321,0x315,0x324,0x318, -0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x318,0x327,0x327,0x31b,0x324,0x318,0x9cf,0x9cf, -0x9d2,0x9cc,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318, -0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x9d2,0x9cc,0x9d2,0x9cc, -0x9cf,0x9c9,0x9d2,0x9cc,0xb8e,0xc87,0x9cf,0x9c9,0x9cf,0x9c9,0x9d2,0x9cc,0x9d2,0x9cc,0x9d2,0x9cc, -0x9d2,0x9cc,0x9d2,0x9cc,0x9d2,0x9cc,0x9d2,0x9cc,0xc87,0xc87,0xc87,0xd80,0xd80,0xd80,0xd83,0xd83, -0xd80,0xd83,0xd83,0xd80,0xd80,0xd83,0xec1,0xec4,0xec4,0xec4,0xec4,0xec1,0xec4,0xec1,0xec4,0xec1, -0xec4,0xec1,0xec4,0xec1,0x32a,0x67b,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x32a,0x32a,0x32a,0x32a,0x32a,0x67b,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x32a,0x32a,0x32a,0x32a,0x32d,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0xc8a,0xc8a, -0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x336,0x336,0x333,0x333,0x681,0x333,0x339,0x684,0x33c,0x684,0x684,0x684,0x33c,0x684,0x339,0x339, -0x687,0x33f,0x333,0x333,0x333,0x333,0x333,0x333,0x67e,0x67e,0x67e,0x67e,0x330,0x67e,0x333,0xb04, -0x342,0x342,0x342,0x342,0x342,0x333,0x333,0x333,0x333,0x333,0x9de,0x9de,0x9db,0x9d8,0x9db,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68d,0x68d,0x92d,0x68d,0x68d,0x930,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xc3f, -0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xe85,0xe85,0xe85,0xe85,0xe88,0xd4d,0xd4d,0xd4d, -0x690,0x690,0xb0a,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84, -0xf6f,0xf6c,0xf6f,0xf6c,0x34e,0x357,0xf6f,0xf6c,9,9,0x35d,0xec7,0xec7,0xec7,0x345,0x14b8, -9,9,9,9,0x35a,0x348,0x36c,0x34b,0x36c,0x36c,0x36c,9,0x36c,9,0x36c,0x36c, -0x363,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696, -0x696,0x696,9,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x36c,0x36c,0x363,0x363,0x363,0x363, -0x363,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693, -0x693,0x693,0x360,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x363,0x363,0x363,0x363,0x363,0xf6f, -0x36f,0x36f,0x372,0x36c,0x36c,0x36f,0x366,0x9e1,0xb97,0xb94,0x369,0x9e1,0x369,0x9e1,0x369,0x9e1, -0x369,0x9e1,0x354,0x351,0x354,0x351,0x354,0x351,0x354,0x351,0x354,0x351,0x354,0x351,0x354,0x351, -0x36f,0x36f,0x366,0x360,0xb46,0xb43,0xb91,0xc93,0xc90,0xc96,0xc93,0xc90,0xd86,0xd89,0xd89,0xd89, -0x9f0,0x6a2,0x37e,0x381,0x37e,0x37e,0x37e,0x381,0x37e,0x37e,0x37e,0x37e,0x381,0x9f0,0x381,0x37e, -0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x6a2,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f, -0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f, -0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x69c,0x699,0x699,0x699,0x699,0x699,0x699, -0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x9ea,0x69c,0x378,0x37b, -0x378,0x378,0x378,0x37b,0x378,0x378,0x378,0x378,0x37b,0x9ea,0x37b,0x378,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x381,0x37b,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x375,0x939, -0x93c,0x91e,0x91e,0x111c,0x9e4,0x9e4,0xb9d,0xb9a,0x9ed,0x9e7,0x9ed,0x9e7,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x381,0x37b,0x37e, -0x378,0xb9d,0xb9a,0x37e,0x378,0xb9d,0xb9a,0x37e,0x378,0xb9d,0xb9a,0xeca,0x381,0x37b,0x381,0x37b, -0x37e,0x378,0x381,0x37b,0x37e,0x378,0x381,0x37b,0x381,0x37b,0x381,0x37b,0x37e,0x378,0x381,0x37b, -0x381,0x37b,0x381,0x37b,0x37e,0x378,0x381,0x37b,0x9f0,0x9ea,0x381,0x37b,0x381,0x37b,0x381,0x37b, -0x381,0x37b,0xd8f,0xd8c,0x381,0x37b,0xecd,0xeca,0xecd,0xeca,0xecd,0xeca,0xc03,0xc00,0xc03,0xc00, -0xc03,0xc00,0xc03,0xc00,0xc03,0xc00,0xc03,0xc00,0xc03,0xc00,0xc03,0xc00,0xefa,0xef7,0xefa,0xef7, -0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7, -0x1155,0x1152,0x132f,0x132c,0x14ee,0x14eb,0x14ee,0x14eb,0x14ee,0x14eb,0x14ee,0x14eb,0xc,0x393,0x393,0x393, -0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, -0x393,0x393,0x393,0x393,0x393,0x393,0x393,0xc,0xc,0x396,0x384,0x384,0x384,0x38a,0x384,0x387, -0x18f9,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, -0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, -0x38d,0x38d,0x38d,0x390,0x18f9,0x399,0x9f3,0xc,0xc,0x14bb,0x14bb,0x13d7,0xf,0x960,0x960,0x960, -0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0xd92,0x960, -0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x39c,0x39c,0x39c,0x39c, -0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xed0,0x39c,0x39c,0x39c,0x3a8,0x39c,0x39f,0x39c,0x39c,0x3ab, -0x963,0xd95,0xd98,0xd95,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x3ae,0x3ae,0x3ae,0x3ae, -0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae, -0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0xf,0xf,0xf,0xf,0x18fc,0x3ae,0x3ae,0x3ae,0x3a5, -0x3a2,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xcab,0xcab,0xcab,0xcab, -0x13da,0x14be,0xf78,0xf78,0xf78,0xf75,0xf75,0xd9e,0x8a6,0xca5,0xca2,0xca2,0xc99,0xc99,0xc99,0xc99, -0xc99,0xc99,0xf72,0xf72,0xf72,0xf72,0xf72,0x8a3,0x14b5,0x1b0f,0xda1,0x8a9,0x12f6,0x3c9,0x3cc,0x3cc, -0x3cc,0x3cc,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0x8ac,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0xb3d, -0xb3d,0xb3d,0xc99,0xc9f,0xc9c,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0x12f3,0x93f,0x93f,0x93f,0x93f, -0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x3c3,0x3c0,0x3bd,0x3ba,0xba0,0xba0,0x921,0x3c9,0x3c9,0x3d5, -0x3c9,0x3cf,0x3cf,0x3cf,0x3cf,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x9f9,0x9f9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x9f9,0x3cc,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x9f9,0x3c9,0x3c9,0x3c9,0x3cc,0x942,0x3c9,0x3b4,0x3b4, -0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b1,0x3ba,0x3b7,0x3b7,0x3b4,0x3b4,0x3b4,0x3b4,0x3d2,0x3d2,0x3b4, -0x3b4,0x3ba,0x3b7,0x3b7,0x3b7,0x3b4,0xca8,0xca8,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, -0x3c6,0x3c6,0x9f9,0x9f9,0x9f9,0x9f6,0x9f6,0xca8,0xa0e,0xa0e,0xa0e,0xa08,0xa08,0xa08,0xa08,0xa08, -0xa08,0xa08,0xa08,0xa05,0xa08,0xa05,0x12,0xa11,0xa0b,0x9fc,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, -0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, -0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xcae,0xcae,0xcae,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02, -0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff, -0x9ff,0x9ff,0x9ff,0x12,0x12,0xcae,0xcae,0xcae,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc, -0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa14,0xa14, -0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xba3,0x15,0x15,0x15,0x15,0x15,0x15, -0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12, -0xf12,0xf12,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15, -0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15, -0xf15,0xf15,0xf15,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf18,0xf18,0xf0c,0xf0c, -0xf0f,0xf1e,0xf1b,0xff,0xff,0x1920,0x1923,0x1923,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb16,0xb16,0xb19,0xb19,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0x1c53,0x1c53,0x1c50,0x1c50,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1626, -0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1bed,0x1bea,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, -0x1491,0x1491,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b6c,0x1b6c,0x1b6c,0x1b6c,0x1b6c,0x1b6c,0x1b6c,0x1fe, -0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246, -0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, -0x196e,0x196e,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1ad3,0x288,0x288,0x288,0x288,0x288,0x288,0x288, -0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x1761,0x1761,0x1761,0x1761,0x204,0x204,0x204,0x204, -0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e, -0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1bd5,0x1bd5,0x1bd5,0x1bd5,0x29d,0x1bd5,0x1bd5,0x1bd5, -0x1bd5,0x1bd5,0x1bd5,0x1bd5,0x29d,0x1bd5,0x1bd5,0x29d,0x16c5,0x16c5,0x16c5,0x16c5,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x2b2,0x2b2,0x2b2,0x2b2, -0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xdf5,0xdf5,0xdf2,0xdf2,0xdf2,0xdf5,0xd2,0xd2, -0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x210,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, -0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x1c08,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25, -0x1a25,0x1a25,0x26d,0x26d,0x26d,0x26d,0x1a28,0x1a22,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5, -0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38, -0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x252,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, -0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0,0,0,0,0,0,0,0, +0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f4,0x690,0x83d,0x840,0x696,0x840,0x83a,0x68a, +0x681,0x2fa,0x69f,0x2fd,0x843,0x678,0x68d,0x837,0x693,0x69c,0x67e,0x67e,0x684,0x2f7,0x68a,0x687, +0x681,0x67e,0x69f,0x2fd,0x67b,0x67b,0x67b,0x690,0x306,0x306,0x306,0x306,0x306,0x306,0x6a8,0x306, +0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x6a8,0x306,0x306,0x306,0x306,0x306,0x306,0x699, +0x6a8,0x306,0x306,0x306,0x306,0x306,0x6a8,0x6a2,0x6a5,0x6a5,0x303,0x303,0x303,0x303,0x6a2,0x303, +0x6a5,0x6a5,0x6a5,0x303,0x6a5,0x6a5,0x303,0x303,0x6a2,0x303,0x6a5,0x6a5,0x303,0x303,0x303,0x699, +0x6a2,0x6a5,0x6a5,0x303,0x6a5,0x303,0x6a2,0x303,0x312,0x6b4,0x312,0x30c,0x312,0x30c,0x312,0x30c, +0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x30f,0x6b1,0x312,0x6b4,0x312,0x30c,0x312,0x30c, +0x312,0x30c,0x312,0x6b4,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x6b7,0x6b1, +0x312,0x30c,0x312,0x6b4,0x312,0x30c,0x312,0x30c,0x312,0x6b1,0x6ae,0x6ab,0x312,0x30c,0x312,0x30c, +0x6b1,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x6ae,0x6ab,0x6b7,0x6b1,0x312,0x6b4,0x312,0x30c,0x312, +0x6b4,0x6ba,0x6b7,0x6b1,0x312,0x6b4,0x312,0x30c,0x312,0x30c,0x6b7,0x6b1,0x312,0x30c,0x312,0x30c, +0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x6b7,0x6b1, +0x312,0x30c,0x312,0x6b4,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, +0x312,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x309,0x318,0x327,0x327,0x324,0x327,0x324,0x327,0x327, +0x324,0x327,0x327,0x327,0x324,0x31e,0x327,0x333,0x327,0x327,0x324,0x327,0x327,0x324,0x327,0x327, +0x327,0x324,0x324,0x324,0x327,0x327,0x324,0x327,0x336,0x330,0x327,0x324,0x327,0x324,0x327,0x327, +0x324,0x327,0x31e,0x31e,0x327,0x324,0x327,0x336,0x330,0x327,0x327,0x327,0x324,0x327,0x324,0x327, +0x327,0x315,0x31e,0x321,0x327,0x324,0x31e,0x315,0x31b,0x31b,0x31b,0x31b,0x32d,0x32d,0x32a,0x32d, +0x32d,0x32a,0x32d,0x32d,0x32a,0x336,0x6bd,0x336,0x6bd,0x336,0x6bd,0x336,0x6bd,0x336,0x6bd,0x336, +0x6bd,0x336,0x6bd,0x336,0x6bd,0x324,0x336,0x330,0x336,0x330,0x336,0x330,0x327,0x324,0x336,0x330, +0x336,0x330,0x336,0x330,0x336,0x330,0x336,0x330,0x330,0x32d,0x32d,0x32a,0x336,0x330,0xa29,0xa29, +0xa35,0xa32,0x336,0x330,0x336,0x330,0x336,0x330,0x336,0x330,0x336,0x330,0x336,0x330,0x336,0x330, +0x336,0x330,0x336,0x330,0x336,0x330,0x336,0x330,0x336,0x330,0x336,0x330,0xa35,0xa32,0xa35,0xa32, +0xa29,0xa26,0xa35,0xa32,0xc0c,0xd08,0xa2f,0xa2c,0xa2f,0xa2c,0xa35,0xa32,0xa35,0xa32,0xa35,0xa32, +0xa35,0xa32,0xa35,0xa32,0xa35,0xa32,0xa35,0xa32,0xd05,0xd05,0xd05,0xe01,0xe01,0xe01,0xe04,0xe04, +0xe01,0xe04,0xe04,0xe01,0xe01,0xe04,0xf4e,0xf51,0xf51,0xf51,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e, +0xf51,0xf4e,0xf51,0xf4e,0x339,0x6c0,0x339,0x342,0x342,0x339,0x342,0x342,0x339,0x345,0x339,0x342, +0x339,0x339,0x339,0x339,0x339,0x6c0,0x339,0x342,0x339,0x339,0x339,0x339,0x342,0x342,0x339,0x339, +0x339,0x339,0x339,0x339,0x339,0x339,0x342,0x339,0x339,0x339,0x339,0x33f,0x339,0x339,0x339,0x339, +0x33f,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x342,0x339,0x339, +0x339,0x339,0x339,0x339,0x339,0x339,0x342,0x339,0x33c,0x339,0x339,0x339,0x339,0x339,0x339,0x339, +0x339,0x339,0x33f,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0xa38,0xa38,0xa38, +0xa38,0xa38,0xd0b,0xd0b,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x351,0x351,0x357, +0x357,0x351,0x351,0x351,0x34e,0x34e,0x348,0x348,0x6c3,0x348,0x351,0x6c9,0x354,0x6c9,0x6c9,0x6c9, +0x354,0x6c9,0x351,0x351,0x6cc,0x35a,0x348,0x348,0x348,0x348,0x348,0x348,0x6c6,0x6c6,0x6c6,0x6c6, +0x34b,0x6c6,0x348,0xb82,0x35d,0x35d,0x35d,0x35d,0x35d,0x348,0x348,0x348,0x348,0x348,0xa44,0xa44, +0xa41,0xa3b,0xa3e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0x6db,0x6db,0x6db,0x6db,0x6db,0x6d5,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db, +0x6db,0x6d5,0x6cf,0x6db,0x6db,0x6db,0x6cf,0x6db,0x6db,0x6cf,0x6d5,0x6cf,0x6cf,0x6cf,0x6cf,0x6db, +0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6d5,0x6d5,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6cf,0x6cf,0x6cf, +0x6cf,0x6db,0x6db,0x6cf,0x6db,0x6db,0x6d5,0x6cf,0x6d5,0x6db,0x6d5,0x6cf,0x6db,0x6db,0x6cf,0x6cf, +0x6cf,0x6cf,0x6cf,0x6cf,0x6d8,0x6d8,0x981,0x6d8,0x6d8,0x984,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85, +0xb85,0xb85,0xb85,0xcbd,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xf15,0xf0f,0xf0f,0xf0f, +0xf12,0xdce,0xdce,0xdce,0x6d2,0x6d2,0xb88,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0x100e,0x100b,0x100e,0x100b,0x369,0x375,0x100e,0x100b,9,9,0x378,0xf54, +0xf54,0xf54,0x360,0x158a,9,9,9,9,0x372,0x363,0x38d,0x366,0x38d,0x38d,0x38d,9, +0x38d,9,0x38d,0x38d,0x38a,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1, +0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,9,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x38d,0x38d, +0x38a,0x38a,0x38a,0x38a,0x38a,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de, +0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x387,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x38a,0x38a, +0x38a,0x38a,0x38a,0x1011,0x390,0x390,0x393,0x384,0x384,0x390,0x381,0xa4a,0xc15,0xc12,0x37b,0xa47, +0x37b,0xa47,0x37b,0xa47,0x37b,0xa47,0x36f,0x36c,0x36f,0x36c,0x36f,0x36c,0x36f,0x36c,0x36f,0x36c, +0x36f,0x36c,0x36f,0x36c,0x390,0x390,0x381,0x37e,0xbc4,0xbc1,0xc0f,0xd14,0xd11,0xd17,0xd14,0xd11, +0xe07,0xe0a,0xe0a,0xe0a,0xa59,0x6ed,0x3ab,0x3ae,0x3ab,0x3ab,0x3ab,0x3ae,0x3ab,0x3ab,0x3ab,0x3ab, +0x3ae,0xa59,0x3ae,0x3ab,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ed,0x6ea,0x6ea, +0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea, +0x6ea,0x6ea,0x6ea,0x6ea,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e7,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0xa53,0x6e7,0x3a5,0x3a8,0x3a5,0x3a5,0x3a5,0x3a8,0x3a5,0x3a5,0x3a5,0x3a5,0x3a8,0xa53,0x3a8,0x3a5, +0x39f,0x399,0x39f,0x399,0x39f,0x399,0x39f,0x399,0x39f,0x399,0x39f,0x399,0x39f,0x399,0x39f,0x399, +0x39f,0x399,0x39f,0x399,0x39f,0x399,0x3a2,0x39c,0x39f,0x399,0x39f,0x399,0x39f,0x399,0x39f,0x399, +0x39f,0x399,0x396,0x98d,0x990,0x972,0x972,0x11e2,0xa4d,0xa4d,0xc1b,0xc18,0xa56,0xa50,0xa56,0xa50, +0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5, +0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5, +0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5,0x3ab,0x3a5, +0x3ab,0x3ae,0x3a8,0x3ab,0x3a5,0xc1b,0xc18,0x3ab,0x3a5,0xc1b,0xc18,0x3ab,0x3a5,0xc1b,0xc18,0xf57, +0x3ae,0x3a8,0x3ae,0x3a8,0x3ab,0x3a5,0x3ae,0x3a8,0x3ab,0x3a5,0x3ae,0x3a8,0x3ae,0x3a8,0x3ae,0x3a8, +0x3ab,0x3a5,0x3ae,0x3a8,0x3ae,0x3a8,0x3ae,0x3a8,0x3ab,0x3a5,0x3ae,0x3a8,0xa59,0xa53,0x3ae,0x3a8, +0x3ae,0x3a8,0x3ae,0x3a8,0x3ae,0x3a8,0xe10,0xe0d,0x3ae,0x3a8,0xf5a,0xf57,0xf5a,0xf57,0xf5a,0xf57, +0xc81,0xc7e,0xc81,0xc7e,0xc81,0xc7e,0xc81,0xc7e,0xc81,0xc7e,0xc81,0xc7e,0xc81,0xc7e,0xc81,0xc7e, +0xf87,0xf84,0xf87,0xf84,0x1092,0x108f,0x1092,0x108f,0x1092,0x108f,0x1092,0x108f,0x1092,0x108f,0x1092,0x108f, +0x1092,0x108f,0x1092,0x108f,0x121b,0x1218,0x13f8,0x13f5,0x15c6,0x15c3,0x15c0,0x15bd,0x15c0,0x15bd,0x15c6,0x15c3, +0xc,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0, +0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0xc,0xc,0x3c3,0x3b1,0x3b1, +0x3b1,0x3b7,0x3b1,0x3b4,0x19d7,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd, +0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd, +0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3ba,0x19d7,0x3c6,0xa5c,0xc,0xc,0x158d,0x158d,0x14a6, +0xf,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, +0x9b4,0x9b4,0xe13,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, +0x3c9,0x3c9,0x3c9,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0xf5d,0x3c9,0x3c9,0x3c9,0x3d8,0x3c9, +0x3cf,0x3c9,0x3c9,0x3db,0x9b7,0xe16,0xe1c,0xe19,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0xf,0xf,0xf,0xf,0x19da, +0x3de,0x3de,0x3de,0x3d5,0x3d2,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xd2c,0xd2c,0xd2c,0xd2c,0x14a9,0x1590,0x101a,0x101a,0x101a,0x1017,0x1017,0xe22,0x8f7,0xd26,0xd23,0xd23, +0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0x1014,0x1014,0x1014,0x1014,0x1014,0x8f4,0x1587,0x1bfc,0xe25,0x8fa, +0x13bf,0x3ff,0x402,0x402,0x402,0x402,0x402,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x101d,0x101d,0x101d,0x101d,0x101d, +0x8fd,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0xbbb,0xbbb,0xbbb,0xd1a,0xd20,0xd1d,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0x13bc, +0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x3f3,0x3f0,0x3ed,0x3ea,0xc1e,0xc1e, +0x975,0x3ff,0x3ff,0x408,0x3ff,0x3fc,0x3fc,0x3fc,0x3fc,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3f9,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3f9,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0xa62,0xa62,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0xa62,0x402,0x3ff,0x402,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0xa62,0x3ff,0x3ff,0x3ff,0x402, +0x996,0x3ff,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e1,0x3ea,0x3e7,0x3e7,0x3e4,0x3e4,0x3e4, +0x3e4,0x405,0x405,0x3e4,0x3e4,0x3ea,0x3e7,0x3e7,0x3e7,0x3e4,0xd29,0xd29,0x3f6,0x3f6,0x3f6,0x3f6, +0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0xa62,0xa62,0xa62,0xa5f,0xa5f,0xd29,0xa77,0xa77,0xa77,0xa71, +0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa6e,0xa71,0xa6e,0x12,0xa7a,0xa74,0xa65,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xd2f,0xd2f,0xd2f,0xa6b,0xa6b,0xa6b,0xa6b, +0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa68,0xa68,0xa68,0xa68, +0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0x12,0x12,0xd2f,0xd2f,0xd2f,0xe85,0xe85,0xe85,0xe85, +0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85, +0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0xa80,0xa80,0xa80,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80, +0xa80,0xa80,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xc21,0x15,0x15, +0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0xf9f,0xf9f,0xf9f,0xf9f, +0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2, +0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2, +0xfa2,0xfa2,0xfa2,0xfa2,0xfa5,0xfa5,0xfa5,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96, +0xfa8,0xfa8,0xf99,0xf99,0xf9c,0xfae,0xfab,0xff,0xff,0x19fe,0x1a01,0x1a01,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb94,0xb94,0xb97,0xb97, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0x1d40,0x1d40,0x1d3d,0x1d3d,0x1dd,0x1dd,0x1dd,0x1dd, +0x1dd,0x1dd,0x1dd,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1e9,0x1e9,0x1e9,0x1e9, +0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1311,0x1311,0x1311,0x1311, +0x1311,0x1311,0x1311,0x1311,0x1311,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1cda,0x1cd7,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1c59,0x1c59,0x1c59,0x1c59, +0x1c59,0x1c59,0x1c59,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x246,0x246,0x246,0x246, +0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1a4f,0x1a4f,0x1a4f,0x1a4f, +0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1bc0,0x288,0x288,0x288, +0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x183f,0x183f,0x183f,0x183f, +0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1c6b,0x1c6b,0x1c6b,0x1c6b, +0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x172b,0x172b,0x172b,0x172b, +0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1cc2,0x1cc2,0x1cc2,0x1cc2, +0x29d,0x1cc2,0x1cc2,0x1cc2,0x1cc2,0x1cc2,0x1cc2,0x1cc2,0x29d,0x1cc2,0x1cc2,0x29d,0x17a3,0x17a3,0x17a3,0x17a3, +0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1c9e,0x1c9e,0x1c9e,0x1c9e, +0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe7c,0xe7c,0xe79,0xe79, +0xe79,0xe7c,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x210,0x1857,0x1857,0x1857, +0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x2b8,0x2b8,0x2b8,0x2b8, +0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x1cf5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b0c,0x1b0c,0x1b0c,0x1b0c, +0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x26d,0x26d,0x26d,0x26d,0x1b0f,0x1b09,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1c92,0x1c92,0x1c92,0x1c92, +0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1d25,0x1d25,0x1d25,0x1d25, +0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x252,0x1a64,0x1a64,0x1a64, +0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x270,0x270,0x270,0x270, +0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x95d,0x95d,3,3,3,3,3,3,3,3, +0,0,0,0,0,0,0,0,0,0,0x9b1,0x9b1,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,0x95d,0x95d,6,6,6,6, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,0x9b1,0x9b1, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,0x14c4,0x3f0,0x3ff,0x3ff, -0x18,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x18,0x18,0x405,0x405,0x18,0x18,0x405, -0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x18,0x405,0x405, -0x405,0x405,0x405,0x405,0x405,0x18,0x405,0x18,0x18,0x18,0x405,0x405,0x405,0x405,0x18,0x18, -0x3f3,0xcb4,0x3f0,0x3ff,0x3ff,0x3f0,0x3f0,0x3f0,0x3f0,0x18,0x18,0x3ff,0x3ff,0x18,0x18,0x402, -0x402,0x3f6,0xda7,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3f0,0x18,0x18,0x18,0x18, -0x408,0x408,0x18,0x408,0x405,0x405,0x3f0,0x3f0,0x18,0x18,0x948,0x948,0x948,0x948,0x948,0x948, -0x948,0x948,0x948,0x948,0x405,0x405,0x3fc,0x3fc,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3fc,0x3f9,0x112b, -0x185a,0x1857,0x18ff,0x18,0x1b,0xcb7,0x40b,0xcba,0x1b,0x417,0x417,0x417,0x417,0x417,0x417,0x1b, -0x1b,0x1b,0x1b,0x417,0x417,0x1b,0x1b,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417, -0x417,0x417,0x417,0x417,0x417,0x1b,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x1b,0x417,0x41a, -0x1b,0x417,0x41a,0x1b,0x417,0x417,0x1b,0x1b,0x40e,0x1b,0x414,0x414,0x414,0x40b,0x40b,0x1b, -0x1b,0x1b,0x1b,0x40b,0x40b,0x1b,0x1b,0x40b,0x40b,0x411,0x1b,0x1b,0x1b,0xf84,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x41a,0x41a,0x41a,0x417,0x1b,0x41a,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x40b,0x40b,0x417,0x417, -0x417,0xf84,0x1902,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1e,0x41d,0x41d,0x426, -0x1e,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0xcc3,0x429,0x1e,0x429,0x429,0x429,0x1e,0x429, -0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x1e,0x429,0x429, -0x429,0x429,0x429,0x429,0x429,0x1e,0x429,0x429,0x1e,0x429,0x429,0x429,0x429,0x429,0x1e,0x1e, -0x420,0x429,0x426,0x426,0x426,0x41d,0x41d,0x41d,0x41d,0x41d,0x1e,0x41d,0x41d,0x426,0x1e,0x426, -0x426,0x423,0x1e,0x1e,0x429,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x429,0xcc3,0xcbd,0xcbd,0x1e,0x1e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e, -0x94e,0x94e,0x94e,0x94e,0x13dd,0xcc0,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x16da,0x185d,0x185d, -0x185d,0x1860,0x1860,0x1860,0x21,0x42c,0x43b,0x43b,0x21,0x441,0x441,0x441,0x441,0x441,0x441,0x441, -0x441,0x21,0x21,0x441,0x441,0x21,0x21,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441, -0x441,0x441,0x441,0x441,0x441,0x21,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x21,0x441,0x441, -0x21,0xcc6,0x441,0x441,0x441,0x441,0x21,0x21,0x42f,0x441,0x42c,0x42c,0x43b,0x42c,0x42c,0x42c, -0xf87,0x21,0x21,0x43b,0x43e,0x21,0x21,0x43e,0x43e,0x432,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x1a6d,0x42c,0x42c,0x21,0x21,0x21,0x21,0x444,0x444,0x21,0x441,0x441,0x441,0xf87,0xf87, -0x21,0x21,0x438,0x438,0x438,0x438,0x438,0x438,0x438,0x438,0x438,0x438,0x435,0xcc6,0x1302,0x1302, -0x1302,0x1302,0x1302,0x1302,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x24,0x24,0x447,0x453, -0x24,0x453,0x453,0x453,0x453,0x453,0x453,0x24,0x24,0x24,0x453,0x453,0x453,0x24,0x453,0x453, -0x456,0x453,0x24,0x24,0x24,0x453,0x453,0x24,0x453,0x24,0x453,0x453,0x24,0x24,0x24,0x453, -0x453,0x24,0x24,0x24,0x453,0x453,0x453,0x24,0x24,0x24,0x453,0x453,0x453,0x453,0x453,0x453, -0x453,0x453,0xdaa,0x453,0x453,0x453,0x24,0x24,0x24,0x24,0x447,0x44d,0x447,0x44d,0x44d,0x24, -0x24,0x24,0x44d,0x44d,0x44d,0x24,0x450,0x450,0x450,0x44a,0x24,0x24,0xf8a,0x24,0x24,0x24, -0x24,0x24,0x24,0x447,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xebe,0x954, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x951,0x951,0x951,0xd7a,0xcc9,0xcc9,0xcc9,0xcc9, -0xcc9,0xccc,0xcc9,0x24,0x24,0x24,0x24,0x24,0x14c7,0x465,0x465,0x465,0x1905,0x468,0x468,0x468, -0x468,0x468,0x468,0x468,0x468,0x27,0x468,0x468,0x468,0x27,0x468,0x468,0x468,0x468,0x468,0x468, -0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x27,0x468,0x468,0x468,0x468,0x468,0x468, -0x468,0x468,0x468,0x468,0x14ca,0x468,0x468,0x468,0x468,0x468,0x27,0x27,0x1b12,0xf93,0x459,0x459, -0x459,0x465,0x465,0x465,0x465,0x27,0x459,0x459,0x45c,0x27,0x459,0x459,0x459,0x45f,0x27,0x27, -0x27,0x27,0x27,0x27,0x27,0x459,0x459,0x27,0xf93,0xf93,0x16dd,0x27,0x27,0x1b15,0x27,0x27, -0x468,0x468,0xf8d,0xf8d,0x27,0x27,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462, -0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x19d1,0xf90,0xf90,0xf90,0xf90,0xf90,0xf90,0xf90,0xf90, -0x179d,0x14cd,0x471,0x471,0x1908,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x2a,0x477,0x477, -0x477,0x2a,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477, -0x477,0x2a,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x2a,0x477,0x477,0x477, -0x477,0x477,0x2a,0x2a,0xccf,0xcd2,0x471,0x46b,0x474,0x471,0x46b,0x471,0x471,0x2a,0x46b,0x474, -0x474,0x2a,0x474,0x474,0x46b,0x46e,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x46b,0x46b,0x2a, -0x2a,0x2a,0x2a,0x2a,0x2a,0x1b18,0x477,0x2a,0x477,0x477,0xed6,0xed6,0x2a,0x2a,0x957,0x957, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x2a,0xed9,0xed9,0x1bdb,0x2a,0x2a,0x2a,0x2a, -0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1863,0x14d0,0x483,0x483,0x1a70,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x2d,0x489,0x489,0x489,0x2d,0x489,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x483,0x47a,0x47a,0x47a,0xf96,0x2d,0x483,0x483, -0x483,0x2d,0x486,0x486,0x486,0x47d,0x1308,0x17a0,0x2d,0x2d,0x2d,0x2d,0x17a3,0x17a3,0x17a3,0x47a, -0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x16e0,0x489,0x489,0xf96,0xf96,0x2d,0x2d,0x480,0x480, -0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0xf99,0xf99,0xf99,0xf99,0xf99,0xf99,0x17a0,0x17a0, -0x17a0,0xf9c,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0x30,0x1a73,0xa23,0xa23,0x30,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0x30, -0x30,0x30,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0x30,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0x30,0xa29,0x30,0x30,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0x30,0x30,0x30,0xa1d,0x30, -0x30,0x30,0x30,0xa1a,0xa23,0xa23,0xa1a,0xa1a,0xa1a,0x30,0xa1a,0x30,0xa23,0xa23,0xa26,0xa23, -0xa26,0xa26,0xa26,0xa1a,0x30,0x30,0x30,0x30,0x30,0x30,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3, -0x14d3,0x14d3,0x14d3,0x14d3,0x30,0x30,0xa23,0xa23,0xa20,0x30,0x30,0x30,0x30,0x30,0x30,0x30, -0x30,0x30,0x30,0x30,0x33,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x48f,0x4a4,0x4a1,0x48f,0x48f,0x48f,0x48f,0x48f,0x48f,0x495,0x33, -0x33,0x33,0x33,0x48c,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4a4,0x4a7,0x492,0x492,0x492,0x492,0x492, -0x492,0x48f,0x492,0x498,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49b,0x49b, -0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +0x1596,0x426,0x435,0x435,0x18,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x18,0x18,0x43e, +0x43e,0x18,0x18,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, +0x43e,0x18,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x18,0x43e,0x18,0x18,0x18,0x43e,0x43e, +0x43e,0x43e,0x18,0x18,0x429,0xd35,0x426,0x435,0x435,0x426,0x426,0x426,0x426,0x18,0x18,0x435, +0x435,0x18,0x18,0x438,0x438,0x42c,0xe2b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x426, +0x18,0x18,0x18,0x18,0x43b,0x43b,0x18,0x43b,0x43e,0x43e,0x426,0x426,0x18,0x18,0x99c,0x99c, +0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x43e,0x43e,0x432,0x432,0x42f,0x42f,0x42f,0x42f, +0x42f,0x432,0x42f,0x11f1,0x1938,0x1935,0x19dd,0x18,0x1b,0xd38,0x441,0xd3b,0x1b,0x450,0x450,0x450, +0x450,0x450,0x450,0x1b,0x1b,0x1b,0x1b,0x450,0x450,0x1b,0x1b,0x450,0x450,0x450,0x450,0x450, +0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x1b,0x450,0x450,0x450,0x450,0x450,0x450, +0x450,0x1b,0x450,0x44d,0x1b,0x450,0x44d,0x1b,0x450,0x450,0x1b,0x1b,0x444,0x1b,0x44a,0x44a, +0x44a,0x441,0x441,0x1b,0x1b,0x1b,0x1b,0x441,0x441,0x1b,0x1b,0x441,0x441,0x447,0x1b,0x1b, +0x1b,0x1026,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x44d,0x44d,0x44d,0x450,0x1b,0x44d,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f, +0x441,0x441,0x450,0x450,0x450,0x1026,0x19e0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1e,0x453,0x453,0x45c,0x1e,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0xd44,0x45f,0x1e,0x45f, +0x45f,0x45f,0x1e,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, +0x45f,0x1e,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x1e,0x45f,0x45f,0x1e,0x45f,0x45f,0x45f, +0x45f,0x45f,0x1e,0x1e,0x456,0x45f,0x45c,0x45c,0x45c,0x453,0x453,0x453,0x453,0x453,0x1e,0x453, +0x453,0x45c,0x1e,0x45c,0x45c,0x459,0x1e,0x1e,0x45f,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x45f,0xd44,0xd3e,0xd3e,0x1e,0x1e,0x9a2,0x9a2, +0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x14ac,0xd41,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x17b8,0x193b,0x193b,0x193b,0x193e,0x193e,0x193e,0x21,0x462,0x471,0x471,0x21,0x47a,0x47a,0x47a, +0x47a,0x47a,0x47a,0x47a,0x47a,0x21,0x21,0x47a,0x47a,0x21,0x21,0x47a,0x47a,0x47a,0x47a,0x47a, +0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x21,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a, +0x47a,0x21,0x47a,0x47a,0x21,0xd47,0x47a,0x47a,0x47a,0x47a,0x21,0x21,0x465,0x47a,0x462,0x462, +0x471,0x462,0x462,0x462,0x1029,0x21,0x21,0x471,0x474,0x21,0x21,0x474,0x474,0x468,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x1b54,0x462,0x462,0x21,0x21,0x21,0x21,0x477,0x477,0x21,0x47a, +0x47a,0x47a,0x1029,0x1029,0x21,0x21,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46b,0xd47,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x24,0x24,0x47d,0x489,0x24,0x489,0x489,0x489,0x489,0x489,0x489,0x24,0x24,0x24,0x489,0x489, +0x489,0x24,0x489,0x489,0x48c,0x489,0x24,0x24,0x24,0x489,0x489,0x24,0x489,0x24,0x489,0x489, +0x24,0x24,0x24,0x489,0x489,0x24,0x24,0x24,0x489,0x489,0x489,0x24,0x24,0x24,0x489,0x489, +0x489,0x489,0x489,0x489,0x489,0x489,0xe2e,0x489,0x489,0x489,0x24,0x24,0x24,0x24,0x47d,0x483, +0x47d,0x483,0x483,0x24,0x24,0x24,0x483,0x483,0x483,0x24,0x486,0x486,0x486,0x480,0x24,0x24, +0x102c,0x24,0x24,0x24,0x24,0x24,0x24,0x47d,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0xf4b,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a5,0x9a5,0x9a5,0xdfb, +0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4d,0xd4a,0x24,0x24,0x24,0x24,0x24,0x1599,0x49b,0x49b,0x49b, +0x19e3,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x27,0x49e,0x49e,0x49e,0x27,0x49e,0x49e, +0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x27,0x49e,0x49e, +0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x159c,0x49e,0x49e,0x49e,0x49e,0x49e,0x27,0x27, +0x1bff,0x1038,0x48f,0x48f,0x48f,0x49b,0x49b,0x49b,0x49b,0x27,0x48f,0x48f,0x492,0x27,0x48f,0x48f, +0x48f,0x495,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x48f,0x48f,0x27,0x1035,0x1035,0x17bb,0x27, +0x27,0x1c02,0x27,0x27,0x49e,0x49e,0x102f,0x102f,0x27,0x27,0x498,0x498,0x498,0x498,0x498,0x498, +0x498,0x498,0x498,0x498,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x1ab2,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x187b,0x159f,0x4a7,0x4a7,0x19e6,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, +0x4b0,0x2a,0x4b0,0x4b0,0x4b0,0x2a,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, +0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x2a,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, +0x2a,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x2a,0x2a,0xd50,0xd53,0x4a7,0x4a1,0x4aa,0x4a7,0x4a1,0x4a7, +0x4a7,0x2a,0x4a1,0x4aa,0x4aa,0x2a,0x4aa,0x4aa,0x4a1,0x4a4,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, +0x2a,0x4a1,0x4a1,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1c05,0x4ad,0x2a,0x4b0,0x4b0,0xf63,0xf63, +0x2a,0x2a,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x2a,0xf66,0xf66,0x1cc8, +0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1941,0x15a2,0x4bc,0x4bc, +0x1b57,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x2d,0x4c2,0x4c2,0x4c2,0x2d,0x4c2,0x4c2, +0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4bc,0x4b3,0x4b3,0x4b3, +0x103b,0x2d,0x4bc,0x4bc,0x4bc,0x2d,0x4bf,0x4bf,0x4bf,0x4b6,0x13d1,0x187e,0x2d,0x2d,0x2d,0x2d, +0x1881,0x1881,0x1881,0x4b3,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x17be,0x4c2,0x4c2,0x103b,0x103b, +0x2d,0x2d,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x103e,0x103e,0x103e,0x103e, +0x103e,0x103e,0x187e,0x187e,0x187e,0x1041,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x30,0x1b5a,0xa92,0xa92, +0x30,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa98,0xa98,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0x30,0x30,0x30,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa98,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0x30,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0x30,0xa9b,0x30,0x30,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0x30, +0x30,0x30,0xa89,0x30,0x30,0x30,0x30,0xa86,0xa92,0xa92,0xa86,0xa86,0xa86,0x30,0xa86,0x30, +0xa92,0xa92,0xa95,0xa92,0xa95,0xa95,0xa95,0xa83,0x30,0x30,0x30,0x30,0x30,0x30,0x15a5,0x15a5, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x30,0x30,0xa92,0xa8f,0xa8c,0x30,0x30,0x30, +0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x33,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd, +0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd, +0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4dd,0x4c8,0x4dd,0x4da,0x4c8,0x4c8,0x4c8,0x4c8, +0x4c8,0x4c8,0x4ce,0x33,0x33,0x33,0x33,0x4c5,0x4e3,0x4e3,0x4e3,0x4e3,0x4e3,0x4dd,0x4e0,0x4cb, +0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4c8,0x4cb,0x4d1,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7, +0x4d7,0x4d7,0x4d4,0x4d4,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x36,0x4b9,0x4b9,0x36,0x4b9,0x36,0x19d7,0x4b9,0x4b9,0x19d7,0x4b9,0x36,0x19d7,0x4b9,0x19d7,0x19d7, -0x19d7,0x19d7,0x19d7,0x19d7,0x4b9,0x4b9,0x4b9,0x4b9,0x19d7,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9, -0x19d7,0x4b9,0x4b9,0x4b9,0x36,0x4b9,0x36,0x4b9,0x19d7,0x19d7,0x4b9,0x4b9,0x19d7,0x4b9,0x4b9,0x4b9, -0x4b9,0x4ad,0x4b9,0x4b6,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x19d4,0x4ad,0x4ad,0x4b9,0x36,0x36, -0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x36,0x4bf,0x36,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4ad,0x1bde,0x36, -0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x36,0x36,0x4bc,0x4bc,0x13e0,0x13e0, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x33,0x33,0x33,0x33,0x36,0x4f5,0x4f5,0x36,0x4f5,0x36,0x1ab8,0x4f5,0x4f5,0x1ab8,0x4f5,0x36, +0x1ab8,0x4f5,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x4f5,0x4f5,0x4f5,0x4f5,0x1ab8,0x4f5,0x4f5,0x4f5, +0x4f5,0x4f5,0x4f5,0x4f5,0x1ab8,0x4f5,0x4f5,0x4f5,0x36,0x4f5,0x36,0x4f5,0x1ab8,0x1ab8,0x4f5,0x4f5, +0x1ab8,0x4f5,0x4f5,0x4f5,0x4f5,0x4e6,0x4f5,0x4ef,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x1ab5,0x4e6, +0x4e6,0x4f5,0x36,0x36,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x36,0x4f8,0x36,0x4e9,0x4e9,0x4e9,0x4e9, +0x4e9,0x4e6,0x1ccb,0x36,0x4ec,0x4ec,0x4ec,0x4ec,0x4ec,0x4ec,0x4ec,0x4ec,0x4ec,0x4ec,0x36,0x36, +0x4f2,0x4f2,0x14af,0x14af,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, -0x99c,0x99c,0x99c,0x99f,0x99c,0x99c,0x99c,0x99c,0x39,0x99c,0x99c,0x99c,0x99c,0x99f,0x99c,0x99c, -0x99c,0x99c,0x99f,0x99c,0x99c,0x99c,0x99c,0x99f,0x99c,0x99c,0x99c,0x99c,0x99f,0x99c,0x99c,0x99c, -0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99f,0xa38,0xfab,0xfab,0x39,0x39,0x39, -0x39,0x966,0x966,0x969,0x966,0x969,0x969,0x975,0x969,0x975,0x966,0x966,0x966,0x966,0x966,0x996, -0x966,0x969,0x96f,0x96f,0x972,0x97b,0x96c,0x96c,0x99c,0x99c,0x99c,0x99c,0x1311,0x130b,0x130b,0x130b, -0x966,0x966,0x966,0x969,0x966,0x966,0xa2c,0x966,0x39,0x966,0x966,0x966,0x966,0x969,0x966,0x966, -0x966,0x966,0x969,0x966,0x966,0x966,0x966,0x969,0x966,0x966,0x966,0x966,0x969,0x966,0xa2c,0xa2c, -0xa2c,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0xa2c,0x969,0xa2c,0xa2c,0xa2c,0x39,0xa35,0xa35, -0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa2f,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0x39,0xfa2,0xa32, -0xdad,0xdad,0xfa5,0xfa8,0xfa2,0x112e,0x112e,0x112e,0x112e,0x130e,0x130e,0x39,0x39,0x39,0x39,0x39, +0x36,0x36,0x36,0x36,0x9fc,0x9fc,0x9fc,0x9f9,0x9fc,0x9fc,0x9fc,0x9fc,0x39,0x9fc,0x9fc,0x9fc, +0x9fc,0x9f9,0x9fc,0x9fc,0x9fc,0x9fc,0x9f9,0x9fc,0x9fc,0x9fc,0x9fc,0x9f9,0x9fc,0x9fc,0x9fc,0x9fc, +0x9f9,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9f9,0xaaa,0x1050, +0x1050,0x39,0x39,0x39,0x39,0x9bd,0x9bd,0x9ba,0x9bd,0x9ba,0x9ba,0x9cf,0x9ba,0x9cf,0x9bd,0x9bd, +0x9bd,0x9bd,0x9bd,0x9f3,0x9bd,0x9ba,0x9c9,0x9c9,0x9cc,0x9d5,0x9c6,0x9c6,0x9fc,0x9fc,0x9fc,0x9fc, +0x13da,0x13d4,0x13d4,0x13d4,0x9bd,0x9bd,0x9bd,0x9ba,0x9bd,0x9bd,0xa9e,0x9bd,0x39,0x9bd,0x9bd,0x9bd, +0x9bd,0x9ba,0x9bd,0x9bd,0x9bd,0x9bd,0x9ba,0x9bd,0x9bd,0x9bd,0x9bd,0x9ba,0x9bd,0x9bd,0x9bd,0x9bd, +0x9ba,0x9bd,0xa9e,0xa9e,0xa9e,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0xa9e,0x9ba,0xa9e,0xa9e, +0xa9e,0x39,0xaa7,0xaa7,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa1,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4, +0xaa4,0x39,0x1047,0xaa4,0xe31,0xe31,0x104a,0x104d,0x1047,0x11f4,0x11f4,0x11f4,0x11f4,0x13d7,0x13d7,0x39, 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x4c8,0x4c8,0x4c8,0x4c8, -0x4c8,0x4c8,0x3c,0x13e6,0x3c,0x3c,0x3c,0x3c,0x3c,0x13e6,0x3c,0x3c,0x4c5,0x4c5,0x4c5,0x4c5, -0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xdbc,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0x3f,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xdbc,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc, -0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x3f, -0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0x1314,0x1314,0xdb6, -0xdb9,0xa5c,0xa65,0xa59,0xa59,0xa59,0xa59,0xa65,0xa65,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f, -0xa5f,0xa5f,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x3f,0x3f,0x3f, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa68,0xa68,0xa68,0xa68,0xa68,0x16e6,0x42,0x42,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x42,0x42, -0xa7a,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, -0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa77,0xa74,0x45,0x45,0x45, -0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa80,0xa80,0xa80,0xa83,0xa83, -0xa83,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x48,0x48,0x48,0x48,0x48,0x48,0x48, -0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xa86,0xaa4,0xaa4,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa8c,0xa89,0xaad,0xaad,0xa9e,0xaa7,0xa95,0xa92,0xa9b,0xa98,0xaa7,0xcd5,0x4b,0x4b, -0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, -0xab9,0xab9,0xb31,0xb34,0xabf,0xb2e,0xabc,0xab9,0xac2,0xad1,0xac5,0xad4,0xad4,0xad4,0xab0,0x1b1b, -0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0x190b,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xab3,0xfc9,0x4e,0x4e,0x4e,0x4e,0x4e, -0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x51,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x51,0x51, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x4e9,0x51,0x4e9,0x51,0x4e9,0x51,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x51, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e0,0x4e6,0x4e0, -0x4e0,0x4dd,0x4e6,0x4e6,0x4e6,0x51,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4dd,0x4dd,0x4dd, -0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x51,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x51,0x4dd,0x4dd,0x4dd, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4dd,0x4dd,0x4dd, -0x51,0x51,0x4e6,0x4e6,0x4e6,0x51,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e3,0x4e0,0x51, -0xba9,0xbac,0xbac,0xbac,0xfd2,0x54,0x14b2,0x14b2,0x14b2,0x14b2,0x4f2,0x4f2,0x4f2,0x4f2,0x4f2,0x4f2, -0x53d,0xbbe,0x57,0x57,0x6d8,0x53d,0x53d,0x53d,0x53d,0x53d,0x543,0x555,0x543,0x54f,0x549,0x6db, -0x53a,0x6d5,0x6d5,0x6d5,0x6d5,0x53a,0x53a,0x53a,0x53a,0x53a,0x540,0x552,0x540,0x54c,0x546,0x57, -0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x57,0x57,0x57, -0x1b1e,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x561,0x561,0x561, -0x561,0x564,0xae0,0xae0,0xbc4,0xbca,0xbca,0xbc7,0xbc7,0xbc7,0xbc7,0xdcb,0xedc,0xedc,0xedc,0xedc, -0x1119,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x594,0x594,0x594,0xae9,0xee5,0xfd8,0xfd8,0xfd8,0xfd8,0x1275,0x16ec,0x16ec,0x60,0x60,0x60,0x60, -0x702,0x702,0x702,0x702,0x702,0x702,0x702,0x702,0x702,0x702,0x5a0,0x5a0,0x59d,0x59d,0x59d,0x59d, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0xaf2,0xaf2,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, +0x501,0x501,0x501,0x501,0x501,0x501,0x3c,0x14b5,0x3c,0x3c,0x3c,0x3c,0x3c,0x14b5,0x3c,0x3c, +0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xe40,0xad4,0x3f,0xad4,0xad4,0xad4,0xad4,0x3f,0x3f, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0x3f,0xad4,0x3f,0xad4,0xad4,0xad4,0xad4,0x3f,0x3f, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xe40,0xad4,0x3f,0xad4,0xad4,0xad4,0xad4,0x3f,0x3f, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4, +0xad4,0xad4,0xad4,0xe40,0xad4,0x3f,0xad4,0xad4,0xad4,0xad4,0x3f,0x3f,0xad4,0xad4,0xad4,0xad4, +0xad4,0xad4,0xad4,0x3f,0xad4,0x3f,0xad4,0xad4,0xad4,0xad4,0x3f,0x3f,0xad4,0xad4,0xad4,0xad4, +0xad4,0xad4,0xad4,0xe40,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0x3f,0xad4,0xad4,0xad4,0xad4, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xe40,0xad4,0x3f,0xad4,0xad4, +0xad4,0xad4,0x3f,0x3f,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xe40,0xad4,0xad4,0xad4,0xad4, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0x3f, +0x3f,0x13dd,0x13dd,0xe3a,0xe3d,0xace,0xad7,0xacb,0xacb,0xacb,0xacb,0xad7,0xad7,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, +0xac8,0x3f,0x3f,0x3f,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x17c4,0x42,0x42,0x17c1,0x17c1,0x17c1,0x17c1, +0x17c1,0x17c1,0x42,0x42,0xaec,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, +0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xae9, +0xae6,0x45,0x45,0x45,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf2, +0xaf2,0xaf2,0xaf5,0xaf5,0xaf5,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x48,0x48,0x48, +0x48,0x48,0x48,0x48,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xaf8,0xb1f,0xb1f,0xb04,0xb04,0xb04, +0xb04,0xb04,0xafe,0xafe,0xb04,0xb01,0xb07,0xafb,0xb2b,0xb2b,0xb19,0xb25,0xb13,0xb0d,0xb16,0xb10, +0xb25,0xd56,0x4b,0x4b,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0x4b,0x4b, +0x4b,0x4b,0x4b,0x4b,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0x4b,0x4b, +0x4b,0x4b,0x4b,0x4b,0xb37,0xb37,0xbaf,0xbb2,0xb3d,0xbac,0xb3a,0xb37,0xb40,0xb4f,0xb43,0xb52, +0xb52,0xb52,0xb2e,0x1c08,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46,0x4e,0x4e, +0x4e,0x4e,0x4e,0x4e,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, +0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x19e9,0x4e,0x4e,0x4e, +0x4e,0x4e,0x4e,0x4e,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb31,0x106e,0x4e, +0x4e,0x4e,0x4e,0x4e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, +0x124e,0x124e,0x124e,0x124e,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x52b,0x52b,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x528,0x528,0x528,0x528,0x528,0x528,0x51,0x51,0x52b,0x52b,0x52b,0x52b, +0x52b,0x52b,0x51,0x51,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x51,0x52b,0x51,0x52b, +0x51,0x52b,0x51,0x52b,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x52b,0x52b,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x528,0x522,0x528,0x522,0x528,0x522,0x528,0x522,0x528,0x522,0x528,0x522, +0x528,0x522,0x51,0x51,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x52b,0x52b,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x528,0x528,0x528,0x528,0x528,0x51,0x528,0x528,0x52b,0x52b,0x52b,0x525, +0x52b,0x51c,0x522,0x51c,0x51c,0x519,0x528,0x528,0x528,0x51,0x528,0x528,0x52b,0x525,0x52b,0x525, +0x52b,0x519,0x519,0x519,0x528,0x528,0x528,0x522,0x51,0x51,0x528,0x528,0x52b,0x52b,0x52b,0x525, +0x51,0x519,0x519,0x519,0x528,0x528,0x528,0x522,0x528,0x528,0x528,0x528,0x52b,0x52b,0x52b,0x525, +0x52b,0x519,0x519,0x519,0x51,0x51,0x528,0x528,0x528,0x51,0x528,0x528,0x52b,0x525,0x52b,0x525, +0x52b,0x51f,0x51c,0x51,0xc27,0xc2a,0xc2a,0xc2a,0x107a,0x54,0x1584,0x1584,0x1584,0x1584,0x534,0x534, +0x534,0x534,0x534,0x534,0x57f,0xc3c,0x57,0x57,0x726,0x57f,0x57f,0x57f,0x57f,0x57f,0x585,0x597, +0x585,0x591,0x58b,0x729,0x57c,0x723,0x723,0x723,0x723,0x57c,0x57c,0x57c,0x57c,0x57c,0x582,0x594, +0x582,0x58e,0x588,0x57,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0, +0x13e0,0x57,0x57,0x57,0x1c0b,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a, +0x5a,0x5a,0x5a,0x5a,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6, +0x5a6,0x5a3,0x5a3,0x5a3,0x5a3,0x5a6,0xb5e,0xb5e,0xc42,0xc48,0xc48,0xc45,0xc45,0xc45,0xc45,0xe52, +0xf69,0xf69,0xf69,0xf69,0x11df,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d6,0x5d6,0x5d6,0xb67,0xf72,0x1080,0x1080,0x1080,0x1080,0x133e,0x17ca,0x17ca, +0x60,0x60,0x60,0x60,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x5e5,0x5e5, +0x5e2,0x5e2,0x5e2,0x5e2,0x606,0x606,0x606,0x606,0x606,0xb70,0xb70,0x63,0x63,0x63,0x63,0x63, 0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x66,0x66,0x66,0x66,0x66, +0x63,0x63,0x63,0x63,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x66, 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0x69,0xb0d,0xb0d,0xb0d,0xb0d,0xb10, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb10,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, -0x6f,0x822,0x81c,0x822,0x81c,0x822,0x81c,0x822,0x81c,0x822,0x81c,0x81c,0x81f,0x81c,0x81f,0x81c, -0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c, -0x81c,0x81c,0x81c,0x822,0x81c,0x822,0x81c,0x822,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x822,0x81c, -0x81c,0x81c,0x81c,0x81c,0x81f,0xc63,0xc63,0x6f,0x6f,0x936,0x936,0x8fd,0x8fd,0x825,0x828,0xc60, -0x72,0x72,0x72,0x72,0x72,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a, -0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a, -0x83a,0x1107,0x18d2,0x19bc,0x75,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x75,0x906,0x906,0x909,0x909,0x909,0x909,0x909,0x909, -0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x846,0x846,0xd5f,0xd5f,0x78,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0x7b,0x7b,0x7b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, -0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xc6c,0xb2b,0xb2b,0xb2b,0xc6c,0xb2b,0x7e, -0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, -0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x9c0,0x9c0,0x9c0,0x9c0,0x81,0x81,0x81,0x81, -0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221, -0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x84, -0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x84,0x84,0x84,0x84,0x84,0xafe,0x5fa,0x600,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606, -0x606,0x5fd,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x84, -0x600,0x600,0x600,0x600,0x600,0x84,0x600,0x84,0x600,0x600,0x84,0x600,0x600,0x84,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x603,0x615,0x60f,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x1329,0x1329,0x1b21,0x87,0x87,0x87,0x87,0x87, -0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x615,0x60f,0x612,0x618,0x615, -0x60f,0x615,0x60f,0x615,0x60f,0x615,0x615,0x60f,0x60f,0x60f,0x60f,0x612,0x60f,0x60f,0x612,0x60f, -0x612,0x612,0x612,0x60f,0x612,0x612,0x612,0x612,0x87,0x87,0x612,0x612,0x612,0x612,0x60f,0x60f, -0x612,0x60f,0x60f,0x60f,0x60f,0x612,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x60f,0x60f, -0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x1b21,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x85e,0x870,0x86d,0x870,0x86d,0xc81,0xc81,0xd6b, -0xd68,0x861,0x861,0x861,0x861,0x873,0x873,0x873,0x88b,0x88e,0x89d,0x8a,0x891,0x894,0x8a0,0x8a0, -0x888,0x87f,0x879,0x87f,0x879,0x87f,0x879,0x87c,0x87c,0x897,0x897,0x89a,0x897,0x897,0x897,0x8a, -0x897,0x885,0x882,0x87c,0x8a,0x8a,0x8a,0x8a,0x621,0x62d,0x621,0xbfd,0x621,0x8d,0x621,0x62d, -0x621,0x62d,0x621,0x62d,0x621,0x62d,0x621,0x62d,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627, -0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a,0x624,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a, -0x624,0x62a,0x624,0x62a,0x624,0x8d,0x8d,0x61e,0x75f,0x762,0x777,0x77a,0x759,0x762,0x762,0x93, -0x741,0x744,0x744,0x744,0x744,0x741,0x741,0x93,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, -0x90,0xb01,0xb01,0xb01,0x9c3,0x73b,0x630,0x630,0x93,0x789,0x768,0x759,0x762,0x75f,0x759,0x76b, -0x75c,0x756,0x759,0x777,0x76e,0x765,0x786,0x759,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783, -0x783,0x783,0x774,0x771,0x777,0x777,0x777,0x789,0x74a,0x747,0x747,0x747,0x747,0x747,0x747,0x747, -0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747, -0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x93,0x93,0x93,0x747,0x747,0x747,0x747,0x747,0x747, -0x93,0x93,0x747,0x747,0x747,0x747,0x747,0x747,0x93,0x93,0x747,0x747,0x747,0x747,0x747,0x747, -0x93,0x93,0x747,0x747,0x747,0x93,0x93,0x93,0xb4c,0xb4c,0xb4c,0xb4c,0x96,0x96,0x96,0x96, -0x96,0x96,0x96,0x96,0x96,0x186f,0x186f,0x186f,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, -0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0x99,0x99,0x99,0x99,0x99, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, -0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0x9f,0x9f,0xfe4,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x1b24,0x1b24,0x9f,0x9f,0x9f,0x9f,0x9f, +0x66,0x66,0x66,0x66,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, +0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0x69,0xb8b, +0xb8b,0xb8b,0xb8b,0xb8e,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, +0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8e,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +0x69,0x69,0x69,0x69,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, +0x6c,0x6c,0x6c,0x6c,0x6f,0x873,0x86d,0x873,0x86d,0x873,0x86d,0x873,0x86d,0x873,0x86d,0x86d, +0x870,0x86d,0x870,0x86d,0x870,0x86d,0x870,0x86d,0x870,0x86d,0x870,0x86d,0x870,0x86d,0x870,0x86d, +0x870,0x86d,0x870,0x86d,0x86d,0x86d,0x86d,0x873,0x86d,0x873,0x86d,0x873,0x86d,0x86d,0x86d,0x86d, +0x86d,0x86d,0x873,0x86d,0x86d,0x86d,0x86d,0x86d,0x870,0xce1,0xce1,0x6f,0x6f,0x98a,0x98a,0x951, +0x951,0x876,0x879,0xcde,0x72,0x72,0x72,0x72,0x72,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x11cd,0x19b0,0x1a9d,0x75,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e, +0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x75,0x95a,0x95a,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x897,0x897,0x897,0x897, +0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897, +0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0x897,0xde0,0xde0,0x78,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0x7b,0x7b,0x7b,0xba9,0xba9,0xba9,0xba9, +0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xcea,0xba9,0xba9, +0xba9,0xcea,0xba9,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x1275,0x1275,0x1275,0x1275, +0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0xa1d,0xa1d,0xa1d,0xa1d, +0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x12ea,0x12ea,0x12ea,0x12ea, +0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x64e,0x64e,0x64e,0x64e, +0x64e,0x64e,0x64e,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x63c, +0x63c,0x63c,0x63c,0x63c,0x84,0x84,0x84,0x84,0x84,0xb7c,0x63f,0x645,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x642,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645, +0x645,0x645,0x645,0x84,0x645,0x645,0x645,0x645,0x645,0x84,0x645,0x84,0x645,0x645,0x84,0x645, +0x645,0x84,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x648,0x65a,0x654,0x65a,0x654, +0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654,0x13f2,0x13f2,0x1c0e,0x87, +0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x65a, +0x654,0x657,0x65d,0x65a,0x654,0x65a,0x654,0x65a,0x654,0x65a,0x65a,0x654,0x654,0x654,0x654,0x657, +0x654,0x654,0x657,0x654,0x657,0x657,0x657,0x654,0x657,0x657,0x657,0x657,0x87,0x87,0x657,0x657, +0x657,0x657,0x654,0x654,0x657,0x654,0x654,0x654,0x654,0x657,0x654,0x654,0x654,0x654,0x654,0x657, +0x657,0x657,0x654,0x654,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x1c0e,0xbc7,0xbc7,0xbc7,0xbc7, +0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0x8af,0x8c1,0x8be,0x8c1, +0x8be,0xcff,0xcff,0xdec,0xde9,0x8b2,0x8b2,0x8b2,0x8b2,0x8c4,0x8c4,0x8c4,0x8dc,0x8df,0x8ee,0x8a, +0x8e2,0x8e5,0x8f1,0x8f1,0x8d9,0x8d0,0x8ca,0x8d0,0x8ca,0x8d0,0x8ca,0x8cd,0x8cd,0x8e8,0x8e8,0x8eb, +0x8e8,0x8e8,0x8e8,0x8a,0x8e8,0x8d6,0x8d3,0x8cd,0x8a,0x8a,0x8a,0x8a,0x666,0x672,0x666,0xc7b, +0x666,0x8d,0x666,0x672,0x666,0x672,0x666,0x672,0x666,0x672,0x666,0x672,0x672,0x66f,0x669,0x66c, +0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66f,0x669,0x66f,0x669,0x66c, +0x672,0x66f,0x669,0x66f,0x669,0x66f,0x669,0x66f,0x669,0x8d,0x8d,0x663,0x7ad,0x7b0,0x7c5,0x7c8, +0x7a7,0x7b0,0x7b0,0x93,0x78f,0x792,0x792,0x792,0x792,0x78f,0x78f,0x93,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x90,0x90,0xb7f,0xb7f,0xb7f,0xa20,0x789,0x675,0x675,0x93,0x7d7,0x7b6,0x7a7, +0x7b0,0x7ad,0x7a7,0x7b9,0x7aa,0x7a4,0x7a7,0x7c5,0x7bc,0x7b3,0x7d4,0x7a7,0x7d1,0x7d1,0x7d1,0x7d1, +0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7c2,0x7bf,0x7c5,0x7c5,0x7c5,0x7d7,0x798,0x795,0x795,0x795, +0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, +0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x93,0x93,0x93,0x795,0x795, +0x795,0x795,0x795,0x795,0x93,0x93,0x795,0x795,0x795,0x795,0x795,0x795,0x93,0x93,0x795,0x795, +0x795,0x795,0x795,0x795,0x93,0x93,0x795,0x795,0x795,0x93,0x93,0x93,0xbca,0xbca,0xbca,0xbca, +0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x194d,0x194d,0x194d,0xbd0,0xbd0,0xbd0,0xbd0, +0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0x99, +0x99,0x99,0x99,0x99,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713, +0x1713,0x1713,0x1713,0x1713,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, +0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c, +0x9c,0x9c,0x9c,0x9c,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0x9f,0x9f,0x108c,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe5,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x1c11,0x1c11,0x9f, 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xa2,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xa2,0xb7f,0xb7f, -0xa2,0xa2,0xb7f,0xa2,0xa2,0xb7f,0xb7f,0xa2,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb7c,0xa2,0xb7c,0xa2,0xb7c,0xb7c,0xb7c, -0xb7c,0xcf3,0xb7c,0xb7c,0xa2,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xa2,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xa2, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xb7f,0xa2,0xa2,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xa2,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xddd,0xddd,0xa2,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb76, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xef4,0xef1,0xa2,0xa2,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xa5,0xb85,0xa5,0xa5, +0x9f,0x9f,0x9f,0x9f,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xa2,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfd,0xbfd,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfd,0xa2,0xbfd,0xbfd,0xa2,0xa2,0xbfd,0xa2,0xa2,0xbfd,0xbfd,0xa2,0xa2,0xbfd,0xbfd,0xbfd, +0xbfd,0xa2,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfa,0xbfa,0xbfa,0xbfa,0xa2,0xbfa, +0xa2,0xbfa,0xbfa,0xbfa,0xbfa,0xd74,0xbfa,0xbfa,0xa2,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfa,0xbfa,0xbfa,0xbfa,0xbfd,0xbfd,0xa2,0xbfd,0xbfd,0xbfd,0xbfd,0xa2, +0xa2,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xa2,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xa2,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfd,0xbfd,0xa2,0xbfd, +0xbfd,0xbfd,0xbfd,0xa2,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xa2,0xbfd,0xa2,0xa2,0xa2,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xa2,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xe64,0xe64,0xa2,0xa2,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfa,0xbfa,0xbfa,0xbf4,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xf81,0xf7e,0xa2,0xa2,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xa5,0xc03,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, 0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xc0c,0xc0c,0xc0c,0xc0c, -0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0x1b2a,0xc0c,0xc0c,0xc0c,0xc0c,0xc06,0xc06, -0xc09,0x1b27,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0x1b2a,0xc15,0xc15,0xc15,0xc15, -0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc0f,0xc0f, -0xc12,0xc75,0xc75,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xc1b,0xc1b,0xc1b,0xc1b, -0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc18,0xc18, -0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xc21,0xc21,0xc21,0xc21, -0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xb1,0xc21,0xc21,0xc21,0xb1,0xc1e,0xc1e, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd05,0xd05,0xd05,0xd05, -0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05, -0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0x14f1,0x14f1,0xb4,0xcf6,0xcf6,0xcf6,0xd02, -0xd02,0xd02,0xd02,0xcf6,0xcf6,0xd02,0xd02,0xd02,0xb4,0xb4,0xb4,0xb4,0xd02,0xd02,0xcf6,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xcf9,0xcf9,0xcf9,0xb4,0xb4,0xb4,0xb4,0xcfc,0xb4,0xb4,0xb4, -0xd08,0xd08,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xd0b,0xd0b,0xd0b,0xd0b, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xb7,0xb7, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0xba,0xba,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0xba,0x1a76, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xbd,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xbd,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xbd, -0xd2f,0xd2f,0xbd,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xbd,0xbd,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd, +0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0x1c17,0xc8a,0xc8a, +0xc8a,0xc8a,0xc84,0xc84,0xc87,0x1c14,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0x1c17, +0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93,0xc93, +0xc93,0xc93,0xc8d,0xc8d,0xc90,0xcf3,0xcf3,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab, +0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99, +0xc99,0xc99,0xc96,0xc96,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, +0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xc9f,0xb1,0xc9f,0xc9f, +0xc9f,0xb1,0xc9c,0xc9c,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86, +0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0xd86,0x15c9,0x15c9,0xb4, +0xd77,0xd77,0xd77,0xd83,0xd83,0xd83,0xd83,0xd77,0xd77,0xd83,0xd83,0xd83,0xb4,0xb4,0xb4,0xb4, +0xd83,0xd83,0xd77,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd7a,0xd7a,0xd7a,0xb4,0xb4,0xb4,0xb4, +0xd7d,0xb4,0xb4,0xb4,0xd89,0xd89,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80, +0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c, +0xd8c,0xd8c,0xb7,0xb7,0xd8c,0xd8c,0xd8c,0xd8c,0xd8c,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, +0xb7,0xb7,0xb7,0xb7,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0xba,0xba,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0xba,0x1b5d,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0xdb0,0xdb0,0xdb0,0xdb0, +0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xbd,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0, +0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xbd, +0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0, +0xdb0,0xdb0,0xdb0,0xbd,0xdb0,0xdb0,0xbd,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0, +0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xbd,0xbd,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0, +0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd, 0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd, -0xbd,0xbd,0xbd,0xbd,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, -0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xc0, -0xc0,0xc0,0xc0,0xc0,0xd71,0xd71,0xd77,0xc3,0xc3,0xc3,0xc3,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e, -0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e, -0xd6e,0xd6e,0xd6e,0xd6e,0xc3,0xc3,0xc3,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74, -0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38, -0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xc6,0xd35, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc9,0xc9, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, -0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xcc,0xcc,0xd44,0xcc,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xcc,0xd44,0xd44,0xcc,0xcc,0xcc,0xd44,0xcc,0xcc,0xd44,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0x14f7,0x14f7,0x17a9,0x17a9,0xd5,0x10e6,0x10e6,0x10e6,0x10e6, -0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x1a85,0x126,0x126,0x126,0xe0a,0xe0a,0xe0a,0xe0a, -0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a, -0xe0a,0xe0a,0xe0a,0xe01,0xe01,0xe07,0xe07,0xe01,0xd8,0xd8,0xe04,0xe04,0x1113,0x1113,0x1113,0x1113, -0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0x1c56,0xc72,0xc72,0xc72,0xc72, -0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xe1c,0xe19,0xe1c,0xe19, -0xe19,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0x1161,0x115e,0x1161,0x115e,0x115b,0x115b,0x115b,0x13ef,0x13ec, -0xde,0xde,0xde,0xde,0xde,0xe16,0xe13,0xe13,0xe13,0xe10,0xe16,0xe13,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1,0xe25,0xe25,0xe25,0xe25, -0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe22,0xe22,0xe22,0xe22, -0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe28,0xe28,0xe28,0xe28, -0xe28,0xe28,0xe7,0x13f2,0xe7,0xe7,0xe7,0xe7,0xe7,0x13f2,0xe7,0xe7,0xe7f,0xe7f,0xe7f,0xe7f, -0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe40,0xe34,0xe34,0xe34, -0xea,0xe34,0xe34,0xea,0xea,0xea,0xea,0xea,0xe34,0xe34,0xe34,0xe34,0xe40,0xe40,0xe40,0xe40, -0xea,0xe40,0xe40,0xe40,0xea,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, -0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0x1914,0x1914,0xea,0xea, -0xe31,0xe31,0xe31,0xea,0xea,0xea,0xea,0xe37,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, -0x1911,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe43,0xe43, -0xe3a,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0x1167,0x1167,0xed,0xed,0xed,0xed,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe52,0xe52,0xe52, -0xe4f,0xe4f,0xe52,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xed,0xed, -0xed,0xed,0xed,0xed,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x1164,0xed, -0xed,0xed,0xe49,0xe49,0xe58,0xe58,0xe58,0xe58,0xf0,0xf0,0xf0,0xf0,0xe58,0xe58,0xe58,0xe58, -0xe58,0xe58,0xe58,0xe58,0xe55,0xe58,0xe58,0xe58,0xe58,0xe58,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0x1506,0x150c,0x1509,0x1854,0x17af,0x1878,0x1878,0x1878,0x1878,0x1878,0x191a,0x1917, -0x191d,0x1917,0x191d,0x19dd,0x1a79,0x1a79,0x1a79,0x1b3c,0x1b3c,0x1b36,0x1b33,0x1b36,0x1b33,0x1b36,0x1b33,0x1b36, -0x1b33,0x1b39,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, +0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3, +0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3, +0xdb3,0xdb3,0xdb3,0xc0,0xc0,0xc0,0xc0,0xc0,0xdf2,0xdf2,0xdf8,0xc3,0xc3,0xc3,0xc3,0xdef, +0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef, +0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xc3,0xc3,0xc3,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, +0xdf5,0xdf5,0xdf5,0xdf5,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9, +0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9, +0xdb9,0xdb9,0xc6,0xdb6,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2, +0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2, +0xdc2,0xdc2,0xc9,0xc9,0xdbf,0xdbf,0xdbf,0xdbf,0xdbf,0xdbf,0xdbf,0xdbf,0xdbf,0xdbf,0xc9,0xc9, +0xc9,0xc9,0xc9,0xc9,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, +0x1911,0x1911,0x1911,0x1911,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xcc,0xcc,0xdc5,0xcc,0xdc5,0xdc5, +0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5, +0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xcc,0xdc5,0xdc5,0xcc,0xcc,0xcc,0xdc5,0xcc,0xcc,0xdc5, +0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, +0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0x15cf,0x15cf,0x1887,0x1887,0xd5, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x1b72,0x126,0x126,0x126, +0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91, +0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe88,0xe88,0xe8e,0xe8e,0xe88,0xd8,0xd8,0xe8b,0xe8b, +0x11d9,0x11d9,0x11d9,0x11d9,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0x1d43, +0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0, +0xea3,0xea0,0xea3,0xea0,0xea0,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0x122a,0x1227,0x122a,0x1227,0x1221, +0x1224,0x1224,0x14be,0x14bb,0xde,0xde,0xde,0xde,0xde,0xe9d,0xe9a,0xe9a,0xe9a,0xe97,0xe9d,0xe9a, +0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, +0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1, +0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xe1,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xe1, +0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xe1,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xe1, +0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac, +0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, +0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xe7,0x14c1,0xe7,0xe7,0xe7,0xe7,0xe7,0x14c1,0xe7,0xe7, +0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0xec7,0xebb,0xebb,0xebb,0xea,0xebb,0xebb,0xea,0xea,0xea,0xea,0xea,0xebb,0xebb,0xebb,0xebb, +0xec7,0xec7,0xec7,0xec7,0xea,0xec7,0xec7,0xec7,0xea,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7, +0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7, +0x19f2,0x19f2,0xea,0xea,0xeb8,0xeb8,0xeb8,0xea,0xea,0xea,0xea,0xebe,0xec1,0xec1,0xec1,0xec1, +0xec1,0xec1,0xec1,0xec1,0x19ef,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xec4,0xec4,0xec4,0xec4, +0xec4,0xec4,0xeca,0xeca,0xec1,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xed6,0xed6,0xed6,0xed6, +0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0x1230,0x1230,0xed,0xed,0xed,0xed,0xed6,0xed6,0xed6,0xed6, +0xed6,0xed9,0xed9,0xed9,0xed6,0xed6,0xed9,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6, +0xed6,0xed6,0xed,0xed,0xed,0xed,0xed,0xed,0xed3,0xed3,0xed3,0xed3,0xed3,0xed3,0xed3,0xed3, +0xed3,0xed3,0x122d,0xed,0xed,0xed,0xed0,0xed0,0xedf,0xedf,0xedf,0xedf,0xf0,0xf0,0xf0,0xf0, +0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedc,0xedf,0xedf,0xedf,0xedf,0xedf,0xf0,0xf0, +0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x15de,0x15e4,0x15e1,0x1932,0x188d,0x1956,0x1956,0x1956, +0x1956,0x1956,0x19f8,0x19f5,0x19fb,0x19f5,0x19fb,0x1abe,0x1b60,0x1b60,0x1b60,0x1c29,0x1c29,0x1c23,0x1c20,0x1c23, +0x1c20,0x1c23,0x1c20,0x1c23,0x1c20,0x1c26,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, 0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, -0xf3,0xf3,0xf3,0xf3,0xe7c,0xe7c,0xe7c,0xe79,0xe79,0xe70,0xe70,0xe79,0xe76,0xe76,0xe76,0xe76, -0x1a7c,0xf6,0xf6,0xf6,0x12cc,0x12cc,0x12cc,0x12cf,0x12cf,0x12cf,0x12d2,0x12d2,0x12d5,0x12d2,0x14a,0x14a, -0x14a,0x14a,0x14a,0x14a,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0x13fe,0x13fe,0xf9,0xf9,0xf9,0xf9, -0xf9,0xf9,0xf9,0xe82,0x133b,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xf9,0xf9,0xf9,0x1338,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, -0xc45,0xc45,0xc45,0xc45,0xeaf,0xea0,0xe9a,0xeac,0xea9,0xea3,0xea3,0xeb2,0xe9d,0xea6,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xf36,0xf36,0xf21,0xf36,0xf39,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c, -0x1b3f,0x102,0x102,0x102,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf42,0xf42, -0xf2a,0xf2d,0xf42,0xf42,0xf27,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf24, -0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a, -0xf2a,0x1b42,0x1b42,0x102,0x1b4b,0x1b45,0x19e3,0x19e0,0x19e3,0x19e3,0x19e3,0x1a82,0x1a7f,0x1a82,0x1a7f,0x105, -0x105,0x105,0x105,0x105,0x1b4b,0x1b45,0x105,0x1b45,0x105,0x1b45,0x1b4b,0x1b45,0x1b4b,0x1b45,0x105,0x105, -0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, -0x105,0x105,0x1b48,0x1b48,0x1b48,0x1a82,0x1a7f,0x1515,0x1407,0x1407,0x133e,0x103e,0x103e,0x103e,0x103e,0x103e, -0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51, -0xf51,0xf51,0xf51,0xf51,0xf4e,0xf4e,0xf54,0xf54,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108, -0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d, -0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf57,0xf57,0xf57,0xf57,0x1170,0x1170,0x10b,0x10b,0x10b,0xf5a, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x1701,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e, +0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf06,0xf06,0xf06,0xf03,0xf03,0xefa,0xefa,0xf03, +0xf00,0xf00,0xf00,0xf00,0x1b63,0xf6,0xf6,0xf6,0x1395,0x1395,0x1395,0x1398,0x1398,0x1398,0x139b,0x139b, +0x139e,0x139b,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0x14d0,0x14d0, +0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf0c,0x1404,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, +0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x1401,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3, +0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xf3c,0xf2d,0xf27,0xf39,0xf36,0xf30,0xf30,0xf3f, +0xf2a,0xf33,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc9,0xfc9,0xfb1,0xfc9,0xfcc,0xfcf,0xfcf,0xfcf, +0xfcf,0xfcf,0xfcf,0xfcf,0x1c2c,0x102,0x102,0x102,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3, +0xfc3,0xfc3,0xfd5,0xfd5,0xfbd,0xfc0,0xfd5,0xfd5,0xfba,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd, +0xfbd,0xfbd,0xfbd,0xfb7,0xfb7,0xfb7,0xfb7,0xfb7,0xfb7,0xfb7,0xfb7,0xfb7,0xfbd,0xfbd,0xfbd,0xfbd, +0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0x1c2f,0x1c2f,0x102,0x1c38,0x1c35,0x1aca,0x1ac7,0x1aca,0x1aca,0x1aca,0x1b6f, +0x1b6c,0x1b6f,0x1b6c,0x105,0x105,0x105,0x105,0x105,0x1c38,0x1c35,0x105,0x1c35,0x105,0x1c35,0x1c38,0x1c35, +0x1c38,0x1c35,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, +0x105,0x105,0x105,0x105,0x105,0x105,0x1c32,0x1c32,0x1c32,0x1b69,0x1b66,0x15ed,0x14d9,0x14d9,0x140d,0x10ef, +0x10ef,0x10ef,0x10ef,0x10ef,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0, +0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xfed,0xfed,0xff3,0xff3,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0x108,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc, +0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xff6,0xff6,0xff6,0xff6,0x1239,0x1239, +0x10b,0x10b,0x10b,0xff9,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x17df,0x10e,0x10e, 0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e, -0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xf66,0xf66,0xf66,0x1521, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x111,0xf63,0xf63,0xf63,0xf63, -0x151e,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0xf69,0xf69,0xf69,0xf69, -0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0x192c,0x192c, -0x192c,0x192c,0x192c,0x192c,0x192c,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1065,0x1065,0x1065,0x1065, -0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1053,0x1053,0x1053,0x1053,0x1053,0x1053,0x1053,0x1053, -0x1062,0x1062,0x1059,0x1056,0x117,0x117,0x117,0x1068,0x1068,0x105c,0x105c,0x105c,0x105f,0x105f,0x105f,0x105f, -0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x117,0x117,0x117,0x1065,0x1065,0x1065,0x106b,0x106b,0x106b,0x106b, -0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x1080,0x1080,0x1080,0x1080, -0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1083,0x1083,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x10aa,0x10aa,0x10aa,0x10aa, -0x10a4,0x17b5,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x10b0,0x10b0,0x10a7,0x10a7,0x10a7,0x10a7, -0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10ce,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c8,0x10cb, -0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x10c5,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10da,0x10da,0x10d1,0x10d1,0x10da, -0x10da,0x10d1,0x10d1,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x10dd,0x10dd,0x10dd,0x10d1, -0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10d1,0x10da,0x123,0x123,0x10d7,0x10d7,0x10d7,0x10d7, -0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x123,0x123,0x10d4,0x10e3,0x10e3,0x10e3,0x152d,0x126,0x126,0x126, +0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e, +0x1005,0x1005,0x1005,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x111, +0x1002,0x1002,0x1002,0x1002,0x15f6,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111, +0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008, +0x1008,0x1008,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x114,0x114,0x114,0x114,0x114,0x114,0x114, +0x1125,0x1125,0x1125,0x1125,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1113,0x1113,0x1113,0x1113, +0x1113,0x1113,0x1113,0x1113,0x1122,0x1122,0x1119,0x1116,0x117,0x117,0x117,0x1128,0x1128,0x111c,0x111c,0x111c, +0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x117,0x117,0x117,0x1125,0x1125,0x1125, +0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e, +0x1140,0x1140,0x1140,0x1140,0x1140,0x1140,0x1140,0x1140,0x1140,0x1140,0x1146,0x1146,0x11a,0x11a,0x11a,0x11a, +0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a, +0x1170,0x1170,0x1170,0x1170,0x116a,0x1893,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x1176,0x1176, +0x116d,0x116d,0x116d,0x116d,0x116d,0x116d,0x116d,0x116d,0x116d,0x116d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x1188,0x1188,0x118e,0x1191,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x118b, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x11a0, +0x11a0,0x1197,0x1197,0x11a0,0x11a0,0x1197,0x1197,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123, +0x11a3,0x11a3,0x11a3,0x1197,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x1197,0x11a0,0x123,0x123, +0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x123,0x123,0x119a,0x11a9,0x11a9,0x11a9, +0x1605,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126, 0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126, -0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x10e9,0x10e9,0x10e9,0x10e9, -0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9, -0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10ec,0x129,0x129,0x10ef,0x10ef,0x10ef,0x10ef, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x12c,0x12c,0x12c,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x12f,0x12f,0x12f, -0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x10f8,0x10f8,0x10f8,0x10f8, -0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8, -0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x132,0x132,0x132,0x132,0x132,0x10f5,0x10fb,0x10fb,0x10fb,0x10fb, -0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x135,0x135,0x135,0x135,0x10fe,0x10fe,0x10fe,0x10fe, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x1176,0x1176,0x1176,0x1176, -0x117f,0x1176,0x1176,0x1176,0x117f,0x1176,0x1176,0x1176,0x1176,0x1173,0x13b,0x13b,0x117c,0x117c,0x117c,0x117c, -0x117c,0x117c,0x117c,0x1182,0x117c,0x1182,0x117c,0x117c,0x117c,0x1182,0x1182,0x13b,0x1185,0x1185,0x1185,0x1185, -0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185, -0x1185,0x1185,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x119d,0x1188,0x119d,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x141,0x1191,0x119a,0x1188,0x119a, -0x119a,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x1188, -0x1188,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x141,0x141,0x118b,0x1197,0x1197,0x1197,0x1197, -0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x141,0x141,0x141,0x141,0x141,0x141,0x1197,0x1197,0x1197,0x1197, -0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x141,0x141,0x141,0x141,0x141,0x141,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x11a3,0x11a6,0x11a6,0x11a6,0x11a6,0x1194,0x1194,0x141,0x141,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x1569,0x1a97,0x12e7,0x12c0,0x12de,0x12de, -0x12de,0x12de,0x12de,0x12de,0x12de,0x12c6,0x12c3,0x12ba,0x12ba,0x12e4,0x12ba,0x12ba,0x12ba,0x12ba,0x12c9,0x14a6, -0x14ac,0x14a9,0x14a9,0x18f3,0x16c8,0x16c8,0x1a64,0x144,0x144,0x144,0x144,0x144,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11b2,0x11b2,0x11b5,0x11be, -0x11b8,0x11b8,0x11b8,0x11be,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x12ab,0x12ab,0x12ab,0x12ab, -0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab, -0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x14d,0x14d,0x14d,0x11dc,0x11d0,0x11d0,0x11d0, -0x11d0,0x11d0,0x11d0,0x11d3,0x11e2,0x11e2,0x11d0,0x11d0,0x11d0,0x11d0,0x150,0x12db,0x11d6,0x11d6,0x11d6,0x11d6, -0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x150,0x150,0x150,0x150,0x11d0,0x11d0,0x1200,0x11f4,0x1200,0x153, -0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, -0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x11fd,0x11fd,0x1203,0x11f7,0x11fa,0x1218,0x1218,0x1218,0x1212, -0x1212,0x1209,0x1212,0x1212,0x1209,0x1212,0x1212,0x121b,0x1215,0x120c,0x156,0x156,0x120f,0x120f,0x120f,0x120f, -0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x156,0x156,0x156,0x156,0x156,0x156,0x1221,0x1221,0x1221,0x1221, -0x1221,0x1221,0x1221,0x159,0x159,0x159,0x159,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e, -0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e, -0x121e,0x121e,0x121e,0x121e,0x159,0x159,0x159,0x159,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a, -0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x15c,0x1227, -0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x15f,0x15f, -0x15f,0x1233,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, -0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x162,0x162, -0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245, -0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x165,0x165,0x165,0x165,0x165, -0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b, -0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b, -0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x16b,0x1263,0x1263,0x1b4e,0x16e,0x16e,0x16e,0x16e,0x16e, -0x16e,0x16e,0x16e,0x16e,0x16e,0x1935,0x16e,0x16e,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, -0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836, -0x1836,0x1836,0x1836,0x1836,0x1836,0x1a88,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171, +0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af, +0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11b2,0x129,0x129, +0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5, +0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x12c,0x12c,0x12c, +0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8, +0x11b8,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x132,0x132,0x132,0x132,0x132,0x11bb, +0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x135,0x135,0x135,0x135, +0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, +0x11c4,0x11c4,0x11c4,0x11c4,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x123f,0x123f,0x123f,0x123f,0x1248,0x123f,0x123f,0x123f,0x1248,0x123f,0x123f,0x123f,0x123f,0x123c,0x13b,0x13b, +0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x124b,0x1245,0x124b,0x1245,0x1245,0x1245,0x124b,0x124b,0x13b, +0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, +0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1266,0x1251,0x1266,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x141, +0x125a,0x1263,0x1251,0x1263,0x1263,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1251,0x1251,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x141,0x141,0x1254, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x141,0x141,0x141,0x141,0x141,0x141, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x141,0x141,0x141,0x141,0x141,0x141, +0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x126c,0x126f,0x126f,0x126f,0x126f,0x125d,0x125d,0x141,0x141, +0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1644,0x1b84, +0x13b0,0x1389,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x138f,0x138c,0x1383,0x1383,0x13ad,0x1383,0x1383, +0x1383,0x1383,0x1392,0x1578,0x157e,0x157b,0x157b,0x19d1,0x17a6,0x17a6,0x1b4b,0x144,0x144,0x144,0x144,0x144, +0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284, +0x127b,0x127b,0x127e,0x1287,0x1281,0x1281,0x1281,0x1287,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, +0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374, +0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x14d,0x14d,0x14d, +0x12a5,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c,0x12ab,0x12ab,0x1299,0x1299,0x1299,0x1299,0x150,0x13a4, +0x129f,0x129f,0x129f,0x129f,0x129f,0x129f,0x129f,0x129f,0x129f,0x129f,0x150,0x150,0x150,0x150,0x1299,0x1299, +0x12c9,0x12bd,0x12c9,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, +0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x12c6,0x12c6,0x12cc,0x12c0,0x12c3, +0x12e1,0x12e1,0x12e1,0x12db,0x12db,0x12d2,0x12db,0x12db,0x12d2,0x12db,0x12db,0x12e4,0x12de,0x12d5,0x156,0x156, +0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x156,0x156,0x156,0x156,0x156,0x156, +0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x159,0x159,0x159,0x159,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7, +0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7, +0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x159,0x159,0x159,0x159,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x15c,0x12f0,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x1302,0x1302,0x1302,0x1302, +0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302, +0x1302,0x1302,0x15f,0x15f,0x15f,0x12fc,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x1308,0x1308,0x1308,0x1308, +0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308, +0x1308,0x1308,0x162,0x162,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x130e,0x130e,0x130e,0x130e, +0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x165, +0x165,0x165,0x165,0x165,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x1314,0x1314,0x1314,0x1314, +0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, +0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x16b,0x132c,0x132c,0x1c3b,0x16e, +0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x1a16,0x16e,0x16e,0x1557,0x1557,0x1557,0x1557, +0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1914,0x1914,0x1914,0x1914, +0x1914,0x1914,0x1914,0x1914,0x1914,0x1914,0x1914,0x1914,0x1914,0x1b75,0x171,0x171,0x171,0x171,0x171,0x171, 0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171, -0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, -0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, -0x134a,0x134a,0x134a,0x134a,0x12b4,0x13b0,0x13b0,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, -0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x1839, -0x174,0x174,0x174,0x174,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x13d4,0x13d4,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x174,0x174,0x174,0x174,0x174,0x174, +0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x1419,0x1419, +0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419, +0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x137d,0x147f,0x147f,0x174,0x174,0x174,0x174,0x174, +0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a, +0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f, +0x147f,0x147f,0x147f,0x1917,0x174,0x174,0x174,0x174,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377, +0x1377,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x14a3,0x14a3,0x174,0x174,0x174,0x174,0x174,0x174, +0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x174,0x174, 0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x1353,0x134d,0x134d,0x134d,0x177,0x177,0x1350,0x177,0x1365,0x1365,0x1365,0x1365, -0x1365,0x1365,0x1356,0x135f,0x1359,0x1359,0x135f,0x135f,0x135f,0x1359,0x135f,0x1359,0x1359,0x1359,0x1362,0x1362, -0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x135c,0x135c,0x135c,0x135c,0x17d,0x1368,0x1368,0x1368, -0x1368,0x1368,0x1368,0x17d,0x17d,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x17d,0x17d,0x1368,0x1368,0x1368, -0x1368,0x1368,0x1368,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x1368,0x1368,0x1368,0x1368, -0x1368,0x1368,0x1368,0x17d,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x17d,0x15cf,0x15cf,0x15cf,0x15cf, -0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x136b,0x136b,0x136b,0x136b, -0x136b,0x136b,0x136e,0x1383,0x1383,0x1374,0x1374,0x1374,0x1374,0x1374,0x180,0x180,0x180,0x180,0x1371,0x1371, -0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1377,0x1377, -0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1b54,0x1b57,0x1b57,0x1b51,0x1b51,0x1b57,0x180,0x180, -0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x153c,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x186,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x153f,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x13b9,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f, -0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x186,0x186, -0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x13ce,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x154b,0x154b, -0x154b,0x154b,0x154b,0x154b,0x16bf,0x154b,0x154b,0x154b,0x1791,0x1842,0x1842,0x187b,0x187b,0x1a46,0x1af1,0x1af1, -0x189,0x189,0x189,0x189,0x1c3e,0x1bc0,0x1bc0,0x1bc0,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b, -0x154b,0x154b,0x154b,0x16bc,0x16bc,0x189,0x189,0x189,0x154b,0x154b,0x154b,0x154b,0x1842,0x1842,0x1842,0x18de, -0x18de,0x19c2,0x1a46,0x1af1,0x1af1,0x189,0x189,0x189,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1be4,0x1be4,0x1be4,0x18c, -0x18c,0x18c,0x18c,0x1be4,0x1be4,0x1be4,0x1be4,0x1be4,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428, -0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, -0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x18f,0x1428,0x18f,0x18f,0x1428, -0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428, -0x18f,0x1428,0x18f,0x1428,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x1428,0x18f,0x18f,0x18f,0x18f,0x1428, -0x18f,0x1428,0x18f,0x1428,0x18f,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x18f,0x1428,0x18f,0x18f,0x1428, -0x18f,0x1428,0x18f,0x1428,0x18f,0x1428,0x18f,0x1428,0x18f,0x1428,0x1428,0x18f,0x1428,0x18f,0x18f,0x1428, -0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428, -0x18f,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, -0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, -0x1428,0x1428,0x1428,0x1428,0x18f,0x18f,0x18f,0x18f,0x18f,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428, -0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, -0x1428,0x1428,0x1428,0x1428,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f, +0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174, +0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422, +0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x141c,0x141c,0x141c,0x177,0x177,0x141f,0x177, +0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1425,0x142e,0x1428,0x1428,0x142e,0x142e,0x142e,0x1428,0x142e,0x1428, +0x1428,0x1428,0x1431,0x1431,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x142b,0x142b,0x142b,0x142b, +0x17d,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x17d,0x17d,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x17d, +0x17d,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d, +0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x17d,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x17d, +0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, +0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143d,0x1452,0x1452,0x1443,0x1443,0x1443,0x1443,0x1443,0x180,0x180, +0x180,0x180,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440, +0x1440,0x1440,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1c41,0x1c44,0x1c44,0x1c3e, +0x1c3e,0x1c44,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x1614,0x1455,0x1455,0x1455,0x1455, +0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, +0x1455,0x1455,0x1455,0x1455,0x1455,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1458,0x1458,0x1458,0x1458, +0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x186,0x186,0x1458,0x1458,0x1458, +0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1617,0x186,0x1458,0x1458,0x1458, +0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1488,0x186,0x1458,0x1458,0x1458, +0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x149d,0x149a,0x149a,0x149a, +0x149a,0x149a,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x179d,0x1623,0x1623,0x1623,0x186f,0x1920,0x1920,0x1959, +0x1959,0x1b2d,0x1bde,0x1bde,0x189,0x189,0x189,0x189,0x1d2b,0x1cad,0x1cad,0x1cad,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x179a,0x179a,0x189,0x189,0x189,0x1623,0x1623,0x1623,0x1623, +0x1920,0x1920,0x1920,0x19bc,0x19bc,0x1aa3,0x1b2d,0x1bde,0x1bde,0x189,0x189,0x189,0x145b,0x145b,0x145b,0x145b, +0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, +0x1cd1,0x1cd1,0x1cd1,0x18c,0x18c,0x18c,0x18c,0x1cd1,0x1cd1,0x1cd1,0x1cd1,0x1cd1,0x14fa,0x14fa,0x14fa,0x14fa, +0x18f,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, +0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x14fa,0x14fa,0x18f, +0x14fa,0x18f,0x18f,0x14fa,0x18f,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x18f, +0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x14fa,0x18f,0x14fa,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x14fa,0x18f, +0x18f,0x18f,0x18f,0x14fa,0x18f,0x14fa,0x18f,0x14fa,0x18f,0x14fa,0x14fa,0x14fa,0x18f,0x14fa,0x14fa,0x18f, +0x14fa,0x18f,0x18f,0x14fa,0x18f,0x14fa,0x18f,0x14fa,0x18f,0x14fa,0x18f,0x14fa,0x18f,0x14fa,0x14fa,0x18f, +0x14fa,0x18f,0x18f,0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x18f, +0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x14fa,0x18f,0x14fa,0x14fa,0x14fa,0x14fa, +0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, +0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x18f,0x18f,0x18f,0x18f,0x14fa,0x14fa,0x14fa, +0x18f,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, +0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f, 0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f, -0x18f,0x18f,0x18f,0x18f,0x1425,0x1425,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f, -0x18f,0x18f,0x18f,0x18f,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x142b,0x142b,0x142b,0x142b,0x142b, -0x143a,0x142b,0x142e,0x142e,0x142b,0x142b,0x142b,0x1431,0x1431,0x192,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437, -0x1437,0x1437,0x1437,0x1437,0x1434,0x1440,0x1440,0x1440,0x1941,0x193e,0x193e,0x1a8e,0x192,0x192,0x192,0x192, -0x192,0x192,0x192,0x192,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1, -0x15e1,0x15e1,0x15e1,0x15e1,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x1449, -0x1443,0x1443,0x1449,0x1449,0x1452,0x1452,0x144c,0x144f,0x144f,0x1449,0x1446,0x195,0x195,0x195,0x195,0x195, -0x195,0x195,0x195,0x195,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x198,0x198,0x198,0x198, -0x1716,0x1716,0x1455,0x1455,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x198,0x198,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x1461,0x1461,0x1461,0x1461,0x1461,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19b, -0x19b,0x19b,0x19b,0x19e9,0x1461,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e, -0x145e,0x145e,0x145e,0x145e,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19b,0x19b,0x19b,0x19b, -0x19b,0x19b,0x19b,0x145b,0x145b,0x145b,0x145b,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464, -0x1464,0x1464,0x1464,0x1464,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x19e,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1a1,0x1a1,0x1a1,0x1a1, -0x1a1,0x1a1,0x1a1,0x1a1,0x12e1,0x12de,0x12e1,0x12bd,0x12de,0x12e4,0x12e4,0x12e7,0x12e4,0x12e7,0x12ea,0x12de, -0x12e7,0x12e7,0x12de,0x12de,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x148b, -0x1494,0x148b,0x1494,0x1494,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x1497,0x148e,0x19f2,0x1b63,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, -0x155d,0x155d,0x1a7,0x1a7,0x155a,0x155a,0x155a,0x155a,0x155a,0x1560,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a7,0x1a7,0x1a7,0x1566,0x1566,0x1566,0x1566,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x1563,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x2af, -0x1bae,0x1bae,0x1bae,0x1bae,0x16cb,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x1ad,0x1ad,0x1ad,0x1ad,0x1a97,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69, -0x1b66,0x1b66,0x1b66,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, +0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x14f7,0x14f7,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f, +0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x14fd, +0x14fd,0x14fd,0x14fd,0x14fd,0x150c,0x14fd,0x1500,0x1500,0x14fd,0x14fd,0x14fd,0x1503,0x1503,0x192,0x1509,0x1509, +0x1509,0x1509,0x1509,0x1509,0x1509,0x1509,0x1509,0x1509,0x1506,0x1512,0x1512,0x1512,0x1a22,0x1a1f,0x1a1f,0x1b7b, +0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc, +0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e, +0x151e,0x151e,0x151e,0x151b,0x1515,0x1515,0x151b,0x151b,0x1524,0x1524,0x151e,0x1521,0x1521,0x151b,0x1518,0x195, +0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, +0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, +0x198,0x198,0x198,0x198,0x17f4,0x17f4,0x1527,0x1527,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, +0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x198,0x198,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, +0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x1533,0x1533,0x1533,0x1533,0x1533,0x1ad6,0x1ad6,0x1ad6, +0x1ad6,0x1ad6,0x1ad6,0x19b,0x19b,0x19b,0x19b,0x1ad0,0x1533,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1ad3,0x1ad3,0x1ad3,0x1ad3,0x1ad3,0x1ad3,0x1ad3,0x1ad3, +0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x152d,0x152d,0x152d,0x152d,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557, +0x1557,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554, +0x1554,0x1554,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a, +0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x13aa,0x13a7,0x13aa,0x1386,0x13a7,0x13ad,0x13ad,0x13b0, +0x13ad,0x13b0,0x13b3,0x13a7,0x13b0,0x13b0,0x13a7,0x13a7,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, +0x156c,0x156c,0x156c,0x155d,0x1566,0x155d,0x1566,0x1566,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x1569,0x1560, +0x1ad9,0x1c50,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638, +0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1a7,0x1a7,0x1635,0x1635,0x1635,0x1635,0x1635,0x163b,0x1a7,0x1a7, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1641,0x1641,0x1641,0x1641,0x1aa,0x1aa,0x1aa,0x1aa, +0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x163e,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b, +0x1c9b,0x1c9b,0x1c9b,0x2af,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x17a9,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0, +0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0, +0x17a0,0x17a0,0x17a0,0x17a0,0x1ad,0x1ad,0x1ad,0x1ad,0x1b84,0x1c56,0x1c56,0x1c56,0x1c56,0x1c56,0x1c56,0x1c56, +0x1c56,0x1c56,0x1c56,0x1c56,0x1c53,0x1c53,0x1c53,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, 0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x1b0,0x1b0,0x1b0,0x1b0,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1b3, -0x1b3,0x1b3,0x1b3,0x1b3,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1b3,0x1b3,0x1575,0x156f,0x1572,0x157b,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, -0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1944,0x1944,0x1944, -0x1944,0x1be7,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1a49,0x1a49,0x1a49,0x1a49,0x1a49,0x1a49,0x1a49,0x1a49, -0x1a49,0x1a49,0x1a49,0x1a49,0x1b9,0x1b9,0x1b9,0x1b9,0x1bc3,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, -0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x172b,0x16ce,0x158a,0x16d4,0x1bc,0x1596,0x1596,0x1596, -0x1596,0x1596,0x1596,0x1596,0x1596,0x1bc,0x1bc,0x1596,0x1596,0x1bc,0x1bc,0x1596,0x1596,0x1596,0x1596,0x1596, -0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1bc,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596, -0x1596,0x1bc,0x1596,0x1596,0x1bc,0x1596,0x1596,0x1596,0x1596,0x1596,0x1bc,0x19ce,0x16d1,0x1593,0x1584,0x158a, -0x1584,0x158a,0x158a,0x158a,0x158a,0x1bc,0x1bc,0x158a,0x158a,0x1bc,0x1bc,0x158d,0x158d,0x1590,0x1bc,0x1bc, -0x172e,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1584,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x159c,0x1599,0x1599, -0x1596,0x1596,0x158a,0x158a,0x1bc,0x1bc,0x1587,0x1587,0x1587,0x1587,0x1587,0x1587,0x1587,0x1bc,0x1bc,0x1bc, -0x1587,0x1587,0x1587,0x1587,0x1587,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc, -0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1, -0x15b1,0x15b1,0x1bf,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1, -0x15c3,0x15c3,0x15c3,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15ba,0x15bd,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1731,0x1731,0x1731,0x1731,0x15cf,0x15cc,0x19f5,0x19f5,0x1a9d,0x1aa0,0x1a9a,0x1a9a,0x1c5,0x1c5,0x1c5,0x1c5, -0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1, -0x15e1,0x15e1,0x15e1,0x15d8,0x15db,0x15de,0x15e1,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, -0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15e4,0x15e4,0x1ce,0x1ce,0x1ce,0x1ce,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7, -0x15ed,0x15ed,0x16d7,0x15ed,0x15ed,0x15ed,0x15ea,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x1d1,0x1d1,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x15fc,0x160e,0x160e,0x1602,0x160b,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1d7, -0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1d7,0x1d7,0x1d7,0x1d7,0x1617,0x1617, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f, -0x1620,0x1620,0x1620,0x1620,0x1620,0x161a,0x1623,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, -0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x1620,0x1620,0x1620,0x1620,0x1620,0x1da, -0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, -0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1dd, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1632,0x1632,0x1632,0x1632,0x1632,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, -0x164d,0x164d,0x1650,0x1650,0x1653,0x1644,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, -0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x1e3,0x1644,0x1644,0x1644,0x1644,0x1644, -0x1644,0x1644,0x1e3,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x164d,0x164d,0x164d, +0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1b3,0x1b3,0x1650,0x164a,0x164d,0x1656,0x1659,0x1659,0x1659,0x1659, +0x1659,0x1659,0x1659,0x1659,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x165c,0x165c,0x165c,0x165c, 0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6, -0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665, -0x1665,0x1665,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1662,0x1662,0x1662,0x1662,0x1e9,0x1e9,0x1e9, -0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1668, -0x167a,0x167a,0x1668,0x1668,0x1668,0x1668,0x1ef,0x1ef,0x167a,0x167a,0x167d,0x167d,0x1668,0x1668,0x167a,0x166e, -0x166b,0x1671,0x1683,0x1683,0x1674,0x1674,0x1677,0x1677,0x1677,0x1683,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x1737,0x1737,0x1737,0x1737,0x1734,0x1734,0x1ef,0x1ef, -0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef, +0x165c,0x1a25,0x1a25,0x1a25,0x1a25,0x1cd4,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b30,0x1b30,0x1b30,0x1b30, +0x1b30,0x1b30,0x1b30,0x1b30,0x1b30,0x1b30,0x1b30,0x1b30,0x1b9,0x1b9,0x1b9,0x1b9,0x1cb0,0x1b9,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1809,0x17ac,0x1665,0x17b2, +0x1bc,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1bc,0x1bc,0x1671,0x1671,0x1bc,0x1bc,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1bc,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1bc,0x1671,0x1671,0x1bc,0x1671,0x1671,0x1671,0x1671,0x1671,0x1bc,0x1aaf, +0x17af,0x166e,0x165f,0x1665,0x165f,0x1665,0x1665,0x1665,0x1665,0x1bc,0x1bc,0x1665,0x1665,0x1bc,0x1bc,0x1668, +0x1668,0x166b,0x1bc,0x1bc,0x180c,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x165f,0x1bc,0x1bc,0x1bc,0x1bc, +0x1bc,0x1677,0x1674,0x1674,0x1671,0x1671,0x1665,0x1665,0x1bc,0x1bc,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, +0x1662,0x1bc,0x1bc,0x1bc,0x1662,0x1662,0x1662,0x1662,0x1662,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc, +0x1bc,0x1bc,0x1bc,0x1bc,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c, +0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x1bf,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c, +0x168c,0x168c,0x168c,0x168c,0x169e,0x169e,0x169e,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1695,0x1698,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x1c2,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x180f,0x180f,0x180f,0x180f,0x16aa,0x16a7,0x1adc,0x1adc,0x1b8a,0x1b8d,0x1b87,0x1b87, +0x1c5,0x1c5,0x1c5,0x1c5,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c, +0x183c,0x183c,0x183c,0x183c,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, +0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x1c8,0x1c8,0x1c8,0x1c8,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, +0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x1c8,0x1c8,0x1c8,0x1c8,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x1c8,0x1c8,0x1c8,0x1c8, +0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x1c8,0x1c8,0x1c8,0x1c8,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc, +0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16b3,0x16b6,0x16b9,0x16bc,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16bf,0x16bf,0x1ce,0x1ce,0x1ce,0x1ce,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c8,0x16c8,0x17b5,0x16c8,0x16c8,0x16c8,0x16c5,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce, +0x1ce,0x1ce,0x1ce,0x1ce,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x1d1,0x1d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, +0x16d1,0x16d1,0x16d1,0x16d1,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, +0x1d1,0x1d1,0x1d1,0x1d1,0x16d7,0x16e9,0x16e9,0x16dd,0x16e6,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef, +0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef, +0x16ef,0x16ef,0x16ef,0x1d7,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x1d7,0x1d7, +0x1d7,0x1d7,0x16f2,0x16f2,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c, +0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16f5,0x1701,0x16fe,0x16fe,0x16fe,0x16fe,0x16fe, +0x16fe,0x16fe,0x16fe,0x16fe,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16fe,0x16fe, +0x16fe,0x16fe,0x16fe,0x1da,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707, +0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707, +0x1707,0x1707,0x1707,0x1dd,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713, +0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1713,0x1710,0x1710,0x1710,0x1710,0x1710,0x1e0, +0x1e0,0x1e0,0x1e0,0x1e0,0x172b,0x172b,0x172e,0x172e,0x1731,0x1722,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, +0x1e3,0x1e3,0x1e3,0x1e3,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1e3,0x1722, +0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x1e3,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, +0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x1e3,0x1e3,0x1e3,0x1e3, +0x1e3,0x172b,0x172b,0x172b,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, +0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x1e6,0x1e6,0x1e6, +0x1e6,0x1e6,0x1e6,0x1e6,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, +0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1740,0x1740,0x1740, +0x1740,0x1e9,0x1e9,0x1e9,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e, +0x175e,0x175e,0x175e,0x1746,0x1758,0x1758,0x1746,0x1746,0x1746,0x1746,0x1ef,0x1ef,0x1758,0x1758,0x175b,0x175b, +0x1746,0x1746,0x1758,0x174c,0x1749,0x174f,0x1761,0x1761,0x1752,0x1752,0x1755,0x1755,0x1755,0x1761,0x1818,0x1818, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1815,0x1815,0x1815,0x1815, +0x1812,0x1812,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef, 0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef, -0x1f2,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2, -0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1f5,0x1f5,0x1f5,0x1f5, -0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1689,0x1689,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1f5,0x1f5,0x1aa3,0x1aa3,0x1f5,0x1f5, -0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5, +0x1ef,0x1ef,0x1ef,0x1ef,0x1f2,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2, +0x1f2,0x1f2,0x1f2,0x1f2,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1f5,0x1f5,0x1f5,0x1f5,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1f5,0x1f5, +0x1b90,0x1b90,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5, 0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5, -0x168c,0x169b,0x1692,0x168f,0x16a1,0x16a1,0x1695,0x16a1,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, -0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, -0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4, -0x16a4,0x16a4,0x16a4,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x16ad, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x1947,0x1fe,0x1fe,0x173d,0x173d,0x173d, -0x1749,0x1749,0x173d,0x173d,0x173d,0x173d,0x174c,0x173d,0x173d,0x173d,0x173d,0x1740,0x1fe,0x1fe,0x1fe,0x1fe, -0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1743,0x1743,0x1752,0x1752,0x1752,0x1743, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, +0x1f5,0x1f5,0x1f5,0x1f5,0x176a,0x1779,0x1770,0x176d,0x177f,0x177f,0x1773,0x177f,0x1f8,0x1f8,0x1f8,0x1f8, +0x1f8,0x1f8,0x1f8,0x1f8,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1f8,0x1f8, +0x1f8,0x1f8,0x1f8,0x1f8,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1782,0x1782, +0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb, +0x1fb,0x1fb,0x1fb,0x178b,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, +0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x1a28,0x1fe, +0x1fe,0x181b,0x181b,0x181b,0x1827,0x1827,0x181b,0x181b,0x181b,0x181b,0x182a,0x181b,0x181b,0x181b,0x181b,0x181e, +0x1fe,0x1fe,0x1fe,0x1fe,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1821,0x1821, +0x1830,0x1830,0x1830,0x1821,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x201,0x201,0x201,0x201,0x201, 0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, -0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, -0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x207,0x1767,0x1767,0x207,0x207, -0x207,0x207,0x207,0x1764,0x1764,0x1764,0x1764,0x1764,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x20a, -0x176a,0x20a,0x176a,0x176a,0x176a,0x176a,0x20a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, -0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x20a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, -0x176a,0x176d,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x20d,0x20d,0x20d,0x20d,0x20d, -0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x20d,0x20d,0x20d,0x20d,0x20d, -0x20d,0x20d,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x177c,0x177c,0x177c,0x177c,0x1779,0x177c,0x177c,0x177f, -0x1782,0x177f,0x177f,0x177c,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x210,0x210,0x210,0x1779,0x1779,0x1779,0x1779,0x1779,0x17d9,0x17d9,0x17d9,0x17d9,0x17d0,0x17d0,0x17d0,0x17ca, -0x17cd,0x17cd,0x17cd,0x19f8,0x213,0x213,0x213,0x213,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6, -0x17d6,0x17d6,0x213,0x213,0x213,0x213,0x17d3,0x17d3,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, -0x17f4,0x216,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, -0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f1,0x17df,0x17df,0x17df,0x17df, -0x17df,0x17df,0x17df,0x216,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17f1,0x17e2,0x17f4,0x17f7,0x17f7,0x17eb, -0x17e8,0x17e8,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x17ee,0x17ee,0x17ee,0x17ee, -0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5, -0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x216,0x216,0x216,0x1803,0x1806,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, -0x17fa,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x21c, -0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd, -0x17fd,0x21c,0x21c,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x21c,0x17fd,0x17fd,0x21c,0x17fd,0x17fd, -0x17fd,0x17fd,0x17fd,0x21c,0x21c,0x21c,0x21c,0x21c,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e, -0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x184b,0x18e7,0x1a52,0x1a55,0x1afd,0x21f,0x21f,0x21f, -0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x1afa,0x1afa,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f, -0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x222,0x222,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, -0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x222,0x1809,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, -0x1800,0x1809,0x1800,0x1800,0x1809,0x1800,0x1800,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222, -0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x225,0x225,0x225, -0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225, -0x1827,0x1827,0x1818,0x1812,0x1812,0x1827,0x1815,0x182a,0x182a,0x182a,0x182a,0x182d,0x182d,0x1821,0x181e,0x181b, -0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1aa6,0x1821,0x228,0x181b,0x194a,0x19fb, -0x1aa9,0x1aa9,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1845,0x1845,0x1845,0x1845, +0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x207, +0x1845,0x1845,0x207,0x207,0x207,0x207,0x207,0x1842,0x1842,0x1842,0x1842,0x1842,0x1848,0x1848,0x1848,0x1848, +0x1848,0x1848,0x1848,0x20a,0x1848,0x20a,0x1848,0x1848,0x1848,0x1848,0x20a,0x1848,0x1848,0x1848,0x1848,0x1848, +0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x20a,0x1848,0x1848,0x1848,0x1848,0x1848, +0x1848,0x1848,0x1848,0x1848,0x1848,0x184b,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x16a1,0x16a1,0x16a1,0x16a1, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x1854,0x1854,0x1854,0x1854, +0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x20d, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x1851,0x1851,0x1851,0x1851, +0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x20d, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x185a,0x185a,0x185a,0x185a, +0x1857,0x185a,0x185a,0x185d,0x1860,0x185d,0x185d,0x185a,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, +0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x1857,0x1857,0x1857,0x1857,0x1857,0x18b7,0x18b7,0x18b7,0x18b7, +0x18ae,0x18ae,0x18ae,0x18a8,0x18ab,0x18ab,0x18ab,0x1adf,0x213,0x213,0x213,0x213,0x18b4,0x18b4,0x18b4,0x18b4, +0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x213,0x213,0x213,0x213,0x18b1,0x18b1,0x18d2,0x18d2,0x18d2,0x18d2, +0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x216,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2, +0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18cf, +0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x216,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18cf,0x18c0, +0x18d2,0x18d5,0x18d5,0x18c9,0x18c6,0x18c6,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, +0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x216,0x216,0x216,0x18e1,0x18e4,0x18ea,0x18ea, +0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18d8,0x18d8,0x18d8,0x18d8, +0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x1a46,0x1a46,0x1a46,0x1a46, +0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x21c,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x18db,0x18db,0x21c,0x21c,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x21c,0x18db, +0x18db,0x21c,0x18db,0x18db,0x18db,0x18db,0x18db,0x21c,0x21c,0x21c,0x21c,0x21c,0x1cfb,0x1cfb,0x1cfb,0x1cfb, +0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1929,0x19c5,0x1b39,0x1b3c, +0x1bea,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x1be7,0x1be7,0x21f,0x21f, +0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x18ea,0x18ea,0x18ea,0x18ea, +0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x222,0x222,0x18de,0x18de, +0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x222,0x18e7,0x18de,0x18de, +0x18de,0x18de,0x18de,0x18de,0x18de,0x18e7,0x18de,0x18de,0x18e7,0x18de,0x18de,0x222,0x222,0x222,0x222,0x222, +0x222,0x222,0x222,0x222,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, +0x18ed,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225, +0x225,0x225,0x225,0x225,0x1905,0x1905,0x18f6,0x18f0,0x18f0,0x1905,0x18f3,0x1908,0x1908,0x1908,0x1908,0x190b, +0x190b,0x18ff,0x18fc,0x18f9,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1b93,0x18ff, +0x228,0x18f9,0x1a2b,0x1ae2,0x1b96,0x1b96,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833, -0x1833,0x1833,0x1833,0x1833,0x22b,0x22b,0x22b,0x22b,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830, -0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830, -0x1830,0x1830,0x1830,0x1830,0x22b,0x22b,0x22b,0x22b,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x184e,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58, -0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x1bcc,0x1bcc,0x1bcc,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x273,0x273,0x1c41,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x234, -0x188d,0x188d,0x234,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, -0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x234, -0x234,0x234,0x1881,0x234,0x1881,0x1881,0x234,0x1881,0x1881,0x1881,0x1884,0x1881,0x1887,0x1887,0x1890,0x1881, -0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, -0x188a,0x188a,0x234,0x234,0x234,0x234,0x234,0x234,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x237,0x237,0x237,0x237,0x189f,0x18a2,0x18a2,0x23a,0x23a,0x23a,0x23a,0x23a, -0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8, -0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1, -0x18b1,0x18b1,0x18b1,0x23d,0x23d,0x23d,0x23d,0x23d,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75, -0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x18bd,0x18c0,0x18cf,0x18cf,0x18c0,0x18c3,0x18bd,0x18ba, -0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x18a8,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x18a5, -0x18a5,0x1893,0x1893,0x1893,0x18a8,0x18a8,0x18a8,0x18a8,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, -0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x243,0x243,0x243,0x243, -0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x1950,0x1950,0x1950,0x1950,0x1950,0x1950,0x1950,0x1950, -0x1950,0x1950,0x1950,0x1950,0x1950,0x1950,0x243,0x243,0x1a61,0x1a61,0x1a61,0x1a61,0x1b03,0x1c47,0x1c47,0x1c47, -0x1a61,0x1a61,0x1a61,0x1bcf,0x1bcf,0x276,0x276,0x276,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962, -0x1962,0x1962,0x1962,0x1962,0x195f,0x195f,0x195f,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953, -0x195f,0x1959,0x1956,0x195c,0x246,0x246,0x246,0x246,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x249,0x249,0x1965,0x1965,0x1965,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x24c,0x1974, -0x1974,0x24c,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974, -0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1971,0x1971,0x1971,0x1971,0x1971,0x24c, -0x1968,0x1968,0x24c,0x1971,0x1971,0x1968,0x1971,0x196b,0x1974,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, -0x197d,0x197d,0x1980,0x1980,0x1977,0x1977,0x1977,0x1977,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1986,0x1983,0x1983,0x1983, -0x1986,0x1983,0x1983,0x1983,0x1983,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, -0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992, -0x1992,0x1992,0x198f,0x1989,0x1989,0x198c,0x198c,0x1995,0x1995,0x255,0x255,0x255,0x255,0x255,0x255,0x255, -0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998, -0x1998,0x1998,0x1998,0x1998,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, -0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199e,0x19a7,0x199b,0x199b,0x25b,0x25b,0x25b,0x25b,0x25b, -0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19ad,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e, -0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6, -0x19b6,0x19b6,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b3,0x19b3,0x19b3, -0x19b3,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96, -0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1bf9,0x1bff,0x1bff,0x1bff,0x1bff,0x1bff,0x1bff,0x1bfc, -0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x264,0x264, -0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d, -0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x267, -0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c, -0x26a,0x26a,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c, -0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a19,0x1a19,0x1a19,0x1a10,0x1a10,0x1a10,0x1a10, -0x26a,0x26a,0x1a10,0x1a10,0x1a19,0x1a19,0x1a19,0x1a19,0x1a13,0x1a1c,0x1a16,0x1a1c,0x1a19,0x26a,0x26a,0x26a, -0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, -0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28, -0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x26d,0x26d,0x26d,0x1a1f,0x1a1f,0x1a1f,0x1a1f,0x1a1f,0x1a1f,0x1a1f,0x1a28, -0x1a28,0x1a28,0x1a28,0x1a28,0x1a2b,0x1a2b,0x26d,0x26d,0x270,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e, -0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e, -0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x270,0x270,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x1a5b,0x1a5b,0x1a5b,0x273, -0x273,0x1c44,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x1a5e,0x1a5e,0x1a5e,0x1a5e, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x1a61,0x1a61,0x1a61,0x1b03,0x1b03,0x1b03,0x1b03,0x1c47, -0x1c47,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1b03,0x1b03, -0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1c47,0x1c47,0x1c47, -0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1c47,0x1c47,0x1c47,0x276,0x1c47, -0x1b03,0x1b03,0x1b03,0x1bd2,0x1bd2,0x1bd2,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x1c47,0x1c47, -0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1bcf,0x1bcf,0x1bcf,0x1c47,0x1c47,0x276,0x276,0x276,0x276, -0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1c47,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1c4a,0x1c4a,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x1a37,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31, -0x1a31,0x1a31,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x1a34, -0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a3a,0x1a3a,0x1a3a,0x1a3a, -0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x27c,0x27c,0x27c,0x27c,0x27c,0x1a3d, -0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aac,0x1aac,0x1aac,0x1aac,0x1aac,0x1aac,0x1aac,0x27f,0x27f,0x27f,0x27f, +0x228,0x228,0x228,0x228,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, +0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x22b,0x22b,0x22b,0x22b,0x190e,0x190e,0x190e,0x190e, +0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, +0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x22b,0x22b,0x22b,0x22b,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x1aac,0x1aac,0x1aac,0x1aac,0x1aac,0x1b3f,0x1b3f, +0x1b3f,0x1b3f,0x1b3f,0x1b3f,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x1cb9,0x1cb9,0x1cb9,0x231, +0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x273,0x273,0x1d2e,0x273, +0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x196b,0x196b,0x196b,0x196b, +0x196b,0x196b,0x196b,0x234,0x196b,0x196b,0x234,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b, +0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x195f,0x195f,0x195f, +0x195f,0x195f,0x195f,0x234,0x234,0x234,0x195f,0x234,0x195f,0x195f,0x234,0x195f,0x195f,0x195f,0x1962,0x195f, +0x1965,0x1965,0x196e,0x195f,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x1968,0x1968,0x1968,0x1968, +0x1968,0x1968,0x1968,0x1968,0x1968,0x1968,0x234,0x234,0x234,0x234,0x234,0x234,0x19ce,0x19ce,0x19ce,0x19ce, +0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce, +0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x237,0x237,0x237,0x237,0x197d,0x1980,0x1980,0x23a, +0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x1c95,0x1c95,0x1c95,0x1c95, +0x1c95,0x1c95,0x1c95,0x1c95,0x1c95,0x1c95,0x1c95,0x1c95,0x1c95,0x1c95,0x1c95,0x1c95,0x198f,0x198f,0x198f,0x198f, +0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x23d,0x23d,0x23d,0x23d,0x23d,0x1c62,0x1c62,0x1c62,0x1c62, +0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x199b,0x199e,0x19ad,0x19ad, +0x199e,0x19a1,0x199b,0x1998,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x1986,0x1971,0x1971,0x1971, +0x1971,0x1971,0x1971,0x1983,0x1983,0x1971,0x1971,0x1971,0x1986,0x1986,0x1986,0x1986,0x1ae8,0x1ae8,0x1ae8,0x1ae8, +0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8, +0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x1a31,0x1a31,0x1a31,0x1a31, +0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x243,0x243,0x1b48,0x1b48,0x1b48,0x1b48, +0x1bf0,0x1d34,0x1d34,0x1d34,0x1b48,0x1b48,0x1b48,0x1cbc,0x1cbc,0x276,0x276,0x276,0x1a43,0x1a43,0x1a43,0x1a43, +0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a40,0x1a40,0x1a40,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34, +0x1a34,0x1a34,0x1a34,0x1a34,0x1a40,0x1a3a,0x1a37,0x1a3d,0x246,0x246,0x246,0x246,0x1a46,0x1a46,0x1a46,0x1a46, +0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46, +0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x249,0x249,0x1a46,0x1a46,0x1a46,0x1a55,0x1a55,0x1a55,0x1a55, +0x1a55,0x1a55,0x24c,0x1a55,0x1a55,0x24c,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55, +0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a52,0x1a52, +0x1a52,0x1a52,0x1a52,0x24c,0x1a49,0x1a49,0x24c,0x1a52,0x1a52,0x1a49,0x1a52,0x1a4c,0x1a55,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x1a5e,0x1a5e,0x1a61,0x1a61,0x1a58,0x1a58,0x1a58,0x1a58,0x24f,0x24f,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64, +0x1a67,0x1a64,0x1a64,0x1a64,0x1a67,0x1a64,0x1a64,0x1a64,0x1a64,0x252,0x252,0x252,0x252,0x252,0x252,0x252, +0x252,0x252,0x252,0x252,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73, +0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a70,0x1a6a,0x1a6a,0x1a6d,0x1a6d,0x1a76,0x1a76,0x255,0x255,0x255, +0x255,0x255,0x255,0x255,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79, +0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, +0x258,0x258,0x258,0x258,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c, +0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7f,0x1a88,0x1a7c,0x1a7c,0x25b, +0x25b,0x25b,0x25b,0x25b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8e,0x25e,0x25e,0x25e,0x25e, +0x25e,0x25e,0x25e,0x25e,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97, +0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a97,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91, +0x1a91,0x1a94,0x1a94,0x1a94,0x1a94,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x261,0x261,0x261,0x261,0x261,0x261, +0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1c83,0x1c83,0x1c83,0x1c83, +0x1c83,0x1c83,0x1c83,0x1c83,0x1c83,0x1c83,0x1c83,0x1c83,0x1c83,0x1c83,0x1c83,0x1c83,0x1ce6,0x1cec,0x1cec,0x1cec, +0x1cec,0x1cec,0x1cec,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9,0x1ce9, +0x1ce9,0x1ce9,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x1af4,0x1af4,0x1af4,0x1af4, +0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4,0x1af4, +0x1af4,0x1af4,0x1af4,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x1b03,0x1b03,0x1b03,0x1b03, +0x1b03,0x1b03,0x1b03,0x1b03,0x26a,0x26a,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03, +0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b00,0x1b00,0x1b00, +0x1af7,0x1af7,0x1af7,0x1af7,0x26a,0x26a,0x1af7,0x1af7,0x1b00,0x1b00,0x1b00,0x1b00,0x1afa,0x1b03,0x1afd,0x1b03, +0x1b00,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, +0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x1b0f,0x1b0f,0x1b0f,0x1b0f, +0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x26d,0x26d,0x26d,0x1b06,0x1b06,0x1b06,0x1b06, +0x1b06,0x1b06,0x1b06,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b12,0x1b12,0x26d,0x26d,0x270,0x1b15,0x1b15,0x1b15, +0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15, +0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x1b15,0x270,0x270, +0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, +0x1b42,0x1b42,0x1b42,0x273,0x273,0x1d31,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, +0x1b45,0x1b45,0x1b45,0x1b45,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x19ce,0x19ce,0x19ce,0x19ce, +0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x1b48,0x1b48,0x1b48,0x1bf0, +0x1bf0,0x1bf0,0x1bf0,0x1d34,0x1d34,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x1b48,0x1b48,0x1b48,0x1b48, +0x1b48,0x1b48,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1cbc,0x1cbc,0x1cbc, +0x1cbc,0x1d34,0x1d34,0x1d34,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1cbc,0x1cbc,0x1cbc,0x1cbc,0x1d34, +0x1d34,0x1d34,0x276,0x1d34,0x1bf0,0x1bf0,0x1bf0,0x1cbf,0x1cbf,0x1cbf,0x276,0x276,0x276,0x276,0x276,0x276, +0x276,0x276,0x1d34,0x1d34,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1bf0,0x1cbc,0x1cbc,0x1cbc,0x1d34,0x1d34, +0x276,0x276,0x276,0x276,0x1cbc,0x1cbc,0x1cbc,0x1cbc,0x1cbc,0x1cbc,0x1cbc,0x1cbc,0x1d34,0x276,0x276,0x276, +0x276,0x276,0x276,0x276,0x1cbf,0x1cbf,0x1cbf,0x1cbf,0x1cbf,0x1cbf,0x1cbf,0x1d37,0x1d37,0x276,0x276,0x276, +0x276,0x276,0x276,0x276,0x1b1e,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18, +0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279, +0x279,0x279,0x279,0x1b1b,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a, +0x1b21,0x1b21,0x1b21,0x1b21,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x27c,0x27c, +0x27c,0x27c,0x27c,0x1b24,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b99,0x1b99,0x1b99,0x1b99,0x1b99,0x1b99,0x1b99, 0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, -0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x282,0x282,0x1aca,0x282,0x282,0x1aca,0x1aca,0x1aca,0x1aca, -0x1aca,0x1aca,0x1aca,0x1aca,0x282,0x1aca,0x1aca,0x282,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca, -0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1ab2,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x282,0x1ac1, -0x1ac4,0x282,0x282,0x1ab2,0x1ab2,0x1ac7,0x1ab8,0x1acd,0x1ac1,0x1acd,0x1ac1,0x1ab5,0x1ad0,0x1abb,0x1ad0,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe, -0x1abe,0x1abe,0x282,0x282,0x282,0x282,0x282,0x282,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09, -0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x285,0x285, +0x27f,0x27f,0x27f,0x27f,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x282,0x282,0x1bb7,0x282,0x282, +0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x282,0x1bb7,0x1bb7,0x282,0x1bb7,0x1bb7,0x1bb7,0x1bb7, +0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1bb7,0x1b9f,0x1bae,0x1bae,0x1bae, +0x1bae,0x1bae,0x282,0x1bae,0x1bb1,0x282,0x282,0x1b9f,0x1b9f,0x1bb4,0x1ba5,0x1bba,0x1bae,0x1bba,0x1bae,0x1ba2, +0x1bbd,0x1ba8,0x1bbd,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x1bab,0x1bab,0x1bab,0x1bab, +0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x282,0x282,0x282,0x282,0x282,0x282,0x1bf6,0x1bf6,0x1bf6,0x1bf6, +0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6, +0x1bf6,0x1bf6,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285, 0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285, -0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285, -0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, -0x1ad6,0x1ad6,0x1ad6,0x28b,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, -0x1ad6,0x1ad6,0x1ad6,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, -0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x1ad9,0x1ad9,0x1ad9,0x1ad9,0x1ad9,0x1ad9,0x1ad9,0x1ad9, -0x1ad9,0x1ad9,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c, -0x1b0c,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, +0x285,0x285,0x285,0x285,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3, +0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x28b,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3, +0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, +0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x1bc6,0x1bc6,0x1bc6,0x1bc6, +0x1bc6,0x1bc6,0x1bc6,0x1bc6,0x1bc6,0x1bc6,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x1bf9,0x1bf9,0x1bf9,0x1bf9, +0x1bf9,0x1bf9,0x1bf9,0x1bf9,0x1bf9,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, 0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, -0x28e,0x28e,0x28e,0x28e,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x291,0x1adc, -0x1adc,0x1adf,0x291,0x291,0x1ae2,0x1ae2,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, -0x291,0x291,0x291,0x291,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b72,0x1b75,0x1b75,0x1b75, -0x1b75,0x1b75,0x1b75,0x294,0x1b78,0x1b78,0x294,0x294,0x294,0x294,0x294,0x294,0x1b6f,0x1b6f,0x1b6f,0x1b6f, -0x1b6f,0x1b6f,0x1b6f,0x1b6f,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e, -0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7b,0x1b7b,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297, -0x297,0x297,0x297,0x297,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x29a,0x1b81,0x1b81,0x1b81,0x1b81, -0x29a,0x1b81,0x1b81,0x29a,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81, -0x1b81,0x1b81,0x1b81,0x29a,0x1b84,0x1b8a,0x1b8a,0x1b87,0x1b87,0x1b87,0x2a0,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87, -0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87, -0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x2a0,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x2a0, -0x2a0,0x2a0,0x2a0,0x2a0,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b90,0x1b8d, -0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d, -0x1b8d,0x1b8d,0x1b8d,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x1c02,0x1c02,0x1c02,0x1c02,0x1c02,0x1c02,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, +0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf, +0x1bcf,0x1bcf,0x291,0x1bc9,0x1bc9,0x1bcc,0x291,0x291,0x1bcf,0x1bcf,0x291,0x291,0x291,0x291,0x291,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62, +0x1c5f,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x1c62,0x294,0x1c65,0x1c65,0x294,0x294,0x294,0x294,0x294,0x294, +0x1c5c,0x1c5c,0x1c5c,0x1c5c,0x1c5c,0x1c5c,0x1c5c,0x1c5c,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b, +0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c68,0x1c68,0x297,0x297,0x297,0x297,0x297, +0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x29a, +0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x29a,0x1c6e,0x1c6e,0x29a,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e, +0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x29a,0x1c71,0x1c77,0x1c77,0x1c74,0x1c74,0x1c74,0x2a0,0x1c74, +0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74, +0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x2a0,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74,0x1c74, +0x1c74,0x1c74,0x1c74,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a, +0x1c7a,0x1c7a,0x1c7d,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a, +0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x1c7a,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x1cef,0x1cef,0x1cef, +0x1cef,0x1cef,0x1cef,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, 0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x1b96,0x1b96,0x1b93,0x1b93,0x1b93,0x1b93,0x1b99,0x1b99,0x1b99,0x1b99,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, +0x2a3,0x2a3,0x2a3,0x2a3,0x1c83,0x1c83,0x1c80,0x1c80,0x1c80,0x1c80,0x1c86,0x1c86,0x1c86,0x1c86,0x2a6,0x2a6, 0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, -0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x2a9, -0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9, -0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, -0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba2,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x2af,0x1bae,0x1bae,0x1bae,0x1bae, -0x1bae,0x1bae,0x1bae,0x2af,0x1bae,0x1bae,0x2af,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab, -0x1bab,0x1bab,0x2af,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab, -0x1bab,0x1bab,0x2af,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x2af,0x1bab,0x1bab,0x2af,0x2af,0x2af, -0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x2b2,0x2b2, -0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4, -0x1bb4,0x1bb4,0x1bb4,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x1bb1,0x1bb1,0x1bb1,0x1bb1, -0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x2b5,0x2b5,0x2b5,0x2b5, +0x2a6,0x2a6,0x2a6,0x2a6,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c, +0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c, +0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c, +0x1c8c,0x1c8c,0x1c8c,0x2a9,0x1c89,0x1c89,0x1c89,0x1c89,0x1c89,0x1c89,0x1c89,0x1c89,0x1c89,0x1c89,0x2a9,0x2a9, +0x2a9,0x2a9,0x2a9,0x2a9,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638, +0x1638,0x1638,0x1638,0x1638,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92,0x1c92, +0x1c92,0x1c92,0x1c8f,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, +0x2ac,0x2ac,0x2ac,0x2ac,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x2af, +0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x1c9b,0x2af,0x1c9b,0x1c9b,0x2af,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98, +0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x2af,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98, +0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x2af,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x1c98,0x2af,0x1c98, +0x1c98,0x2af,0x2af,0x2af,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1, +0x1ca1,0x1ca1,0x2b2,0x2b2,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1, +0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, +0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, 0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5, -0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x1c05,0x1c05,0x1c05, -0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0e,0x1c0e,0x1c0e,0x2b8,0x2b8, -0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, -0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5, +0x2b5,0x1cf2,0x1cf2,0x1cf2,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cfb, +0x1cfb,0x1cfb,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, +0x2b8,0x2b8,0x2b8,0x2b8,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x2bb,0x2bb, 0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x1c14,0x1c14,0x1c14,0x1c14, -0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14, -0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x1c17,0x1c17,0x1c2c,0x1c23, -0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x2c1,0x1c29,0x1c29, -0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29, -0x1c29,0x1c29,0x1c29,0x1c29,0x1c23,0x1c23,0x1c17,0x1c17,0x1c17,0x1c17,0x1c17,0x2c1,0x2c1,0x2c1,0x1c23,0x1c23, -0x1c17,0x1c26,0x1c1a,0x1c2f,0x1c2f,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d, -0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1, -0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c32,0x1c32,0x1c32,0x1c32, -0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01,0x1d01, +0x1d01,0x1d01,0x1d01,0x1d01,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be, +0x1d04,0x1d04,0x1d19,0x1d10,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16, +0x1d16,0x2c1,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16, +0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d10,0x1d10,0x1d04,0x1d04,0x1d04,0x1d04,0x1d04,0x2c1, +0x2c1,0x2c1,0x1d10,0x1d10,0x1d04,0x1d13,0x1d07,0x1d1c,0x1d1c,0x1d0a,0x1d0a,0x1d0a,0x1d0a,0x1d0a,0x1d0a,0x1d0a, +0x1d0a,0x1d0a,0x1d0a,0x1d0a,0x1d0d,0x1d0d,0x1d0d,0x1d0d,0x1d0d,0x1d0d,0x1d0d,0x1d0d,0x1d0d,0x1d0d,0x2c1,0x2c1, +0x2c1,0x2c1,0x2c1,0x2c1,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25,0x1d25, +0x1d1f,0x1d1f,0x1d1f,0x1d1f,0x1d22,0x1d22,0x1d22,0x1d22,0x1d22,0x1d22,0x1d22,0x1d22,0x1d22,0x1d22,0x2c4,0x2c4, +0x2c4,0x2c4,0x2c4,0x2c4,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x95d,0x95d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d, -0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0x12a5, -0x12a5,0x12a5,0x2ca,0x2ca,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97, -0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0x2ca,0x2ca, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x9b1,0x9b1,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a, +0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0x136e,0x136e,0x136e,0x2ca,0x2ca,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24, +0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24, +0xf24,0xf24,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, 0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, -0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, -0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, -0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0x2cd,0x2cd, -0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7, -0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x1bbd,0x1bbd,0x1bbd,0x1bbd,0x1c3b,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0, -0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1, -0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x2d3,0x2d3, -0x1794,0x1794,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc, -0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x2df,0x2df, -0x3e7,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3e7,0x3e7,0x3e7,0x3e7,0x3e1,0x1125,0x12fc, -0x3ea,0x927,0x92a,0x3d8,0x3d8,0x1122,0x12f9,0x12f9,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed, -0x1122,0x3db,0x3db,0x3e7,0xcb1,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x3ea,0x3ea,0x3db,0x3db,0x8af,0x8b2,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, -0x3e4,0xf81,0xf7e,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x14c1,0x1128,0x1128,0xed3,0xed3,0xda4,0xed3,0xed3, -0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ed,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x3ea,0x3ed,0x3ea,0x3ea,0x3ed,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x12f9,0x12fc,0x3de,0x3ea,0x3e7,0x3e7, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x1305,0x489,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x1305,0x1866,0x1866,0xf9f,0x47a,0x483, -0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5, -0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xba6,0xba6,0xdb3,0xdb3,0x8b5,0xdb0,0x13e3,0x13e3,0x13e3, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8, -0x4ce,0x4ce,0x4ce,0x113d,0x113d,0x113d,0x113d,0x113d,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, -0x4d1,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce, -0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce, -0x4ce,0x4ce,0x4ce,0x4ce,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4, -0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4, -0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4d4,0x4d4,0x4d4,0x4d4,0x4d7,0x9a2,0xfcc,0xfcc,0xfcf,0xfcc, -0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4, -0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x6a5,0x6a5,0x6a8,0x504,0x6b4,0x6b1,0x6b1,0x6ae,0x52e,0x52e,0x4ec,0x4ec,0x4ec,0x4ec,0x4ec,0xb37, -0x6b7,0x510,0x6cf,0x6d2,0x525,0x6b7,0x513,0x513,0x504,0x51f,0x51f,0x6a5,0x52b,0x528,0x6ab,0x4fe, -0x4f5,0x4f5,0x4f8,0x4f8,0x4f8,0x4f8,0x4f8,0x4fb,0x4f8,0x4f8,0x4f8,0x4ef,0x537,0x534,0x531,0x531, -0x6c3,0x519,0x516,0x6c0,0x6bd,0x6ba,0x6cc,0x507,0x6c9,0x6c9,0x51c,0x51f,0x6c6,0x6c6,0x51c,0x51f, -0x501,0x504,0x504,0x504,0x522,0x50d,0x50a,0xbbb,0xada,0xada,0xad7,0xad7,0xad7,0xad7,0xbb2,0xbb2, -0xbb2,0xbb2,0xbb8,0xcde,0xcdb,0xdbf,0xdc2,0xbb5,0xdc2,0xdc2,0xdc2,0xdc2,0xdbf,0xdc2,0xdc2,0xbaf, -0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x558,0x55e,0x73e,0x55b,0x9a5,0x9c6,0xadd,0xadd,0xadd, -0xbc1,0xbc1,0xdc8,0xdc8,0xdc8,0xdc8,0x1146,0x1149,0x1149,0x131a,0x14af,0x14d9,0x14dc,0x14dc,0x16e9,0x1869, -0x56a,0x56a,0x582,0x6e4,0x567,0x6de,0x56a,0x57f,0x567,0x6e4,0x579,0x582,0x582,0x582,0x579,0x579, -0x582,0x582,0x582,0x6ea,0x567,0x582,0x6e7,0x567,0x576,0x582,0x582,0x582,0x582,0x582,0x567,0x567, -0x56d,0x6de,0x6e1,0x567,0x582,0x567,0x6ed,0x567,0x582,0x570,0x588,0x6f0,0x582,0x582,0x573,0x579, -0x582,0x582,0x585,0x582,0x579,0x57c,0x57c,0x57c,0x57c,0xae6,0xae3,0xce1,0xdd1,0xbd6,0xbd9,0xbd9, -0xbd3,0xbd0,0xbd0,0xbd0,0xbd0,0xbd9,0xbd6,0xbd6,0xbd6,0xbd6,0xbcd,0xbd0,0xdce,0xedf,0xee2,0xfd5, -0x114c,0x114c,0x114c,0x6f6,0x6f3,0x58b,0x58e,0x58e,0x58e,0x58e,0x58e,0x6f3,0x6f6,0x6f6,0x6f3,0x58e, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x597,0x597,0x597,0x597, -0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x591,0x591,0x591,0x591,0x591,0x591, -0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59a,0x59d,0x59d,0x59d,0x59d,0x59d,0x5a0,0x59a, -0x59d,0x59d,0x59a,0x59a,0x59a,0x59a,0x59d,0x59d,0x6ff,0x6ff,0x59a,0x59a,0x59d,0x59d,0x59d,0x59d, -0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x5a0,0x5a0,0x5a0,0x59d,0x59d,0x702,0x59d, -0x702,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59a,0x59d,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59d,0x59d,0x59a,0x6ff,0x59a,0x59a,0x59a,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec, -0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0x705,0x5a3,0x705,0x705, -0x5a6,0x5a3,0x5a3,0x705,0x705,0x5a6,0x5a3,0x705,0x5a6,0x5a3,0x5a3,0x705,0x5a3,0x705,0x5b2,0x5af, -0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x5a3,0x5a3,0x705,0x705,0x705,0x705,0x5a3,0x5a3,0x705, -0x5a6,0x705,0x5a6,0x705,0x705,0x705,0x705,0x705,0x70b,0x5a9,0x705,0x5a9,0x5a9,0x5a3,0x5a3,0x5a3, -0x705,0x705,0x705,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x705,0x5a3,0x5a3,0x5a3,0x5a6,0x5a3,0x5a3, -0x5a6,0x5a3,0x5a3,0x5a6,0x705,0x5a6,0x5a3,0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x708,0x705,0x5a6,0x5a3, -0x705,0x705,0x705,0x705,0x5a3,0x5a3,0x705,0x705,0x5a3,0x5a6,0x708,0x708,0x5a6,0x5a6,0x5a3,0x5a3, -0x5a6,0x5a6,0x5a3,0x5a3,0x5a6,0x5a6,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a6,0x5a6,0x705,0x705, -0x5a6,0x5a6,0x705,0x705,0x5a6,0x5a6,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a6,0x5a6,0x5a6,0x5a6,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a6,0x5a6,0x5a6,0x5a6,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a6,0x5a6,0x5a6,0x5a6,0x5a3,0x5ac,0x5a3,0x5a3,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, -0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0x5b5,0xaef,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5be,0x5bb,0x5be,0x5bb,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x70e,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x7fe,0x7fe,0x5b5,0x5b5,0x5b5,0x5b5,0x5b8,0x5b8,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x804,0x801,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0xaef,0xbe5,0xaef,0xaef,0xaef,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x717,0x717,0x717,0x717, -0x717,0x717,0x717,0x717,0x717,0x717,0x5c7,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42, -0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xd50,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, -0x5ca,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x5cd,0x5cd,0x5cd,0x5cd,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x720,0x720,0x720,0x720, -0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x5d0,0x5d0,0x720,0x720, -0x720,0x720,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0x726,0x726,0x5d3,0x723, -0x723,0x723,0x723,0x723,0x723,0x723,0x5d3,0x5d3,0x5d3,0x5d3,0x5d6,0x5d6,0x5d6,0x5d6,0x726,0x726, -0x5d6,0x5d6,0x726,0x726,0x5d3,0x5d3,0x5d3,0x5d3,0x726,0x726,0x5d6,0x5d6,0x726,0x726,0x5d3,0x5d3, -0x5d3,0x5d3,0x726,0x726,0x723,0x5d3,0x5d6,0x726,0x5d3,0x5d3,0x723,0x726,0x726,0x726,0x5d6,0x5d6, -0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x726,0x723, -0x726,0x723,0x5d3,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d3,0x5d3,0x723,0xaf5,0xaf5,0xaf5,0xaf5, -0xaf5,0xaf5,0xaf5,0xaf5,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xc5a,0xc5a,0xbeb,0x5dc,0x5dc,0x5dc,0x5dc, -0x5d9,0x72f,0x72f,0x5d9,0x5d9,0x729,0x5d9,0x5d9,0x5d9,0x5d9,0x729,0x729,0x5d9,0x5d9,0x5d9,0x5d9, -0xd59,0xd59,0xbee,0xbee,0xdda,0xaf8,0x5dc,0x5dc,0x72c,0x5df,0x72c,0x5dc,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5dc,0x5dc,0x5dc,0x5d9,0x5d9,0x5d9,0x5d9,0x72f,0x5d9,0x72f,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x72f,0x72f,0x5e2,0x72f, -0x729,0x729,0x5d9,0x729,0x72c,0x729,0x729,0x5d9,0x729,0x72f,0x5e2,0x72f,0xaf8,0xaf8,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xdd7,0xe8e,0x5e5,0x5e5,0x5e5,0x5e5, -0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5, -0x5e8,0x13a4,0x13a4,0x13a4,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x14e2,0x5ee,0x5ee,0x5ee, -0x5ee,0x13a4,0x5e8,0x5e8,0x5ee,0x5ee,0x13a7,0x13a7,0x5f4,0x5f4,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x13a4,0x5e8,0x5e8,0x5e8, +0x2ca,0x2ca,0x2ca,0x2ca,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0x2cd,0x2cd,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, +0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1caa,0x1caa,0x1caa,0x1caa,0x1d28,0x2d0,0x2d0, +0x2d0,0x2d0,0x2d0,0x2d0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, +0x14a0,0x14a0,0x2d3,0x2d3,0x1872,0x1872,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, +0x2d6,0x2d6,0x2d6,0x2d6,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8, +0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9, +0x2d9,0x2d9,0x2d9,0x2d9,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1d46,0x1d46,0x1d46,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x2dc, +0x2dc,0x2dc,0x2dc,0x2dc,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a, +0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1d46,0x2df,0x2df,0x41a,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x41a,0x41a,0x41a, +0x41a,0x414,0x11eb,0x13c5,0x420,0x97b,0x97e,0x40b,0x40b,0x11e8,0x13c2,0x13c2,0x41d,0x41d,0x41d,0x41d, +0x41d,0x41d,0x41d,0x41d,0x11e8,0x40e,0x40e,0x41a,0xd32,0x420,0x420,0x420,0x420,0x420,0x420,0x420, +0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420, +0x420,0x420,0x420,0x420,0x420,0x420,0x40e,0x40e,0x900,0x903,0x999,0x999,0x999,0x999,0x999,0x999, +0x999,0x999,0x999,0x999,0x417,0x1023,0x1020,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x1593,0x11ee,0x11ee,0xf60, +0xf60,0xe28,0xf60,0xf60,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x423,0x420,0x420, +0x420,0x420,0x420,0x420,0x420,0x423,0x420,0x420,0x423,0x420,0x420,0x420,0x420,0x420,0x13c2,0x13c5, +0x411,0x420,0x41a,0x41a,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x13ce,0x4c2,0x4c2, +0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x13ce,0x1944, +0x1944,0x1044,0x4b3,0x4bc,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504, +0x504,0x504,0x504,0x504,0x504,0x4fe,0x4fe,0x4fe,0x4fe,0x4fe,0x4fe,0xc24,0xc24,0xe37,0xe37,0x906, +0xe34,0x14b2,0x14b2,0x14b2,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501, +0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501, +0x501,0x501,0x501,0x501,0x50a,0x50a,0x50a,0x1203,0x1203,0x1203,0x1203,0x1203,0x507,0x507,0x507,0x507, +0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507, +0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x1200,0x1200, +0x1200,0x1200,0x1200,0x1200,0x50d,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a, +0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a, +0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x50a,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513, +0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x513,0x513, +0x513,0x513,0x510,0x9ff,0x1071,0x1071,0x1077,0x1071,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513, +0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513, +0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x516,0x513,0x1074,0x1071,0x1074,0x1071,0x1074,0x1071, +0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, +0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, +0x6f0,0x6f0,0x6f3,0x546,0x6ff,0x6fc,0x6fc,0x702,0x570,0x570,0x52e,0x52e,0x52e,0x52e,0x52e,0xbb5, +0x6f6,0x54f,0x71d,0x720,0x567,0x6f6,0x555,0x555,0x546,0x561,0x561,0x6f0,0x56d,0x56a,0x6f9,0x540, +0x537,0x537,0x53a,0x53a,0x53a,0x53a,0x53a,0x53d,0x53a,0x53a,0x53a,0x531,0x579,0x576,0x573,0x573, +0x70e,0x55b,0x558,0x70b,0x708,0x705,0x71a,0x552,0x714,0x717,0x55e,0x561,0x711,0x711,0x55e,0x561, +0x543,0x546,0x546,0x546,0x564,0x54c,0x549,0xc39,0xb58,0xb58,0xb55,0xb55,0xb55,0xb55,0xc30,0xc30, +0xc30,0xc30,0xc36,0xd5f,0xd5c,0xe43,0xe49,0xc33,0xe49,0xe49,0xe49,0xe49,0xe46,0xe49,0xe49,0xc2d, +0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59a,0x5a0,0x78c,0x59d,0xa02,0xa23,0xb5b,0xb5b,0xb5b, +0xc3f,0xc3f,0xe4f,0xe4f,0xe4f,0xe4f,0x120c,0x120f,0x120f,0x13e3,0x1581,0x15ab,0x15ae,0x15ae,0x17c7,0x1947, +0x5af,0x5af,0x5c7,0x732,0x5a9,0x72c,0x5af,0x5c4,0x5a9,0x732,0x5be,0x5c7,0x5c7,0x5c7,0x5be,0x5be, +0x5c7,0x5c7,0x5c7,0x738,0x5a9,0x5c7,0x735,0x5a9,0x5bb,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5a9,0x5a9, +0x5b2,0x72c,0x72f,0x5a9,0x5c7,0x5a9,0x73b,0x5ac,0x5c7,0x5b5,0x5cd,0x73e,0x5c7,0x5c7,0x5b8,0x5be, +0x5c7,0x5c7,0x5ca,0x5c7,0x5be,0x5c1,0x5c1,0x5c1,0x5c1,0xb64,0xb61,0xd62,0xe58,0xc54,0xc57,0xc57, +0xc51,0xc4e,0xc4e,0xc4e,0xc4e,0xc57,0xc54,0xc54,0xc54,0xc54,0xc4b,0xc4e,0xe55,0xf6c,0xf6f,0x107d, +0x1212,0x1212,0x1212,0x744,0x741,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x741,0x744,0x744,0x741,0x5d3, +0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x5dc,0x5dc,0x5dc,0x5dc, +0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, +0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5df,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e5,0x5df, +0x5e2,0x5e2,0x5df,0x5df,0x5df,0x5df,0x5e2,0x5e2,0x74d,0x74d,0x5df,0x5df,0x5e2,0x5e2,0x5e2,0x5e2, +0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e5,0x5e5,0x5e5,0x5e2,0x5e2,0x750,0x5e2, +0x750,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5df,0x5e2,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df, +0x5e2,0x5e2,0x5df,0x74d,0x5df,0x5df,0x5df,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0x753,0x5e8,0x753,0x753, +0x5eb,0x5e8,0x5e8,0x753,0x753,0x5eb,0x5e8,0x753,0x5eb,0x5e8,0x5e8,0x753,0x5e8,0x753,0x5f7,0x5f1, +0x5e8,0x753,0x5e8,0x5e8,0x5e8,0x5e8,0x753,0x5e8,0x5e8,0x753,0x753,0x753,0x753,0x5e8,0x5e8,0x753, +0x5eb,0x753,0x5eb,0x753,0x753,0x753,0x753,0x753,0x759,0x5f4,0x753,0x5f4,0x5f4,0x5e8,0x5e8,0x5e8, +0x753,0x753,0x753,0x753,0x5e8,0x5e8,0x5e8,0x5e8,0x753,0x753,0x5e8,0x5e8,0x5e8,0x5eb,0x5e8,0x5e8, +0x5eb,0x5e8,0x5e8,0x5eb,0x753,0x5eb,0x5e8,0x5e8,0x753,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x753,0x5e8, +0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x756,0x753,0x5eb,0x5e8, +0x753,0x753,0x753,0x753,0x5e8,0x5e8,0x753,0x753,0x5e8,0x5eb,0x756,0x756,0x5eb,0x5eb,0x5e8,0x5e8, +0x5eb,0x5eb,0x5e8,0x5e8,0x5eb,0x5eb,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5eb,0x5eb,0x753,0x753, +0x5eb,0x5eb,0x753,0x753,0x5eb,0x5eb,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, +0x5e8,0x753,0x5e8,0x5e8,0x5e8,0x753,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x753,0x5e8,0x5e8, +0x5e8,0x5e8,0x5e8,0x5e8,0x5eb,0x5eb,0x5eb,0x5eb,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, +0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x753,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, 0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x5e8,0x735,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x13a4,0x5e8,0x13a4,0x5e8,0x5e8,0x5e8,0x5e8,0x13a4,0x13a4,0x13a4,0x5e8,0x129f,0x5e8,0x5e8,0x5e8,0x5f1, -0x5f1,0x5f1,0x5f1,0x1326,0x1326,0x5e8,0x5eb,0x5eb,0x5ee,0x5e8,0x5e8,0x5e8,0xbf7,0xbf4,0xbf7,0xbf4, -0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0x732,0x732,0x732,0x732,0x732,0x732, -0x732,0x732,0x732,0x732,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x5e8,0x5e8,0x5e8,0x5e8,0x13a4,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x5e8,0x5e8,0x5e8,0x13a4,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x60f,0x60f,0x60f,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0x615,0x615,0x95a,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x60c,0x60c, -0xbfa,0xd7d,0x1b21,0x1b21,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x612,0x618,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f, -0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x615,0x60f,0x612,0x618,0x615,0x60f,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x615,0x60f,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, -0x615,0x60f,0x615,0x60f,0x615,0x60f,0x612,0x618,0x612,0x618,0x615,0x60f,0x615,0x60f,0x615,0x60f, -0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x612,0x615,0x60f,0x612,0x615,0x60f,0x612,0x618, -0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x60f,0x615,0x918,0x91b,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21, -0x1b21,0x1b21,0x1b21,0x1b21,0x612,0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x60f,0x612,0x60f,0x60f, -0x612,0x612,0x60f,0x60f,0x612,0x612,0x60f,0x612,0x60f,0x612,0x60f,0x60f,0x612,0x60f,0x60f,0x612, -0x60f,0x612,0x60f,0x60f,0x612,0x60f,0x612,0x612,0x60f,0x60f,0x60f,0x612,0x60f,0x60f,0x60f,0x60f, -0x60f,0x612,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x60f,0x60f,0x612,0x60f,0x612,0x60f, -0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x618,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x61b,0x61b,0x61b,0x61b,0xfe1,0xfe1,0xfe1,0x14e5, -0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x16ef,0x16ef,0x864,0x86a,0x86a,0x876,0x876,0x867,0x85e,0x867, -0x85e,0x867,0x85e,0x867,0x85e,0x867,0x85e,0x867,0x62a,0x62a,0x624,0x62a,0x624,0x62a,0x624,0x62a, -0x624,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a,0x624,0x627, -0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a,0x624,0x62a,0x624,0x62a, -0x624,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627, -0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627, -0x62d,0x62a,0x624,0x627,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714, -0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a, -0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x717,0x717,0x717,0x717, -0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x738,0x738,0x738,0x738, -0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738, -0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0xc48,0x8c7,0x8be,0x8bb, -0x8c1,0x8c4,0x74d,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x8cd,0x74d,0x74d,0x74d, -0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d, -0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x8ca,0x8ca, -0x753,0x8dc,0x8df,0x8e5,0x80a,0x816,0x8fa,0x813,0x8d3,0x8d0,0x8d3,0x8d0,0x8d9,0x8d6,0x8d9,0x8d6, -0x8d3,0x8d0,0x810,0x8e5,0x8d3,0x8d0,0x8d3,0x8d0,0x8d3,0x8d0,0x8d3,0x8d0,0x8eb,0x8f1,0x8ee,0x8ee, -0x759,0x795,0x795,0x795,0x795,0x795,0x795,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f, -0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x75c,0x777,0x756,0x77d,0x780, -0x77a,0x792,0x792,0x792,0x792,0x792,0x792,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c, -0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x75c,0x777,0x756,0x777,0xc4b, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x1299,0x1299,0x1299,0x1299,0x1299,0x7fb,0x810,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x813,0x813,0x933,0x933,0x933,0x933,0x819,0x819,0x8e8,0x8f7,0x8f7,0x8f7,0x8f7,0x8f4,0x80d,0x8e2, -0xb1c,0xb1c,0xb1c,0xc5d,0xc7b,0xc78,0xb3a,0x8b8,0x81f,0x81c,0x81f,0x822,0x81c,0x81f,0x81c,0x81f, -0x81c,0x81f,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81f,0x81f,0x81c,0x81f,0x81f,0x81c,0x81f,0x81f, -0x81c,0x81f,0x81f,0x81c,0x81f,0x81f,0x81c,0x81c,0xc7e,0x831,0x82b,0x831,0x82b,0x831,0x82b,0x831, -0x82b,0x831,0x82b,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b, -0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x831,0x82b,0x82e,0x82b,0x82e, -0x82b,0x82e,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82e,0x82e,0x82b,0x82e,0x82e,0x82b,0x82e,0x82e, -0x82b,0x82e,0x82e,0x82b,0x82e,0x82e,0x82b,0x82b,0x82b,0x82b,0x82b,0x831,0x82b,0x831,0x82b,0x831, -0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x831,0x82b,0x82b,0x82b,0x82b,0x82b,0x82e,0x831,0x831,0x82e, -0x82e,0x82e,0x82e,0x900,0x903,0x834,0x837,0xc66,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x840,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849, -0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849, -0xd62,0xd62,0xe91,0x843,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0xd5c,0xd5c,0xd5c,0xd5c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c, -0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c, -0x84c,0x84c,0x84c,0x1a6a,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0xd65,0xd65,0xd65,0xd65,0x915, -0x915,0x915,0x915,0x915,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, -0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, -0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0xd65,0xd65,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, -0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, -0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, -0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, -0x855,0x855,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94, -0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0x110a,0x110a,0x110a,0x110a,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x85b,0x85b, -0x858,0x85b,0x858,0x85b,0x85b,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x85b, -0x858,0x85b,0x858,0x85b,0x85b,0x858,0x858,0x85b,0x85b,0x85b,0x858,0x858,0x858,0x858,0x14a0,0x14a0, -0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0x12d8,0x12d8,0x12d8,0x12d8,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0xd5c,0xc69,0xc69,0xc69, -0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0xc69,0xc69,0xc69, -0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0xd65,0x99c,0x97e,0x97e,0x97e, -0x97e,0x978,0x97e,0x97e,0x990,0x97e,0x97e,0x97b,0x987,0x98d,0x98d,0x98d,0x98d,0x98d,0x990,0x978, -0x984,0x978,0x978,0x978,0x96c,0x96c,0x978,0x978,0x978,0x978,0x978,0x978,0x993,0x993,0x993,0x993, -0x993,0x993,0x993,0x993,0x993,0x993,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x97b,0x96c,0x978,0x96c,0x978,0x96c,0x98a,0x981,0x98a,0x981,0x999,0x999,0x9a8,0x9a8,0x9a8,0x9a8, -0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8, -0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b1,0x9b1,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9b4,0x9b4,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9bd,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9bd,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0xa4d,0xa4d,0xfc6,0xa4d,0xa4d,0xa4d,0xa50,0xa4d,0xfc6,0xa4d,0xa4d,0xfbd, -0xa47,0xa3b,0xa3b,0xa3b,0xa3b,0xa4a,0xa3b,0xfae,0xfae,0xfae,0xa3b,0xa3e,0xa47,0xa41,0xfb4,0xfc0, -0xfc0,0xfae,0xfae,0xfc6,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xa53,0xa53, -0xa44,0xa44,0xa44,0xa44,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4a,0xa4a,0xa3b,0xa3b,0xfc6,0xfc6, -0xfc6,0xfc6,0xfae,0xfae,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d, -0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d, -0xa4d,0xa4d,0xa4d,0xa4d,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6b,0xa71,0xa6e, -0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143, -0x1140,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e, -0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e, -0xa6e,0xa6e,0xa6e,0xa6e,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa83,0xa83,0xa83,0xaa7,0xaa7,0xaa7,0xaaa,0xaaa,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xa8f,0xa8f,0xaa4,0xa86,0xa86,0xa86,0xa86,0xa86, -0xa86,0xa86,0xaa4,0xaa4,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xacb,0xacb,0xacb,0xacb,0xacb,0xab6,0xab6,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xace, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xafb,0xafb,0xafb,0xafb, -0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, -0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0x13aa,0x13aa,0x13aa,0x1ae5,0x1ae5,0x1ae5,0x1ae5,0x1ae5,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0x1ae8,0x1ae8, -0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb28,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5eb,0x5eb,0x5eb,0x5eb,0x5e8,0x5e8,0x5e8,0x5e8, +0x5e8,0x5e8,0x5eb,0x5eb,0x5eb,0x5eb,0x5e8,0x5ee,0x5e8,0x5e8,0xc5d,0xc5d,0xc5d,0xc5d,0xc5d,0xc5d, +0xc5d,0xc5d,0xc5d,0xc5d,0xc5d,0xc5d,0xc5d,0xc5d,0x5fa,0xb6d,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa, +0x603,0x600,0x603,0x600,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x75c,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa, +0x5fa,0x5fa,0x84c,0x84c,0x5fa,0x5fa,0x5fa,0x5fa,0x5fd,0x5fd,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa, +0x5fa,0x852,0x84f,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa, +0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa, +0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0xb6d,0xc63,0xb6d,0xb6d,0xb6d,0x606,0x606,0x606,0x606, +0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606, +0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x765,0x765,0x765,0x765, +0x765,0x765,0x765,0x765,0x765,0x765,0x60c,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0, +0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xcc0,0xdd1,0x76b,0x76b,0x76b,0x76b, +0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b, +0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x76b,0x76b,0x76b,0x76b, +0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x612,0x612,0x612,0x612,0x76b,0x76b,0x76b,0x76b, +0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76e,0x76e,0x76e,0x76e, +0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x615,0x615,0x76e,0x76e, +0x76e,0x76e,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0x774,0x774,0x618,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x618,0x618,0x618,0x618,0x61b,0x61b,0x61b,0x61b,0x774,0x774, +0x61b,0x61b,0x774,0x774,0x618,0x618,0x618,0x618,0x774,0x774,0x61b,0x61b,0x774,0x774,0x618,0x618, +0x618,0x618,0x774,0x774,0x771,0x618,0x61b,0x774,0x618,0x618,0x771,0x774,0x774,0x774,0x61b,0x61b, +0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x774,0x771, +0x774,0x771,0x618,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x618,0x618,0x771,0xb73,0xb73,0xb73,0xb73, +0xb73,0xb73,0xb73,0xb73,0xc69,0xc69,0xc69,0xc69,0xc69,0xcd8,0xcd8,0xc69,0x621,0x621,0x621,0x621, +0x61e,0x77d,0x77d,0x61e,0x61e,0x777,0x61e,0x61e,0x61e,0x61e,0x777,0x777,0x61e,0x61e,0x61e,0x61e, +0xdda,0xdda,0xc6c,0xc6c,0xe61,0xb76,0x621,0x621,0x77a,0x624,0x77a,0x621,0x61e,0x61e,0x61e,0x61e, +0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e, +0x61e,0x61e,0x61e,0x61e,0x61e,0x621,0x621,0x621,0x61e,0x61e,0x61e,0x61e,0x77d,0x61e,0x77d,0x61e, +0x61e,0x61e,0x61e,0x61e,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, +0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x61e,0x77d,0x77d,0x627,0x77d, +0x777,0x777,0x61e,0x777,0x77a,0x777,0x777,0x61e,0x777,0x77d,0x627,0x77d,0xb76,0xb76,0xc6f,0xc6f, +0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xe5e,0xf1b,0x62a,0x62a,0x62a,0x62a, +0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a, +0x62d,0x1473,0x1473,0x1473,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x15b4,0x633,0x633,0x633, +0x633,0x1473,0x62d,0x62d,0x633,0x633,0x1476,0x1476,0x639,0x639,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d, +0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x1473,0x62d,0x62d,0x62d, +0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d, +0x62d,0x783,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d, +0x1473,0x62d,0x1473,0x62d,0x62d,0x62d,0x62d,0x1473,0x1473,0x1473,0x62d,0x1368,0x62d,0x62d,0x62d,0x636, +0x636,0x636,0x636,0x13ef,0x13ef,0x62d,0x630,0x630,0x633,0x62d,0x62d,0x62d,0xc75,0xc72,0xc75,0xc72, +0xc75,0xc72,0xc75,0xc72,0xc75,0xc72,0xc75,0xc72,0xc75,0xc72,0x780,0x780,0x780,0x780,0x780,0x780, +0x780,0x780,0x780,0x780,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d, +0x62d,0x62d,0x62d,0x62d,0x1473,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d, +0x62d,0x62d,0x62d,0x1473,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x651,0x651,0x651,0x651,0x651,0x651,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7, +0xbc7,0xbc7,0xbc7,0xbc7,0x65a,0x65a,0x9ae,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x651,0x651, +0xc78,0xdfe,0x1c0e,0x1c0e,0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654, +0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654, +0x657,0x65d,0x65a,0x654,0x65a,0x654,0x65a,0x654,0x65a,0x654,0x65a,0x654,0x65a,0x654,0x65a,0x654, +0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654, +0x65a,0x654,0x657,0x65d,0x65a,0x654,0x65a,0x654,0x657,0x65d,0x65a,0x654,0x657,0x65d,0x65a,0x654, +0x65a,0x654,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2, +0x65a,0x654,0x65a,0x654,0x65a,0x654,0x657,0x65d,0x657,0x65d,0x65a,0x654,0x65a,0x654,0x65a,0x654, +0x65a,0x654,0x65a,0x654,0x65a,0x654,0x65a,0x654,0x657,0x65a,0x654,0x657,0x65a,0x654,0x657,0x65d, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657, +0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d, +0x654,0x65a,0x96c,0x96f,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e, +0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x657,0x654,0x657,0x657,0x657,0x657,0x657,0x657,0x654,0x657,0x654,0x654, +0x657,0x657,0x654,0x654,0x657,0x657,0x654,0x657,0x654,0x657,0x654,0x654,0x657,0x654,0x654,0x657, +0x654,0x657,0x654,0x654,0x657,0x654,0x657,0x657,0x654,0x654,0x654,0x657,0x654,0x654,0x654,0x654, +0x654,0x657,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x657,0x657,0x654,0x654,0x657,0x654,0x657,0x654, +0x654,0x654,0x654,0x654,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657, +0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657, +0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d, +0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x660,0x660,0x660,0x660,0x1089,0x1089,0x1089,0x15b7, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x17cd,0x17cd,0x8b5,0x8bb,0x8bb,0x8c7,0x8c7,0x8b8,0x8af,0x8b8, +0x8af,0x8b8,0x8af,0x8b8,0x8af,0x8b8,0x8af,0x8b8,0x66f,0x66f,0x669,0x66f,0x669,0x66f,0x669,0x66f, +0x669,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66f,0x669,0x66c, +0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66f,0x669,0x66f,0x669,0x66f, +0x669,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66c, +0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66c,0x672,0x66f,0x669,0x66c, +0x672,0x66f,0x669,0x66c,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762, +0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x768,0x768,0x768,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x765,0x765,0x765,0x765, +0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x76b,0x76b,0x76b,0x76b, +0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b, +0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x76b,0x786,0x786,0x786,0x786, +0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786, +0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0xcc6,0x918,0x90f,0x90c, +0x912,0x915,0x79b,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x91e,0x79b,0x79b,0x79b, +0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b, +0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x91b,0x91b, +0x7a1,0x92d,0x930,0x936,0x858,0x867,0x94e,0x864,0x924,0x921,0x924,0x921,0x92a,0x927,0x92a,0x927, +0x924,0x921,0x85e,0x936,0x924,0x921,0x924,0x921,0x924,0x921,0x924,0x921,0x93c,0x942,0x945,0x93f, +0x7a7,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd, +0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7aa,0x7c5,0x7a4,0x7cb,0x7ce, +0x7c8,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da, +0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7aa,0x7c5,0x7a4,0x7c5,0xcc9, +0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, +0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, +0x846,0x846,0x1362,0x1362,0x1362,0x1362,0x1362,0x849,0x85e,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x987,0x987,0x987,0x987,0x86a,0x86a,0x939,0x94b,0x94b,0x94b,0x94b,0x948,0x85b,0x933, +0xb9a,0xb9a,0xb9a,0xcdb,0xcf9,0xcf6,0xbb8,0x909,0x870,0x86d,0x870,0x873,0x86d,0x870,0x86d,0x870, +0x86d,0x870,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x870,0x870,0x86d,0x870,0x870,0x86d,0x870,0x870, +0x86d,0x870,0x870,0x86d,0x870,0x870,0x86d,0x86d,0xcfc,0x882,0x87c,0x882,0x87c,0x882,0x87c,0x882, +0x87c,0x882,0x87c,0x87c,0x87f,0x87c,0x87f,0x87c,0x87f,0x87c,0x87f,0x87c,0x87f,0x87c,0x87f,0x87c, +0x87f,0x87c,0x87f,0x87c,0x87f,0x87c,0x87f,0x87c,0x87f,0x87c,0x87f,0x882,0x87c,0x87f,0x87c,0x87f, +0x87c,0x87f,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87f,0x87f,0x87c,0x87f,0x87f,0x87c,0x87f,0x87f, +0x87c,0x87f,0x87f,0x87c,0x87f,0x87f,0x87c,0x87c,0x87c,0x87c,0x87c,0x882,0x87c,0x882,0x87c,0x882, +0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x882,0x87c,0x87c,0x87c,0x87c,0x87c,0x87f,0x882,0x882,0x87f, +0x87f,0x87f,0x87f,0x954,0x957,0x885,0x888,0xce4,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e, +0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e, +0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x891,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e, +0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e, +0x88e,0x88e,0x88e,0x88e,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a, +0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a, +0xde3,0xde3,0xf1e,0x894,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960, +0xddd,0xddd,0xddd,0xddd,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d, +0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d, +0x89d,0x89d,0x89d,0x1b51,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966, +0x966,0x966,0x966,0x966,0x966,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0xde6,0xde6,0xde6,0xde6,0x969, +0x969,0x969,0x969,0x969,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0, +0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0, +0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0xde6,0xde6,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3, +0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3, +0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966, +0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6, +0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6, +0x8a6,0x8a6,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21, +0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0x11d0,0x11d0,0x11d0,0x11d0,0x8a9,0x8a9,0x8a9,0x8a9, +0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9, +0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8ac,0x8ac, +0x8a9,0x8ac,0x8a9,0x8ac,0x8ac,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8ac, +0x8a9,0x8ac,0x8a9,0x8ac,0x8ac,0x8a9,0x8a9,0x8ac,0x8ac,0x8ac,0x8a9,0x8a9,0x8a9,0x8a9,0x1572,0x1572, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, +0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960, +0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960, +0x13a1,0x13a1,0x13a1,0x13a1,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0xddd,0xce7,0xce7,0xce7, +0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0x963,0x963,0x963,0x963, +0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963, +0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0xce7,0xce7,0xce7, +0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0x966,0x966,0x966,0x966, +0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966, +0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0xde6,0x9fc,0x9d8,0x9d8,0x9d8, +0x9d8,0x9d2,0x9d8,0x9d8,0x9ed,0x9d8,0x9d8,0x9e7,0x9e4,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ed,0x9d2, +0x9de,0x9d2,0x9d2,0x9d2,0x9c0,0x9c0,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9f0,0x9f0,0x9f0,0x9f0, +0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, +0x9d5,0x9c6,0x9d2,0x9c6,0x9d2,0x9c3,0x9e1,0x9db,0x9e1,0x9db,0x9f6,0x9f6,0xa05,0xa05,0xa05,0xa05, +0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05, +0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa08,0xa08,0xa08,0xa08, +0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08, +0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa0b,0xa0b,0xa0b,0xa0b, +0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, +0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa14,0xa14,0xa14,0xa14, +0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14, +0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa0e,0xa0e,0xa17,0xa17,0xa17,0xa17, +0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17, +0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa11,0xa11,0xa14,0xa14,0xa14,0xa14, +0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14, +0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa17,0xa17,0xa17,0xa17, +0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17, +0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa1a,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1a,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xabf,0xabf,0x106b,0xabf,0xabf,0xabf,0xac2,0xabf,0x106b,0xabf,0xabf,0x1062, +0xab9,0xaad,0xaad,0xaad,0xaad,0xabc,0xaad,0x1053,0x1053,0x1053,0xaad,0xab0,0xab9,0xab3,0x1059,0x1065, +0x1065,0x1053,0x1053,0x106b,0xbbe,0xbbe,0xbbe,0xbbe,0xbbe,0xbbe,0xbbe,0xbbe,0xbbe,0xbbe,0xac5,0xac5, +0xab6,0xab6,0xab6,0xab6,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabc,0xabc,0xaad,0xaad,0x106b,0x106b, +0x106b,0x106b,0x1053,0x1053,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, +0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, +0xabf,0xabf,0xabf,0xabf,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xe40,0xad4,0xad4,0xad4,0xad4, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xe40, +0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xadd,0xae3,0xae0, +0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, +0x1206,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0, +0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0, +0xae0,0xae0,0xae0,0xae0,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5, +0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5, +0xaf5,0xaf5,0xaf5,0xaf5,0xb25,0xb25,0xb25,0xb28,0xb28,0xb25,0xb25,0xb25,0xb22,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb0a,0xb0a,0xb1f,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xb1f,0xb1f,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, 0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb2b,0xb2b,0xc6c,0xc6c,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, -0xb2b,0xb2b,0xb2b,0xb2b,0xc6c,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, -0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, -0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0x14e8, -0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xcf0,0xcf0,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xced,0xced,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd3b,0xd3b,0xd3b,0xd3b,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58, -0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58, -0xb58,0xb58,0xb58,0xb58,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, -0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, -0xb5b,0xb5b,0xb5b,0xb5b,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb61,0xb6d,0xb73,0xb73,0xb73,0xb67,0xb67, -0xb67,0xb70,0xb64,0xb64,0xb64,0xb64,0xb64,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb6a,0xb6a,0xb73,0xb73,0xb73,0xb67,0xb67,0xb73,0xb73,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb73,0xb73,0xb73,0xb73,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, -0xb6a,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0x16f2,0x16f2, -0xb7f,0xb76,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb76,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb76,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb76,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb76,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, +0xb25,0xb25,0xb25,0xb25,0xb49,0xb49,0xb49,0xb49,0xb49,0xb34,0xb34,0xb49,0xb49,0xb49,0xb49,0xb49, +0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, +0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb4c, +0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, +0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb6d,0xb6d,0xb6d,0xb6d, +0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d, +0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xc63,0xc63,0xc63,0xc63,0xc63,0xb79,0xb79,0xb79,0xb79, 0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb88,0xb88,0xb88,0xb88, -0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88, -0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0x1aee, -0x1aee,0x1aee,0x1aee,0x1aee,0x1aee,0x1aee,0x1bba,0x1bba,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, +0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb8b,0xb8b,0xb8b,0xb8b, 0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, -0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, -0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe2,0xbe5, -0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xce4, -0xce7,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xeeb,0xeeb,0xeeb,0xeeb, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xdd7,0xe8b,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xfdb,0x1278,0x1278, -0xde0,0xde0,0xde0,0xde0,0xde0,0xde6,0xde3,0xefd,0xefd,0xefd,0xefd,0x13e9,0xfed,0x13e9,0x1332,0x1332, -0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24, -0xc24,0xc24,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0x1104,0x1101,0xff3,0xff0,0xc27,0xc27,0xc27,0xc27, -0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc2a,0xc2a,0xc2a,0xc2a, -0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a, -0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2d,0xc2d,0xc2d,0xc33, -0xc30,0xc57,0xc54,0xc33,0xc30,0xc33,0xc30,0xc33,0xc30,0xc33,0xc30,0xc33,0xc30,0xc33,0xc30,0xc33, -0xc30,0xc33,0xc30,0xc33,0xc30,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc33,0xc30,0xc33,0xc30,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc33,0xc30,0xc2d,0xc2d,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc3c,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc3c,0xc3c,0xc3c,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc39,0xc36,0xc36,0xc36, -0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f, -0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f, -0xcea,0xd56,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xe8b,0xe8b,0xdd7,0xdd7,0xdd7,0xdd7, -0xdd7,0xdd7,0xeee,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0x129c,0x129c,0x127b, -0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, -0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, -0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd14,0xd14,0xd14,0xd14,0xd14,0xd11,0xd26,0xd26,0xd26,0xd20, -0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd20,0xd26,0xd26,0xd26,0xd26, -0xd1a,0xd1a,0xd23,0xd23,0xd23,0xd23,0xd17,0xd17,0xd17,0xd17,0xd17,0xd1d,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xde9,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, -0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd20,0xd26, -0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd1a,0xd1a,0xd1a, -0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, -0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, -0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xdef,0xdef, -0xdef,0xdef,0xdef,0xdef,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0x110d,0x110d,0xff6,0xff6,0xff6, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, -0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, -0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xebb,0xebb,0xe0d,0xe0d,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0x1002,0x1002,0x1005,0x1002,0x1002, -0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff, -0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19, -0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19, -0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, -0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0x1b30, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0x1b2d, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46, -0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xf06,0xf06,0xf06,0xf06,0x1008,0x1008,0x1008,0x1008,0x1008, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, -0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe5b, -0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e, -0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe67,0xe67, -0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe64,0xe6d,0x1014,0x100e,0x101d,0x100b,0xe6a,0xe6a,0x100b,0x100b, -0xe7c,0xe7c,0xe70,0xe7c,0xe7c,0xe7c,0xe73,0xe7c,0xe7c,0xe7c,0xe7c,0xe70,0xe7c,0xe7c,0xe7c,0xe7c, +0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb9d,0xb9d,0xb9d,0xb9d, +0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, +0xb9d,0xb9d,0xb9d,0xb9d,0x1479,0x1479,0x1479,0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1bd2,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0x1bd5,0x1bd5, +0x1bd5,0x1bd5,0x1bd5,0x1bd5,0x1bd5,0x1bd5,0x1bd5,0x1bd5,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba6,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba9,0xba9,0xcea,0xcea,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, +0xba9,0xba9,0xba9,0xba9,0xcea,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, +0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd, +0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0x15ba, +0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xd71,0xd71,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, +0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, +0xbd3,0xbd3,0xd6e,0xd6e,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc, +0xdbc,0xdbc,0xdbc,0xdbc,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6, +0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6, +0xbd6,0xbd6,0xbd6,0xbd6,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, +0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, +0xbd9,0xbd9,0xbd9,0xbd9,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbdf,0xbeb,0xbf1,0xbf1,0xbf1,0xbe5,0xbe5, +0xbe5,0xbee,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbf1, +0xbf1,0xbf1,0xbf1,0xbf1,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe8,0xbe8,0xbf1,0xbf1,0xbf1,0xbe5,0xbe5,0xbf1,0xbf1,0xbf1, +0xbf1,0xbf1,0xbf1,0xbf1,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbf1,0xbf1,0xbf1,0xbf1,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8, +0xbe8,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0x17d0,0x17d0, +0xbfd,0xbf4,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbf4,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbf4,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbf4,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbf4,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfd,0xbfd,0xbfd,0xbfd,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc06,0xc06,0xc06,0xc06, +0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06, +0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0x1bdb, +0x1bdb,0x1bdb,0x1bdb,0x1bdb,0x1bdb,0x1bdb,0x1ca7,0x1ca7,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63, +0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc60,0xc63, +0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xd65, +0xd68,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xf78,0xf78,0xf78,0xf78, +0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd6b,0xe5e,0xf18,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0x1083,0x1341,0x1341, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe6d,0xe6a,0xf8a,0xf8a,0xf8a,0xf8a,0x14b8,0x1095,0x14b8,0x13fb,0x13fb, +0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2, +0xca2,0xca2,0xccf,0xccc,0xccf,0xccc,0xccf,0xccc,0x11ca,0x11c7,0x109b,0x1098,0xca5,0xca5,0xca5,0xca5, +0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca8,0xca8,0xca8,0xca8, +0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8, +0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xcab,0xcab,0xcab,0xcb1, +0xcae,0xcd5,0xcd2,0xcb1,0xcae,0xcb1,0xcae,0xcb1,0xcae,0xcb1,0xcae,0xcb1,0xcae,0xcb1,0xcae,0xcb1, +0xcae,0xcb1,0xcae,0xcb1,0xcae,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, +0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, +0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcb1,0xcae,0xcb1,0xcae,0xcab,0xcab,0xcab,0xcab, +0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, +0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcb1,0xcae,0xcab,0xcab,0xcb4,0xcb4,0xcb4,0xcb4, +0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcba,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcba,0xcba,0xcba,0xcb4, +0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb7,0xcb4,0xcb4,0xcb4, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, +0xd6b,0xdd7,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xf18,0xf18,0xe5e,0xe5e,0xe5e,0xe5e, +0xe5e,0xe5e,0xf7b,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1365,0x1365,0x1344, +0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f, +0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f, +0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd95,0xd95,0xd95,0xd95,0xd95,0xd92,0xda7,0xda7,0xda7,0xda1, +0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda1,0xda7,0xda7,0xda7,0xda7, +0xd9b,0xd9b,0xda4,0xda4,0xda4,0xda4,0xd98,0xd98,0xd98,0xd98,0xd98,0xd9e,0xe73,0xe73,0xe73,0xe73, +0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe70,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73, +0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda1,0xda7, +0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xda7,0xd9b,0xd9b,0xd9b, +0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e, +0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e, +0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xe76,0xe76, +0xe76,0xe76,0xe76,0xe76,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x11d3,0x11d3,0x109e,0x109e,0x109e, +0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad, +0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad, +0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3, +0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3, +0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc, +0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc, +0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, +0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, +0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, +0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, 0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, -0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, -0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, -0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97, -0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97, -0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8, -0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, -0xeeb,0xeeb,0xeeb,0xee8,0xee8,0xee8,0xee8,0xee8,0x114f,0x139b,0x139b,0x139b,0x139b,0x131d,0x131d,0x131d, -0x139e,0x1320,0x1320,0x139e,0x14df,0x14df,0x14df,0x14df,0x14df,0x14df,0x14df,0x17a6,0x17a6,0x17a6,0x17a6,0x186c, -0xf00,0xf00,0xf00,0xf00,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6, -0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9, -0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fd,0x1875,0x1875,0x18f6,0x1875,0x1bd8,0x17ac,0x1335,0x1158,0xf03,0xf03, -0xf21,0xf21,0xf21,0xf21,0xf33,0xf3c,0xf3f,0xf3c,0xf3f,0xf3c,0xf3f,0xf3c,0xf3f,0xf3c,0xf3f,0xf3c, -0xf3c,0xf3c,0xf3f,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c, -0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf24,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf36, -0xf21,0xf36,0xf33,0xf33,0xf48,0xf45,0xf48,0xf48,0xf48,0xf45,0xf45,0xf48,0xf45,0xf48,0xf45,0xf48, -0xf45,0x102f,0x102f,0x102f,0x116d,0x1026,0x102f,0x1026,0xf45,0xf48,0xf45,0xf45,0x1026,0x1026,0x1026,0x1026, -0x1029,0x102c,0x116d,0x116d,0xf4b,0xf4b,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1041,0x1038,0x1041,0x1038,0x1038,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1041,0x1038,0x1041,0x1038,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51, -0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51, -0xf51,0xf51,0xf51,0xf51,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60, -0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60, -0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66, -0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66, -0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xfae,0xfc6,0xfbd,0xfc3,0xfc3,0xfc6,0xfc6,0xfbd, -0xfbd,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc6,0xfc6,0xfc6,0xfae,0xfae,0xfae,0xfae,0xfc6,0xfc6,0xfc6, -0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfae,0xfbd,0xfc0,0xfae,0xfae,0xfc3, -0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfb1,0xfc6,0xfc3,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba, -0xfba,0xfba,0x1137,0x1137,0x1134,0x1131,0xfb7,0xfb7,0xfde,0xfde,0xfde,0xfde,0x129c,0x129c,0x127b,0x127b, -0x127b,0x1278,0x1278,0x1278,0x1278,0x127b,0x13a1,0x127b,0x127b,0x127b,0x1278,0x127b,0x129c,0x1278,0x1278,0x1278, -0x127b,0x127b,0x1278,0x1278,0x127b,0x1278,0x1278,0x127b,0xff9,0xff9,0xff9,0xff9,0xff9,0xff6,0xff6,0xff9, -0xff9,0xff9,0xff9,0xff9,0xff9,0x14f4,0x14f4,0x14f4,0x110d,0xff6,0xff6,0xff6,0xff6,0x12a8,0x1284,0x1284, -0x1284,0x1284,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x101a,0x101a,0x1017,0x1011,0x1017,0x1011,0x1017,0x1011, -0x1017,0x1011,0x100e,0x100e,0x100e,0x100e,0x1023,0x1020,0x100e,0x116a,0x13f5,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13fb,0x13fb,0x150f,0x1503,0x1503,0x1500,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1035,0x1032,0x1032,0x1041,0x1038,0x1341,0x133e,0x16fb,0x1341,0x133e,0x1404,0x1401,0x1512,0x1512,0x1518,0x1512, -0x1518,0x1512,0x1518,0x1512,0x1518,0x1512,0x1518,0x1512,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x103b,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038, -0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1041,0x1038,0x1044,0x1044,0x104a,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x104a,0x1044,0x1044,0x1044,0x1044,0x104a,0x104a, -0x1044,0x1044,0x104d,0x140d,0x140a,0x140a,0x1050,0x1050,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, -0x1047,0x1047,0x1410,0x1410,0x1410,0x1410,0x1410,0x1410,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, -0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, -0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e, -0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e, -0x1071,0x1071,0x1071,0x1074,0x1071,0x1071,0x1077,0x1077,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083, -0x1083,0x1083,0x1083,0x1083,0x1086,0x107d,0x108c,0x1089,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083, -0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083, -0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1347,0x1344,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098, -0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109b,0x111f,0x108f,0x108f,0x108f,0x1095,0x1413,0x1413,0x1413,0x1413, -0x1413,0x1413,0x1413,0x1413,0x1092,0x1092,0x1095,0x10a1,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098, -0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098, -0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x1527,0x1524,0x1527,0x1524,0x152a,0x152a,0x1704,0x1413, -0x10aa,0x10aa,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad, -0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad, -0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b6,0x10b6,0x10b6,0x1116,0x10bf,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10b9,0x10b9,0x10b9,0x10b9, -0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10fb,0x10fb,0x10fb,0x10fb, -0x1110,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb, -0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fe,0x10fe,0x10fe,0x10fe, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x110a,0x110a,0x110a,0x110a, -0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x149d,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, -0x1785,0x1785,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x117f,0x117f,0x117f,0x117f, -0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f, -0x117f,0x117f,0x1176,0x1176,0x1179,0x1179,0x117f,0x1176,0x1176,0x1176,0x1176,0x1176,0x1185,0x1185,0x1185,0x1185, -0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185, -0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11ac,0x11ac,0x11ac,0x11ac, -0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, -0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11a9,0x11af,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11c1,0x11c1,0x11c1,0x11c1, -0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x12ed,0x11c7,0x12f0, -0x11c7,0x11c7,0x11c7,0x11c7,0x11c4,0x11c4,0x11c4,0x11c7,0x1707,0x170a,0x1932,0x192f,0x11ca,0x11ca,0x11ca,0x11d9, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11cd, -0x11d9,0x11d9,0x11ca,0x11ca,0x11ca,0x11ca,0x11d9,0x11d9,0x11ca,0x11ca,0x11d9,0x11d9,0x11eb,0x11eb,0x11eb,0x11eb, -0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11ee,0x11eb,0x11eb,0x11eb, -0x11eb,0x11eb,0x11eb,0x11e5,0x11e5,0x11e5,0x11eb,0x11e8,0x1530,0x1533,0x1536,0x1536,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11f1,0x11fd,0x11f1,0x11f1, -0x11f1,0x1206,0x1206,0x11f1,0x11f1,0x1206,0x11fd,0x1206,0x1206,0x11fd,0x11f1,0x11f4,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x1218,0x1218,0x1218,0x1218, -0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218, -0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1230,0x1230,0x1230,0x1230, -0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230, -0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x122d,0x122d,0x122d,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1248,0x1248,0x1248,0x1248, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, +0xe82,0xe82,0xe82,0xe82,0xe82,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, +0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, +0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, +0xf48,0xf48,0xe94,0xe94,0xf90,0xf90,0xf90,0xf90,0xf90,0xf90,0xf90,0x10ad,0x10ad,0x10b0,0x10b3,0x10ad, +0x10a7,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, +0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0, +0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0,0xea3,0xea0, +0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf, +0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf, +0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0x1c1d, +0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2, +0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0x1c1a, +0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5, +0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5, +0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0xecd, +0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0xf93,0xf93,0xf93,0xf93,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6, +0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6, +0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6, +0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf, +0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xedf, +0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8, +0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee8,0xee2, +0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5, +0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee8,0xee8,0xee8,0xee8,0xee8, +0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef1,0xef1, +0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xeee,0xef7,0x10c2,0x10bc,0x10ce,0x10b9,0xeeb,0xeeb,0x10b9,0x10b9, +0xf06,0xf06,0xefa,0xf06,0xf06,0xf06,0xefd,0xf06,0xf06,0xf06,0xf06,0xefa,0xf06,0xf06,0xf06,0xf06, +0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06, +0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24, +0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24, +0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0xf78,0xf78,0xf78,0xf75,0xf75,0xf75,0xf75,0xf75,0x1215,0x146a,0x146a,0x146a,0x146a,0x13e6,0x13e6,0x13e6, +0x146d,0x13e9,0x13e9,0x146d,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x1884,0x1884,0x1884,0x1884,0x194a, +0xf8d,0xf8d,0xf8d,0xf8d,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, +0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1, +0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2, +0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d5,0x1953,0x1953,0x19d4,0x1953,0x1cc5,0x188a,0x13fe,0x121e,0xf90,0xf90, +0xfb1,0xfb1,0xfb1,0xfb1,0xfc6,0xfcf,0xfd2,0xfcf,0xfd2,0xfcf,0xfd2,0xfcf,0xfd2,0xfcf,0xfd2,0xfcf, +0xfcf,0xfcf,0xfd2,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf, +0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfb4,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfc9, +0xfb1,0xfc9,0xfc6,0xfc6,0xfe1,0xfde,0xfe1,0xfe1,0xfe1,0xfde,0xfde,0xfe1,0xfe4,0xfe7,0xfe4,0xfe7, +0xfe4,0x10da,0x10da,0x10da,0x1236,0x10d7,0x10da,0x10d7,0xfd8,0xfdb,0xfd8,0xfde,0x10dd,0x10dd,0x10dd,0x10dd, +0x10e0,0x10e3,0x1236,0x1236,0xfea,0xfea,0x10f8,0x10f5,0x10f8,0x10f5,0x10f8,0x10f5,0x10f8,0x10f5,0x10f8,0x10f5, +0x10f8,0x10f5,0x10f8,0x10f5,0x10ec,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec, +0x10f2,0x10ec,0x10f2,0x10ec,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0, +0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0, +0xff0,0xff0,0xff0,0xff0,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff, +0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff, +0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005, +0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005, +0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1053,0x106b,0x1062,0x1068,0x1068,0x106b,0x106b,0x1062, +0x1062,0x1068,0x1068,0x1068,0x1068,0x1068,0x106b,0x106b,0x106b,0x1053,0x1053,0x1053,0x1053,0x106b,0x106b,0x106b, +0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x1053,0x1062,0x1065,0x1053,0x1053,0x1068, +0x1068,0x1068,0x1068,0x1068,0x1068,0x1056,0x106b,0x1068,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f, +0x105f,0x105f,0x11fd,0x11fd,0x11fa,0x11f7,0x105c,0x105c,0x1086,0x1086,0x1086,0x1086,0x1365,0x1365,0x1344,0x1344, +0x1344,0x1341,0x1341,0x1341,0x1341,0x1344,0x1470,0x1344,0x1344,0x1344,0x1341,0x1344,0x1365,0x1341,0x1341,0x1341, +0x1344,0x1344,0x1341,0x1341,0x1344,0x1341,0x1341,0x1344,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x109e,0x109e,0x10a1, +0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x15cc,0x15cc,0x15cc,0x11d3,0x109e,0x109e,0x109e,0x109e,0x1371,0x134d,0x134d, +0x134d,0x134d,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x10c8,0x10c8,0x10c5,0x10bf,0x10c5,0x10bf,0x10c5,0x10bf, +0x10c5,0x10bf,0x10cb,0x10cb,0x10cb,0x10cb,0x10d4,0x10d1,0x10cb,0x1233,0x14ca,0x14c7,0x14c7,0x14ca,0x14c4,0x14c4, +0x14c4,0x14ca,0x14cd,0x14cd,0x15e7,0x15db,0x15db,0x15d8,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec, +0x10e9,0x10e6,0x10e6,0x10fe,0x10fb,0x1410,0x140d,0x17d9,0x140a,0x1407,0x14d6,0x14d3,0x15ea,0x15ea,0x15f0,0x15ea, +0x15f0,0x15ea,0x15f0,0x15ea,0x15f0,0x15ea,0x15f0,0x15ea,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec, +0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec, +0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x1101,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec, +0x10ec,0x10f2,0x10ec,0x10f2,0x10ec,0x10f2,0x10f2,0x10ec,0x1104,0x1104,0x110a,0x1110,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x110a,0x1104,0x1104,0x1104,0x1104,0x110a,0x110a, +0x1104,0x1104,0x110d,0x14df,0x14dc,0x14dc,0x1110,0x1110,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, +0x1107,0x1107,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e, +0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e, +0x1131,0x1131,0x1131,0x1134,0x1131,0x1131,0x1137,0x1137,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, +0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, +0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143, +0x1143,0x1143,0x1143,0x1143,0x1149,0x113d,0x114f,0x114c,0x1146,0x1146,0x1146,0x1143,0x1143,0x1143,0x1143,0x1143, +0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143, +0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1416,0x1413,0x1164,0x115e, +0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1161,0x11e5,0x1152,0x1152,0x1152,0x115b, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x1155,0x1155,0x1158,0x1167,0x1164,0x115e,0x1164,0x115e, +0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e, +0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x1164,0x115e,0x15ff,0x15fc,0x15ff,0x15fc, +0x1602,0x1602,0x17e2,0x14e5,0x1170,0x1170,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, +0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, +0x1173,0x1173,0x1173,0x1173,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170, +0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1179,0x1179,0x1179,0x1179,0x1179,0x117c,0x117c,0x117c,0x11dc,0x1185, +0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194, +0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, +0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6, +0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8, +0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8,0x11b8, +0x11c1,0x11c1,0x11c1,0x11c1,0x11d6,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1, +0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1, +0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, +0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, +0x11d0,0x11d0,0x11d0,0x11d0,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x156f,0x1863,0x1863,0x1863, +0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3, 0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x124e,0x124e,0x125a,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1260,0x125d,0x1260,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1260,0x125d,0x125d,0x125d,0x125d,0x125a,0x125a,0x125a,0x124e, -0x124e,0x124e,0x124e,0x125a,0x125a,0x1254,0x1251,0x1257,0x1257,0x1266,0x1263,0x1263,0x1269,0x1269,0x1269,0x1269, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x123f,0x123f,0x1242,0x1242,0x1248,0x123f,0x123f,0x123f,0x123f,0x123f, +0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, +0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, 0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x126f,0x126f,0x126f,0x126c, -0x126c,0x126c,0x1269,0x1269,0x1269,0x1269,0x126c,0x1269,0x1269,0x1269,0x126f,0x126c,0x126f,0x126c,0x1269,0x1269, 0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x126f,0x126c,0x126c,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1be1,0x1a07,0x1a07,0x1a07,0x1a07, -0x1a07,0x1a07,0x1a07,0x1a0a,0x1a04,0x1bf3,0x1bf3,0x1bf3,0x1bf6,0x1bf0,0x1bf6,0x1bf0,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128d,0x128d,0x128d,0x1272,0x1938,0x1398,0x1296,0x1398,0x1398, -0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1296,0x1398,0x1296,0x127b,0x127b,0x1323,0x1278, -0x1323,0x1323,0x1323,0x1323,0x1278,0x1278,0x129c,0x1278,0x1278,0x1278,0x1278,0x1278,0x1278,0x127b,0x129c,0x129c, -0x127b,0x129c,0x1278,0x127b,0x127b,0x127e,0x129c,0x1278,0x1278,0x129c,0x127b,0x127b,0x1395,0x1395,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1287,0x1287,0x1287,0x1287,0x13ad,0x138f,0x1290,0x13ad,0x13ad,0x13ad, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x1836,0x1836,0x1836,0x1836,0x1836,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x1539,0x1539,0x1a88,0x1a88,0x1a88,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x1398,0x1398,0x1296,0x1398, -0x1398,0x1398,0x1296,0x1398,0x1398,0x1398,0x1290,0x1290,0x1290,0x1290,0x1290,0x1392,0x1395,0x1395,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1293,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1293,0x1395,0x1395,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1416,0x1416,0x19e6,0x1a88,0x1a88,0x1a88,0x1395,0x1395,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1395,0x1395,0x1293,0x1395,0x1293,0x1293,0x1395,0x1395,0x1293,0x12b7,0x12b7,0x12b7,0x12b7, -0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7, -0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x1341,0x133e,0x1341,0x133e, -0x1341,0x133e,0x1341,0x133e,0x1341,0x133e,0x1404,0x1518,0x1518,0x1518,0x17b2,0x1926,0x1518,0x1518,0x16fe,0x16fe, -0x16fe,0x16f8,0x16fe,0x16f8,0x1929,0x1926,0x19e3,0x19e0,0x19e3,0x19e0,0x19e3,0x19e0,0x1365,0x1365,0x1365,0x1365, -0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, -0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x137a,0x136b,0x137a,0x1380, -0x1380,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d, -0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x136b,0x136b,0x136b,0x136b, -0x136b,0x136b,0x136b,0x136b,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x13b6,0x13b3,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bc,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bc,0x13bf,0x13bf,0x13bf,0x13bc,0x13bf,0x13bc,0x13bf,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13c2,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bc,0x13bf,0x13bc,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, -0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x1542,0x1542, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1788,0x1788,0x1788, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1788,0x1788,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13c2,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1542,0x1542,0x1545,0x1545,0x13bf,0x13bf,0x13c2,0x13c2,0x13c2,0x16b3,0x13bf,0x13c2, -0x13bf,0x13bf,0x13c2,0x1548,0x1548,0x1545,0x1545,0x1788,0x1788,0x1788,0x1788,0x1788,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1545,0x1545,0x16b3,0x1545,0x1545,0x1545, -0x1788,0x1788,0x1788,0x178b,0x178b,0x178b,0x178b,0x178b,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x13bf,0x1545,0x13c2,0x13c2,0x13bf,0x13bf,0x13c2,0x13c2, -0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2, -0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13bf,0x13bf,0x13bf, -0x13c2,0x13bf,0x13bf,0x13bf,0x13bf,0x13c2,0x13c2,0x13c2,0x13bf,0x13c2,0x13c2,0x13c2,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13c2,0x13bf,0x13c2,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x16b3,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1545,0x1788,0x1419,0x1419,0x1419,0x1419,0x1542,0x1542,0x1542,0x1542, -0x1542,0x1542,0x1545,0x1788,0x1788,0x1788,0x1788,0x170d,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1548,0x1548,0x1545,0x1545,0x1545,0x1545,0x183f,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1545,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x14a3,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x14a3,0x13c5,0x13c5, -0x13c5,0x14a3,0x13c5,0x14a3,0x13c5,0x14a3,0x13c5,0x14a3,0x13c5,0x13c5,0x13c5,0x14a3,0x13c5,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x14a3,0x14a3,0x13c5,0x13c5,0x13c5,0x13c5,0x14a3,0x13c5,0x14a3,0x14a3,0x13c5,0x13c5,0x13c5,0x13c5, -0x14a3,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x16b9,0x16b9,0x178e, -0x178e,0x13c8,0x13c8,0x13c8,0x13c5,0x13c5,0x13c5,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x1638,0x1638,0x1638,0x1638, -0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x13cb,0x13cb,0x13cb,0x13cb, -0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb, -0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13ce, -0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb, -0x13ce,0x13ce,0x13ce,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13d1,0x13d1,0x13d1,0x13d1, -0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1, -0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x17bb,0x17bb,0x17b8,0x1710, -0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x141f,0x141f,0x141f,0x141f, -0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x154e,0x1422,0x1551,0x1422,0x1422, -0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1713, -0x1713,0x1b5d,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x1a8b,0x1a8b,0x142b,0x142b,0x142b,0x143d, -0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d, -0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x1458,0x1458,0x1458,0x1458, -0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458, -0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x145e,0x145e,0x145e,0x145e, -0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e, -0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x19ec,0x1461,0x1461,0x1461,0x1461, -0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, -0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1467,0x1467,0x1473,0x1479, -0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479, -0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1473, -0x1473,0x1473,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1473,0x1476,0x1479,0x147c,0x147c, -0x1479,0x147f,0x147f,0x146a,0x146d,0x1719,0x171c,0x171c,0x171c,0x1557,0x1a94,0x1a91,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1554,0x1722,0x1725,0x171f,0x1728,0x1728,0x149a,0x149a,0x149a,0x149a, +0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275, +0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1272,0x1278, +0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284, +0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284, +0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, +0x128a,0x13b6,0x1290,0x13b9,0x1290,0x1290,0x1290,0x1290,0x128d,0x128d,0x128d,0x1290,0x17e5,0x17e8,0x1a13,0x1a10, +0x1293,0x1293,0x1293,0x12a2,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8, +0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8, +0x12a8,0x12a8,0x12a8,0x1296,0x12a2,0x12a2,0x1293,0x1293,0x1293,0x1293,0x12a2,0x12a2,0x1293,0x1293,0x12a2,0x12a2, +0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4, +0x12b7,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x12ae,0x12ae,0x12ae,0x12b4,0x12b1,0x1608,0x160b,0x160e,0x160e, +0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6, +0x12ba,0x12c6,0x12ba,0x12ba,0x12ba,0x12cf,0x12cf,0x12ba,0x12ba,0x12cf,0x12c6,0x12cf,0x12cf,0x12c6,0x12ba,0x12bd, +0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6, +0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6, +0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1, +0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1, +0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9, +0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f6,0x12f6,0x12f6, +0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302, +0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302, +0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311, +0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311, +0x1317,0x1317,0x1323,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326, +0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1329,0x1326,0x1329,0x1326,0x1326,0x1326, +0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1329,0x1326,0x1326,0x1326,0x1326, +0x1323,0x1323,0x1323,0x1317,0x1317,0x1317,0x1317,0x1323,0x1323,0x131d,0x131a,0x1320,0x1320,0x132f,0x132c,0x132c, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1338,0x1338,0x1338,0x1335,0x1335,0x1335,0x1332,0x1332,0x1332,0x1332,0x1335,0x1332,0x1332,0x1332,0x1338,0x1335, +0x1338,0x1335,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1338,0x1335,0x1335, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1cce, +0x1aee,0x1aee,0x1aee,0x1aee,0x1aee,0x1aee,0x1aee,0x1af1,0x1aeb,0x1ce0,0x1ce0,0x1ce0,0x1ce3,0x1cdd,0x1ce3,0x1cdd, +0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1356,0x1356,0x1356,0x133b,0x1a19, +0x1467,0x135f,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x135f,0x1467,0x135f, +0x1344,0x1344,0x13ec,0x1341,0x13ec,0x13ec,0x13ec,0x13ec,0x1341,0x1341,0x1365,0x1341,0x1341,0x1341,0x1341,0x1341, +0x1341,0x1344,0x1365,0x1365,0x1344,0x1365,0x1341,0x1344,0x1344,0x1347,0x1365,0x1341,0x1341,0x1365,0x1344,0x1344, +0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1350,0x1350,0x1350,0x1350,0x147c,0x145e, +0x1359,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x1914,0x1914,0x1914,0x1914,0x1914, +0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1611,0x1611,0x1b75,0x1b75,0x1b75, +0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, +0x1467,0x1467,0x135f,0x1467,0x1467,0x1467,0x135f,0x1467,0x1467,0x1467,0x1359,0x1359,0x1359,0x1359,0x1359,0x1461, +0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x135c,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x135c, +0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x14e8,0x14e8,0x1acd,0x1b75,0x1b75,0x1b75, +0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x135c,0x1464,0x135c,0x135c,0x1464,0x1464,0x135c, +0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, +0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, +0x140a,0x1407,0x140a,0x1407,0x140a,0x1407,0x140a,0x1407,0x140a,0x1407,0x14d6,0x15f0,0x15f0,0x15f0,0x1890,0x1a04, +0x15f0,0x15f0,0x17dc,0x17dc,0x17dc,0x17d6,0x17dc,0x17d6,0x1a0a,0x1a07,0x1ac4,0x1ac1,0x1ac4,0x1ac1,0x1ac4,0x1ac1, +0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, +0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, +0x1449,0x143a,0x1449,0x144f,0x144f,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c, +0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, +0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, +0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, +0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, +0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1485,0x1482,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9, +0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9, +0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148b,0x148b,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148b,0x148e,0x148e,0x148e,0x148b,0x148e,0x148b,0x148e,0x148b,0x148e,0x148e,0x148e, +0x148e,0x148e,0x1491,0x148e,0x148e,0x148e,0x148e,0x148b,0x148e,0x148b,0x148b,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148b, +0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, +0x148b,0x148b,0x161a,0x161a,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x1866,0x1866,0x1866,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x161d,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x161d,0x1866,0x1866,0x148e,0x148e,0x148e,0x148e, +0x148e,0x1491,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161a,0x161a,0x161d,0x161d,0x148e,0x148e,0x1491,0x1491, +0x1491,0x1791,0x148e,0x1491,0x148e,0x148e,0x1491,0x1620,0x1620,0x161d,0x161d,0x1866,0x1866,0x1866,0x1866,0x1866, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x161d,0x161d,0x161d, +0x1791,0x161d,0x161d,0x161d,0x1866,0x1866,0x1866,0x1869,0x1869,0x1869,0x1869,0x1869,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x161d,0x148e,0x161d,0x1491,0x1491, +0x148e,0x148e,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1491,0x1491, +0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, +0x1491,0x148e,0x148e,0x148e,0x1491,0x148e,0x148e,0x148e,0x148e,0x1491,0x1491,0x1491,0x148e,0x1491,0x1491,0x1491, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1491,0x148e,0x1491,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x1791,0x148e,0x148e,0x148e,0x148e,0x161d,0x161d,0x1866,0x14eb,0x14eb,0x14eb,0x14eb, +0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161d,0x1866,0x1866,0x1866,0x1866,0x17eb,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x1620,0x1620,0x161d,0x161d,0x161d,0x161d,0x191d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161d,0x148e,0x148e,0x148e,0x148e,0x148e, +0x1575,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494, +0x1494,0x1575,0x1494,0x1494,0x1494,0x1575,0x1494,0x1575,0x1494,0x1575,0x1494,0x1575,0x1494,0x1494,0x1494,0x1575, +0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1575,0x1575,0x1494,0x1494,0x1494,0x1494,0x1575,0x1494,0x1575,0x1575, +0x1494,0x1494,0x1494,0x1494,0x1575,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494, +0x1494,0x1797,0x1797,0x186c,0x186c,0x1497,0x1497,0x1497,0x1494,0x1494,0x1494,0x1497,0x1497,0x1497,0x1497,0x1497, +0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, +0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, 0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, -0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x190e,0x190e,0x190e,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x19da,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x1872,0x190e, -0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1548,0x1545,0x1545,0x1545,0x1545,0x16b6,0x16b6,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x183c,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x1566,0x1566,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, -0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, -0x157e,0x157e,0x157e,0x157e,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1, -0x15ab,0x15ab,0x15ab,0x159f,0x159f,0x159f,0x15ab,0x15ab,0x159f,0x15ae,0x15a2,0x159f,0x15b4,0x15b4,0x15a8,0x15b4, -0x15b4,0x15a5,0x17c4,0x1bed,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15b7,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf, -0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15c9, -0x15d2,0x15d2,0x15d2,0x15d2,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15e7,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, -0x160b,0x160b,0x160b,0x160b,0x1608,0x1608,0x1608,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1608, -0x1608,0x15fc,0x1608,0x15ff,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, -0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, -0x160b,0x160b,0x160b,0x160b,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, -0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, -0x162f,0x162c,0x162c,0x162c,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638, -0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x163e,0x163e,0x163e,0x163b,0x163b,0x163b, -0x1638,0x1638,0x1638,0x1638,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1653,0x1653,0x1647,0x1644,0x1644, -0x1644,0x1644,0x1644,0x1644,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, -0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1656,0x1656,0x1656,0x1656,0x1656, -0x1656,0x1656,0x1656,0x1656,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, +0x149a,0x149a,0x149a,0x149d,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, +0x149a,0x149a,0x149a,0x149a,0x149d,0x149d,0x149d,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, +0x1899,0x1899,0x1896,0x17ee,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14ee,0x14ee,0x14ee,0x14ee,0x14ee,0x14ee, +0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x1626, +0x14f4,0x162c,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x1629,0x1629,0x1629, +0x1629,0x1629,0x162c,0x17f1,0x17f1,0x1c4a,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x1b78,0x1b78, +0x14fd,0x14fd,0x14fd,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f, +0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f, +0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a, +0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1ad3, +0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533, +0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533, +0x1539,0x1539,0x1545,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b, +0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b, +0x154b,0x154b,0x154b,0x1545,0x1545,0x1545,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1545, +0x1548,0x154b,0x154e,0x154e,0x154b,0x1551,0x1551,0x153c,0x153f,0x17f7,0x17fa,0x17fa,0x17fa,0x1632,0x1b81,0x1b7e, +0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x162f,0x1800,0x1803,0x17fd,0x1806,0x1806, +0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, +0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x19ec,0x19ec,0x19ec,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x1abb,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x1950,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x1620,0x161d,0x161d,0x161d, +0x161d,0x1794,0x1794,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x191a,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, +0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, +0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, 0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, -0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, -0x1680,0x1680,0x1680,0x1680,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1689,0x1689,0x1689,0x1689,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, -0x16a1,0x16a1,0x16a1,0x16a1,0x168c,0x169b,0x169b,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x169b,0x168c,0x169e, -0x169e,0x168c,0x169e,0x168c,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, +0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c, +0x168c,0x168c,0x168c,0x168c,0x1686,0x1686,0x1686,0x167a,0x167a,0x167a,0x1686,0x1686,0x167a,0x1689,0x167d,0x167a, +0x168f,0x168f,0x1683,0x168f,0x168f,0x1680,0x18a2,0x1cda,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, 0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, -0x16a1,0x16a1,0x16a1,0x16a1,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x1692,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, 0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, -0x16aa,0x16aa,0x16aa,0x16aa,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, +0x16aa,0x16aa,0x16aa,0x16a4,0x16ad,0x16ad,0x16ad,0x16ad,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, 0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, -0x16f5,0x16f5,0x16f5,0x16f5,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, -0x190e,0x190e,0x190e,0x19da,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x175b,0x1758,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e, +0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16c2,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4, +0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4, +0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6, +0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e3,0x16e3,0x16e3,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7, +0x16d7,0x16d7,0x16d7,0x16e3,0x16e3,0x16d7,0x16e3,0x16da,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6, +0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6, +0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d, +0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d, +0x170d,0x170d,0x170d,0x170d,0x170d,0x170a,0x170a,0x170a,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, +0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x171c,0x171c, +0x171c,0x1719,0x1719,0x1719,0x1716,0x1716,0x1716,0x1716,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, +0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x1731, +0x1731,0x1725,0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, +0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, +0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737, +0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1734, +0x1734,0x1734,0x1734,0x1734,0x1734,0x1734,0x1734,0x1734,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, +0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, +0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e, 0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e, -0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761, -0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761, -0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x177c,0x177c,0x177c,0x177c,0x1779, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x177c,0x177c,0x177c, -0x177c,0x177c,0x177c,0x177c,0x177c,0x1779,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c, -0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c, -0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e, -0x187e,0x187e,0x187e,0x187e,0x1af7,0x1a4c,0x1a4c,0x1a4f,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x179a,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x18e4,0x1797,0x1797,0x1797,0x1797,0x1797,0x1845,0x1845,0x1845, -0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, -0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x1797,0x19c5,0x19c5,0x1a4c,0x1a4c,0x1a4c,0x1a4c,0x1a4c, -0x1a4c,0x1a4c,0x1a4c,0x1af4,0x1bc6,0x1a4f,0x1a4f,0x1a4f,0x18e1,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4, -0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e1,0x18e1,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b, -0x1b5d,0x1b60,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x193b,0x17be,0x17be,0x17be,0x17be, -0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1848,0x1845, -0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x1848,0x18e4,0x18e4,0x1848,0x1848,0x1848,0x1848,0x1848, -0x1848,0x1848,0x1845,0x17c7,0x1848,0x1848,0x1848,0x1a4c,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x17c7,0x1845, -0x1845,0x1845,0x1845,0x1845,0x18e1,0x19c5,0x19c5,0x19c5,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845, -0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x18e1,0x17dc,0x17dc,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9, -0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9, -0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc, -0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc, -0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x1827,0x1827,0x1827, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, +0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, +0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x176a,0x1779,0x1779,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x1779,0x176a,0x177c,0x177c,0x176a,0x177c,0x176a,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, +0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, +0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e, +0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e, +0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec, +0x19ec,0x19ec,0x19ec,0x19ec,0x17d3,0x17d3,0x17d3,0x17d3,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec, +0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x1abb,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, +0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, +0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833, +0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833, +0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1839,0x1836,0x1833,0x1833,0x1833,0x1833, +0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x183c,0x183c,0x183c,0x183c, +0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c, +0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183f,0x183f,0x183f,0x183f, +0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x1851,0x1851,0x1851,0x1851, 0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, -0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x18a8,0x18a8,0x18a8,0x18a8,0x19fe,0x19fe,0x18ab,0x18ab, -0x18ab,0x18ab,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x18a5, -0x1896,0x1899,0x189c,0x18ae,0x18ae,0x194d,0x189f,0x189f,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8, -0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8, -0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, -0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18b4,0x18ba,0x18b7,0x18b7,0x18b7, -0x18b7,0x18c6,0x18cc,0x18b7,0x18b7,0x18b7,0x18b7,0x18c3,0x18c9,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7, -0x18b7,0x18b7,0x18b7,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, -0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, -0x18d5,0x18d5,0x18d5,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb, -0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1bb7,0x1bb7,0x1bb7,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, -0x18e1,0x18e1,0x18e1,0x18e1,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x1a4c,0x1af4,0x19c5,0x19c5,0x19c5,0x19c5,0x1af7, -0x1af4,0x1bc6,0x19c5,0x1a4c,0x19c5,0x19c5,0x19c5,0x19c5,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x19c5, -0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5, -0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, -0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, -0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x1bc9,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962, -0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962, -0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d, -0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d, -0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4, -0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4, -0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad, -0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad, -0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19aa,0x19aa,0x19aa,0x19c5,0x19c5,0x19c5,0x1af4,0x1af4,0x1a4c,0x1a4c,0x1a4c, -0x1a4c,0x1a4c,0x1a4c,0x1af4,0x1af4,0x1af4,0x1a4c,0x1a4c,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c8,0x19c8,0x19c5, -0x19c8,0x19c8,0x1a4c,0x1a4f,0x1a4c,0x1a4c,0x1a4c,0x1a4c,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, -0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, -0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28, -0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28, -0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31, -0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a67,0x1a67,0x1a31,0x1a67,0x1a31,0x1a31,0x1a31,0x1a31, -0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a37,0x1a37,0x1a37,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43, +0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1854,0x1854,0x1854,0x1854, +0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854, +0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1857,0x1857,0x1857,0x1857, +0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857, +0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x185a, +0x185a,0x185a,0x185a,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857, +0x1857,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x1857,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a, +0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a, +0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x1872,0x1872,0x1872,0x1872, +0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872, +0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x195c,0x195c,0x195c,0x195c, +0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x1be4,0x1b33,0x1b33,0x1b36,0x1875,0x1875,0x1875,0x1875, +0x1875,0x1875,0x1875,0x1875,0x1878,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x19c2,0x1875,0x1875,0x1875,0x1875, +0x1875,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x19bf,0x19bf, +0x19bf,0x19bf,0x19bf,0x19bf,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1875,0x1aa6,0x1aa6,0x1b33, +0x1b33,0x1b33,0x1b33,0x1b33,0x1b33,0x1b33,0x1b33,0x1be1,0x1cb3,0x1b36,0x1b36,0x1b36,0x19bf,0x19c2,0x19c2,0x19c2, +0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19bf,0x19bf,0x1b78,0x1b78,0x1b78,0x1b78, +0x1b78,0x1b78,0x1b78,0x1b78,0x1c4a,0x1c4d,0x1c47,0x1c47,0x1c47,0x1c47,0x1c47,0x1c47,0x1c47,0x1c47,0x1c47,0x1a1c, +0x189c,0x189c,0x189c,0x189c,0x189c,0x189c,0x189c,0x189c,0x189c,0x189c,0x189c,0x189c,0x1923,0x1923,0x1923,0x1923, +0x1923,0x1923,0x1926,0x1923,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x1926,0x19c2,0x19c2,0x1926, +0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1923,0x18a5,0x1926,0x1926,0x1926,0x1b33,0x1923,0x1923,0x1923,0x1923, +0x1923,0x1923,0x18a5,0x1923,0x1923,0x1923,0x1923,0x1923,0x19bf,0x1aa6,0x1aa6,0x1aa6,0x1923,0x1923,0x1923,0x1923, +0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x19bf,0x18ba,0x18ba,0x18b7,0x18b7, +0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7, +0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x1908,0x1908,0x1908,0x1908, +0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908, +0x1908,0x1905,0x1905,0x1905,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x1908,0x1908,0x1908,0x1908, +0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908, +0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192f,0x192f,0x192f,0x192f, +0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f, +0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x1bed, +0x1bed,0x1bed,0x1bed,0x1bed,0x1bed,0x1bed,0x1bed,0x1bed,0x1bed,0x1bed,0x1bed,0x1bed,0x1986,0x1986,0x1986,0x1986, +0x1ae5,0x1ae5,0x1989,0x1989,0x1989,0x1989,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971, +0x1971,0x1971,0x1971,0x1983,0x1974,0x1977,0x197a,0x198c,0x198c,0x1a2e,0x197d,0x197d,0x1986,0x1986,0x1986,0x1986, +0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986, +0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x19a7,0x19a7,0x19a7,0x19a7, +0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x1992, +0x1998,0x1995,0x1995,0x1995,0x1995,0x19a4,0x19aa,0x1995,0x1995,0x1995,0x1995,0x19a1,0x19a7,0x1995,0x1995,0x1995, +0x1995,0x1995,0x1995,0x1995,0x1995,0x1995,0x1995,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7, +0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19b3,0x19b3,0x19b3,0x19b3, +0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1bd8,0x1bd8,0x1bd8,0x1bd8, +0x1bd8,0x1bd8,0x1bd8,0x1bd8,0x1bd8,0x1bd8,0x1bd8,0x1bd8,0x1bd8,0x1ca4,0x1ca4,0x1ca4,0x19b9,0x19b9,0x19b9,0x19b9, +0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9, +0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19bf,0x19bf,0x19bf,0x19bf, +0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1b33,0x1be1,0x1aa6, +0x1aa6,0x1aa6,0x1aa6,0x1be4,0x1be1,0x1cb3,0x1aa6,0x1b33,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x19bf,0x19bf,0x19bf,0x19bf, +0x19bf,0x19bf,0x19bf,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6, +0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x19c8,0x19c8,0x19c8,0x19c8, +0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8, +0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19cb,0x19cb,0x19cb,0x19cb, +0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb, +0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x1cb6,0x19ce,0x19ce,0x19ce,0x19ce, +0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce, +0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x1a43,0x1a43,0x1a43,0x1a43, 0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43, -0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, -0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, -0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2, -0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2, -0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06, -0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06, -0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09, -0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09, -0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e, -0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e, -0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1, -0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1, -0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4, -0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4, -0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e, -0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b, -0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d, -0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d, -0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0,0,0,0 +0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a5e,0x1a5e,0x1a5e,0x1a5e, +0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e, +0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a64,0x1a64,0x1a64,0x1a64, +0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64, +0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a64,0x1a82,0x1a82,0x1a82,0x1a82, +0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82, +0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a85,0x1a85,0x1a85,0x1a85, +0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, +0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a8e,0x1a8e,0x1a8e,0x1a8e, +0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e, +0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8b,0x1a8b,0x1a8b,0x1aa6,0x1aa6,0x1aa6,0x1be1, +0x1be1,0x1b33,0x1b33,0x1b33,0x1b33,0x1b33,0x1b33,0x1be1,0x1be1,0x1be1,0x1b33,0x1b33,0x1aa6,0x1aa6,0x1aa6,0x1aa6, +0x1aa6,0x1aa9,0x1aa9,0x1aa6,0x1aa9,0x1aa9,0x1b33,0x1b36,0x1b33,0x1b33,0x1b33,0x1b33,0x1ae8,0x1ae8,0x1ae8,0x1ae8, +0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8, +0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1b0f,0x1b0f,0x1b0f,0x1b0f, +0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f, +0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b0f,0x1b18,0x1b18,0x1b18,0x1b18, +0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b4e,0x1b4e,0x1b18,0x1b4e, +0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b18,0x1b1e,0x1b1e,0x1b1e,0x1b2a,0x1b2a,0x1b2a,0x1b2a, +0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a, +0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1b2a,0x1bc3,0x1bc3,0x1bc3,0x1bc3, +0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3, +0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bc3,0x1bcf,0x1bcf,0x1bcf,0x1bcf, +0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf, +0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bf3,0x1bf3,0x1bf3,0x1bf3, +0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3, +0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf3,0x1bf6,0x1bf6,0x1bf6,0x1bf6, +0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6, +0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1c6b,0x1c6b,0x1c6b,0x1c6b, +0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b, +0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c8c,0x1c8c,0x1c8c,0x1c8c, +0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c, +0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c8c,0x1c9e,0x1c9e,0x1c9e,0x1c9e, +0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, +0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1ca1,0x1ca1,0x1ca1,0x1ca1, +0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1, +0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1ca1,0x1cfb,0x1cfb,0x1cfb,0x1cfb, +0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cf8,0x1cf8,0x1cf8, +0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1cf8,0x1d3a,0x1d3a,0x1d3a,0x1d3a, +0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a, +0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d3a,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0,0,0,0 }; static const UTrie2 propsVectorsTrie={ @@ -3533,17 +3534,17 @@ static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index+5368, nullptr, 5368, - 27396, + 27416, 0xa40, 0x1578, 0x0, 0x0, 0x110000, - 0x7ff8, + 0x800c, nullptr, 0, false, false, 0, nullptr }; -static const uint32_t propsVectors[7260]={ +static const uint32_t propsVectors[7497]={ 0x67,0,0,0x67,0,0xe00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67, 0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0,0,0x1267,0, 0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0,0x1767,0,0, @@ -3590,416 +3591,431 @@ static const uint32_t propsVectors[7260]={ 0,0,0x14067,0,0,0x14167,0,0,0x14367,0,0,0x14467,0,0,0x14567,0, 0,0x14667,0,0,0x14767,0,0,0xa0067,0,0xe00000,0xa4f67,0,0xe00000,0xa5f67,0,0xe00000, 0xac567,0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267,0,0xe00000,0xb2e67,0,0xe00000,0xb4867, -0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001, -0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x200000,0x11000200,0x24000008,0x1710000, -0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319, -0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100, -0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400, -0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600,0x7c00500,0x530400,0x11000600, -0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010,0x201001,0x11000800,0x7c00500, -0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002,0x1100080e,0x7000500,0x220402, -0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e,0x7c00100,0x250401,0x1100080e, -0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100,0x220401,0x11000908,0x7c00100, -0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200400,0x11000a03,0x4000000,0x201000,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100,0x220400, -0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000a03,0xc000010,0x1049400,0x11000b13,0x2802500,0x962460,0x11000b13, -0x4000000,0x200000,0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100, -0x2633800,0x11000c00,0x80000000,0x1329960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400, -0x11000c02,0x4000000,0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02, -0x7c00100,0x230402,0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000f01,0x2802400,0x962460,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400, -0x962460,0x11000f0a,0x2806400,0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401, -0x11001004,0x2802100,0x962460,0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004, -0x6800100,0x962540,0x11001004,0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400, -0x962460,0x11001110,0x2806400,0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460, -0x1100120f,0x2802400,0x962460,0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f, -0x2802400,0x962460,0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100, -0x962541,0x1100131f,0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540, -0x11001423,0x6800100,0x962541,0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524, -0x2806400,0x962460,0x11001524,0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400, -0x962460,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460, -0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926, -0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000, -0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460, -0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18, -0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100, -0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001, -0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800, -0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x445801,0x11002800,0x4000001,0x445802,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000, -0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000, -0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800, -0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x1248002,0x11002800,0x40000001, -0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x2880000,0x2a65620,0x11002801,0x2882000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f, -0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900, -0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000, -0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f, -0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00, -0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000, -0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000, -0x11002e00,0x24000020,0x200001,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00, -0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020, -0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000, -0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700, -0x24000000,0x2800000,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000, -0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x2800000,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005, -0x11005013,0x7c00100,0x2633801,0x11005013,0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005102,0x7000100,0x230408,0x11005102, -0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460,0x11005500,0x80000, -0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502,0x7c00100,0x230409, -0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400,0x100002,0x11020200, -0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x200000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000, -0x1500000,0x11020200,0x24000000,0x1600000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219,0x7c00100,0x220400, -0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100,0x220402,0x11020319, -0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400,0x11020600,0x4000400, -0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701,0x2802400,0x962461, -0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100,0x220401,0x11020908, -0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002,0x11022800,0x24000000, -0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800,0x24000002,0x370000, -0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020,0x100000,0x11022800, -0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f,0x11022c00,0x4000000, -0x100002,0x11022c00,0x4000000,0x10000f,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x7c00120,0x120405,0x11022c0e,0x7c00100,0x250401, -0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100,0x150402,0x11022e00, -0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001,0x11022f00,0x24000020,0x100002,0x11023000,0x24000000, -0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300,0x4000100,0x150403,0x11023400,0x24000000,0x100000, -0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700, -0x24000020,0x100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0,0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000, -0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a, -0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x445811,0x11065700,0x4000000,0x810011,0x11065700,0x4000000,0xe00011,0x11065700,0x4000000,0x1410011,0x11065700, -0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11,0x11065700,0x4000010, -0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011,0x11065700,0x4000400,0xe00011,0x11065700,0x4000420,0xe00011, -0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe29811,0x11065700,0xc000010,0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100,0xe20411,0x11065719, -0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0,0x1329800,0x11080100,0x24000000, -0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000, -0x11080100,0x24000000,0x2410000,0x11080100,0x24000006,0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100, -0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020,0x200000,0x11080100,0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400, -0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100,0x44000001,0x1a45800,0x11080119,0x7c00100,0x220400, -0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200, -0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000, -0xe00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000,0x200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002, -0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14, -0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100, -0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402, -0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500, -0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000, -0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010, -0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400, -0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010, -0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c, -0x110a5400,0xc000010,0xb4800c,0x11400c0c,0x4000010,0xb00000,0x11400c0c,0x4000010,0x1071400,0x11400c17,0xc000010,0xb48000,0x11400c1e,0x7c00900,0x230400,0x11400f4b, -0xc000010,0x448000,0x11400f5f,0xc000010,0x448000,0x11401d94,0x4000000,0x200000,0x11403dcc,0x4000000,0xe00000,0x114457c1,0x4000008,0x81000a,0x114457c1,0x4000008, -0x141000a,0x114457c1,0x4000010,0x87000a,0x114457c1,0x6800004,0x120000a,0x114457c1,0xc000010,0x84800a,0x114457ca,0x3802500,0x126246a,0x114457ca,0x7c00d00,0x2530c0a, -0x114a3dc1,0x24000000,0x810000,0x114a3dc1,0x24000000,0x1410000,0x114a3dc1,0x24000008,0x810000,0x114a3dc1,0x24000008,0x1410000,0x114a3dc1,0x24000010,0x870000,0x114a3dc1, -0x2c000010,0x848000,0x114a3dc7,0x4000000,0xe00000,0x114a3dc7,0x24000000,0xe00000,0x114a3dc7,0x24000002,0xe00000,0x114a3dc7,0x24000002,0x1200000,0x114a3dc7,0x24000008, -0x810000,0x114a3dc7,0x24000008,0x1410000,0x114a3dca,0x7c00900,0x930c00,0x114a3dca,0x7c00900,0xe30c00,0x114a3dcc,0x7c00300,0xe30000,0x114a3eca,0x7000400,0x1200c02, -0x114a3fc1,0x6800004,0x1200000,0x114a3fca,0x7c00d00,0x2530c00,0x114a42cc,0x4000000,0xe00000,0x114a42cc,0x4000000,0xe0000f,0x114a44cc,0x4000000,0xe00002,0x114a44cc, -0x4000000,0xe00003,0x114a45cc,0x4000000,0xe00002,0x114a45cc,0x4000000,0xe0000d,0x11505113,0x24000000,0x810000,0x11505113,0x24000000,0x1410000,0x1180090a,0x2802400, -0x962460,0x11800c27,0x2802100,0x962460,0x11800c27,0x2802500,0x962460,0x11800f32,0x2802400,0x962460,0x11800f3f,0x2802400,0x962460,0x11820700,0x2802400,0x962460, -0x11820700,0x2802500,0x962460,0x118a3dcd,0x2802400,0x962460,0x118a3eca,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c2c, -0x6800000,0x1329800,0x11c00c30,0xc000010,0xb48000,0x11c00f78,0x6800000,0x1329800,0x11c0107d,0x6800000,0x1329800,0x11c01181,0x6800000,0x1329800,0x11c01285,0x6800000, -0x1329800,0x11c01489,0x4000000,0x200000,0x11c01489,0x6800000,0x1329800,0x11c0168d,0x6800000,0x1329800,0x11d05117,0x7c00100,0x230408,0x20000067,0x1000,0, -0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27,0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27, -0x2802500,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000,0x400000,0x20001b27,0x4000000, -0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000,0x20001b27,0x4000010,0xb00000, -0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27,0x7c00100,0x230400,0x20001b27, -0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900000,0x20004c67,0,0x1900000,0x20004d67,0, -0x1900000,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0,0x200a4a12,0x7c00100,0x1f304c1, -0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419,0x7c00100,0x220401,0x30000419, -0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600,0x7c00500,0x230400,0x30000605,0x4000400, -0x200400,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401,0x30000908,0x7c00100,0x250400, -0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400400,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22,0x2802100,0x962460,0x30000d22, -0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100,0x230400,0x30000d22,0xc000010, -0x248000,0x30000d22,0x80000000,0x218560,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460,0x30001821,0x2806400,0x962460, -0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27,0x2802100,0x962460,0x30001b27, -0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100,0x1862460,0x30001c1c,0x2802400, -0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540,0x30001c1c,0x7c00100,0x1830000, -0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b,0x4000010,0x400000,0x30001f0b, -0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000000,0x200000,0x30002128,0x7c00100, -0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x445800,0x3000221d,0x7c00100,0x230400, -0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417,0x2806400,0x1862460,0x30002417, -0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010,0x400000,0x30002417,0x4000010, -0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000,0x30002417,0xc000010,0x448000, -0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b, -0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900, -0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002,0x30002a00,0x4000000,0x1600000, -0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000, -0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000,0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100, -0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701,0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000, -0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305, -0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x3040259a,0x4000010, -0x400000,0x3040259a,0x4000010,0xb70000,0x3040259a,0xc000010,0xb48000,0x304028bc,0x4000001,0xc41c0b,0x304a3dcc,0x4000000,0xe00000,0x30800c27,0x2802100,0x962460, -0x30c01c92,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x200000,0x3100581e, -0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000,0x200000,0x31005c00,0x80000, -0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001,0x31005c00,0x6800000,0x962540, -0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00, -0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100, -0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400,0x32000908,0x7c00100,0x250400, -0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820,0x32002800, -0x4000001,0x445802,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x1500002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100, -0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460,0x32002c00,0x4000000,0x200000, -0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00,0x24000020,0x200000,0x32002f00, -0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020,0x200000,0x32003700,0x24000000, -0x100000,0x32003700,0x24000000,0x200000,0x32003800,0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400, -0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806400,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b, -0x2802100,0x962460,0x3200632b,0x6804000,0x962540,0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100, -0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006900,0x24000020,0x200000, -0x32006900,0x24000020,0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701, -0x2882000,0xc62460,0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020, -0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x200000,0x320a3d11,0x7c00100,0x1230400, -0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11, -0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x32406396,0xc000010,0x448000,0x324a3dcf,0x4000000,0xe00000,0x324a3dcf,0x7c00100,0x1230400,0x324a3fca,0x4000002, -0x1200c00,0x324a53c7,0x24000000,0xe00000,0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400, -0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02, -0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000c02,0x80000000,0x1329960,0x40000d22,0x7c00100, -0x230400,0x40000f0a,0x7c00100,0x230400,0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460, -0x4000120f,0x4000000,0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615, -0x2802400,0x962460,0x40001615,0x7c00100,0x230400,0x40002417,0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002, -0x200000,0x40002c00,0x4000000,0x200002,0x40003000,0x24000000,0x200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40005a09,0x7c00100,0x220400, -0x40005a09,0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30, -0x6800000,0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000, -0x200000,0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400, -0x40007219,0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007400,0x4000000,0x200000,0x40007531, -0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400,0x40007a32,0x6800000, -0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701,0x2802400,0xc62460, -0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x200000,0x400a3700,0x24000000,0xe00000,0x400a4400,0x4000000,0xe0000d,0x400a4412, -0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,0x40507719,0x4000000, -0x200000,0x4050771c,0x4000000,0x400000,0x4050771f,0x4000000,0x200000,0x4050771f,0x4000000,0x400000,0x40c01489,0x4000000,0x200000,0x40d05117,0x4000000,0x200000, -0x41000419,0x7c00100,0x220400,0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908, -0x7c00100,0x250400,0x41000b13,0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000, -0x1500000,0x41000c02,0xc000010,0xb48000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000, -0x41001d0c,0x7c00100,0x22040f,0x41001d0c,0x7c00100,0x230400,0x41001f0b,0x2802400,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800, -0x24000000,0x200000,0x41002800,0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000, -0x200000,0x41002c00,0x7c00120,0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0xe00000,0x41005d00,0x7c00120,0x220405, -0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100,0x220400,0x41007300, -0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400,0x41008002,0x7c00100, -0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301,0x2802000,0x962460, -0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100,0x250400,0x4100850b, -0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400,0x41008838,0x7c00100, -0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939,0x4000000,0x400000, -0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000400,0x200400,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000,0x1329800,0x41008b3b, -0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f,0x41008d19,0x7c00100, -0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00,0x24000006,0x400000, -0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c, -0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460,0x410a3700,0x24000000,0x200000,0x410a3700,0x24000000, -0xe00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010, -0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100, -0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x41408ad2,0x4000400,0x200000,0x414a82cc,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01489,0x6800000, -0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908,0x7c00100,0x250400, -0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020,0x962460,0x50002c00, -0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000,0x50003700,0x24000000, -0x200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600,0x24000020,0x200000, -0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000,0x200000,0x50009257, -0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400,0x50009257,0xc000010, -0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x400000,0x5000933e,0x4000000,0xe00000,0x5000933e,0x4000010,0x400000, -0x5000933e,0x6800000,0xe29800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x2f62540,0x5000933e,0x7c00100,0x2b30400,0x5000933e, -0x7c00100,0x2b30401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400,0x5000965a,0x4000000, -0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b,0x7c00100,0x230400, -0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409acc,0x4000000,0x200000,0x5100080e,0x7c00100,0x220400,0x5100080e, -0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400,0x51000f0a,0x7c00100, -0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524,0x2802100,0x962460, -0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000,0x1500000,0x5100171a, -0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400,0x51001c1c,0x2802100, -0x1862460,0x51001c1c,0x2802500,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c,0x6800100,0x1862400, -0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800500,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619, -0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400,0x51003700,0x24000000,0x200000,0x51003700,0x24000000, -0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000, -0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301, -0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008301,0x2802400,0xc62460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000,0x51008e00,0x24000000, -0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00,0x24000002,0x200000, -0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100,0x22040f,0x51009419, -0x7c00100,0x250400,0x51009500,0x4000400,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f,0x51009519,0x7c00100, -0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71,0x6804400,0x962540, -0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802d00,0x962460,0x51009c52,0x4000010,0x400000,0x51009c52, -0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800,0x51009d6d,0x7c00100, -0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63,0x4000010,0x400000, -0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010,0xb48000,0x5100a008, -0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400,0x5100a008,0x7c00100, -0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f,0x7c00100,0x230400, -0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100,0x230400,0x5100a24f, -0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540,0x5100a36e,0x7c00100, -0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0xe00000,0x5100a442,0x6800000,0xe29800,0x5100a442,0x6800100,0x962540,0x5100a442,0x7c00100,0x430400, -0x5100a442,0x7c00100,0x2d30400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b, -0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00,0x4000000, -0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x200000, -0x510aaa00,0x4000000,0xe00000,0x514a82cc,0x4000000,0xe00000,0x5150a20e,0x4000400,0x400000,0x51802bbe,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008, -0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000, -0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800500,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520, -0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000, -0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100, -0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400, -0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e, -0x7c00100,0x230400,0x5200ac7e,0xc000010,0x248000,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400, -0x1862460,0x5200ae6a,0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540, -0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083, -0xc000010,0x448000,0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010, -0x448000,0x5200b30a,0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460, -0x5200b54e,0x4000000,0xe00000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0xe29800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x2f62540,0x5200b54e, -0x7c00100,0x2b30400,0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800500,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900, -0x1830000,0x5200b77f,0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000, -0x5200b77f,0x7c00500,0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873, -0x6800000,0x1329800,0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100, -0x2230500,0x5200b912,0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000, -0x5200bb85,0x7c00100,0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d, -0x7c00100,0x230400,0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802100, -0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400, -0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c178,0x80000000,0x1329960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247, -0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000, -0x2800000,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003, -0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0xe00000,0x520a3800, -0x24000000,0x100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000, -0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af9c,0x7c00100,0x230400,0x5240afa1,0x4000400,0x200000, -0x5240afa3,0x6800400,0x962540,0x5240afa3,0x7c00100,0x230400,0x5240afad,0x7c00100,0x230400,0x5240afaf,0x7c00100,0x230400,0x5240b2d4,0x4000000,0x200000,0x5240b2e3, -0x4000000,0x200000,0x5240b2f1,0x4000000,0x200000,0x5240b2fc,0x4000000,0x1500000,0x524a44cc,0x4000000,0xe00003,0x5250b511,0x7c00900,0x430400,0x5280af9c,0x2802400, -0x962460,0x5280af9d,0x2802400,0x962460,0x5280afa3,0x2802400,0x962460,0x5280afa5,0x2802400,0x962460,0x5280afa7,0x2802400,0x962460,0x52d0b308,0x2802400,0x962460, -0x52d0b30c,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a, -0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000, -0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802400,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x200000, -0x60003000,0x24000000,0xe00000,0x60003700,0x24000000,0x200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108, -0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802400,0xc62460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100, -0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x2703580,0x6000c654,0x2802000,0x962460, -0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f, -0x6800100,0x962540,0x6000c73f,0x6804000,0x2e62540,0x6000c73f,0x7c00100,0x2d30400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806400, -0x2f62460,0x6000c941,0x4000000,0xe00000,0x6000c941,0x4000010,0xe00000,0x6000c941,0x6800000,0x2d29800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x2b30400, -0x6000c941,0x7c00100,0x2c30400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300, -0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x600a3000,0x24000000,0x200000,0x600a3000,0x24000000, -0xe00000,0x600a3700,0x24000000,0x200000,0x600a3800,0x24000000,0x200000,0x600a3800,0x24000000,0x2800000,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x100000, -0x600ac400,0x4000000,0xe0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0xe00000,0x600acd00,0x4000000,0x200000,0x600acd00, -0x4000000,0xe00000,0x600acd00,0x4000000,0x2800000,0x600ace00,0x4000000,0xe00000,0x600ace00,0x4000000,0x2800000,0x600acf00,0x4000000,0xe00000,0x600acf00,0x4000000, -0x2800000,0x600ad111,0x7c40300,0xe30000,0x604ac4cc,0x4000000,0xe00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x1329960,0x6100120f,0x4000000,0x200000, -0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100,0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407, -0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100, -0x230400,0x61009519,0x7c00100,0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460, -0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202, -0x2802500,0x962460,0x6100d202,0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100, -0x962461,0x6100d476,0x2806400,0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400, -0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573, -0x7c00900,0x230400,0x6100d573,0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802500,0x962460,0x6100d85c,0x6800100, -0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000, -0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997, -0xc000010,0x448000,0x6100da98,0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400, -0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000, -0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000,0xe00000,0x6140afa1,0x7c00100,0x230400,0x6140afa3,0x7c00100,0x230400,0x6180af9e,0x2802400,0x962460,0x62002a00, -0x4000000,0x1600000,0x63002800,0x80000,0x918820,0x63c00c15,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000, -0x1329960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460, -0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000, -0x24000000,0x200000,0x70003800,0x24000000,0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108,0x7c00100, -0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400,0x962460, -0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000,0x70008e00, -0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965,0x4000010, -0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000,0x200000, -0x7000b61c,0x2802500,0x1862460,0x7000b61c,0x6800500,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0xc62460,0x7000cc00, -0x4000000,0xe00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x2800000,0x7000cf00,0x4000000,0xe00000,0x7000d202,0x2802100, -0x962460,0x7000d202,0x7c00100,0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400, -0x7000dd86,0xc000010,0x448000,0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2400,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187, -0x2802000,0x962460,0x7000e187,0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100, -0x230400,0x7000e300,0x4000000,0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541, -0x7000e489,0x6804400,0x2f62540,0x7000e489,0x7c00100,0x430400,0x7000e489,0x7c00100,0x2b30400,0x7000e489,0x7c00100,0x2d30400,0x7000e489,0x7c00900,0x430400,0x7000e59d, -0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d,0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400, -0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100,0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460, -0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400,0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719, -0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0,0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000, -0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000,0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000, -0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000,0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3, -0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3,0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010, -0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010,0x448000,0x7000ee1c,0x2802500,0x1862460,0x7000ee1c,0x6800000,0x1329800, -0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000,0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e, -0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200,0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000, -0x1710000,0x7000f34b,0x2802400,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010,0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400, -0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000,0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b, -0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6,0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400, -0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800,0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541, -0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000,0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e, -0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e,0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100, -0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000,0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400, -0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0xe00000,0x700acd00,0x4000000,0x2800000,0x700ace00,0x4000000,0xe00000,0x700acf00,0x4000000,0xe00000,0x700acf00, -0x4000000,0x2800000,0x7050df21,0x4000000,0x200000,0x7050f729,0x80000,0x918820,0x7080afa1,0x2802400,0x962460,0x7090df21,0x2802400,0x962460,0x70d0e427,0x2802100, -0x962460,0x70d0e427,0x2802400,0x962460,0x70d0e427,0x6800100,0x962540,0x70d0ea25,0x4000010,0x400000,0x8000120f,0x7c00100,0x230400,0x80001524,0x7c00100,0x230400, -0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00,0x4000000,0x200000,0x80005208, -0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100,0x230400,0x80009519,0x7c00100, -0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400,0x8000cd00,0x4000000,0xe00000, -0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802000,0x962460,0x8000d997,0x2802400,0x962460,0x8000d997, -0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100,0x962460,0x8000e489,0x7c00100, -0x2d30400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000,0x8000fda1,0x2802100,0x1862460, -0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862400,0x8000fda1,0x6800100,0x1862540,0x8000fda1, -0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100, -0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000, -0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670, -0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0xe00000,0x800acd00,0x4000000,0x2902460,0x800ace00,0x4000000, -0xe00000,0x800acf00,0x4000000,0xe00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0xe00000,0x800b0500,0x4000000,0x2800000,0x90001615,0x7c00100,0x230400, -0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802400,0x962460,0x90008e00, -0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x1329960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100, -0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x90010500,0x4000000,0xe00000,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460, -0x900107a7,0x2802c00,0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8, -0x2802100,0x962460,0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000, -0x1329800,0x900108a8,0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460, -0x90010ca9,0x2802100,0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b, -0x4000000,0x500000,0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000, -0x400000,0x90010eaa,0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000, -0x90010fab,0x7c00100,0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0xe00000,0x900acd00, -0x4000000,0x2800000,0x900acf00,0x4000000,0xe00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x2800000,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300, -0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100,0x962460, -0xa000120f,0x2802400,0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000,0xa000581e, -0x7c00100,0x230400,0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0xe00000,0xa0010500,0x4000000, -0x200000,0xa00114af,0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100,0x230400, -0xa00114af,0x7c00100,0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000,0xa00116b0, -0x4000000,0x500000,0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0,0xc000010, -0x448000,0xa0011722,0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000,0x200000, -0xa00118b1,0x4000000,0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560,0xa00118b1, -0xc000010,0x448000,0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0xe00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00,0x4000000, -0xe00000,0xa00b0500,0x4000000,0xe00000,0xa00b0500,0x4000000,0x2800000,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100,0xe30000, -0xa00b1596,0x7c00300,0xe30000,0xa040afb9,0x6800400,0x962540,0xa08083ba,0x2802400,0x962460,0xb0000a03,0x7c00100,0x220400,0xb0000b13,0x7c00100,0x2633800,0xb0001004, -0x2802000,0x962460,0xb0001110,0x4000000,0x200000,0xb0001524,0x2802100,0x962460,0xb0001615,0x4000000,0x500000,0xb000251b,0x7c00100,0x230400,0xb0007300,0x24000000, -0x200000,0xb0008939,0x4000000,0x200000,0xb0008939,0x7c00100,0x230400,0xb0008e00,0x24000000,0x200000,0xb0008e00,0x24000000,0x400000,0xb0008e00,0x24000010,0x400000, -0xb0009257,0x2802000,0x962460,0xb0009257,0x4000000,0x1600000,0xb0009519,0x7c00100,0x220400,0xb0009519,0x7c00100,0x250400,0xb0009a00,0x4000000,0x200000,0xb000b30a, -0x2802100,0x962460,0xb000b30a,0x7c00100,0x230400,0xb000c178,0x80000000,0x1329960,0xb000c300,0x4000000,0x200000,0xb000d202,0x2802000,0x962460,0xb000d476,0x6800100, -0x962540,0xb000d476,0x7c00100,0x230400,0xb000e300,0x4000000,0xe00000,0xb000fda1,0x7c00100,0x1830000,0xb0010eaa,0x2802000,0x962460,0xb00116b0,0x7c00100,0x230400, -0xb0011900,0x4000000,0xe00000,0xb0011ab2,0x2802100,0x962460,0xb0011ab2,0x2802400,0x962460,0xb0011ab2,0x2806400,0x962460,0xb0011ab2,0x4000000,0x200000,0xb0011ab2, -0x6800100,0x962540,0xb0011ab2,0x7c00100,0x230400,0xb0011b0c,0x7c00100,0x230400,0xb0011cb3,0x2802100,0x962460,0xb0011cb3,0x2806400,0x962460,0xb0011cb3,0x6800000, -0x1329800,0xb0011cb3,0x6800100,0x962540,0xb0011cb3,0x7c00100,0x230400,0xb0011db6,0x2802500,0x962460,0xb0011db6,0x6800000,0x1329800,0xb0011db6,0x7c00100,0x230400, -0xb0011db6,0x7c00500,0x230400,0xb0011e00,0x4000000,0x200000,0xb0011e00,0x4000000,0x1500000,0xb0011fb4,0x2802100,0x962460,0xb0011fb4,0x6800100,0x962540,0xb0011fb4, -0x7c00100,0x430400,0xb0011fb4,0x7c00100,0x2d30400,0xb0011fb4,0xc000010,0x448000,0xb0012000,0x4000000,0x200000,0xb00121b5,0x4000000,0x200000,0xb00121b5,0x4000010, -0x400000,0xb00121b5,0x7c00100,0x220400,0xb00121b5,0x7c00100,0x250400,0xb00121b5,0xc000010,0x448000,0xb00122b8,0x4000000,0x200000,0xb00122b8,0x7c00100,0x230400, -0xb00123b7,0x2802400,0x962460,0xb00123b7,0x4000000,0x200000,0xb00123b7,0x7c00100,0x230400,0xb00123b7,0xc000010,0x248000,0xb00a4005,0x7c00100,0xe30400,0xb00a4711, -0x7c40300,0xe30000,0xb00acf00,0x4000000,0xe00000,0xb00b0500,0x4000000,0xe00000,0xb00b0500,0x4000000,0x2800000,0xb00b109a,0x7c00300,0xe30000,0xb080e487,0x2802000, -0x962460,0xc0001524,0x4000000,0x500000,0xc0001a18,0x2806400,0x1862460,0xc0001a18,0x7c00100,0x1830000,0xc0007300,0x24000000,0x200000,0xc0008e00,0x24000010,0x400000, -0xc0009519,0x7c00100,0x220400,0xc0009519,0x7c00100,0x250400,0xc000c300,0x4000000,0x20000f,0xc000d85c,0x2802100,0x962460,0xc000d85c,0x6800100,0x962540,0xc000d85c, -0x7c00100,0x230400,0xc000dc99,0x7c00100,0x230400,0xc000e719,0x7c00100,0x220400,0xc00107a7,0x7c00100,0x230400,0xc0010eaa,0x7c00100,0x230400,0xc00116b0,0x7c00100, -0x230560,0xc0011900,0x4000000,0x200000,0xc0012447,0,0x818820,0xc0012447,0,0xc18820,0xc0012447,0,0x1418820,0xc00125b9,0x7c00100,0x230400, -0xc00126bb,0x2802100,0x962460,0xc00126bb,0x2806400,0x962460,0xc00126bb,0x4000000,0x500000,0xc00126bb,0x6800100,0x962540,0xc00126bb,0x7c00100,0x230400,0xc00127ba, -0x2802400,0x962460,0xc00127ba,0x4000000,0x200000,0xc00127ba,0x6800000,0x1329800,0xc00127ba,0x7c00100,0x230400,0xc00127ba,0x7c00900,0x230400,0xc0012800,0x4000000, -0x200000,0xc0012b23,0x4000000,0x200000,0xc0012b23,0x4000000,0x400000,0xc0012b23,0x4000000,0x1500000,0xc0012cbc,0x2802400,0x962460,0xc0012cbc,0x4000000,0x1600000, -0xc0012cbc,0x6800000,0x1329800,0xc0012cbc,0x7c00100,0x230400,0xc00acf00,0x4000000,0xe00000,0xc00ae300,0x4000000,0xe00000,0xc00b0500,0x4000000,0xe00000,0xc00b0500, -0x4000000,0x2800000,0xc00b0b11,0x4000000,0x1200000,0xc00b0b11,0x7c00900,0x1230400,0xc00b109a,0x7c00300,0xe30000,0xc00b2914,0x7c00100,0x2530000,0xc00b2916,0x7c00100, -0x2530c00,0xc00b2a00,0x4000000,0xe00000,0xc040af5e,0x7c00100,0x230400,0xc0c12b89,0x4000000,0x200000,0xc14a44cc,0x4000000,0xe0000d,0xd000131f,0x2802c00,0x962460, -0xd000171a,0x7c00100,0x230400,0xd0001821,0x2802100,0x962460,0xd0007300,0x24000000,0x200000,0xd0008e00,0x24000000,0x200000,0xd0008f3a,0x2806000,0x962460,0xd0009519, -0x7c00100,0x220400,0xd0009519,0x7c00100,0x250400,0xd000a500,0x4000000,0x200000,0xd000c300,0x4000000,0xe00000,0xd000d202,0x7c00100,0x230400,0xd000d476,0x7c00100, -0x230400,0xd000d997,0x2802100,0x962460,0xd000d997,0x6800100,0x962540,0xd000e001,0x2802100,0x962460,0xd000e700,0x4000400,0x200000,0xd000e719,0x7c00100,0x220400, -0xd000e719,0x7c00500,0x22040f,0xd000fa00,0x4000000,0xe00000,0xd0010eaa,0x4000010,0x400000,0xd0010eaa,0x7c00100,0x230400,0xd0012dbd,0x4000000,0x200000,0xd0012dbd, -0x7c00100,0x230400,0xd0012fbe,0x2802100,0x962460,0xd0012fbe,0x2802400,0x962460,0xd0012fbe,0x2806400,0x2f62460,0xd0012fbe,0x4000000,0x400000,0xd0012fbe,0x6800000, -0xe29800,0xd0012fbe,0x6800100,0x962540,0xd0012fbe,0x6800100,0x962541,0xd0012fbe,0x6804400,0x962540,0xd0012fbe,0x7c00100,0x2b30400,0xd0012fbe,0x7c00100,0x2c30560, -0xd0012fbe,0xc000010,0x448000,0xd0013183,0x7c00100,0x230400,0xd0013200,0x4000000,0x200000,0xd0013200,0x6800000,0x1329805,0xd00134c0,0x2802100,0x962460,0xd00134c0, -0x4000002,0x400000,0xd00134c0,0x7c00100,0x230400,0xd00a4305,0x7c00100,0xe30400,0xd00a4611,0x7c40300,0xe30000,0xd00a4711,0x7c40300,0xe30000,0xd00a5e11,0x7c40300, -0xe30000,0xd00acf00,0x4000000,0xe00000,0xd00b0500,0x4000000,0xe00000,0xd00b0500,0x4000000,0x2800000,0xd00b0b11,0x6800500,0x962540,0xd00b0bbf,0x2802200,0xc62460, -0xd00b119a,0x7c00300,0xe30000,0xd00b2a00,0x4000000,0xe00000,0xd00b2e11,0x7c40300,0xe30000,0xd00b30bf,0x7c00300,0x230000,0xd00b339a,0x7c00300,0xe30000,0xe0000c02, -0xc000010,0xb48000,0xe0001524,0x2802400,0x962460,0xe0001524,0x7c00100,0x230400,0xe0001615,0x7c00100,0x230400,0xe000251b,0x12882000,0x962460,0xe0002a00,0x4000000, -0x1500000,0xe0005102,0x4000000,0x200000,0xe0005c00,0x4000000,0x200000,0xe000622a,0x6804400,0x962540,0xe000622a,0x7c00100,0x230400,0xe0008838,0x7c00100,0x220400, -0xe0008838,0x7c00100,0x250400,0xe0008e00,0x24000000,0x810000,0xe0008e00,0x24000000,0x1410000,0xe0008e00,0x24000002,0x400000,0xe0008e00,0x2c000010,0xb48000,0xe000933e, -0x7c00100,0x2b30400,0xe000933e,0xc000010,0x448000,0xe0009519,0x7c00100,0x220400,0xe0009519,0x7c00100,0x22040f,0xe0009519,0x7c00100,0x250400,0xe000c178,0x2802100, -0x962460,0xe000c941,0x2802100,0x962460,0xe000c941,0x2806400,0x962460,0xe000c941,0x7c00100,0x2b30400,0xe000d202,0x2802400,0x962460,0xe000d202,0x7c00100,0x230400, -0xe000d202,0x7c00500,0x230400,0xe000dc99,0x4000000,0x200000,0xe000e001,0x2802100,0x962460,0xe000e001,0x2802400,0x962460,0xe000fda1,0x7c00100,0x1830000,0xe0013502, -0x2802400,0x962460,0xe0013502,0x4000000,0x200000,0xe0013502,0x7c00100,0x230400,0xe0013502,0x80000000,0x1329960,0xe00136c1,0x4000000,0x200000,0xe00136c1,0x7c00100, -0x230400,0xe001370b,0x7c00100,0x230400,0xe0013919,0x7c00500,0x220400,0xe0013919,0x7c00500,0x22040f,0xe0013919,0x7c00d00,0x23040f,0xe0013a19,0x7c00100,0x220400, -0xe0013a19,0x7c00100,0x230400,0xe0013bc2,0x2802400,0x962460,0xe0013bc2,0x7c00100,0x230400,0xe0013bc2,0xc000010,0x248000,0xe0013cc3,0x6800000,0x1329800,0xe0013cc3, -0x7c00100,0x230400,0xe0013dc4,0x2802400,0x962460,0xe0013dc4,0x7c00100,0x230400,0xe0013e28,0x7c00100,0x230400,0xe0013fc5,0x7c00100,0x220400,0xe0013fc5,0x7c00100, -0x250400,0xe0014000,0x4000000,0x200000,0xe0014001,0x2802400,0x962460,0xe00a4711,0x7c40300,0xe30000,0xe00a5e11,0x7c40300,0xe30000,0xe00ac511,0x7c40300,0xe30000, -0xe00acf00,0x4000000,0xe00000,0xe00ae300,0x4000000,0xe00000,0xe00b0500,0x4000000,0xe00000,0xe00b1314,0x7c00100,0xe30000,0xe00b1316,0x7c00100,0xe30c00,0xe00b2a00, -0x4000000,0xe00000,0xe00b2a00,0x4000000,0x2800000,0xe00b3816,0x7c00500,0x230c00,0xe0808328,0x2802400,0x962460,0xf0001615,0x6800100,0x962540,0xf0001a18,0x2802000, -0x1862460,0xf000c247,0x7c00100,0x1430400,0xf000d000,0x4000000,0xe00000,0xf000e300,0x4000000,0xe00000,0xf000e59d,0x2802100,0x962460,0xf000e59d,0x7c00100,0x230400, -0xf0012447,0,0x818820,0xf0012447,0,0xc18820,0xf0012447,0,0x1418820,0xf0012447,0x2802000,0x962460,0xf0012447,0x2802400,0x962460,0xf0012447, -0x7c00100,0x230400,0xf0013a19,0x7c00100,0x220400,0xf0014102,0x2802400,0x962460,0xf0014308,0x2802100,0x962460,0xf0014308,0x7c00500,0x22040e,0xf0014308,0x7c00500, -0x22040f,0xf001440a,0x4000000,0x500000,0xf0014500,0x4000000,0x200000,0xf00146c6,0x2802100,0x962460,0xf00146c6,0x2806000,0x2f62460,0xf00146c6,0x4000000,0xe00000, -0xf00146c6,0x6800000,0x2d29800,0xf00146c6,0x6800100,0x962540,0xf00146c6,0x6804000,0x962540,0xf00146c6,0x7c00100,0x2b30400,0xf00146c6,0x7c00100,0x2c30560,0xf00146c6, -0xc000010,0x448000,0xf00147c7,0x2802000,0x962460,0xf00147c7,0x6800000,0x1329800,0xf00147c7,0x7c00100,0x230400,0xf00ac511,0x7c40300,0xe30000,0xf00acf00,0x4000000, -0xe00000,0xf00b2914,0x7c00100,0x2530000,0xf00b2916,0x7c00100,0x2530c00,0xf00b2a00,0x4000000,0xe00000,0xf00b2a00,0x4000000,0x2800000,0xf00b4211,0x7c40300,0xe30000, -0xf10a3c00,0x4000000,0xe00000,0xf10a3c00,0x4008000,0xe00000,0xf10a8200,0x4008000,0xe00000,0xf10b4811,0x7c40300,0xe30000}; +0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x4440020,0x11000100,0x40000001,0x4643020,0x11000100,0x40000001,0x4a5a040,0x11000100,0x40000001, +0x516a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc8c4000b,0x11000200,0x7c00100,0xc8220402,0x11000200,0x24000000,0x4200000,0x11000200,0x24000008,0x5710000, +0x11000200,0x40000001,0x5d3b020,0x11000219,0x7c00100,0xfc220401,0x11000219,0x7c00100,0xfc250401,0x11000319,0x7c00100,0xc8220402,0x11000319,0x7c00100,0xfc220401,0x11000319, +0x7c00100,0xfc250400,0x11000319,0x7c00100,0xfc250401,0x11000419,0x7c00100,0x8220400,0x11000419,0x7c00100,0x10220400,0x11000419,0x7c00100,0x10230400,0x11000419,0x7c00100, +0x18220400,0x11000419,0x7c00100,0x18230400,0x11000419,0x7c00100,0x20220400,0x11000419,0x7c00100,0x20250400,0x11000419,0x7c00100,0xc8220402,0x11000419,0x7c00100,0xc8250402, +0x11000419,0x7c00100,0xfc220401,0x11000419,0x7c00100,0xfc250400,0x11000419,0x7c00100,0xfc250401,0x11000519,0x7c00100,0x10220400,0x11000519,0x7c00100,0x10230400,0x11000519, +0x7c00100,0x18220400,0x11000519,0x7c00100,0x30220400,0x11000519,0x7c00100,0xfc220400,0x11000600,0x4000400,0x4200400,0x11000600,0x4000400,0xc8200002,0x11000600,0x7c00500, +0x10220400,0x11000600,0x7c00500,0x10230400,0x11000600,0x7c00500,0x10530400,0x11000600,0x7c00500,0xfc230400,0x11000600,0x7c00d00,0x10230400,0x11000619,0x7c00500,0xc822040f, +0x11000800,0x4000010,0xc9001401,0x11000800,0x4000400,0xc8200001,0x11000800,0x6800010,0xc8201001,0x11000800,0x7c00500,0xc8230401,0x11000807,0x7c00100,0x80220400,0x11000807, +0x7c00100,0x80250400,0x1100080e,0x4000400,0xc8200002,0x1100080e,0x4000400,0xf8200000,0x1100080e,0x7000500,0xc8220402,0x1100080e,0x7c00100,0x8250400,0x1100080e,0x7c00100, +0x18220400,0x1100080e,0x7c00100,0xc8220402,0x1100080e,0x7c00100,0xc8250401,0x1100080e,0x7c00100,0xfc220400,0x1100080e,0x7c00100,0xfc220401,0x1100080e,0x7c00100,0xfc250401, +0x1100080e,0x7c00120,0xc8220402,0x1100080e,0x7c00120,0xc8250402,0x11000908,0x4000000,0xc200000,0x11000908,0x7c00100,0x8220400,0x11000908,0x7c00100,0x8220401,0x11000908, +0x7c00100,0x8250400,0x11000908,0x7c00100,0x8250401,0x11000908,0x7c00100,0xfc220400,0x11000908,0x7c00100,0xfc220401,0x11000908,0x7c00100,0xfc250400,0x11000908,0x7c00100, +0xfc250401,0x11000a03,0x4000000,0x4200400,0x11000a03,0x4000000,0x4201000,0x11000a03,0x4000000,0x4270000,0x11000a03,0x7c00100,0xc8220402,0x11000a03,0x7c00100,0xfc220400, +0x11000a03,0x7c00100,0xfc250400,0x11000a03,0x7c00500,0xfc230400,0x11000a03,0xc000010,0x5049400,0x11000b13,0x2802500,0x20962460,0x11000b13,0x2802500,0xfc962460,0x11000b13, +0x4000000,0x4200000,0x11000b13,0x4000000,0xf8201000,0x11000b13,0x4000000,0xf8230400,0x11000b13,0x4000002,0x4400000,0x11000b13,0x4000010,0x4200000,0x11000b13,0x7c00100, +0xfe633800,0x11000c00,0x80000000,0x5329960,0x11000c02,0x2802100,0x20962460,0x11000c02,0x2802400,0x20962460,0x11000c02,0x4000000,0x4200000,0x11000c02,0x4000000,0x5329400, +0x11000c02,0x4000000,0x5329800,0x11000c02,0x4000000,0x5500000,0x11000c02,0x6800000,0xfd329800,0x11000c02,0x7c00100,0x8230400,0x11000c02,0x7c00100,0xc8230402,0x11000c02, +0x7c00100,0xfc230400,0x11000c02,0x7c00100,0xfc230401,0x11000c02,0x7c00500,0xfc230400,0x11000c02,0x7d00100,0xc0230400,0x11000f01,0x2802400,0x10962460,0x11000f0a,0x2802100, +0xfc962460,0x11000f0a,0x2802400,0xfc962460,0x11000f0a,0x2806400,0xfc962460,0x11000f0a,0x4000000,0x4200000,0x11000f0a,0x6800100,0xfc962540,0x11000f0a,0x7c00100,0xc8230401, +0x11000f0a,0x7c00100,0xfc230400,0x11000f0a,0x7c00100,0xfc230401,0x11001004,0x2802100,0xfc962460,0x11001004,0x2802400,0xfc962460,0x11001004,0x2806400,0xfc962460,0x11001004, +0x4000000,0x4200000,0x11001004,0x4000000,0x5500000,0x11001004,0x6800100,0xfc962540,0x11001004,0x6800100,0xfc962541,0x11001004,0x7c00100,0xc8230401,0x11001004,0x7c00100, +0xfc230400,0x11001110,0x2802100,0xfc962460,0x11001110,0x2802400,0xfc962460,0x11001110,0x2806400,0xfc962460,0x11001110,0x6800100,0xfc962540,0x11001110,0x7c00100,0xc8230401, +0x11001110,0x7c00100,0xfc230400,0x1100120f,0x2802100,0xfc962460,0x1100120f,0x2802400,0xfc962460,0x1100120f,0x2806400,0xfc962460,0x1100120f,0x6800100,0xfc962540,0x1100120f, +0x7c00100,0xfc230400,0x1100131f,0x2802100,0xfc962460,0x1100131f,0x2802400,0xfc962460,0x1100131f,0x2806400,0xfc962460,0x1100131f,0x4000000,0x4200000,0x1100131f,0x6800000, +0xfd329800,0x1100131f,0x6800100,0xfc962540,0x1100131f,0x6800100,0xfc962541,0x1100131f,0x7c00100,0xc8230401,0x1100131f,0x7c00100,0xfc230400,0x11001423,0x2802100,0xfc962460, +0x11001423,0x2806400,0xfc962460,0x11001423,0x6800100,0xfc962540,0x11001423,0x6800100,0xfc962541,0x11001423,0x7c00100,0xfc230400,0x11001423,0x7c00100,0xfc230401,0x11001524, +0x2802100,0xfc962460,0x11001524,0x2802100,0xfc962461,0x11001524,0x2806400,0xfc962460,0x11001524,0x6800000,0xfd329800,0x11001524,0x6800100,0xfc962540,0x11001524,0x7c00100, +0xfc230400,0x11001615,0x2802100,0xfc962460,0x11001615,0x2806400,0xfc962460,0x11001615,0x6800100,0xfc962540,0x11001615,0x6800100,0xfc962541,0x11001615,0x7c00100,0x8230400, +0x11001615,0x7c00100,0xfc230400,0x1100171a,0x2802100,0xfc962460,0x1100171a,0x2806400,0xfc962460,0x1100171a,0x6800000,0xfd329800,0x1100171a,0x6800100,0xfc962540,0x1100171a, +0x6800100,0xfc962541,0x1100171a,0x7c00100,0xfc230400,0x11001900,0x4000000,0x5600000,0x11001926,0x2802100,0xfd862460,0x11001926,0x2802400,0xfd862460,0x11001926,0x2806100, +0xfd862460,0x11001926,0x4000000,0x4200000,0x11001926,0x4000010,0x4400000,0x11001926,0x6800000,0xfd329800,0x11001926,0x7800100,0xc9830142,0x11001926,0x7c00100,0xfd830000, +0x11001926,0x7c00900,0xfd830000,0x11001926,0x7e00100,0xfd830000,0x11001a18,0x2802100,0xfd862460,0x11001a18,0x2802400,0xfd862460,0x11001a18,0x6800000,0xfd329800,0x11001a18, +0x7800100,0xc9830142,0x11001a18,0x7c00100,0xc9830002,0x11001a18,0x7c00100,0xfd830000,0x11001a18,0x7c00900,0xfd830000,0x11001a18,0x7e00100,0xfd830000,0x11001d0c,0x7c00100, +0x8230400,0x11001d0c,0x7c00100,0x8250400,0x11001d0c,0x7c00100,0xfc230400,0x11001e12,0x7c00100,0xa230500,0x11001e12,0x7c00100,0xa330520,0x11001e12,0x7c80100,0xc6330520, +0x11002619,0x7c00100,0xc8220402,0x11002619,0x7c00100,0xfc220401,0x11002619,0x7c00100,0xfc250401,0x1100270e,0x4000400,0xc8200001,0x1100270e,0x4000400,0xc8200002,0x1100270e, +0x4000400,0xc8500001,0x1100270e,0x7c00100,0xc8220401,0x1100270e,0x7c00100,0xc8250401,0x1100270e,0x7c00100,0xfc220401,0x1100270e,0x7c00100,0xfc250401,0x11002800,0x80000, +0xc4918820,0x11002800,0x80000,0xc5c18020,0x11002800,0x180000,0xc0918820,0x11002800,0x4000001,0xc8445801,0x11002800,0x4000001,0xc8445802,0x11002800,0x4000001,0xc8c4000b, +0x11002800,0x6800000,0x10201c00,0x11002800,0x6800020,0x10201c00,0x11002800,0x24000000,0x4200000,0x11002800,0x24000000,0x4810000,0x11002800,0x24000000,0x5410000,0x11002800, +0x24000000,0x5500000,0x11002800,0x24000000,0xc8200002,0x11002800,0x24000000,0xc9500002,0x11002800,0x24000002,0x4400000,0x11002800,0x24000006,0xc8c0000b,0x11002800,0x24000008, +0x5410000,0x11002800,0x24000008,0x5710000,0x11002800,0x24000020,0x5001400,0x11002800,0x24000020,0xc9500002,0x11002800,0x2c000010,0x5248000,0x11002800,0x2c000010,0xc9248002, +0x11002800,0x40000001,0x463b020,0x11002800,0x40080000,0xc4918820,0x11002801,0x2880000,0xc6a65620,0x11002801,0x2882000,0xc4962460,0x11002900,0x4000000,0xc820000e,0x11002900, +0x4000000,0xc820000f,0x11002900,0x4000020,0xc820000e,0x11002900,0x4000020,0xc820000f,0x11002900,0x4000020,0xc881000e,0x11002900,0x4000020,0xc881000f,0x11002900,0x4000020, +0xc941000e,0x11002900,0x4000020,0xc941000f,0x11002900,0x4000022,0xc820000e,0x11002900,0x4000022,0xc820000f,0x11002a00,0x4000000,0x5500000,0x11002a00,0x4000000,0x5600000, +0x11002a00,0x4000000,0xc9600002,0x11002b01,0x2000,0x14962460,0x11002b01,0x2802020,0x10962460,0x11002c00,0x4000000,0x4200000,0x11002c00,0x4000000,0xc200000,0x11002c00, +0x4000000,0xc8200002,0x11002c00,0x4000000,0xc820000f,0x11002c00,0x4000020,0x4200000,0x11002c00,0x7c00000,0x10200000,0x11002c00,0x7c00020,0x10200000,0x11002c00,0x7c00120, +0xc8220405,0x11002c00,0x7c00120,0xc8230402,0x11002c00,0x7c00120,0xc8250402,0x11002c00,0x7c00120,0xc8250405,0x11002c19,0x7c00100,0x8250400,0x11002c19,0x7c00100,0xc8250401, +0x11002d00,0x4000000,0xc8100006,0x11002d00,0x4000000,0xc8200006,0x11002d19,0x7c00100,0x18230400,0x11002d19,0x7c00100,0xc8220402,0x11002d19,0x7c00100,0xc8250402,0x11002e00, +0x24000000,0x4200000,0x11002e00,0x24000020,0x4200000,0x11002e00,0x24000020,0x4200001,0x11002f00,0x24000020,0x4200000,0x11002f00,0x24000020,0x4200001,0x11002f00,0x24000020, +0x4f00000,0x11002f00,0x24000020,0x5600000,0x11002f00,0x24000020,0xc8200002,0x11002f00,0x24000022,0x5600000,0x11003000,0x24000000,0x4200000,0x11003000,0x24000020,0x4200000, +0x11003000,0x24000020,0x4810000,0x11003000,0x24000020,0x5410000,0x11003100,0x24000000,0x4200000,0x11003200,0x24000000,0x4200000,0x11003300,0x4000000,0xc8100003,0x11003400, +0x24000000,0x4100000,0x11003400,0x24000000,0x4200000,0x11003500,0x24000000,0x4200000,0x11003600,0x24000000,0x4200000,0x11003600,0x24000020,0x4200000,0x11003700,0x24000000, +0x4200000,0x11003700,0x24000000,0x4e00000,0x11003700,0x24000000,0x6800000,0x11003700,0x24000020,0x4200000,0x11003800,0x4000000,0x4100000,0x11003800,0x24000000,0x4200000, +0x11003800,0x24000000,0x4b00000,0x11003800,0x24000000,0x4e00000,0x11003800,0x24000000,0x5710000,0x11003800,0x24000000,0x6800000,0x11005003,0x7c00100,0xc8220402,0x11005013, +0x2802500,0x30962460,0x11005013,0x4000020,0xc8200005,0x11005013,0x7c00100,0xca633801,0x11005013,0x7c00100,0xca633802,0x11005013,0x7c00100,0xca633805,0x11005019,0x7c00100, +0xc8220402,0x11005102,0x7000100,0xc8230408,0x11005102,0x7c00100,0xc8230404,0x11005102,0x7c00100,0xc8230407,0x11005102,0x7c00100,0xc8230408,0x11005102,0x7c00100,0xc8230409, +0x11005201,0x2802400,0x10962460,0x11005500,0x80000,0xc5e18820,0x11005502,0x7000100,0xc8230408,0x11005502,0x7c00100,0xc8230404,0x11005502,0x7c00100,0xc8230407,0x11005502, +0x7c00100,0xc8230408,0x11005502,0x7c00100,0xc8230409,0x11005667,0x1000,0,0x11020200,0x80004,0xc4418820,0x11020200,0x4000000,0xc8100006,0x11020200,0x4000000, +0xc810000f,0x11020200,0x4000400,0xc8100002,0x11020200,0x4000400,0xc8500002,0x11020200,0x6800c00,0xf8101000,0x11020200,0x24000000,0x4100000,0x11020200,0x24000000,0x4200000, +0x11020200,0x24000000,0x5400000,0x11020200,0x24000000,0x5500000,0x11020200,0x24000000,0x5600000,0x11020200,0x24000020,0x4100000,0x11020200,0x24000020,0x5600000,0x11020219, +0x7c00100,0xc812040f,0x11020219,0x7c00100,0xfc220400,0x11020219,0x7c00100,0xfc220401,0x11020219,0x7c00100,0xfc250400,0x11020319,0x7c00100,0xc8220402,0x11020319,0x7c00100, +0xc8250402,0x11020319,0x7c00100,0xfc220400,0x11020319,0x7c00100,0xfc220401,0x11020319,0x7c00100,0xfc250400,0x11020319,0x7d00100,0xc0220402,0x11020419,0x7c00100,0xfc220401, +0x11020519,0x7c00100,0x10220400,0x11020600,0x4000400,0x4200400,0x11020600,0x4000400,0xc8100002,0x11020600,0x7c00500,0x10130400,0x11020600,0x7c00d00,0x10130400,0x11020701, +0x2802400,0x10962460,0x11020701,0x2802400,0x10c62460,0x11020701,0x2802400,0x20962460,0x11020701,0x2802400,0xc8962461,0x11020701,0x2802400,0xfc962460,0x1102080e,0x7c00100, +0xfc220400,0x1102080e,0x7c00100,0xfc250400,0x11020908,0x7c00100,0xfc220400,0x11020908,0x7c00100,0xfc220401,0x11020908,0x7c00100,0xfc250400,0x11020908,0x7c00100,0xfc250401, +0x11022800,0x24000000,0x4100000,0x11022800,0x24000000,0x4200000,0x11022800,0x24000000,0x5500000,0x11022800,0x24000000,0xc8200002,0x11022800,0x24000000,0xc8f00002,0x11022800, +0x24000000,0xc8f0ac02,0x11022800,0x24000000,0xf8401000,0x11022800,0x24000002,0x4100000,0x11022800,0x24000002,0x4370000,0x11022800,0x24000002,0x4470000,0x11022800,0x24000006, +0xf8400000,0x11022800,0x24000008,0x5710000,0x11022800,0x24000008,0x5712c00,0x11022800,0x24000008,0xf9712c00,0x11022800,0x24000020,0x4100000,0x11022800,0x24000020,0x5500000, +0x11022800,0x24000020,0xc9500002,0x11022900,0x4000000,0xc810000e,0x11022900,0x4000000,0xc810000f,0x11022919,0x7c00100,0xc812040f,0x11022c00,0x4000000,0xc8100002,0x11022c00, +0x4000000,0xc810000f,0x11022c00,0x4000000,0xc9500002,0x11022c00,0x4000000,0xc9600002,0x11022c00,0x7c00120,0xc8120405,0x11022c0e,0x7c00100,0xc8250401,0x11022c19,0x7c00100, +0xc8150401,0x11022d00,0x4000000,0xc8100006,0x11022d00,0x4000000,0xc8200006,0x11022d19,0x7c00100,0xc8120402,0x11022d19,0x7c00100,0xc8150402,0x11022e00,0x24000000,0x4200000, +0x11022e00,0x24000020,0x4100000,0x11022f00,0x24000020,0x4100000,0x11022f00,0x24000020,0x4100001,0x11022f00,0x24000020,0xc8100002,0x11023000,0x24000000,0x4100000,0x11023300, +0x4000000,0xc8100002,0x11023300,0x4000000,0xc8100003,0x11023300,0x4000100,0xc8120403,0x11023300,0x4000100,0xc8150403,0x11023400,0x24000000,0x4100000,0x11023500,0x24000000, +0x4100000,0x11023600,0x24000000,0x4100000,0x11023600,0x24000020,0x4100000,0x11023700,0x24000000,0x4100000,0x11023700,0x24000000,0x4e00000,0x11023700,0x24000020,0x4100000, +0x11023800,0x4000000,0x4100000,0x11023800,0x24000000,0x4200000,0x11024e67,0,0,0x11025600,0x4000000,0x4100000,0x11042a00,0x4000000,0x5600000,0x11045700, +0x4000000,0xc820000a,0x11045700,0x4000020,0xc820000a,0x11045712,0x7c00100,0xc8e3040a,0x11045712,0x7c80100,0xc4e3040a,0x11045716,0x7c00100,0xc8e30c0a,0x11045716,0x7c00100, +0xca530c0a,0x11063d00,0x4000001,0xc8445811,0x11065700,0x4000000,0xc8810011,0x11065700,0x4000000,0xc8e00011,0x11065700,0x4000000,0xc9410011,0x11065700,0x4000000,0xc9500011, +0x11065700,0x4000000,0xc9600011,0x11065700,0x4000006,0xc8e70011,0x11065700,0x4000008,0xc8e00011,0x11065700,0x4000008,0xc8e02c11,0x11065700,0x4000010,0xc8871411,0x11065700, +0x4000010,0xc9201411,0x11065700,0x4000010,0xc9271011,0x11065700,0x4000020,0xc8e00011,0x11065700,0x4000400,0xc8e00011,0x11065700,0x4000420,0xc8e00011,0x11065700,0x6800000, +0xc8e01c11,0x11065700,0x6800040,0xc8e29811,0x11065700,0xc000010,0xc880ac11,0x11065700,0xc000010,0xc8b48011,0x11065719,0x7c00100,0xc8e20411,0x11065719,0x7c00100,0xc8e50411, +0x11065719,0x7c00140,0xc8e20411,0x11065719,0x7c00140,0xc8e50411,0x11080100,0x6800000,0xfc201c00,0x11080100,0x68000c0,0xfd329800,0x11080100,0x24000000,0x4200000,0x11080100, +0x24000000,0x4810000,0x11080100,0x24000000,0x5410000,0x11080100,0x24000000,0x5500000,0x11080100,0x24000000,0x5600000,0x11080100,0x24000000,0x5b00000,0x11080100,0x24000000, +0x6410000,0x11080100,0x24000006,0xf8d70000,0x11080100,0x24000008,0x5714000,0x11080100,0x24000008,0xf9713c00,0x11080100,0x24000010,0x5001400,0x11080100,0x24000010,0x5071400, +0x11080100,0x24000010,0xf9071000,0x11080100,0x24000020,0x4200000,0x11080100,0x24000020,0x4400000,0x11080100,0x24000020,0x5600000,0x11080100,0x24000400,0x4200000,0x11080100, +0x24000420,0x4200000,0x11080100,0x2c000010,0x4b48000,0x11080100,0x2c000010,0xf900ac00,0x11080100,0x44000001,0x5a45800,0x11080119,0x7c00100,0xfc220400,0x11080119,0x7c00100, +0xfc250400,0x11080119,0x7c001c0,0xfc220400,0x11080119,0x7c001c0,0xfc250400,0x11080200,0x4000400,0xc8200002,0x11080200,0x24000000,0x4200000,0x11080200,0x24000000,0x5500000, +0x11080200,0x24000000,0x5600000,0x11080200,0x24000020,0x4200000,0x110a1e12,0x7c00100,0xa130480,0x110a1e12,0x7c80100,0xc6130480,0x110a3000,0x24000000,0x4e00000,0x110a3000, +0x24100000,0xc0810001,0x110a3000,0x24100000,0xc1410001,0x110a3700,0x24000000,0x4200000,0x110a3d00,0x4000000,0x4e00000,0x110a3d00,0x4000000,0xc8e00002,0x110a3d00,0x24000000, +0x4e00000,0x110a3d11,0x7c00300,0x10e30000,0x110a3d11,0x7c00300,0xfce30000,0x110a3d11,0x7c00900,0xfd230400,0x110a3d12,0x2802400,0x18962460,0x110a3e14,0x7c00100,0xfce30000, +0x110a3e14,0x7c00100,0xfce30001,0x110a3e14,0x7c00100,0xfe530000,0x110a3e14,0x7c00900,0xfd230000,0x110a3e14,0x7c00900,0xfd230001,0x110a3f16,0x7c00100,0xfce30c00,0x110a3f16, +0x7c00100,0xfce30c01,0x110a3f16,0x7c00100,0xfe530c00,0x110a3f16,0x7c00900,0xfd230c00,0x110a3f16,0x7c00900,0xfd230c01,0x110a4005,0x7c00100,0xfce30400,0x110a4112,0x7c00100, +0xc8e30402,0x110a4112,0x7c80100,0xc4e30402,0x110a4400,0x4000000,0x14e00000,0x110a4412,0x4000000,0xc8e00002,0x110a4412,0x4000000,0xc8e00003,0x110a4416,0x4000000,0xc8e00c03, +0x110a4500,0x4000000,0xc8e0000d,0x110a4516,0x4000000,0xc8e00c0d,0x110a4711,0x7c40300,0xfce30000,0x110a4f11,0x7c00300,0xc8e30001,0x110a4f11,0x7c40300,0xfce30000,0x110a5300, +0x4000000,0xc8810010,0x110a5300,0x4000000,0xc8e00002,0x110a5300,0x4000000,0xc8e00010,0x110a5300,0x4000000,0xc9410010,0x110a5300,0x4000002,0xc8e70010,0x110a5300,0x4000008, +0xc8810010,0x110a5300,0x4000008,0xc9410010,0x110a5300,0x6800000,0xc8e01c02,0x110a5300,0x6800000,0xc8e01c10,0x110a5400,0x4000000,0xc881000c,0x110a5400,0x4000000,0xc8e0000c, +0x110a5400,0x4000000,0xc941000c,0x110a5400,0x4000000,0xc950000c,0x110a5400,0x4000000,0xc960000c,0x110a5400,0x4000002,0xc8e7000c,0x110a5400,0x4000010,0xc887140c,0x110a5400, +0x4000010,0xc8e7000c,0x110a5400,0x4000010,0xc920140c,0x110a5400,0x4000010,0xc927100c,0x110a5400,0x4000020,0xc8e0000c,0x110a5400,0x4000026,0xc8e7000c,0x110a5400,0xc000010, +0xc880ac0c,0x110a5400,0xc000010,0xc8b4800c,0x11400c0c,0x4000010,0x4b00000,0x11400c0c,0x4000010,0x5071400,0x11400c17,0xc000010,0x4b48000,0x11400c1e,0x7c00900,0x8230400, +0x11400f4b,0xc000010,0x4448000,0x11400f5f,0xc000010,0x4448000,0x11401d94,0x4000000,0x4200000,0x11403dcc,0x4000000,0x4e00000,0x114457c1,0x4000008,0xc881000a,0x114457c1, +0x4000008,0xc941000a,0x114457c1,0x4000010,0xc887000a,0x114457c1,0x6800004,0xc920000a,0x114457c1,0xc000010,0xc884800a,0x114457ca,0x3802500,0xc926246a,0x114457ca,0x7c00d00, +0xca530c0a,0x114a3dc1,0x24000000,0x4810000,0x114a3dc1,0x24000000,0x5410000,0x114a3dc1,0x24000008,0x4810000,0x114a3dc1,0x24000008,0x5410000,0x114a3dc1,0x24000010,0x4870000, +0x114a3dc1,0x2c000010,0x4848000,0x114a3dc7,0x4000000,0x4e00000,0x114a3dc7,0x24000000,0x4e00000,0x114a3dc7,0x24000002,0x4e00000,0x114a3dc7,0x24000002,0x5200000,0x114a3dc7, +0x24000008,0x4810000,0x114a3dc7,0x24000008,0x5410000,0x114a3dc7,0x24000008,0xc810000,0x114a3dca,0x7c00900,0x10930c00,0x114a3dca,0x7c00900,0x10e30c00,0x114a3dcc,0x7c00300, +0xfce30000,0x114a3eca,0x7000400,0xc9200c02,0x114a3fc1,0x6800004,0xf9200000,0x114a3fca,0x7c00d00,0xfe530c00,0x114a42cc,0x4000000,0x4e00000,0x114a42cc,0x4000000,0xc8e0000f, +0x114a44cc,0x4000000,0xc8e00002,0x114a44cc,0x4000000,0xc8e00003,0x114a45cc,0x4000000,0xc8e00002,0x114a45cc,0x4000000,0xc8e0000d,0x11505113,0x24000000,0x14810000,0x11505113, +0x24000000,0x15410000,0x1180090a,0x2802400,0x18962460,0x11800c27,0x2802100,0xfc962460,0x11800c27,0x2802500,0xfc962460,0x11800f32,0x2802400,0x8962460,0x11800f3f,0x2802400, +0x8962460,0x11820700,0x2802400,0xfc962460,0x11820700,0x2802500,0xfc962460,0x118a3dcd,0x2802400,0x10962460,0x118a3eca,0x2802400,0xfc962460,0x11c00904,0x2802400,0x8962460, +0x11c00908,0x2802400,0x18962460,0x11c00c2c,0x6800000,0xfd329800,0x11c00c30,0xc000010,0x4b48000,0x11c00f78,0x6800000,0xfd329800,0x11c0107d,0x6800000,0xfd329800,0x11c01181, +0x6800000,0xfd329800,0x11c01285,0x6800000,0xfd329800,0x11c01489,0x4000000,0x4200000,0x11c01489,0x6800000,0xfd329800,0x11c0168d,0x6800000,0xfd329800,0x11d05117,0x7c00100, +0xc8230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x20962460,0x20000b13,0x2802500,0x20962460,0x20001b27,0x2802100,0xc8962461,0x20001b27,0x2802100,0xfc962460, +0x20001b27,0x2802400,0x10962460,0x20001b27,0x2802400,0x20962460,0x20001b27,0x2802400,0xfc962460,0x20001b27,0x2802500,0xfc962460,0x20001b27,0x2806400,0xfc962460,0x20001b27, +0x2902100,0xc0962462,0x20001b27,0x4000000,0x4200000,0x20001b27,0x4000000,0x4400000,0x20001b27,0x4000000,0x4500000,0x20001b27,0x4000000,0x4810000,0x20001b27,0x4000000, +0x4b00000,0x20001b27,0x4000000,0x5410000,0x20001b27,0x4000000,0xc8c0000b,0x20001b27,0x4000000,0xf8400000,0x20001b27,0x4000010,0x4b00000,0x20001b27,0x4000010,0x4c00000, +0x20001b27,0x6800000,0xfd329800,0x20001b27,0x6800100,0xfc462540,0x20001b27,0x6800400,0xfc962540,0x20001b27,0x7c00100,0xc8230401,0x20001b27,0x7c00100,0xfc230400,0x20002619, +0x7c00100,0xc8220401,0x20002a00,0x4000000,0x5600000,0x20004b67,0,0x1900000,0x20004c67,0,0x1900000,0x20004d67,0,0x1900000,0x20006d67,0x1000, +0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0,0x200a4a12,0x7c00100,0xfdf304c1,0x200a4a12,0x7c00100,0xfe0304e1, +0x21005600,0x4000000,0x4700000,0x21022a00,0x4000000,0x5600000,0x30000419,0x7c00100,0x8220400,0x30000419,0x7c00100,0x8250400,0x30000419,0x7c00100,0x20220400,0x30000419, +0x7c00100,0x20250400,0x30000419,0x7c00100,0xfc220401,0x30000419,0x7c00100,0xfc250401,0x30000519,0x7c00100,0x10220400,0x30000600,0x4000400,0x4200400,0x30000600,0x7c00500, +0x10230400,0x30000600,0x7c00500,0xfc230400,0x30000605,0x4000400,0x4200400,0x3000080e,0x7c00100,0x8220400,0x3000080e,0x7c00100,0x10220400,0x30000908,0x2000,0xc962460, +0x30000908,0x7c00100,0xfc220400,0x30000908,0x7c00100,0xfc220401,0x30000908,0x7c00100,0xfc250400,0x30000908,0x7c00100,0xfc250401,0x30000a03,0x4000006,0xf8400400,0x30000c02, +0x4000000,0xf8200000,0x30000c02,0x7c00100,0xfc230400,0x30000d22,0x2802100,0x40962460,0x30000d22,0x2802400,0x50962460,0x30000d22,0x2802500,0x40962460,0x30000d22,0x4000000, +0x44200000,0x30000d22,0x4000010,0x44200000,0x30000d22,0x7c00100,0x40230400,0x30000d22,0xc000010,0x44248000,0x30000d22,0x80000000,0x44218560,0x30000e25,0x2802500,0xfc962460, +0x30000e25,0x7c00100,0xfc230400,0x30001821,0x2802100,0x30962460,0x30001821,0x2802100,0xfc962460,0x30001821,0x2806400,0xfc962460,0x30001821,0x4000000,0x4200000,0x30001821, +0x6800100,0x30962540,0x30001821,0x6800100,0xfc962540,0x30001821,0x6800100,0xfc962541,0x30001821,0x7c00100,0x30230400,0x30001821,0x7c00100,0xfc230400,0x30001b27,0x2802100, +0xfc962460,0x30001b27,0x2802400,0xfc962460,0x30001b27,0x4000000,0x4200000,0x30001b27,0x4000000,0x4400000,0x30001b27,0x7c00100,0xfc230400,0x30001c1c,0x2802100,0xfd862460, +0x30001c1c,0x2802400,0xfd862460,0x30001c1c,0x2806400,0xfd862460,0x30001c1c,0x4000000,0x4200000,0x30001c1c,0x6800100,0xfd862400,0x30001c1c,0x6800100,0xfd862540,0x30001c1c, +0x7c00100,0xfd830000,0x30001c1c,0x7c00100,0xfd830001,0x30001c1c,0xc000010,0x4448000,0x30001f0b,0x4000000,0x4200000,0x30001f0b,0x4000010,0x4200000,0x30001f0b,0x4000010, +0x4400000,0x30001f0b,0x6800000,0x8200000,0x30001f0b,0x7c00100,0xfc230400,0x30001f0b,0xc000010,0x4248000,0x30002006,0x7c00100,0x40250400,0x30002128,0x4000000,0x44200000, +0x30002128,0x7c00100,0x40230400,0x30002128,0xc000010,0x44248000,0x3000221d,0x4000000,0x84810000,0x3000221d,0x4000000,0x85410000,0x3000221d,0x4000001,0x84445800,0x3000221d, +0x7c00100,0x80230400,0x30002300,0x4000010,0x4400000,0x30002320,0x7c00100,0x80230400,0x30002417,0x2802100,0xfd862460,0x30002417,0x2802400,0x9862460,0x30002417,0x2802400, +0x11862460,0x30002417,0x2802400,0x19862460,0x30002417,0x2802400,0xfd862460,0x30002417,0x2806400,0xfd862460,0x30002417,0x2882000,0xc5862460,0x30002417,0x4000000,0x4200000, +0x30002417,0x4000000,0x5600000,0x30002417,0x4000000,0xc400000,0x30002417,0x4000010,0x4400000,0x30002417,0x4000010,0x5200000,0x30002417,0x6800000,0xfd329800,0x30002417, +0x6800100,0xfd862540,0x30002417,0x7c00100,0x9830000,0x30002417,0x7c00100,0xfd830000,0x30002417,0x7d00100,0xc1830000,0x30002417,0xc000010,0x4448000,0x3000251b,0x80000, +0xc4c18820,0x3000251b,0x2802100,0xa0962460,0x3000251b,0x3c02100,0x80962460,0x3000251b,0x4000000,0x84200000,0x3000251b,0x4000006,0x84500000,0x3000251b,0x4000010,0x84400000, +0x3000251b,0x4000010,0x84b70000,0x3000251b,0x4000800,0x84200000,0x3000251b,0x6800000,0x81329800,0x3000251b,0x7c00100,0x80230400,0x3000251b,0x7c00900,0x80230400,0x3000251b, +0xc000010,0x84b48000,0x3000251b,0x12882000,0xc4962460,0x30002800,0x24000000,0x4200000,0x30002800,0x2c000010,0xc9248002,0x30002a00,0x4000000,0x5600000,0x30002b01,0x2000, +0x14962460,0x30002c00,0x4000000,0x4200000,0x30002c00,0x7c00100,0xc8220405,0x30002d19,0x7c00100,0x18250400,0x30002e00,0x24000000,0x4200000,0x30003000,0x24000000,0x4200000, +0x30003100,0x24000000,0x4200000,0x30003600,0x24000000,0x4200000,0x30003700,0x24000000,0x4200000,0x3000392e,0x24000000,0x14200000,0x30005013,0x7c00100,0xca633801,0x30005600, +0,0x4918820,0x30020600,0x4000400,0x4500400,0x30020701,0x2802400,0x10962460,0x30020701,0x2802400,0x10c62460,0x300a3a11,0x4020000,0x4e00000,0x300a3a11,0x4020000, +0xc8e00002,0x300a3b11,0x4020000,0xc8e00002,0x300a3c00,0x4008000,0x4e00000,0x300a3c00,0x4010000,0x4e00000,0x300a3d11,0x7c00300,0xc8e30002,0x300a4305,0x7c00100,0xfce30400, +0x300a4611,0x7c40300,0xfce30000,0x300a4829,0x7c00100,0x40e30400,0x300a4829,0x7c00900,0x41230400,0x300a4929,0x4000000,0x44e00000,0x3040259a,0x4000010,0x84400000,0x3040259a, +0x4000010,0x84b70000,0x3040259a,0xc000010,0x84b48000,0x304028bc,0x4000001,0xc8c41c0b,0x304a3dcc,0x4000000,0x4e00000,0x30800c27,0x2802100,0xfc962460,0x30c01c92,0x6800000, +0xfd329800,0x3100080e,0x7c00120,0xc8220402,0x3100080e,0x7c00120,0xc8250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x84200000,0x3100581e,0x7c00100,0x80230400, +0x3100590d,0x7c00100,0x80230400,0x31005a09,0x7c00100,0x80220400,0x31005a09,0x7c00100,0x80250400,0x31005b00,0x4000000,0x14200000,0x31005c00,0x80000,0xc4918820,0x31005c00, +0x2802000,0x10962460,0x31005c00,0x2802400,0x10962460,0x31005c00,0x4000000,0x14200000,0x31005c00,0x4000000,0xc8200001,0x31005c00,0x6800000,0x10962540,0x31005c00,0x6800400, +0x10962540,0x31005c01,0x2802400,0x10962460,0x31005d00,0x4000020,0xc8200005,0x31005d00,0x6800020,0xc9329805,0x31005d00,0x7c00120,0xc8220405,0x31005d00,0x7c00120,0xc8250405, +0x31006000,0x82000,0xc4962460,0x31006000,0x180000,0xc0918820,0x310a5e11,0x7c40300,0xfce30000,0x310a5f11,0x7c00300,0xc8e30001,0x32000419,0x7c00100,0x20250400,0x3200080e, +0x4000020,0x4200000,0x3200080e,0x7c00100,0x8220400,0x3200080e,0x7c00100,0x8250400,0x32000908,0x7c00100,0xfc220400,0x32000908,0x7c00100,0xfc250400,0x32000c02,0x7c00100, +0x8230400,0x32000e25,0x7c00100,0xfc230400,0x32001d0c,0x7c00100,0xfc230400,0x32002800,0x80000,0xc5e18820,0x32002800,0x80020,0xc4218820,0x32002800,0x4000001,0xc8445802, +0x32002800,0x24000000,0x4200000,0x32002800,0x24000000,0xc9500002,0x32002800,0x24000020,0x4200000,0x32002800,0x2c000010,0xc9248002,0x32002919,0x7c00100,0xc822040f,0x32002a00, +0x4000000,0x5600000,0x32002b01,0x2000,0x14962460,0x32002b01,0x2802000,0x10962460,0x32002b01,0x2802020,0x10962460,0x32002c00,0x4000000,0x4200000,0x32002c00,0x4000020, +0x4200000,0x32002c00,0x4000020,0xc8200005,0x32002c00,0x7c00120,0xc8220405,0x32002c00,0x7c00120,0xc8250405,0x32002e00,0x24000020,0x4200000,0x32002f00,0x24000020,0x4200000, +0x32003000,0x24000000,0x4200000,0x32003000,0x24000020,0x4200000,0x32003500,0x24000000,0x4200000,0x32003600,0x24000020,0x4200000,0x32003700,0x24000000,0x4100000,0x32003700, +0x24000000,0x4200000,0x32003800,0x24000000,0x4810000,0x32003800,0x24000000,0x5410000,0x32005102,0x4000000,0xc9500008,0x32005502,0x7c00100,0x10230400,0x32006108,0x7c00100, +0x8220400,0x32006108,0x7c00100,0x8250400,0x3200622a,0x2802100,0x80962460,0x3200622a,0x2806400,0x80962460,0x3200622a,0x7c00100,0x80230400,0x3200632b,0x2802100,0x80962460, +0x3200632b,0x6804000,0x80962540,0x3200632b,0x7c00100,0x80230400,0x3200642c,0x2802100,0x80962460,0x3200642c,0x7c00100,0x80230400,0x3200652d,0x2802100,0x80962460,0x3200652d, +0x7c00100,0x80230400,0x32006600,0x24000020,0x4200000,0x32006700,0x24000020,0x4200000,0x32006800,0x24000020,0x4200000,0x32006900,0x24000020,0x4200000,0x32006900,0x24000020, +0x4810000,0x32006900,0x24000020,0x5410000,0x32006a00,0x24000020,0x4200000,0x32006a00,0x24000020,0xc8200001,0x32006a00,0x24000020,0xc8200002,0x32020701,0x2882000,0xc4c62460, +0x32023300,0x4000000,0x14100000,0x32026c01,0x12882000,0xc4962460,0x32065700,0x4000000,0xc8810011,0x32065700,0x4000000,0xc9410011,0x32086600,0x24000020,0x4810000,0x32086600, +0x24000020,0x5410000,0x32086900,0x24000020,0x4810000,0x32086900,0x24000020,0x5410000,0x320a3600,0x24000020,0x4200000,0x320a3d11,0x7c00100,0x11230400,0x320a3e14,0x7c00100, +0xc8e30010,0x320a3e14,0x7c00100,0xfe530000,0x320a3f16,0x7c00100,0xc8e30c10,0x320a4400,0x4000000,0xc8e00003,0x320a4929,0x4000000,0x44e00000,0x320a4f11,0x7c00300,0xc8e30001, +0x320a6b16,0x7c00100,0xa530c00,0x32406396,0xc000010,0x84448000,0x324a3dcf,0x4000000,0x4e00000,0x324a3dcf,0x7c00100,0x11230400,0x324a3fca,0x4000002,0xf9200c00,0x324a53c7, +0x24000000,0x14e00000,0x32820701,0x2802000,0x8962460,0x40000419,0x7c00100,0x10220400,0x40000419,0x7c00100,0x20220400,0x40000519,0x7c00100,0x10220400,0x40000600,0x4000400, +0x4200400,0x4000080e,0x7c00100,0x8220400,0x4000080e,0x7c00100,0x8250400,0x4000080e,0x7c00100,0xc8250402,0x40000c02,0x2802100,0x20962460,0x40000c02,0x2802400,0x20962460, +0x40000c02,0x2802500,0x20962460,0x40000c02,0x4000000,0x4200000,0x40000c02,0x4000000,0x5071400,0x40000c02,0x7c00100,0xfc230400,0x40000c02,0x80000000,0x5329960,0x40000d22, +0x7c00100,0x40230400,0x40000f0a,0x7c00100,0xfc230400,0x40001004,0x7c00100,0xfc230400,0x40001110,0x2802100,0xfc962460,0x40001110,0x6800100,0xfc962540,0x4000120f,0x2802100, +0xfc962460,0x4000120f,0x4000000,0x5600000,0x4000120f,0x7c00100,0xfc230400,0x4000131f,0x7c00100,0xfc230400,0x40001423,0x4000000,0x4200000,0x40001423,0x4000000,0x5600000, +0x40001615,0x2802400,0xfc962460,0x40001615,0x7c00100,0xfc230400,0x40002417,0x2802400,0x19862460,0x40002417,0x4000000,0x4200000,0x40002800,0x6800000,0x20201c00,0x40002800, +0x24000002,0x4200000,0x40002c00,0x4000000,0xc8200002,0x40003000,0x24000000,0x4200000,0x40003000,0x24000020,0x4200000,0x40003700,0x24000000,0x4200000,0x40005a09,0x7c00100, +0x80220400,0x40005a09,0x7c00100,0x80250400,0x40005d00,0x7c00120,0xc8220405,0x40006f30,0x2802100,0x40962460,0x40006f30,0x2802400,0x40962460,0x40006f30,0x4000000,0x44200000, +0x40006f30,0x6800000,0x41329800,0x40006f30,0x6800100,0x40962540,0x40006f30,0x7c00100,0x40230400,0x40006f30,0xc000010,0x44b48000,0x40007034,0x7c00100,0x41830000,0x40007117, +0x4000000,0x4200000,0x40007208,0x7c00100,0x10220400,0x4000720e,0x7c00100,0x10220400,0x4000720e,0x7c00500,0xc822040e,0x4000720e,0x7c00500,0xc822040f,0x40007219,0x7c00100, +0x10220400,0x40007219,0x7c00500,0x10220400,0x40007219,0x7c00500,0xc822040e,0x40007219,0x7c00500,0xc822040f,0x40007300,0x24000000,0x4200000,0x40007400,0x4000000,0x14200000, +0x40007531,0x7c00100,0x80230400,0x40007631,0x7c00100,0x80230400,0x40007835,0x4000010,0x84400000,0x40007835,0x7c00100,0x80230400,0x40007933,0x7c00100,0x80230400,0x40007a32, +0x6800000,0x81329800,0x40007a32,0x7c00100,0x80230400,0x40007b2f,0x7c00100,0x80230400,0x40007c00,0x4000000,0x14200000,0x40020701,0x2802400,0x10962460,0x40020701,0x2802400, +0x10c62460,0x40023300,0x4000000,0x14200000,0x40027d01,0x12882000,0xc4962460,0x400a3700,0x24000000,0x4200000,0x400a3700,0x24000000,0x4e00000,0x400a4400,0x4000000,0xc8e0000d, +0x400a4412,0x4000000,0xc8e00002,0x400a4412,0x4000000,0xc8e00003,0x400a4500,0x4000000,0xc8e0000d,0x400a5300,0x4000000,0xc8810010,0x400a5300,0x4000000,0xc9410010,0x40507719, +0x4000000,0x84200000,0x4050771c,0x4000000,0x84400000,0x4050771f,0x4000000,0x84200000,0x4050771f,0x4000000,0x84400000,0x40c01489,0x4000000,0x4200000,0x40d05117,0x4000000, +0x14200000,0x41000419,0x7c00100,0x20220400,0x41000419,0x7c00100,0x20250400,0x4100080e,0x7c00100,0xfc220400,0x4100080e,0x7c00100,0xfc250400,0x41000908,0x7c00100,0xfc220400, +0x41000908,0x7c00100,0xfc250400,0x41000b13,0x2802000,0x28962460,0x41000b13,0x2802100,0x28962460,0x41000b13,0x2802100,0x30962460,0x41000b13,0x4000000,0xcb00000,0x41000c02, +0x2802100,0x20962460,0x41000c02,0x4000000,0x5500000,0x41000c02,0xc000010,0x4b48000,0x41000f0a,0x7c00100,0xfc230400,0x41001004,0x7c00100,0xfc230400,0x41001423,0x7c00100, +0xfc230400,0x41001b27,0x4000000,0x4500000,0x41001d0c,0x7c00100,0xc822040f,0x41001d0c,0x7c00100,0xfc230400,0x41001f0b,0x2802400,0xfc962460,0x41001f0b,0x4000000,0x4200000, +0x41001f0b,0x7c00100,0xfc230400,0x41002800,0x24000000,0x4200000,0x41002800,0x24000000,0xc200000,0x41002800,0x24000000,0xc400000,0x41002919,0x7c00100,0xc822040e,0x41002a00, +0x4000000,0x5600000,0x41002b01,0x2802020,0x10962460,0x41002c00,0x4000000,0x4200000,0x41002c00,0x7c00120,0xc8220405,0x41003000,0x24000000,0x4200000,0x41003700,0x24000000, +0x4200000,0x41003700,0x24000000,0x4e00000,0x41005d00,0x7c00120,0xc8220405,0x41006600,0x24000020,0x4200000,0x41006600,0x24000020,0x4810000,0x41006600,0x24000020,0x5410000, +0x41007208,0x7c00100,0xc822040f,0x41007219,0x7c00100,0x10220400,0x41007300,0x24000000,0x4200000,0x41007e0e,0x2802000,0x18962460,0x41007e0e,0x4000000,0xc200000,0x41007f0e, +0x4000000,0x4200000,0x41007f0e,0x7c00100,0x8230400,0x41008002,0x7c00100,0xfc230400,0x41008137,0x2802100,0x80962460,0x41008137,0x4000000,0x84200000,0x41008137,0x6800100, +0x80962540,0x41008137,0x7c00100,0x80230400,0x41008301,0x2802000,0x18962460,0x41008407,0x4000000,0x84200000,0x41008407,0x4000000,0x84400000,0x41008407,0x4000000,0x84b00000, +0x41008407,0x7c00100,0x80220400,0x41008407,0x7c00100,0x80250400,0x4100850b,0x7c00100,0xfc230400,0x4100860b,0x4000000,0x4200000,0x4100860b,0x7c00100,0xfc230400,0x4100870c, +0x7c00100,0x8220400,0x41008838,0x7c00100,0x80220400,0x41008838,0x7c00100,0x80250400,0x41008939,0x2802000,0x80962460,0x41008939,0x2802100,0x80962460,0x41008939,0x2806000, +0x80962460,0x41008939,0x4000000,0x84200000,0x41008939,0x4000000,0x84400000,0x41008939,0x7c00100,0x80230400,0x41008939,0xc000010,0x84448000,0x41008a00,0x4000400,0x14200400, +0x41008b3b,0x4000000,0x45800000,0x41008b3b,0x6800000,0x41329800,0x41008b3b,0x7c00100,0x41830000,0x41008b3b,0x7e00100,0x41830000,0x41008c3d,0x4000010,0x84400000,0x41008c3d, +0x7c00100,0x80230400,0x41008d0e,0x7c00100,0xc822040f,0x41008d19,0x7c00100,0x10220400,0x41008d19,0x7c00100,0xc822040f,0x41008e00,0x24000000,0x5710000,0x41008e00,0x24000000, +0xc200000,0x41008e00,0x24000000,0xc400000,0x41008e00,0x24000000,0x1d710000,0x41008e00,0x24000006,0x4400000,0x41008f3a,0x2802100,0x40962460,0x41008f3a,0x2806000,0x40962460, +0x41008f3a,0x4000000,0x44200000,0x41008f3a,0x6800100,0x40962540,0x41008f3a,0x7c00100,0x40230400,0x4100903c,0x7c00100,0x40230400,0x4100903c,0x7c00100,0xc823040f,0x41020701, +0x2802000,0x10962460,0x41020701,0x2802000,0x10c62460,0x41020701,0x2802000,0x20962460,0x410a3700,0x24000000,0x4200000,0x410a3700,0x24000000,0x4e00000,0x410a4412,0x4000000, +0xc8e00003,0x410a4711,0x7c40300,0xfce30000,0x410a4f11,0x7c00300,0xc8e30001,0x410a9100,0x4000000,0xc8800010,0x410a9100,0x4000000,0xc8810010,0x410a9100,0x4000000,0xc8870010, +0x410a9100,0x4000000,0xc8b00010,0x410a9100,0x4000000,0xc8f00010,0x410a9100,0x4000000,0xc9001410,0x410a9100,0x4000000,0xc9071010,0x410a9100,0x4000000,0xc9071410,0x410a9100, +0x4000000,0xc9410010,0x41408ad2,0x4000400,0xc200000,0x414a82cc,0x4000000,0x4e00000,0x41808300,0x2802000,0x18962460,0x41c01489,0x6800000,0xfd329800,0x50000419,0x7c00100, +0x20220400,0x50000419,0x7c00100,0x20250400,0x5000080e,0x7c00100,0xfc220400,0x50000908,0x7c00100,0xfc220400,0x50000908,0x7c00100,0xfc250400,0x50000b13,0x2802500,0x20962460, +0x50000f0a,0x7c00100,0xfc230400,0x50001615,0x2802100,0xfc962460,0x50001615,0x7c00100,0xfc230400,0x50002b01,0x2802020,0x10962460,0x50002c00,0x4000000,0x4200000,0x50002c19, +0x7c00100,0x8220400,0x50002d19,0x7c00100,0x8220400,0x50003000,0x24000000,0x4200000,0x50003000,0x24000020,0x4200000,0x50003700,0x24000000,0x4200000,0x50005d00,0x7c00120, +0xc8220405,0x50005d00,0x7c00120,0xc8250405,0x50006108,0x7c00100,0xfc220400,0x50006108,0x7c00100,0xfc250400,0x50006600,0x24000020,0x4200000,0x50007300,0x24000000,0x4200000, +0x50008301,0x2802400,0x10962460,0x50008a00,0x7c00500,0xfc230400,0x50009257,0x2802400,0x40962460,0x50009257,0x4000000,0x44200000,0x50009257,0x4000010,0x45071400,0x50009257, +0x6800000,0x41329800,0x50009257,0x7c00100,0x40230400,0x50009257,0x7c00100,0x48230400,0x50009257,0x7c00500,0x40230400,0x50009257,0x7c00900,0x48230400,0x50009257,0xc000010, +0x44b48000,0x5000933e,0x2802100,0x40962460,0x5000933e,0x2802400,0x40962460,0x5000933e,0x2802400,0x50962460,0x5000933e,0x4000000,0x44400000,0x5000933e,0x4000000,0x44e00000, +0x5000933e,0x4000010,0x44400000,0x5000933e,0x6800000,0x40e29800,0x5000933e,0x6800100,0x40962540,0x5000933e,0x6800100,0x40962541,0x5000933e,0x6804400,0x42f62540,0x5000933e, +0x7c00100,0x42b30400,0x5000933e,0x7c00100,0x42b30401,0x5000933e,0xc000010,0x44448000,0x50009419,0x7c00100,0x8220400,0x50009419,0x7c00100,0x8250400,0x50009419,0x7c00100, +0x10220400,0x50009419,0x7c00100,0x10250400,0x50009419,0x7c00100,0x20220400,0x50009419,0x7c00100,0x20250400,0x50009500,0x4000400,0x4200400,0x5000965a,0x4000000,0x84500000, +0x5000965a,0x7c00100,0x80230400,0x5000965a,0xc000010,0x84b48000,0x5000975b,0x4000000,0x84200000,0x5000975b,0x4000010,0x84400000,0x5000975b,0x7c00100,0x80230400,0x50009865, +0x7c00100,0x80230400,0x50009965,0x4000010,0x84400000,0x50009965,0x7c00100,0x80230400,0x50409acc,0x4000000,0x4200000,0x5100080e,0x7c00100,0x8220400,0x5100080e,0x7c00100, +0x8250400,0x5100080e,0x7c00100,0x10250400,0x51000c02,0x2802100,0x20962460,0x51000c02,0x4000000,0x5500000,0x51000c02,0x4000020,0x4200000,0x51000c02,0x7c00100,0xfc230400, +0x51000f0a,0x7c00100,0xfc230400,0x51000f0a,0x7c00500,0xfc230400,0x51001110,0x2802100,0x20962460,0x5100131f,0x2802100,0x20962460,0x51001423,0x7c00100,0xfc230400,0x51001524, +0x2802100,0x20962460,0x51001524,0x4000000,0x4200000,0x51001524,0x7c00100,0x8230400,0x51001524,0x7c00100,0xfc230400,0x5100171a,0x2802100,0x20962460,0x5100171a,0x4000000, +0x4200000,0x5100171a,0x4000000,0x5500000,0x5100171a,0x7c00100,0xfc230400,0x51001b27,0x4000000,0x4200000,0x51001b27,0x4000000,0x4400000,0x51001b27,0x4000000,0x4500000, +0x51001b27,0x7c00100,0xfc230400,0x51001c1c,0x2802100,0xfd862460,0x51001c1c,0x2802500,0xfd862460,0x51001c1c,0x2806400,0xfd862460,0x51001c1c,0x4000000,0x5800000,0x51001c1c, +0x6800000,0xfd329800,0x51001c1c,0x6800100,0xfd862400,0x51001c1c,0x6800100,0xfd862540,0x51001c1c,0x6800500,0xfd862400,0x51001c1c,0x7c00100,0xfd830000,0x5100251b,0x7c00100, +0x80230400,0x51002619,0x7c00100,0x10220400,0x51002619,0x7c00100,0x10250400,0x51002619,0x7c00100,0xfc250400,0x51002800,0x80020,0xc4218820,0x51002c00,0x4000000,0xc200000, +0x51002d19,0x7c00100,0x8230400,0x51003700,0x24000000,0x4200000,0x51003700,0x24000000,0x4e00000,0x51005201,0x2802400,0x10962460,0x51005c00,0x4000000,0x14200000,0x51006108, +0x7c00100,0xfc220400,0x51006108,0x7c00100,0xfc250400,0x51006600,0x24000020,0x4200000,0x51006600,0x24000020,0x4810000,0x51006600,0x24000020,0x5410000,0x51007300,0x24000000, +0x4200000,0x51007300,0x24000020,0x4200000,0x51008002,0x7c00100,0xfc230400,0x51008301,0x2802000,0x10962460,0x51008301,0x2802000,0x18962460,0x51008301,0x2802400,0x10962460, +0x51008301,0x2802400,0x10c62460,0x51008301,0x2802400,0x18962460,0x51008a00,0x7c00500,0xfc230400,0x51008e00,0x24000000,0x4200000,0x51008e00,0x24000000,0x4400000,0x51008e00, +0x24000000,0x4810000,0x51008e00,0x24000000,0x5400000,0x51008e00,0x24000000,0x5410000,0x51008e00,0x24000000,0x5710000,0x51008e00,0x24000000,0xc400000,0x51008e00,0x24000002, +0x4200000,0x51008e00,0x24000500,0xc230400,0x51008e00,0x2c000010,0xcb48000,0x51009419,0x7c00100,0x8220400,0x51009419,0x7c00100,0x8250400,0x51009419,0x7c00100,0x10220400, +0x51009419,0x7c00100,0xc822040e,0x51009419,0x7c00100,0xc822040f,0x51009500,0x4000400,0x4200400,0x51009500,0x7c00500,0xfc230400,0x51009519,0x7c00100,0x8220400,0x51009519, +0x7c00100,0x8230400,0x51009519,0x7c00100,0x8250400,0x51009519,0x7c00100,0x18220400,0x51009519,0x7c00100,0x18250400,0x51009519,0x7c00100,0x20220400,0x51009519,0x7c00100, +0x20250400,0x51009519,0x7c00100,0xc822040f,0x51009b71,0x2802100,0x40962460,0x51009b71,0x6800000,0x41329800,0x51009b71,0x6800100,0x40962540,0x51009b71,0x6804400,0x40962540, +0x51009b71,0x7c00100,0x40230400,0x51009c52,0x2802100,0x40962460,0x51009c52,0x2802400,0x40962460,0x51009c52,0x2802d00,0x40962460,0x51009c52,0x4000010,0x44400000,0x51009c52, +0x6800000,0x41329800,0x51009c52,0x6800100,0x40962540,0x51009c52,0x7c00100,0x40230400,0x51009c52,0xc000010,0x44448000,0x51009d6d,0x6800000,0x41329800,0x51009d6d,0x7c00100, +0x40230400,0x51009d6d,0x7c00500,0x40230400,0x51009d6d,0x7c00d00,0x40230400,0x51009d6d,0xc000010,0x44448000,0x51009e08,0x2802100,0x8962460,0x51009f63,0x4000010,0x44400000, +0x51009f63,0x6800000,0x41329800,0x51009f63,0x7c00100,0x40230400,0x51009f63,0x7c00100,0x48230400,0x51009f63,0x7c00900,0x40230400,0x51009f63,0xc000010,0x44448000,0x51009f63, +0xc000010,0x44b48000,0x5100a008,0x2000,0xc962460,0x5100a008,0x2802400,0x20962460,0x5100a008,0x4000000,0x4200000,0x5100a008,0x4000000,0xc200000,0x5100a008,0x7c00100, +0x8220400,0x5100a008,0x7c00100,0x8230400,0x5100a008,0x7c00100,0x8250400,0x5100a008,0x7c00500,0xfc230400,0x5100a16f,0x2806400,0x40962460,0x5100a16f,0x6800000,0x41329800, +0x5100a16f,0x6800100,0x40962540,0x5100a16f,0x7c00100,0x40230400,0x5100a16f,0xc000010,0x44448000,0x5100a24f,0x2802100,0x40962460,0x5100a24f,0x2802400,0x40962460,0x5100a24f, +0x6800000,0x41329800,0x5100a24f,0x7c00100,0x40230400,0x5100a24f,0xc000010,0x44448000,0x5100a36e,0x2802100,0x80962460,0x5100a36e,0x4000000,0x84200000,0x5100a36e,0x6800100, +0x80962540,0x5100a36e,0x6804400,0x80962540,0x5100a36e,0x7c00100,0x80230400,0x5100a442,0x2802100,0x40962460,0x5100a442,0x4000000,0x44e00000,0x5100a442,0x6800000,0x40e29800, +0x5100a442,0x6800100,0x40962540,0x5100a442,0x7c00100,0x40430400,0x5100a442,0x7c00100,0x42d30400,0x5100a442,0xc000010,0x44448000,0x5100a500,0x4000000,0x4200000,0x5100a600, +0x4000000,0xc200000,0x5100a601,0x2802000,0x8962460,0x5100a76b,0x7c00100,0x80230400,0x5100a868,0x7c00100,0x80230400,0x5100a96c,0x4000000,0x84200000,0x5100a96c,0x7c00100, +0x80230400,0x5100aa00,0x4000000,0x4e00000,0x5100ab00,0x4000000,0x4e00000,0x51086600,0x24000020,0x4810000,0x51086600,0x24000020,0x5410000,0x510a4005,0x7c00100,0xfce30400, +0x510a4711,0x7c40300,0xfce30000,0x510a7300,0x24000000,0x4200000,0x510aaa00,0x4000000,0x4e00000,0x514a82cc,0x4000000,0x4e00000,0x5150a20e,0x4000400,0x4400000,0x51802bbe, +0x2802000,0x10962460,0x51c00908,0x2802400,0x18962460,0x51c0a008,0x2802400,0x20962460,0x52000f0a,0x2802100,0x20962460,0x52000f0a,0x6800100,0x8962540,0x52000f0a,0x7c00100, +0xfc230400,0x52001004,0x4000000,0x5600000,0x52001b00,0x4000000,0x4200000,0x52001c1c,0x2802100,0xfd862460,0x52001c1c,0x6800100,0xfd862400,0x52001c1c,0x6800500,0xfd862400, +0x52001e12,0x7c00100,0xa230500,0x52001e12,0x7c00100,0xa330520,0x52002128,0x4000002,0x44400000,0x52002128,0x7c00100,0x40230400,0x52002a00,0x4000000,0x5500000,0x52002a00, +0x4000000,0x5600000,0x52002d00,0x4000000,0xc8200006,0x52003000,0x24000000,0x4200000,0x52006108,0x7c00100,0xfc220400,0x52006108,0x7c00100,0xfc250400,0x52008301,0x2802400, +0x10962460,0x52008407,0x2802400,0x80962460,0x52008407,0x2802400,0x90962460,0x52008407,0x7c00100,0x80220400,0x52008407,0x7c00100,0x80250400,0x52008b3b,0x6800000,0x41800000, +0x52008b3b,0x7c00100,0x41830000,0x52008e00,0x24000000,0xc400000,0x52009419,0x7c00100,0x8250400,0x5200975b,0x4000000,0x84200000,0x5200ac7e,0x2802000,0x80962460,0x5200ac7e, +0x2802100,0x80962460,0x5200ac7e,0x2802400,0x80962460,0x5200ac7e,0x4000010,0x84200000,0x5200ac7e,0x7c00100,0x80230400,0x5200ac7e,0xc000010,0x84248000,0x5200ad28,0x7c00100, +0x40230400,0x5200ae6a,0x2802100,0x41862460,0x5200ae6a,0x2802400,0x40962460,0x5200ae6a,0x2802400,0x41862460,0x5200ae6a,0x2806000,0x41862460,0x5200ae6a,0x4000000,0x45800000, +0x5200ae6a,0x6800000,0x41329800,0x5200ae6a,0x6800100,0x41862400,0x5200ae6a,0x6800100,0x41862540,0x5200ae6a,0x7c00100,0x41830000,0x5200ae6a,0x7c00900,0x41830000,0x5200ae6a, +0xc000010,0x45848000,0x5200b083,0x4000010,0x44400000,0x5200b083,0x7c00100,0x40230400,0x5200b083,0xc000010,0x44448000,0x5200b182,0x2802400,0x40962460,0x5200b182,0x4000000, +0x44200000,0x5200b182,0x4000010,0x44400000,0x5200b182,0x7c00100,0x40230400,0x5200b182,0xc000010,0x44448000,0x5200b30a,0x2802400,0x8962460,0x5200b30a,0x4000000,0xc200000, +0x5200b30a,0x7c00100,0x8230400,0x5200b54e,0x2802100,0x40962460,0x5200b54e,0x2802400,0x40962460,0x5200b54e,0x4000000,0x44e00000,0x5200b54e,0x4000010,0x44400000,0x5200b54e, +0x6800000,0x40e29800,0x5200b54e,0x6800100,0x40962540,0x5200b54e,0x6804400,0x42f62540,0x5200b54e,0x7c00100,0x42b30400,0x5200b54e,0xc000010,0x44448000,0x5200b61c,0x4000000, +0x5800000,0x5200b61c,0x6800500,0xfd862400,0x5200b61c,0x7c00100,0xfd830000,0x5200b61c,0x7c00900,0xfd830000,0x5200b77f,0x2802100,0x41862460,0x5200b77f,0x2802400,0x41862460, +0x5200b77f,0x4000000,0x45800000,0x5200b77f,0x4000010,0x45800000,0x5200b77f,0x7c00100,0x41830000,0x5200b77f,0x7c00500,0x41830000,0x5200b77f,0x7c00900,0x41830000,0x5200b77f, +0x7e00100,0x41830000,0x5200b873,0x2802100,0x40962460,0x5200b873,0x2806400,0x40962460,0x5200b873,0x6800000,0x41329800,0x5200b873,0x6800100,0x40962540,0x5200b873,0x6800400, +0x40962540,0x5200b873,0x7c00100,0x40230400,0x5200b873,0xc000010,0x44448000,0x5200b912,0x7c00100,0xa230500,0x5200b912,0x7c00100,0xa330520,0x5200ba74,0x4000000,0x84200000, +0x5200ba74,0x4000010,0x84400000,0x5200ba74,0x7c00100,0x80230400,0x5200bb85,0x4000000,0x84200000,0x5200bb85,0x7c00100,0x80230400,0x5200bc75,0x4000000,0x84400000,0x5200bc75, +0x4000010,0x84400000,0x5200bc75,0x7c00100,0x80230400,0x5200bd7d,0x4000000,0x84200000,0x5200bd7d,0x7c00100,0x80230400,0x5200be7a,0x4000000,0x84200000,0x5200be7a,0x7c00100, +0x80230400,0x5200bf58,0x7c00100,0x80230400,0x5200c002,0x4000000,0x4200000,0x5200c178,0x2802100,0x80962460,0x5200c178,0x2802400,0x80962460,0x5200c178,0x2806400,0x80962460, +0x5200c178,0x4000000,0x84200000,0x5200c178,0x6800100,0x80962540,0x5200c178,0x7c00100,0x80230400,0x5200c178,0x7c00100,0x80230401,0x5200c178,0xc000010,0x84448000,0x5200c178, +0x80000000,0x85329960,0x5200c247,0x7c00100,0x80230400,0x5200c247,0x7c00100,0x80830400,0x5200c247,0x7c00100,0x81430400,0x5200c300,0x4000000,0xc8200003,0x52022d00,0x4000000, +0xc8100006,0x52023700,0x24000000,0x4100000,0x52023700,0x24000000,0x4e00000,0x52023700,0x24000000,0x6800000,0x52024400,0x4000000,0x4100000,0x52027300,0x24000000,0x4100000, +0x5202c300,0x4000000,0x4100000,0x5202c300,0x4000000,0xc8100002,0x5202c300,0x4000000,0xc8100003,0x5202c300,0x4000000,0xc810000d,0x5202c300,0x4000100,0x4150400,0x5202c300, +0x4000100,0xc815040d,0x520a1e12,0x7c00100,0xa130480,0x520a3700,0x24000000,0x4e00000,0x520a3800,0x24000000,0x4100000,0x520a4711,0x7c40300,0xfce30000,0x520a4f11,0x7c00300, +0xc8e30001,0x520a7300,0x24000000,0x4100000,0x520ab412,0x7c00100,0xa130480,0x520ac400,0x4000000,0xc8e00002,0x520ac400,0x4000000,0xc8e0000d,0x520ac414,0x4000000,0xc8e0000d, +0x520ac511,0x7c40300,0xfce30000,0x5240af9c,0x7c00100,0x8230400,0x5240afa1,0x4000400,0xc200000,0x5240afa3,0x6800400,0x8962540,0x5240afa3,0x7c00100,0x8230400,0x5240afad, +0x7c00100,0x8230400,0x5240afaf,0x7c00100,0x8230400,0x5240b2d4,0x4000000,0x4200000,0x5240b2e3,0x4000000,0x4200000,0x5240b2f1,0x4000000,0x4200000,0x5240b2fc,0x4000000, +0x5500000,0x524a44cc,0x4000000,0xc8e00003,0x5250b511,0x7c00900,0x60430400,0x5280af9c,0x2802400,0x8962460,0x5280af9d,0x2802400,0x8962460,0x5280afa3,0x2802400,0x8962460, +0x5280afa5,0x2802400,0x8962460,0x5280afa7,0x2802400,0x8962460,0x52d0b308,0x2802400,0x8962460,0x52d0b30c,0x7c00100,0x8230400,0x60000c02,0x2802100,0x20962460,0x60000c02, +0x7c00100,0xfc230400,0x60000f0a,0x2802100,0xfc962460,0x60000f0a,0x6800100,0xfc962540,0x60000f0a,0x7c00100,0xfc230400,0x6000131f,0x4000000,0x4200000,0x6000171a,0x7c00100, +0xfc230400,0x6000171a,0x7c00100,0xfc230560,0x60001b27,0x2802100,0xfc962460,0x60001b27,0x4000000,0x4c00000,0x60001b27,0x7c00100,0xfc230400,0x60001f0b,0x2802400,0xfc962460, +0x60002919,0x7c00100,0xc822040e,0x60002a00,0x4000000,0x5600000,0x60003000,0x24000000,0x4200000,0x60003000,0x24000000,0x4e00000,0x60003700,0x24000000,0x4200000,0x60003800, +0x24000000,0x5710000,0x60005102,0x4000000,0x14200000,0x60006108,0x7c00100,0xfc220400,0x60006108,0x7c00100,0xfc250400,0x60006600,0x24000020,0x4200000,0x60008301,0x2802400, +0x10c62460,0x6000903c,0x2806000,0x40962460,0x6000903c,0x4000000,0x44400000,0x60009519,0x7c00100,0x8220400,0x60009519,0x7c00100,0x8250400,0x60009519,0x7c00100,0x10220400, +0x60009519,0x7c00100,0xfc250400,0x6000a008,0x7c00100,0x8220400,0x6000a008,0x7c00100,0x8250400,0x6000c300,0x4000000,0x6703580,0x6000c654,0x2802000,0x40962460,0x6000c654, +0x4000010,0x44200000,0x6000c654,0x7c00100,0x40230400,0x6000c73f,0x2802000,0x40962460,0x6000c73f,0x2802100,0x40962460,0x6000c73f,0x4000000,0x44200000,0x6000c73f,0x6800100, +0x40962540,0x6000c73f,0x6804000,0x42e62540,0x6000c73f,0x7c00100,0x42d30400,0x6000c80b,0x7c00100,0xfc230400,0x6000c941,0x2802100,0x80962460,0x6000c941,0x2806400,0x82f62460, +0x6000c941,0x4000000,0x84e00000,0x6000c941,0x4000010,0x84e00000,0x6000c941,0x6800000,0x82d29800,0x6000c941,0x6800100,0x80962540,0x6000c941,0x7c00100,0x82b30400,0x6000c941, +0x7c00100,0x82c30400,0x6000c941,0xc000010,0x84448000,0x6000ca82,0x7c00100,0x40230400,0x6000cc00,0x4000000,0x4e00000,0x6000d000,0x4000000,0x4200000,0x6002c300,0x4000000, +0x4100000,0x6002c300,0x4000000,0xc810000d,0x6002c300,0x4000100,0x4150400,0x6002c300,0x4000100,0xc815040d,0x600a3000,0x24000000,0x4200000,0x600a3000,0x24000000,0x4e00000, +0x600a3700,0x24000000,0x4200000,0x600a3800,0x24000000,0x4200000,0x600a3800,0x24000000,0x6800000,0x600a4305,0x7c00100,0xfce30400,0x600ac300,0x4000000,0x4100000,0x600ac400, +0x4000000,0xc8e0000d,0x600acb14,0x7c00100,0x8e30000,0x600acb16,0x7c00100,0x8e30c00,0x600acc00,0x4000000,0x4e00000,0x600acd00,0x4000000,0x4200000,0x600acd00,0x4000000, +0x4e00000,0x600acd00,0x4000000,0x6800000,0x600ace00,0x4000000,0x4e00000,0x600ace00,0x4000000,0x6800000,0x600acf00,0x4000000,0x4e00000,0x600acf00,0x4000000,0x6800000, +0x600ad111,0x7c40300,0xfce30000,0x604ac4cc,0x4000000,0xc8e00003,0x61000a03,0x4000000,0x5600000,0x61000c02,0x80000000,0x5329960,0x6100120f,0x4000000,0x4200000,0x61001a18, +0x7c00100,0xfd830000,0x61001d0c,0x7c00100,0xfc230400,0x61001d0c,0x7c00100,0xfc250400,0x61006600,0x24000020,0x4200000,0x61008407,0x7c00100,0x80220400,0x61008407,0x7c00100, +0x80250400,0x6100870c,0x7c00100,0xfc220400,0x61008e00,0x24000000,0x4200000,0x61008e00,0x24000000,0x4400000,0x61008e00,0x24000000,0xc200000,0x61008e00,0x24000002,0x4300000, +0x6100903c,0x7c00100,0x40230400,0x61009519,0x7c00100,0xfc220400,0x61009519,0x7c00100,0xfc250400,0x61009519,0x7c00500,0xc822040f,0x61009b71,0x2802100,0x40962460,0x61009b71, +0x2806400,0x40962460,0x61009b71,0x7c00100,0x40230400,0x6100a008,0x2802100,0x8962460,0x6100c300,0x4000000,0xc820000f,0x6100cd00,0x4000000,0x4200000,0x6100d202,0x2802400, +0x20962460,0x6100d202,0x2802500,0x20962460,0x6100d202,0x7c00100,0xfc230400,0x6100d302,0x4000020,0x4200000,0x6100d302,0x7c00120,0xc8230405,0x6100d476,0x2802100,0x40962460, +0x6100d476,0x2802100,0x40962461,0x6100d476,0x2806400,0x40962460,0x6100d476,0x4000000,0x44400000,0x6100d476,0x6800000,0x41329800,0x6100d476,0x6800100,0x40962540,0x6100d476, +0x7c00100,0x40230400,0x6100d476,0xc000010,0x44448000,0x6100d573,0x2802100,0x40962460,0x6100d573,0x2806400,0x40962460,0x6100d573,0x6800100,0x40962540,0x6100d573,0x7c00100, +0x40230400,0x6100d573,0x7c00900,0x40230400,0x6100d573,0xc000010,0x44448000,0x6100d68d,0x7c00100,0x80230400,0x6100d756,0x7c00100,0x80230400,0x6100d85c,0x2802500,0x40962460, +0x6100d85c,0x6800100,0x40962540,0x6100d85c,0x7c00100,0x40230400,0x6100d85c,0x7c00500,0x40230400,0x6100d997,0x2802100,0x80962460,0x6100d997,0x4000000,0x84200000,0x6100d997, +0x4000000,0x84400000,0x6100d997,0x6800000,0x81329800,0x6100d997,0x6800100,0x80962540,0x6100d997,0x6804400,0x80962540,0x6100d997,0x7c00100,0x80230400,0x6100d997,0x7c00100, +0x80230560,0x6100d997,0xc000010,0x84448000,0x6100da98,0x6800000,0x81329800,0x6100da98,0x7c00100,0x80230400,0x6100db71,0x4000000,0x44200000,0x6100dc99,0x2802100,0x80962460, +0x6100dc99,0x2802400,0x80962460,0x6100dc99,0x6800000,0x81329800,0x6100dc99,0x6800100,0x80962540,0x6100dc99,0x6804400,0x80962540,0x6100dc99,0x7c00100,0x80230400,0x610a4711, +0x7c40300,0xfce30000,0x610a4f11,0x7c00300,0xc8e30001,0x610ace00,0x4000000,0x4e00000,0x6140afa1,0x7c00100,0x8230400,0x6140afa3,0x7c00100,0x8230400,0x6180af9e,0x2802400, +0x8962460,0x62002a00,0x4000000,0x5600000,0x63002800,0x80000,0xc4918820,0x63c00c15,0x80000,0xc4918820,0x7000080e,0x7c00100,0x8250400,0x70000a03,0x4000000,0x4200000, +0x70000c00,0x80000000,0x5329960,0x70000f0a,0x7c00100,0x8230400,0x70001004,0x7c00100,0x8230400,0x70001524,0x2802100,0x8962460,0x70001524,0x7c00100,0x8230400,0x70001615, +0x2802100,0x8962460,0x7000171a,0x2802100,0x8962460,0x70001821,0x6800000,0x9329800,0x70002320,0x7c00100,0x80230400,0x70002a00,0x4000000,0x5500000,0x70002a00,0x4000000, +0x5600000,0x70003000,0x24000000,0x4200000,0x70003800,0x24000000,0x4e00000,0x70005201,0x2802400,0x10962460,0x7000581e,0x7c00100,0x80230400,0x70006108,0x7c00100,0x8220400, +0x70006108,0x7c00100,0x8250400,0x70006108,0x7c00100,0xfc220400,0x70006108,0x7c00100,0xfc250400,0x70006f30,0x7c00100,0x40230400,0x70007300,0x24000000,0x4200000,0x70007f0e, +0x4000000,0x4200000,0x70008301,0x2802100,0x10962460,0x70008301,0x2802400,0x10962460,0x70008e00,0x24000000,0x4200000,0x70008e00,0x24000000,0x4400000,0x70008e00,0x24000002, +0x4400000,0x70008e00,0x24000008,0x5410000,0x70008e00,0x24000010,0x4400000,0x70008e00,0x2c000010,0x4448000,0x70009519,0x7c00100,0x8220400,0x70009519,0x7c00100,0x8230400, +0x70009519,0x7c00100,0x8250400,0x70009865,0x7c00100,0x80230400,0x70009965,0x4000010,0x84400000,0x70009965,0x7c00100,0x80230400,0x7000a008,0x7c00100,0x8220400,0x7000a008, +0x7c00100,0x8250400,0x7000a008,0x7c00500,0xc822040f,0x7000a50e,0x4000000,0x4200000,0x7000b61c,0x2802500,0xfd862460,0x7000b61c,0x6800500,0xfd862400,0x7000b61c,0x7c00100, +0xfd830000,0x7000c300,0x4000000,0x4100000,0x7000c941,0x2806000,0x80c62460,0x7000cc00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x4200000,0x7000cd00,0x4000000,0x4e00000, +0x7000cd00,0x4000000,0x6800000,0x7000cf00,0x4000000,0x4e00000,0x7000d202,0x2802100,0x20962460,0x7000d202,0x7c00100,0x8230400,0x7000d202,0x7c00100,0xfc230400,0x7000d997, +0x7c00100,0x80230400,0x7000d997,0xc000010,0x84248000,0x7000dd86,0x2802400,0x80962460,0x7000dd86,0x7c00100,0x80230400,0x7000dd86,0xc000010,0x84448000,0x7000de9f,0x4000000, +0x84200000,0x7000de9f,0x7c00100,0x80230400,0x7000e001,0x2400,0x4962460,0x7000e001,0x2802400,0x8962460,0x7000e187,0x2802000,0x80962460,0x7000e187,0x2802100,0x80962460, +0x7000e187,0x4000000,0x84200000,0x7000e187,0x7c00100,0x80230400,0x7000e187,0xc000010,0x84448000,0x7000e288,0x7c00100,0x80230400,0x7000e300,0x4000000,0x4200000,0x7000e489, +0x2802100,0x80962460,0x7000e489,0x2802400,0x80962460,0x7000e489,0x6800100,0x80962540,0x7000e489,0x6800100,0x80962541,0x7000e489,0x6804400,0x82f62540,0x7000e489,0x7c00100, +0x80430400,0x7000e489,0x7c00100,0x82b30400,0x7000e489,0x7c00100,0x82d30400,0x7000e489,0x7c00900,0x80430400,0x7000e59d,0x2802100,0x80962460,0x7000e59d,0x2802400,0x80962460, +0x7000e59d,0x4000000,0x84200000,0x7000e59d,0x4000010,0x84200000,0x7000e59d,0x6800100,0x80962540,0x7000e59d,0x6804400,0x80962540,0x7000e59d,0x7c00100,0x80230400,0x7000e59d, +0xc000010,0x84448000,0x7000e691,0x2802100,0x80962460,0x7000e691,0x2802400,0x80962460,0x7000e691,0x2806400,0x80962460,0x7000e691,0x6800000,0x81329800,0x7000e691,0x6800100, +0x80962540,0x7000e691,0x7c00100,0x80230400,0x7000e700,0x4000400,0x4200400,0x7000e70e,0x7c00100,0x8220400,0x7000e719,0x7c00100,0x8220400,0x7000e719,0x7c00500,0xc822040f, +0x7000e853,0x7c00100,0x80230400,0x7000e9a0,0x2802400,0x80962460,0x7000e9a0,0x4000000,0x84200000,0x7000e9a0,0x4000000,0x84500000,0x7000e9a0,0x7c00100,0x80230400,0x7000ea79, +0x2802400,0x80962460,0x7000ea79,0x4000000,0x84200000,0x7000ea79,0x4000000,0x84f00000,0x7000ea79,0x4000010,0x84400000,0x7000ea79,0x7c00100,0x80230400,0x7000eb8c,0x2802400, +0x80962460,0x7000eb8c,0x4000000,0x84200000,0x7000eb8c,0x7c00100,0x80230400,0x7000eca3,0x2802100,0x80962460,0x7000eca3,0x2806400,0x80962460,0x7000eca3,0x4000000,0x84200000, +0x7000eca3,0x6800000,0x81329800,0x7000eca3,0x6800100,0x80962540,0x7000eca3,0x7c00100,0x80230400,0x7000eca3,0xc000010,0x84448000,0x7000ed95,0x6800000,0xa1329800,0x7000ed95, +0x7c00100,0xa0230400,0x7000ed95,0xc000010,0x84448000,0x7000ee1c,0x2802500,0x9862460,0x7000ee1c,0x6800000,0xfd329800,0x7000ee1c,0x7c00100,0x9830000,0x7000ee1c,0x7c00100, +0xfd830000,0x7000ee1c,0x7c00900,0x9830000,0x7000ef8f,0x4000000,0x84200000,0x7000ef8f,0x7c00100,0x80230400,0x7000f08e,0x4000000,0x84200000,0x7000f08e,0x7c00100,0x80230400, +0x7000f159,0x2802100,0x80962460,0x7000f159,0x7c00100,0x80230400,0x7000f200,0x4000000,0x4200000,0x7000f200,0x4000000,0x5200000,0x7000f200,0x4000000,0x5710000,0x7000f34b, +0x2802400,0x80962460,0x7000f34b,0x4000000,0x84200000,0x7000f34b,0x4000010,0x84400000,0x7000f34b,0x6800000,0x81329800,0x7000f34b,0x7c00100,0x80230400,0x7000f34b,0x7c00900, +0x80230400,0x7000f34b,0xc000010,0x84448000,0x7000f490,0x4000000,0x84200000,0x7000f490,0x7c00100,0x80230400,0x7000f5a5,0x7c00100,0x80230400,0x7000f67b,0x4000000,0x84200000, +0x7000f67b,0x4000010,0x84200000,0x7000f67b,0x7c00100,0x80230400,0x7000f8a6,0x2802100,0x80962460,0x7000f8a6,0x2802400,0x80962460,0x7000f8a6,0x2806400,0x80962460,0x7000f8a6, +0x4000000,0x84500000,0x7000f8a6,0x4000010,0x84b00000,0x7000f8a6,0x4000800,0x84200000,0x7000f8a6,0x6800100,0x80962540,0x7000f8a6,0x6800100,0x80962541,0x7000f8a6,0x7c00100, +0x80230400,0x7000f8a6,0xc000010,0x84448000,0x7000f921,0x4000000,0x4200000,0x7000fa00,0x4000000,0x4200000,0x7000fb9e,0x2802100,0x80962460,0x7000fb9e,0x2802400,0x80962460, +0x7000fb9e,0x2806400,0x80962460,0x7000fb9e,0x4000000,0x84200000,0x7000fb9e,0x6800000,0x81329800,0x7000fb9e,0x6800100,0x80962540,0x7000fb9e,0x6800100,0x80962541,0x7000fb9e, +0x7c00100,0x80230400,0x7000fc92,0x4000000,0x84200000,0x7000fc92,0x6800000,0x81329800,0x7000fc92,0x7c00100,0x80220400,0x7000fc92,0x7c00100,0x80230400,0x7000fc92,0x7c00100, +0x80250400,0x700acd00,0x4000000,0x4e00000,0x700acd00,0x4000000,0x6800000,0x700ace00,0x4000000,0x4e00000,0x700acf00,0x4000000,0x4e00000,0x700acf00,0x4000000,0x6800000, +0x7050df21,0x4000000,0xc200000,0x7050f729,0x80000,0xc4918820,0x7080afa1,0x2802400,0x8962460,0x7090df21,0x2802400,0x8962460,0x70d0e427,0x2802100,0xfc962460,0x70d0e427, +0x2802400,0xfc962460,0x70d0e427,0x6800100,0xfc962540,0x70d0ea25,0x4000010,0x84400000,0x8000120f,0x7c00100,0x20230400,0x80001524,0x7c00100,0x20230400,0x8000171a,0x7c00100, +0x8230400,0x80002006,0x7c00100,0x40220400,0x80002006,0x7c00100,0x40250400,0x80002a00,0x4000000,0x5500000,0x80002d00,0x4000000,0x24200000,0x80005208,0x2802400,0x30962460, +0x80005c00,0x4000000,0x34200000,0x80007300,0x24000000,0x24200000,0x80009519,0x7c00100,0x20220400,0x80009519,0x7c00100,0x20230400,0x80009519,0x7c00100,0x20250400,0x80009865, +0x7c00100,0x80230400,0x8000a008,0x2802100,0x28962460,0x8000b30a,0x4000000,0x2c500000,0x8000b30a,0x7c00100,0x28230400,0x8000cd00,0x4000000,0x24e00000,0x8000d202,0x2802500, +0x20962460,0x8000d202,0x7c00100,0x20230400,0x8000d68d,0x4000000,0x84200000,0x8000d997,0x2802000,0x80962460,0x8000d997,0x2802400,0x80962460,0x8000d997,0x4000000,0x84400000, +0x8000d997,0x4000000,0x84500000,0x8000d997,0x7c00100,0x80230400,0x8000d997,0xc000010,0x84448000,0x8000e489,0x2802100,0x80962460,0x8000e489,0x7c00100,0x82d30400,0x8000e719, +0x7c00100,0x20220400,0x8000f8a6,0x2802100,0x80962460,0x8000f8a6,0x7c00100,0x80230400,0x8000f8a6,0xc000010,0x84448000,0x8000fda1,0x2802100,0x81862460,0x8000fda1,0x2806400, +0x81862460,0x8000fda1,0x4000000,0x85800000,0x8000fda1,0x6800000,0x81329800,0x8000fda1,0x6800100,0x81862400,0x8000fda1,0x6800100,0x81862540,0x8000fda1,0x7c00100,0x81830000, +0x8000fda1,0xc000010,0x84448000,0x8000fe9c,0x7c00100,0x80230400,0x8000fe9c,0x7c00100,0x80830400,0x8000fe9c,0x7c00100,0x81430400,0x8000ff06,0x7c00100,0x40220400,0x80010165, +0x7c00100,0x80230400,0x800102a2,0x4000000,0x84200000,0x800102a2,0x7c00100,0x80230400,0x800103a4,0x7c00100,0x80230400,0x800103a4,0xc000010,0x84448000,0x8001044c,0x4000000, +0x84200000,0x8001044c,0x7c00100,0x80220400,0x8001044c,0x7c00100,0x80250400,0x80010670,0x2802000,0x80962460,0x80010670,0x4000000,0x84200000,0x80010670,0x4000010,0x84400000, +0x80010670,0xc000010,0x84448000,0x800a4711,0x7c40300,0xfce30000,0x800acd00,0x4000000,0x4e00000,0x800acd00,0x4000000,0x6902460,0x800ace00,0x4000000,0x4e00000,0x800acf00, +0x4000000,0x4e00000,0x800b0011,0x7c40300,0xfce30000,0x800b0500,0x4000000,0x4e00000,0x800b0500,0x4000000,0x6800000,0x90001615,0x7c00100,0xfc230400,0x9000171a,0x4000000, +0x4200000,0x9000171a,0x7c00100,0xfc230400,0x90003000,0x24000000,0x4200000,0x90007f0e,0x4000000,0x4200000,0x90008301,0x2802400,0x10962460,0x90008e00,0x24000000,0x4400000, +0x90009519,0x7c00100,0x10250400,0x9000a16f,0x2802100,0x40962460,0x9000d200,0x80000000,0x5329960,0x9000d202,0x2802000,0x20962460,0x9000d202,0x2802100,0x20962460,0x9000d202, +0x7c00100,0xfc230400,0x9000e59d,0x2802100,0x80962460,0x90010500,0x4000000,0x4e00000,0x900107a7,0x2802100,0x40962460,0x900107a7,0x2802400,0x40962460,0x900107a7,0x2802c00, +0x40962460,0x900107a7,0x4000000,0x45400000,0x900107a7,0x6800000,0x41329800,0x900107a7,0x7c00100,0x40220400,0x900107a7,0x7c00100,0x40250400,0x900108a8,0x2802100,0x80962460, +0x900108a8,0x2806400,0x80962460,0x900108a8,0x4000000,0x84200000,0x900108a8,0x4000000,0x84400000,0x900108a8,0x4000010,0x84400000,0x900108a8,0x6800000,0x81329800,0x900108a8, +0x6800100,0x80962540,0x900108a8,0x7c00100,0x80230400,0x900108a8,0xc000010,0x84448000,0x90010908,0x7c00100,0x8220400,0x90010a38,0x2802100,0x80962460,0x90010ca9,0x2802100, +0x80962460,0x90010ca9,0x4000000,0x84500000,0x90010ca9,0x4000010,0x84b00000,0x90010ca9,0x6800100,0x80962540,0x90010ca9,0x7c00100,0x80230400,0x90010d1b,0x4000000,0x84500000, +0x90010eaa,0x2802100,0x40962460,0x90010eaa,0x2802400,0x40962460,0x90010eaa,0x2806400,0x40962460,0x90010eaa,0x4000000,0x44200000,0x90010eaa,0x4000000,0x44400000,0x90010eaa, +0x4000010,0x44400000,0x90010eaa,0x6800000,0x41329800,0x90010eaa,0x6800100,0x40962540,0x90010eaa,0x7c00100,0x40230400,0x90010eaa,0xc000010,0x44448000,0x90010fab,0x7c00100, +0x40220400,0x90010fab,0x7c00100,0x40250400,0x9002c300,0x4000000,0x4100000,0x900ac400,0x4000000,0xc8e0000d,0x900acd00,0x4000000,0x4e00000,0x900acd00,0x4000000,0x6800000, +0x900acf00,0x4000000,0x4e00000,0x900b0500,0x4000000,0x4e00000,0x900b0500,0x4000000,0x6800000,0x900b0b9a,0x7c00900,0x81230400,0x900b109a,0x7c00300,0x80e30000,0x900b119a, +0x7c00300,0x80e30000,0x90408e06,0x24000000,0x4400000,0xa0001004,0x4000000,0x4200000,0xa0001004,0x7c00100,0x8230400,0xa000120f,0x2802100,0xfc962460,0xa000120f,0x2802400, +0xfc962460,0xa000171a,0x2802100,0xfc962460,0xa000171a,0x2806400,0x8962460,0xa0002a00,0x4000000,0x5600000,0xa0003000,0x24000000,0x4200000,0xa000581e,0x7c00100,0x80230400, +0xa0007300,0x24000000,0x4200000,0xa0008301,0x2802400,0x10962460,0xa0008e00,0x24000000,0x4400000,0xa000cf00,0x4000000,0x4e00000,0xa0010500,0x4000000,0x4200000,0xa00114af, +0x2802100,0x80962460,0xa00114af,0x2802400,0x80962460,0xa00114af,0x2806400,0x80962460,0xa00114af,0x6800000,0x81329800,0xa00114af,0x7c00100,0x80230400,0xa00114af,0x7c00100, +0x80230560,0xa00116b0,0x2802100,0x80962460,0xa00116b0,0x2802800,0x80962460,0xa00116b0,0x2806400,0x80962460,0xa00116b0,0x4000000,0x84400000,0xa00116b0,0x4000000,0x84500000, +0xa00116b0,0x4000010,0x84400000,0xa00116b0,0x6800100,0x80962540,0xa00116b0,0x7c00100,0x80230400,0xa00116b0,0x7c00100,0x80230560,0xa00116b0,0xc000010,0x84448000,0xa0011722, +0x7c00100,0x40230400,0xa00118b1,0x2802000,0x80962460,0xa00118b1,0x2802100,0x80962460,0xa00118b1,0x2806400,0x80962460,0xa00118b1,0x4000000,0x84200000,0xa00118b1,0x4000000, +0x84400000,0xa00118b1,0x4000000,0x84500000,0xa00118b1,0x6800100,0x80962540,0xa00118b1,0x7c00100,0x80230400,0xa00118b1,0x7c00100,0x80230560,0xa00118b1,0xc000010,0x84448000, +0xa00a4005,0x7c00100,0x8e30400,0xa00a4711,0x7c40300,0xfce30000,0xa00ac400,0x4000000,0x4e00000,0xa00acb14,0x7c00100,0x8e30000,0xa00acf00,0x4000000,0x4e00000,0xa00b0500, +0x4000000,0x4e00000,0xa00b0500,0x4000000,0x6800000,0xa00b0b96,0x7c00900,0x81230400,0xa00b1211,0x7c40300,0xfce30000,0xa00b1314,0x7c00100,0x8e30000,0xa00b1596,0x7c00300, +0x80e30000,0xa040afb9,0x6800400,0x8962540,0xa08083ba,0x2802400,0x10962460,0xb0000a03,0x7c00100,0x10220400,0xb0000b13,0x7c00100,0xfe633800,0xb0001004,0x2802000,0xfc962460, +0xb0001110,0x4000000,0x4200000,0xb0001524,0x2802100,0xfc962460,0xb0001615,0x4000000,0x4500000,0xb000251b,0x7c00100,0x80230400,0xb0007300,0x24000000,0x4200000,0xb0008939, +0x4000000,0x84200000,0xb0008939,0x7c00100,0x80230400,0xb0008e00,0x24000000,0x4200000,0xb0008e00,0x24000000,0x4400000,0xb0008e00,0x24000010,0x4400000,0xb0009257,0x2802000, +0x40962460,0xb0009257,0x4000000,0x45600000,0xb0009519,0x7c00100,0x10220400,0xb0009519,0x7c00100,0x20220400,0xb0009519,0x7c00100,0x20250400,0xb0009a00,0x4000000,0x4200000, +0xb000b30a,0x2802100,0x8962460,0xb000b30a,0x7c00100,0x8230400,0xb000c178,0x80000000,0x85329960,0xb000c300,0x4000000,0x4200000,0xb000d202,0x2802000,0x20962460,0xb000d476, +0x6800100,0x40962540,0xb000d476,0x7c00100,0x40230400,0xb000e300,0x4000000,0x4e00000,0xb000fda1,0x7c00100,0x81830000,0xb0010eaa,0x2802000,0x40962460,0xb00116b0,0x7c00100, +0x80230400,0xb0011900,0x4000000,0x4e00000,0xb0011ab2,0x2802100,0x80962460,0xb0011ab2,0x2802400,0x80962460,0xb0011ab2,0x2806400,0x80962460,0xb0011ab2,0x4000000,0x84200000, +0xb0011ab2,0x6800100,0x80962540,0xb0011ab2,0x7c00100,0x80230400,0xb0011b0c,0x7c00100,0xfc230400,0xb0011cb3,0x2802100,0x40962460,0xb0011cb3,0x2806400,0x40962460,0xb0011cb3, +0x6800000,0x41329800,0xb0011cb3,0x6800100,0x40962540,0xb0011cb3,0x7c00100,0x40230400,0xb0011db6,0x2802500,0x40962460,0xb0011db6,0x6800000,0x41329800,0xb0011db6,0x7c00100, +0x40230400,0xb0011db6,0x7c00500,0x40230400,0xb0011e00,0x4000000,0x4200000,0xb0011e00,0x4000000,0x5500000,0xb0011fb4,0x2802100,0x80962460,0xb0011fb4,0x6800100,0x80962540, +0xb0011fb4,0x7c00100,0x80430400,0xb0011fb4,0x7c00100,0x82d30400,0xb0011fb4,0xc000010,0x84448000,0xb0012000,0x4000000,0x4200000,0xb00121b5,0x4000000,0x84200000,0xb00121b5, +0x4000010,0x84400000,0xb00121b5,0x7c00100,0x80220400,0xb00121b5,0x7c00100,0x80250400,0xb00121b5,0xc000010,0x84448000,0xb00122b8,0x4000000,0x84200000,0xb00122b8,0x7c00100, +0x80230400,0xb00123b7,0x2802400,0x80962460,0xb00123b7,0x4000000,0x84200000,0xb00123b7,0x7c00100,0x80230400,0xb00123b7,0xc000010,0x84248000,0xb00a4005,0x7c00100,0xfce30400, +0xb00a4711,0x7c40300,0xfce30000,0xb00acf00,0x4000000,0x4e00000,0xb00b0500,0x4000000,0x4e00000,0xb00b0500,0x4000000,0x6800000,0xb00b109a,0x7c00300,0x80e30000,0xb080e487, +0x2802000,0xfc962460,0xc0001524,0x4000000,0x4500000,0xc0001a18,0x2806400,0xfd862460,0xc0001a18,0x7c00100,0xfd830000,0xc0007300,0x24000000,0x4200000,0xc0008e00,0x24000010, +0x4400000,0xc0009519,0x7c00100,0x10220400,0xc0009519,0x7c00100,0x10250400,0xc0009519,0x7c00100,0xfc220400,0xc0009519,0x7c00100,0xfc250400,0xc000c300,0x4000000,0xc820000f, +0xc000d85c,0x2802100,0x40962460,0xc000d85c,0x6800100,0x40962540,0xc000d85c,0x7c00100,0x40230400,0xc000dc99,0x7c00100,0x80230400,0xc000e719,0x7c00100,0xfc220400,0xc00107a7, +0x7c00100,0x40230400,0xc0010eaa,0x7c00100,0x40230400,0xc00116b0,0x7c00100,0x80230560,0xc0011900,0x4000000,0x4200000,0xc0012447,0,0x84818820,0xc0012447,0, +0x84c18820,0xc0012447,0,0x85418820,0xc00125b9,0x7c00100,0x80230400,0xc00126bb,0x2802100,0x80962460,0xc00126bb,0x2806400,0x80962460,0xc00126bb,0x4000000,0x84500000, +0xc00126bb,0x6800100,0x80962540,0xc00126bb,0x7c00100,0x80230400,0xc00127ba,0x2802400,0x40962460,0xc00127ba,0x4000000,0x44200000,0xc00127ba,0x6800000,0x41329800,0xc00127ba, +0x7c00100,0x40230400,0xc00127ba,0x7c00900,0x40230400,0xc0012800,0x4000000,0x4200000,0xc0012b23,0x4000000,0x4200000,0xc0012b23,0x4000000,0x4400000,0xc0012b23,0x4000000, +0x5500000,0xc0012cbc,0x2802400,0x40962460,0xc0012cbc,0x4000000,0x45600000,0xc0012cbc,0x6800000,0x41329800,0xc0012cbc,0x7c00100,0x40230400,0xc00acf00,0x4000000,0x4e00000, +0xc00ae300,0x4000000,0x4e00000,0xc00b0500,0x4000000,0x4e00000,0xc00b0500,0x4000000,0x6800000,0xc00b0b11,0x4000000,0x5200000,0xc00b0b11,0x7c00900,0x9230400,0xc00b109a, +0x7c00300,0x80e30000,0xc00b2914,0x7c00100,0xfe530000,0xc00b2916,0x7c00100,0xfe530c00,0xc00b2a00,0x4000000,0x4e00000,0xc040af5e,0x7c00100,0x80230400,0xc0c12b89,0x4000000, +0x4200000,0xc14a44cc,0x4000000,0xc8e0000d,0xd000131f,0x2802c00,0xfc962460,0xd000171a,0x7c00100,0x18230400,0xd0001821,0x2802100,0x10962460,0xd0007300,0x24000000,0x4200000, +0xd0008e00,0x24000000,0x4200000,0xd0008f3a,0x2806000,0x40962460,0xd0009519,0x7c00100,0x8220400,0xd0009519,0x7c00100,0x8250400,0xd0009519,0x7c00100,0xfc220400,0xd0009519, +0x7c00100,0xfc250400,0xd000a500,0x4000000,0x4200000,0xd000c300,0x4000000,0x4e00000,0xd000d202,0x7c00100,0xfc230400,0xd000d476,0x7c00100,0x40230400,0xd000d997,0x2802100, +0x80962460,0xd000d997,0x6800100,0x80962540,0xd000e001,0x2802100,0x10962460,0xd000e700,0x4000400,0x4200000,0xd000e719,0x7c00100,0x10220400,0xd000e719,0x7c00500,0xc822040f, +0xd000fa00,0x4000000,0x4e00000,0xd0010eaa,0x4000010,0x44400000,0xd0010eaa,0x7c00100,0x40230400,0xd0012dbd,0x4000000,0x84200000,0xd0012dbd,0x7c00100,0x80230400,0xd0012fbe, +0x2802100,0x80962460,0xd0012fbe,0x2802400,0x80962460,0xd0012fbe,0x2806400,0x82f62460,0xd0012fbe,0x4000000,0x84400000,0xd0012fbe,0x6800000,0x80e29800,0xd0012fbe,0x6800100, +0x80962540,0xd0012fbe,0x6800100,0x80962541,0xd0012fbe,0x6804400,0x80962540,0xd0012fbe,0x7c00100,0x82b30400,0xd0012fbe,0x7c00100,0x82c30560,0xd0012fbe,0xc000010,0x84448000, +0xd0013183,0x7c00100,0x40230400,0xd0013200,0x4000000,0x4200000,0xd0013200,0x6800000,0xc9329805,0xd00134c0,0x2802100,0x80962460,0xd00134c0,0x4000002,0x84400000,0xd00134c0, +0x7c00100,0x80230400,0xd00a4305,0x7c00100,0xfce30400,0xd00a4611,0x7c40300,0xfce30000,0xd00a4711,0x7c40300,0xfce30000,0xd00a5e11,0x7c40300,0xfce30000,0xd00acf00,0x4000000, +0x4e00000,0xd00b0500,0x4000000,0x4e00000,0xd00b0500,0x4000000,0x6800000,0xd00b0b11,0x6800500,0xfc962540,0xd00b0bbf,0x2802200,0x80c62460,0xd00b119a,0x7c00300,0x80e30000, +0xd00b2a00,0x4000000,0x4e00000,0xd00b2e11,0x7c40300,0xfce30000,0xd00b30bf,0x7c00300,0x80230000,0xd00b339a,0x7c00300,0x80e30000,0xe0000c02,0xc000010,0x4b48000,0xe0001524, +0x2802400,0xfc962460,0xe0001524,0x7c00100,0xfc230400,0xe0001615,0x7c00100,0xfc230400,0xe000251b,0x12882000,0xc4962460,0xe0002a00,0x4000000,0x5500000,0xe0005102,0x4000000, +0x14200000,0xe0005c00,0x4000000,0x14200000,0xe000622a,0x6804400,0x80962540,0xe000622a,0x7c00100,0x80230400,0xe0008838,0x7c00100,0x80220400,0xe0008838,0x7c00100,0x80250400, +0xe0008e00,0x24000000,0x4810000,0xe0008e00,0x24000000,0x5410000,0xe0008e00,0x24000002,0x4400000,0xe0008e00,0x2c000010,0x4b48000,0xe000933e,0x7c00100,0x42b30400,0xe000933e, +0xc000010,0x44448000,0xe0009519,0x7c00100,0xc822040f,0xe0009519,0x7c00100,0xfc220400,0xe0009519,0x7c00100,0xfc250400,0xe000c178,0x2802100,0x80962460,0xe000c941,0x2802100, +0x80962460,0xe000c941,0x2806400,0x80962460,0xe000c941,0x7c00100,0x82b30400,0xe000d202,0x2802400,0x20962460,0xe000d202,0x7c00100,0xfc230400,0xe000d202,0x7c00500,0xfc230400, +0xe000dc99,0x4000000,0x84200000,0xe000e001,0x2802100,0x20962460,0xe000e001,0x2802400,0x20962460,0xe000fda1,0x7c00100,0x81830000,0xe0013502,0x2802400,0x20962460,0xe0013502, +0x4000000,0x4200000,0xe0013502,0x7c00100,0xfc230400,0xe0013502,0x80000000,0x5329960,0xe00136c1,0x4000000,0x84200000,0xe00136c1,0x7c00100,0x80230400,0xe001370b,0x7c00100, +0xfc230400,0xe0013919,0x7c00500,0x20220400,0xe0013919,0x7c00500,0xc822040f,0xe0013919,0x7c00d00,0xc823040f,0xe0013a19,0x7c00100,0xfc220400,0xe0013a19,0x7c00100,0xfc230400, +0xe0013bc2,0x2802400,0x80962460,0xe0013bc2,0x7c00100,0x80230400,0xe0013bc2,0xc000010,0x84248000,0xe0013cc3,0x6800000,0x81329800,0xe0013cc3,0x7c00100,0x80230400,0xe0013dc4, +0x2802400,0x80962460,0xe0013dc4,0x7c00100,0x80230400,0xe0013e28,0x7c00100,0x40230400,0xe0013fc5,0x7c00100,0x80220400,0xe0013fc5,0x7c00100,0x80250400,0xe0014000,0x4000000, +0x14200000,0xe0014001,0x2802400,0x10962460,0xe00a4711,0x7c40300,0xfce30000,0xe00a5e11,0x7c40300,0xfce30000,0xe00ac511,0x7c40300,0xfce30000,0xe00acf00,0x4000000,0x4e00000, +0xe00ae300,0x4000000,0x4e00000,0xe00b0500,0x4000000,0x4e00000,0xe00b1314,0x7c00100,0xfce30000,0xe00b1316,0x7c00100,0xfce30c00,0xe00b2a00,0x4000000,0x4e00000,0xe00b2a00, +0x4000000,0x6800000,0xe00b3816,0x7c00500,0x20230c00,0xe0808328,0x2802400,0x50962460,0xf0001615,0x6800100,0xfc962540,0xf0001a18,0x2802000,0xfd862460,0xf000c247,0x7c00100, +0x81430400,0xf000d000,0x4000000,0x4e00000,0xf000e300,0x4000000,0x4e00000,0xf000e59d,0x2802100,0x80962460,0xf000e59d,0x7c00100,0x80230400,0xf0012447,0,0x84818820, +0xf0012447,0,0x84c18820,0xf0012447,0,0x85418820,0xf0012447,0x2802000,0x80962460,0xf0012447,0x2802400,0x80962460,0xf0012447,0x7c00100,0x80230400,0xf0013a19, +0x7c00100,0xfc220400,0xf0014102,0x2802400,0x20962460,0xf0014308,0x2802100,0xfc962460,0xf0014308,0x7c00500,0xc822040e,0xf0014308,0x7c00500,0xc822040f,0xf001440a,0x4000000, +0x4500000,0xf0014500,0x4000000,0x4200000,0xf00146c6,0x2802100,0x80962460,0xf00146c6,0x2806000,0x82f62460,0xf00146c6,0x4000000,0x84e00000,0xf00146c6,0x6800000,0x82d29800, +0xf00146c6,0x6800100,0x80962540,0xf00146c6,0x6804000,0x80962540,0xf00146c6,0x7c00100,0x82b30400,0xf00146c6,0x7c00100,0x82c30560,0xf00146c6,0xc000010,0x84448000,0xf00147c7, +0x2802000,0x80962460,0xf00147c7,0x6800000,0x81329800,0xf00147c7,0x7c00100,0x80230400,0xf00ac511,0x7c40300,0xfce30000,0xf00acf00,0x4000000,0x4e00000,0xf00b2914,0x7c00100, +0xfe530000,0xf00b2916,0x7c00100,0xfe530c00,0xf00b2a00,0x4000000,0x4e00000,0xf00b2a00,0x4000000,0x6800000,0xf00b4211,0x7c40300,0xfce30000,0xf10a3c00,0x4000000,0x4e00000, +0xf10a3c00,0x4008000,0x4e00000,0xf10a8200,0x4008000,0x4e00000,0xf10b4811,0x7c40300,0xfce30000}; -static const int32_t countPropsVectors=7260; +static const int32_t countPropsVectors=7497; static const int32_t propsVectorsColumns=3; static const uint16_t scriptExtensions[298]={ 0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,2,0x22,0x25,0x57, @@ -4022,6 +4038,6 @@ static const uint16_t scriptExtensions[298]={ 0x804f,0x37,0x804e,2,0x8057,2,0x8025,2,0x115,0x2f,0x31,0x8053,0x2f,0x31,0x80c1,0x2f, 0x8031,2,0x8007,0x79,0x80c2,0x79,0x123,0x89,0x87,0x8087}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2d4e,0x2d4e,0x2d4e,0x2d4e,0x6d50,3,0x89ac,0x8a41,0x8a41,0x8a41,0xb48c7,0x2f75a31,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2d4e,0x2d4e,0x2d4e,0x2d4e,0x6d5a,3,0x8aa3,0x8b38,0x8b38,0x8b38,0xb48c8,0x2f75a31,0,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/uchriter.cpp b/deps/icu-small/source/common/uchriter.cpp index a7d30977e091b7..c8b86e5d4df3f5 100644 --- a/deps/icu-small/source/common/uchriter.cpp +++ b/deps/icu-small/source/common/uchriter.cpp @@ -20,14 +20,14 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UCharCharacterIterator) UCharCharacterIterator::UCharCharacterIterator() : CharacterIterator(), - text(0) + text(nullptr) { // never default construct! } UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length) - : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0), + : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0), text(textPtr) { } @@ -35,7 +35,7 @@ UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t position) - : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0, position), + : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0, position), text(textPtr) { } @@ -45,7 +45,8 @@ UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t textBegin, int32_t textEnd, int32_t position) - : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0, textBegin, textEnd, position), + : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0, + textBegin, textEnd, position), text(textPtr) { } @@ -352,7 +353,7 @@ UCharCharacterIterator::move32(int32_t delta, CharacterIterator::EOrigin origin) void UCharCharacterIterator::setText(ConstChar16Ptr newText, int32_t newTextLength) { text = newText; - if(newText == 0 || newTextLength < 0) { + if (newText == nullptr || newTextLength < 0) { newTextLength = 0; } end = textLength = newTextLength; diff --git a/deps/icu-small/source/common/ucnv.cpp b/deps/icu-small/source/common/ucnv.cpp index a7a07d65d61b4f..34a5a203d09dfb 100644 --- a/deps/icu-small/source/common/ucnv.cpp +++ b/deps/icu-small/source/common/ucnv.cpp @@ -473,8 +473,6 @@ ucnv_setSubstChars (UConverter * converter, * we set subChar1 to 0. */ converter->subChar1 = 0; - - return; } U_CAPI void U_EXPORT2 @@ -1754,7 +1752,7 @@ ucnv_fromUChars(UConverter *cnv, destLimit=dest+destCapacity; /* perform the conversion */ - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, pErrorCode); + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, pErrorCode); destLength=(int32_t)(dest-originalDest); /* if an overflow occurs, then get the preflighting length */ @@ -1765,7 +1763,7 @@ ucnv_fromUChars(UConverter *cnv, do { dest=buffer; *pErrorCode=U_ZERO_ERROR; - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, pErrorCode); + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, pErrorCode); destLength+=(int32_t)(dest-buffer); } while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR); } @@ -1810,7 +1808,7 @@ ucnv_toUChars(UConverter *cnv, destLimit=dest+destCapacity; /* perform the conversion */ - ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, pErrorCode); + ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, pErrorCode); destLength=(int32_t)(dest-originalDest); /* if an overflow occurs, then get the preflighting length */ @@ -1822,7 +1820,7 @@ ucnv_toUChars(UConverter *cnv, do { dest=buffer; *pErrorCode=U_ZERO_ERROR; - ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, pErrorCode); + ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, pErrorCode); destLength+=(int32_t)(dest-buffer); } while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR); diff --git a/deps/icu-small/source/common/ucnv_err.cpp b/deps/icu-small/source/common/ucnv_err.cpp index 761c442632f1ef..7d49a505095e45 100644 --- a/deps/icu-small/source/common/ucnv_err.cpp +++ b/deps/icu-small/source/common/ucnv_err.cpp @@ -109,7 +109,6 @@ UCNV_FROM_U_CALLBACK_STOP ( *err = U_ZERO_ERROR; } /* the caller must have set the error code accordingly */ - return; } @@ -125,7 +124,6 @@ UCNV_TO_U_CALLBACK_STOP ( { /* the caller must have set the error code accordingly */ (void)context; (void)toUArgs; (void)codePoints; (void)length; (void)reason; (void)err; - return; } U_CAPI void U_EXPORT2 @@ -353,8 +351,6 @@ UCNV_FROM_U_CALLBACK_ESCAPE ( *err = err2; return; } - - return; } diff --git a/deps/icu-small/source/common/ucnv_u7.cpp b/deps/icu-small/source/common/ucnv_u7.cpp index 398b528e832d28..bbdaf98dff76fa 100644 --- a/deps/icu-small/source/common/ucnv_u7.cpp +++ b/deps/icu-small/source/common/ucnv_u7.cpp @@ -455,7 +455,6 @@ _UTF7ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; - return; } static void U_CALLCONV @@ -731,7 +730,6 @@ _UTF7FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, pArgs->source=source; pArgs->target=(char *)target; pArgs->offsets=offsets; - return; } static const char * U_CALLCONV @@ -1156,7 +1154,6 @@ _IMAPToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; - return; } static void U_CALLCONV @@ -1443,7 +1440,6 @@ _IMAPFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, pArgs->source=source; pArgs->target=(char *)target; pArgs->offsets=offsets; - return; } U_CDECL_END diff --git a/deps/icu-small/source/common/ucnvbocu.cpp b/deps/icu-small/source/common/ucnvbocu.cpp index 007722e474b42e..3b736aa1e90818 100644 --- a/deps/icu-small/source/common/ucnvbocu.cpp +++ b/deps/icu-small/source/common/ucnvbocu.cpp @@ -1165,7 +1165,6 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; - return; } /* @@ -1363,7 +1362,6 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; - return; } /* miscellaneous ------------------------------------------------------------ */ diff --git a/deps/icu-small/source/common/ucnvisci.cpp b/deps/icu-small/source/common/ucnvisci.cpp index 507a50c89254b0..c14dbaa08c6660 100644 --- a/deps/icu-small/source/common/ucnvisci.cpp +++ b/deps/icu-small/source/common/ucnvisci.cpp @@ -1537,12 +1537,12 @@ _ISCII_SafeClone(const UConverter *cnv, int32_t bufferSizeNeeded = sizeof(struct cloneISCIIStruct); if (U_FAILURE(*status)) { - return 0; + return nullptr; } if (*pBufferSize == 0) { /* 'preflighting' request - set needed size into *pBufferSize */ *pBufferSize = bufferSizeNeeded; - return 0; + return nullptr; } localClone = (struct cloneISCIIStruct *)stackBuffer; diff --git a/deps/icu-small/source/common/ucnvscsu.cpp b/deps/icu-small/source/common/ucnvscsu.cpp index 2138e289cadbe6..e6f8660df40433 100644 --- a/deps/icu-small/source/common/ucnvscsu.cpp +++ b/deps/icu-small/source/common/ucnvscsu.cpp @@ -572,7 +572,6 @@ _SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; - return; } /* @@ -864,7 +863,6 @@ _SCSUToUnicode(UConverterToUnicodeArgs *pArgs, /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; - return; } U_CDECL_END /* SCSU-from-Unicode conversion functions ----------------------------------- */ @@ -1978,12 +1976,12 @@ _SCSUSafeClone(const UConverter *cnv, int32_t bufferSizeNeeded = sizeof(struct cloneSCSUStruct); if (U_FAILURE(*status)){ - return 0; + return nullptr; } if (*pBufferSize == 0){ /* 'preflighting' request - set needed size into *pBufferSize */ *pBufferSize = bufferSizeNeeded; - return 0; + return nullptr; } localClone = (struct cloneSCSUStruct *)stackBuffer; diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index 70b1bbf2239dd9..dbad1e5014796e 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -22,7 +22,6 @@ #include "unicode/usetiter.h" #include "unicode/utf16.h" #include "ustr_imp.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -296,7 +295,7 @@ myUCharsToChars(char* resultOfLen4, const char16_t* currency) { static const int32_t* _findMetaData(const char16_t* currency, UErrorCode& ec) { - if (currency == 0 || *currency == 0) { + if (currency == nullptr || *currency == 0) { if (U_SUCCESS(ec)) { ec = U_ILLEGAL_ARGUMENT_ERROR; } @@ -349,10 +348,10 @@ _findMetaData(const char16_t* currency, UErrorCode& ec) { // ------------------------------------- -static void -idForLocale(const char* locale, char* countryAndVariant, int capacity, UErrorCode* ec) +static CharString +idForLocale(const char* locale, UErrorCode* ec) { - ulocimp_getRegionForSupplementalData(locale, false, countryAndVariant, capacity, ec); + return ulocimp_getRegionForSupplementalData(locale, false, *ec); } // ------------------------------------------ @@ -371,7 +370,7 @@ U_CDECL_END struct CReg; static UMutex gCRegLock; -static CReg* gCRegHead = 0; +static CReg* gCRegHead = nullptr; struct CReg : public icu::UMemory { CReg *next; @@ -379,7 +378,7 @@ struct CReg : public icu::UMemory { char id[ULOC_FULLNAME_CAPACITY]; CReg(const char16_t* _iso, const char* _id) - : next(0) + : next(nullptr) { int32_t len = (int32_t)uprv_strlen(_id); if (len > (int32_t)(sizeof(id)-1)) { @@ -408,7 +407,7 @@ struct CReg : public icu::UMemory { } *status = U_MEMORY_ALLOCATION_ERROR; } - return 0; + return nullptr; } static UBool unreg(UCurrRegistryKey key) { @@ -464,9 +463,8 @@ U_CAPI UCurrRegistryKey U_EXPORT2 ucurr_register(const char16_t* isoCode, const char* locale, UErrorCode *status) { if (status && U_SUCCESS(*status)) { - char id[ULOC_FULLNAME_CAPACITY]; - idForLocale(locale, id, sizeof(id), status); - return CReg::reg(isoCode, id, status); + CharString id = idForLocale(locale, status); + return CReg::reg(isoCode, id.data(), status); } return nullptr; } @@ -524,11 +522,7 @@ ucurr_forLocale(const char* locale, } UErrorCode localStatus = U_ZERO_ERROR; - CharString currency; - { - CharStringByteSink sink(¤cy); - ulocimp_getKeywordValue(locale, "currency", sink, &localStatus); - } + CharString currency = ulocimp_getKeywordValue(locale, "currency", localStatus); int32_t resLen = currency.length(); if (U_SUCCESS(localStatus) && resLen == 3 && uprv_isInvariantString(currency.data(), resLen)) { @@ -540,14 +534,13 @@ ucurr_forLocale(const char* locale, } // get country or country_variant in `id' - char id[ULOC_FULLNAME_CAPACITY]; - idForLocale(locale, id, UPRV_LENGTHOF(id), ec); + CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) { return 0; } #if !UCONFIG_NO_SERVICE - const char16_t* result = CReg::get(id); + const char16_t* result = CReg::get(id.data()); if (result) { if(buffCapacity > u_strlen(result)) { u_strcpy(buff, result); @@ -557,13 +550,13 @@ ucurr_forLocale(const char* locale, } #endif // Remove variants, which is only needed for registration. - char *idDelim = uprv_strchr(id, VAR_DELIM); + char *idDelim = uprv_strchr(id.data(), VAR_DELIM); if (idDelim) { - idDelim[0] = 0; + id.truncate(idDelim - id.data()); } const char16_t* s = nullptr; // Currency code from data file. - if (id[0] == 0) { + if (id.isEmpty()) { // No point looking in the data for an empty string. // This is what we would get. localStatus = U_MISSING_RESOURCE_ERROR; @@ -572,7 +565,7 @@ ucurr_forLocale(const char* locale, localStatus = U_ZERO_ERROR; UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + UResourceBundle *countryArray = ures_getByKey(rb, id.data(), cm, &localStatus); // https://unicode-org.atlassian.net/browse/ICU-21997 // Prefer to use currencies that are legal tender. if (U_SUCCESS(localStatus)) { @@ -602,13 +595,9 @@ ucurr_forLocale(const char* locale, ures_close(countryArray); } - if ((U_FAILURE(localStatus)) && strchr(id, '_') != 0) { + if ((U_FAILURE(localStatus)) && strchr(id.data(), '_') != nullptr) { // We don't know about it. Check to see if we support the variant. - CharString parent; - { - CharStringByteSink sink(&parent); - ulocimp_getParent(locale, sink, ec); - } + CharString parent = ulocimp_getParent(locale, *ec); *ec = U_USING_FALLBACK_WARNING; // TODO: Loop over the parent rather than recursing and // looking again for a currency keyword. @@ -647,10 +636,7 @@ static UBool fallback(CharString& loc) { loc.truncate(3); loc.append("001", status); } else { - CharString tmp; - CharStringByteSink sink(&tmp); - ulocimp_getParent(loc.data(), sink, &status); - loc = std::move(tmp); + loc = ulocimp_getParent(loc.data(), status); } /* char *i = uprv_strrchr(loc, '_'); @@ -683,13 +669,13 @@ ucurr_getName(const char16_t* currency, //|} if (U_FAILURE(*ec)) { - return 0; + return nullptr; } int32_t choice = (int32_t) nameStyle; if (choice < 0 || choice > 4) { *ec = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } // In the future, resource bundles may implement multi-level @@ -705,14 +691,10 @@ ucurr_getName(const char16_t* currency, // this function. UErrorCode ec2 = U_ZERO_ERROR; - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_getName(locale, sink, &ec2); - } + CharString loc = ulocimp_getName(locale, ec2); if (U_FAILURE(ec2)) { *ec = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } char buf[ISO_CURRENCY_CODE_LENGTH+1]; @@ -739,7 +721,7 @@ ucurr_getName(const char16_t* currency, break; default: *ec = U_UNSUPPORTED_ERROR; - return 0; + return nullptr; } key.append("/", ec2); key.append(buf, ec2); @@ -800,21 +782,17 @@ ucurr_getPluralName(const char16_t* currency, //|} if (U_FAILURE(*ec)) { - return 0; + return nullptr; } // Use a separate UErrorCode here that does not propagate out of // this function. UErrorCode ec2 = U_ZERO_ERROR; - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_getName(locale, sink, &ec2); - } + CharString loc = ulocimp_getName(locale, ec2); if (U_FAILURE(ec2)) { *ec = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } char buf[ISO_CURRENCY_CODE_LENGTH+1]; @@ -1002,11 +980,7 @@ collectCurrencyNames(const char* locale, // Look up the Currencies resource for the given locale. UErrorCode ec2 = U_ZERO_ERROR; - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_getName(locale, sink, &ec2); - } + CharString loc = ulocimp_getName(locale, ec2); if (U_FAILURE(ec2)) { ec = U_ILLEGAL_ARGUMENT_ERROR; } @@ -1390,7 +1364,6 @@ searchCurrencyName(const CurrencyNameStruct* currencyNames, break; } } - return; } //========================= currency name cache ===================== @@ -1447,7 +1420,7 @@ currency_cache_cleanup() { for (int32_t i = 0; i < CURRENCY_NAME_CACHE_NUM; ++i) { if (currCache[i]) { deleteCacheEntry(currCache[i]); - currCache[i] = 0; + currCache[i] = nullptr; } } return true; @@ -2030,6 +2003,7 @@ static const struct CurrencyList { {"XBC", UCURR_UNCOMMON|UCURR_NON_DEPRECATED}, {"XBD", UCURR_UNCOMMON|UCURR_NON_DEPRECATED}, {"XCD", UCURR_COMMON|UCURR_NON_DEPRECATED}, + {"XCG", UCURR_COMMON|UCURR_NON_DEPRECATED}, {"XDR", UCURR_UNCOMMON|UCURR_NON_DEPRECATED}, {"XEU", UCURR_UNCOMMON|UCURR_DEPRECATED}, {"XFO", UCURR_UNCOMMON|UCURR_NON_DEPRECATED}, @@ -2229,7 +2203,7 @@ static void U_CALLCONV initIsoCodes(UErrorCode &status) { static void populateCurrSymbolsEquiv(icu::Hashtable *hash, UErrorCode &status) { if (U_FAILURE(status)) { return; } - for (auto& entry : unisets::kCurrencyEntries) { + for (const auto& entry : unisets::kCurrencyEntries) { UnicodeString exemplar(entry.exemplar); const UnicodeSet* set = unisets::get(entry.key); if (set == nullptr) { return; } @@ -2325,10 +2299,9 @@ ucurr_countCurrencies(const char* locale, { // local variables UErrorCode localStatus = U_ZERO_ERROR; - char id[ULOC_FULLNAME_CAPACITY]; // get country or country_variant in `id' - idForLocale(locale, id, sizeof(id), ec); + CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) { @@ -2336,10 +2309,10 @@ ucurr_countCurrencies(const char* locale, } // Remove variants, which is only needed for registration. - char *idDelim = strchr(id, VAR_DELIM); + char *idDelim = strchr(id.data(), VAR_DELIM); if (idDelim) { - idDelim[0] = 0; + id.truncate(idDelim - id.data()); } // Look up the CurrencyMap element in the root bundle. @@ -2347,7 +2320,7 @@ ucurr_countCurrencies(const char* locale, UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); // Using the id derived from the local, get the currency data - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + UResourceBundle *countryArray = ures_getByKey(rb, id.data(), cm, &localStatus); // process each currency to see which one is valid for the given date if (U_SUCCESS(localStatus)) @@ -2440,20 +2413,19 @@ ucurr_forLocaleAndDate(const char* locale, { // local variables UErrorCode localStatus = U_ZERO_ERROR; - char id[ULOC_FULLNAME_CAPACITY]; // get country or country_variant in `id' - idForLocale(locale, id, sizeof(id), ec); + CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) { return 0; } // Remove variants, which is only needed for registration. - char *idDelim = strchr(id, VAR_DELIM); + char *idDelim = strchr(id.data(), VAR_DELIM); if (idDelim) { - idDelim[0] = 0; + id.truncate(idDelim - id.data()); } // Look up the CurrencyMap element in the root bundle. @@ -2461,7 +2433,7 @@ ucurr_forLocaleAndDate(const char* locale, UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); // Using the id derived from the local, get the currency data - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + UResourceBundle *countryArray = ures_getByKey(rb, id.data(), cm, &localStatus); // process each currency to see which one is valid for the given date bool matchFound = false; @@ -2587,9 +2559,8 @@ static const UEnumeration defaultKeywordValues = { U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, const char *locale, UBool commonlyUsed, UErrorCode* status) { // Resolve region - char prefRegion[ULOC_COUNTRY_CAPACITY]; - ulocimp_getRegionForSupplementalData(locale, true, prefRegion, sizeof(prefRegion), status); - + CharString prefRegion = ulocimp_getRegionForSupplementalData(locale, true, *status); + // Read value from supplementalData UList *values = ulist_createEmptyList(status); UList *otherValues = ulist_createEmptyList(status); @@ -2621,7 +2592,7 @@ U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, break; } const char *region = ures_getKey(&bundlekey); - UBool isPrefRegion = uprv_strcmp(region, prefRegion) == 0 ? true : false; + UBool isPrefRegion = prefRegion == region; if (!isPrefRegion && commonlyUsed) { // With commonlyUsed=true, we do not put // currencies for other regions in the @@ -2732,7 +2703,7 @@ ucurr_getNumericCode(const char16_t* currency) { if (currency && u_strlen(currency) == ISO_CURRENCY_CODE_LENGTH) { UErrorCode status = U_ZERO_ERROR; - UResourceBundle *bundle = ures_openDirect(0, "currencyNumericCodes", &status); + UResourceBundle *bundle = ures_openDirect(nullptr, "currencyNumericCodes", &status); ures_getByKey(bundle, "codeMap", bundle, &status); if (U_SUCCESS(status)) { char alphaCode[ISO_CURRENCY_CODE_LENGTH+1]; diff --git a/deps/icu-small/source/common/udata.cpp b/deps/icu-small/source/common/udata.cpp index 88126fc689a2c3..4c2ba57303a088 100644 --- a/deps/icu-small/source/common/udata.cpp +++ b/deps/icu-small/source/common/udata.cpp @@ -850,12 +850,12 @@ static UBool extendICUData(UErrorCode *pErr) UDataMemory_init(©PData); if(pData != nullptr) { UDatamemory_assign(©PData, pData); - copyPData.map = 0; /* The mapping for this data is owned by the hash table */ - copyPData.mapAddr = 0; /* which will unmap it when ICU is shut down. */ - /* CommonICUData is also unmapped when ICU is shut down.*/ - /* To avoid unmapping the data twice, zero out the map */ - /* fields in the UDataMemory that we're assigning */ - /* to CommonICUData. */ + copyPData.map = nullptr; /* The mapping for this data is owned by the hash table */ + copyPData.mapAddr = nullptr; /* which will unmap it when ICU is shut down. */ + /* CommonICUData is also unmapped when ICU is shut down.*/ + /* To avoid unmapping the data twice, zero out the map */ + /* fields in the UDataMemory that we're assigning */ + /* to CommonICUData. */ didUpdate = /* no longer using this result */ setCommonICUData(©PData,/* The new common data. */ diff --git a/deps/icu-small/source/common/udataswp.cpp b/deps/icu-small/source/common/udataswp.cpp index bbce1a8ecd7500..0f194f47e89248 100644 --- a/deps/icu-small/source/common/udataswp.cpp +++ b/deps/icu-small/source/common/udataswp.cpp @@ -441,7 +441,7 @@ udata_openSwapperForInputData(const void *data, int32_t length, pHeader->info.sizeofUChar!=2 ) { *pErrorCode=U_UNSUPPORTED_ERROR; - return 0; + return nullptr; } inIsBigEndian=(UBool)pHeader->info.isBigEndian; @@ -461,7 +461,7 @@ udata_openSwapperForInputData(const void *data, int32_t length, (length>=0 && length=-1) { + if (iter != nullptr) { + if (s != nullptr && length >= -1) { *iter=stringIterator; iter->context=s; if(length>=0) { @@ -283,7 +283,7 @@ utf16BEIteratorPrevious(UCharIterator *iter) { } static const UCharIterator utf16BEIterator={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, stringIteratorGetIndex, stringIteratorMove, stringIteratorHasNext, @@ -457,7 +457,7 @@ characterIteratorSetState(UCharIterator *iter, uint32_t state, UErrorCode *pErro } static const UCharIterator characterIteratorWrapper={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, characterIteratorGetIndex, characterIteratorMove, characterIteratorHasNext, @@ -472,8 +472,8 @@ static const UCharIterator characterIteratorWrapper={ U_CAPI void U_EXPORT2 uiter_setCharacterIterator(UCharIterator *iter, CharacterIterator *charIter) { - if(iter!=0) { - if(charIter!=0) { + if (iter != nullptr) { + if (charIter != nullptr) { *iter=characterIteratorWrapper; iter->context=charIter; } else { @@ -521,7 +521,7 @@ replaceableIteratorPrevious(UCharIterator *iter) { } static const UCharIterator replaceableIterator={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, stringIteratorGetIndex, stringIteratorMove, stringIteratorHasNext, @@ -536,8 +536,8 @@ static const UCharIterator replaceableIterator={ U_CAPI void U_EXPORT2 uiter_setReplaceable(UCharIterator *iter, const Replaceable *rep) { - if(iter!=0) { - if(rep!=0) { + if (iter != nullptr) { + if (rep != nullptr) { *iter=replaceableIterator; iter->context=rep; iter->limit=iter->length=rep->length(); @@ -987,7 +987,7 @@ utf8IteratorSetState(UCharIterator *iter, } static const UCharIterator utf8Iterator={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, utf8IteratorGetIndex, utf8IteratorMove, utf8IteratorHasNext, @@ -1002,8 +1002,8 @@ static const UCharIterator utf8Iterator={ U_CAPI void U_EXPORT2 uiter_setUTF8(UCharIterator *iter, const char *s, int32_t length) { - if(iter!=0) { - if(s!=0 && length>=-1) { + if (iter != nullptr) { + if (s != nullptr && length >= -1) { *iter=utf8Iterator; iter->context=s; if(length>=0) { diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index ce49d6c50e2005..88fe7eaadce8b4 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -30,6 +30,8 @@ l = lang, C = ctry, M = charmap, V = variant */ +#include + #include "unicode/bytestream.h" #include "unicode/errorcode.h" #include "unicode/stringpiece.h" @@ -58,6 +60,8 @@ U_NAMESPACE_USE U_CFUNC void locale_set_default(const char *id); U_CFUNC const char *locale_get_default(); +namespace { + /* ### Data tables **************************************************/ /** @@ -94,7 +98,7 @@ U_CFUNC const char *locale_get_default(); /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ /* Subsequent hand addition of selected languages */ -static const char * const LANGUAGES[] = { +constexpr const char* LANGUAGES[] = { "aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain", "ak", "akk", "akz", "ale", "aln", "alt", "am", "an", "ang", "anp", "ar", "arc", @@ -185,10 +189,10 @@ nullptr, nullptr }; -static const char* const DEPRECATED_LANGUAGES[]={ +constexpr const char* DEPRECATED_LANGUAGES[]={ "in", "iw", "ji", "jw", "mo", nullptr, nullptr }; -static const char* const REPLACEMENT_LANGUAGES[]={ +constexpr const char* REPLACEMENT_LANGUAGES[]={ "id", "he", "yi", "jv", "ro", nullptr, nullptr }; @@ -211,7 +215,7 @@ static const char* const REPLACEMENT_LANGUAGES[]={ /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ /* Subsequent hand addition of selected languages */ -static const char * const LANGUAGES_3[] = { +constexpr const char* LANGUAGES_3[] = { "aar", "abk", "ace", "ach", "ada", "ady", "ave", "aeb", "afr", "afh", "agq", "ain", "aka", "akk", "akz", "ale", "aln", "alt", "amh", "arg", "ang", "anp", "ara", "arc", @@ -327,7 +331,7 @@ nullptr * RO(ROM) is now RO(ROU) according to * http://www.iso.org/iso/en/prods-services/iso3166ma/03updates-on-iso-3166/nlv3e-rou.html */ -static const char * const COUNTRIES[] = { +constexpr const char* COUNTRIES[] = { "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", @@ -363,10 +367,10 @@ nullptr, nullptr }; -static const char* const DEPRECATED_COUNTRIES[] = { +constexpr const char* DEPRECATED_COUNTRIES[] = { "AN", "BU", "CS", "DD", "DY", "FX", "HV", "NH", "RH", "SU", "TP", "UK", "VD", "YD", "YU", "ZR", nullptr, nullptr /* deprecated country list */ }; -static const char* const REPLACEMENT_COUNTRIES[] = { +constexpr const char* REPLACEMENT_COUNTRIES[] = { /* "AN", "BU", "CS", "DD", "DY", "FX", "HV", "NH", "RH", "SU", "TP", "UK", "VD", "YD", "YU", "ZR" */ "CW", "MM", "RS", "DE", "BJ", "FR", "BF", "VU", "ZW", "RU", "TL", "GB", "VN", "YE", "RS", "CD", nullptr, nullptr /* replacement country codes */ }; @@ -384,7 +388,7 @@ static const char* const REPLACEMENT_COUNTRIES[] = { * second list, and another nullptr entry. The two lists correspond to * the two lists in COUNTRIES. */ -static const char * const COUNTRIES_3[] = { +constexpr const char* COUNTRIES_3[] = { /* "AD", "AE", "AF", "AG", "AI", "AL", "AM", */ "AND", "ARE", "AFG", "ATG", "AIA", "ALB", "ARM", /* "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", */ @@ -460,7 +464,7 @@ typedef struct CanonicalizationMap { * A map to canonicalize locale IDs. This handles a variety of * different semantic kinds of transformations. */ -static const CanonicalizationMap CANONICALIZE_MAP[] = { +constexpr CanonicalizationMap CANONICALIZE_MAP[] = { { "art__LOJBAN", "jbo" }, /* registered name */ { "hy__AREVELA", "hy" }, /* Registered IANA variant */ { "hy__AREVMDA", "hyw" }, /* Registered IANA variant */ @@ -475,15 +479,13 @@ static const CanonicalizationMap CANONICALIZE_MAP[] = { }; /* ### BCP47 Conversion *******************************************/ -/* Test if the locale id has BCP47 u extension and does not have '@' */ -#define _hasBCP47Extension(id) (id && uprv_strstr(id, "@") == nullptr && getShortestSubtagLength(localeID) == 1) /* Gets the size of the shortest subtag in the given localeID. */ -static int32_t getShortestSubtagLength(const char *localeID) { +int32_t getShortestSubtagLength(const char *localeID) { int32_t localeIDLength = static_cast(uprv_strlen(localeID)); int32_t length = localeIDLength; int32_t tmpLength = 0; int32_t i; - UBool reset = true; + bool reset = true; for (i = 0; i < localeIDLength; i++) { if (localeID[i] != '_' && localeID[i] != '-') { @@ -502,12 +504,18 @@ static int32_t getShortestSubtagLength(const char *localeID) { return length; } +/* Test if the locale id has BCP47 u extension and does not have '@' */ +inline bool _hasBCP47Extension(const char *id) { + return id != nullptr && uprv_strstr(id, "@") == nullptr && getShortestSubtagLength(id) == 1; +} /* ### Keywords **************************************************/ -#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) -#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) +inline bool UPRV_ISDIGIT(char c) { return c >= '0' && c <= '9'; } +inline bool UPRV_ISALPHANUM(char c) { return uprv_isASCIILetter(c) || UPRV_ISDIGIT(c); } /* Punctuation/symbols allowed in legacy key values */ -#define UPRV_OK_VALUE_PUNCTUATION(c) ((c) == '_' || (c) == '-' || (c) == '+' || (c) == '/') +inline bool UPRV_OK_VALUE_PUNCTUATION(char c) { return c == '_' || c == '-' || c == '+' || c == '/'; } + +} // namespace #define ULOC_KEYWORD_BUFFER_LEN 25 #define ULOC_MAX_NO_KEYWORDS 25 @@ -536,36 +544,31 @@ locale_getKeywordsStart(const char *localeID) { return nullptr; } +namespace { + /** - * @param buf buffer of size [ULOC_KEYWORD_BUFFER_LEN] * @param keywordName incoming name to be canonicalized * @param status return status (keyword too long) - * @return length of the keyword name + * @return the keyword name */ -static int32_t locale_canonKeywordName(char *buf, const char *keywordName, UErrorCode *status) +CharString locale_canonKeywordName(const char* keywordName, UErrorCode& status) { - int32_t keywordNameLen = 0; + if (U_FAILURE(status)) { return {}; } + CharString result; for (; *keywordName != 0; keywordName++) { if (!UPRV_ISALPHANUM(*keywordName)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ - return 0; - } - if (keywordNameLen < ULOC_KEYWORD_BUFFER_LEN - 1) { - buf[keywordNameLen++] = uprv_tolower(*keywordName); - } else { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; - return 0; + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return {}; } + result.append(uprv_tolower(*keywordName), status); } - if (keywordNameLen == 0) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */ - return 0; + if (result.isEmpty()) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */ + return {}; } - buf[keywordNameLen] = 0; /* terminate */ - return keywordNameLen; + return result; } typedef struct { @@ -575,20 +578,41 @@ typedef struct { int32_t valueLen; } KeywordStruct; -static int32_t U_CALLCONV +int32_t U_CALLCONV compareKeywordStructs(const void * /*context*/, const void *left, const void *right) { const char* leftString = ((const KeywordStruct *)left)->keyword; const char* rightString = ((const KeywordStruct *)right)->keyword; return uprv_strcmp(leftString, rightString); } -U_CFUNC void -ulocimp_getKeywords(const char *localeID, +} // namespace + +U_EXPORT CharString +ulocimp_getKeywords(const char* localeID, + char prev, + bool valuesToo, + UErrorCode& status) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getKeywords(localeID, + prev, + sink, + valuesToo, + status); + }, + status); +} + +U_EXPORT void +ulocimp_getKeywords(const char* localeID, char prev, ByteSink& sink, - UBool valuesToo, - UErrorCode *status) + bool valuesToo, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + KeywordStruct keywordList[ULOC_MAX_NO_KEYWORDS]; int32_t maxKeywords = ULOC_MAX_NO_KEYWORDS; @@ -601,7 +625,7 @@ ulocimp_getKeywords(const char *localeID, if(prev == '@') { /* start of keyword definition */ /* we will grab pairs, trim spaces, lowercase keywords, sort and return */ do { - UBool duplicate = false; + bool duplicate = false; /* skip leading spaces */ while(*pos == ' ') { pos++; @@ -610,7 +634,7 @@ ulocimp_getKeywords(const char *localeID, break; } if(numKeywords == maxKeywords) { - *status = U_INTERNAL_PROGRAM_ERROR; + status = U_INTERNAL_PROGRAM_ERROR; return; } equalSign = uprv_strchr(pos, '='); @@ -618,13 +642,13 @@ ulocimp_getKeywords(const char *localeID, /* lack of '=' [foo@currency] is illegal */ /* ';' before '=' [foo@currency;collation=pinyin] is illegal */ if(!equalSign || (semicolon && semicolon= ULOC_KEYWORD_BUFFER_LEN) { /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + status = U_INTERNAL_PROGRAM_ERROR; return; } for(i = 0, n = 0; i < equalSign - pos; ++i) { @@ -635,7 +659,7 @@ ulocimp_getKeywords(const char *localeID, /* zero-length keyword is an error. */ if (n == 0) { - *status = U_INVALID_FORMAT_ERROR; + status = U_INVALID_FORMAT_ERROR; return; } @@ -650,7 +674,7 @@ ulocimp_getKeywords(const char *localeID, /* Premature end or zero-length value */ if (!*equalSign || equalSign == semicolon) { - *status = U_INVALID_FORMAT_ERROR; + status = U_INVALID_FORMAT_ERROR; return; } @@ -685,7 +709,7 @@ ulocimp_getKeywords(const char *localeID, /* now we have a list of keywords */ /* we need to sort it */ - uprv_sortArray(keywordList, numKeywords, sizeof(KeywordStruct), compareKeywordStructs, nullptr, false, status); + uprv_sortArray(keywordList, numKeywords, sizeof(KeywordStruct), compareKeywordStructs, nullptr, false, &status); /* Now construct the keyword part */ for(i = 0; i < numKeywords; i++) { @@ -709,137 +733,127 @@ uloc_getKeywordValue(const char* localeID, char* buffer, int32_t bufferCapacity, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - CheckedArrayByteSink sink(buffer, bufferCapacity); - ulocimp_getKeywordValue(localeID, keywordName, sink, status); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return reslen; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(buffer, bufferCapacity, reslen, status); - } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + buffer, bufferCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getKeywordValue(localeID, keywordName, sink, status); + }, + *status); +} - return reslen; +U_EXPORT CharString +ulocimp_getKeywordValue(const char* localeID, + const char* keywordName, + UErrorCode& status) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getKeywordValue(localeID, keywordName, sink, status); + }, + status); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_getKeywordValue(const char* localeID, const char* keywordName, icu::ByteSink& sink, - UErrorCode* status) + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + if (localeID == nullptr || keywordName == nullptr || keywordName[0] == 0) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + const char* startSearchHere = nullptr; const char* nextSeparator = nullptr; - char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - if(status && U_SUCCESS(*status) && localeID) { - CharString tempBuffer; - const char* tmpLocaleID; + CharString tempBuffer; + const char* tmpLocaleID; - if (keywordName == nullptr || keywordName[0] == 0) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } + CharString canonKeywordName = locale_canonKeywordName(keywordName, status); + if (U_FAILURE(status)) { + return; + } + + if (_hasBCP47Extension(localeID)) { + tempBuffer = ulocimp_forLanguageTag(localeID, -1, nullptr, status); + tmpLocaleID = U_SUCCESS(status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; + } else { + tmpLocaleID=localeID; + } - locale_canonKeywordName(keywordNameBuffer, keywordName, status); - if(U_FAILURE(*status)) { + startSearchHere = locale_getKeywordsStart(tmpLocaleID); + if(startSearchHere == nullptr) { + /* no keywords, return at once */ return; - } + } - if (_hasBCP47Extension(localeID)) { - CharStringByteSink sink(&tempBuffer); - ulocimp_forLanguageTag(localeID, -1, sink, nullptr, status); - tmpLocaleID = U_SUCCESS(*status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; - } else { - tmpLocaleID=localeID; - } - - startSearchHere = locale_getKeywordsStart(tmpLocaleID); - if(startSearchHere == nullptr) { - /* no keywords, return at once */ - return; - } - - /* find the first keyword */ - while(startSearchHere) { - const char* keyValueTail; - int32_t keyValueLen; - - startSearchHere++; /* skip @ or ; */ - nextSeparator = uprv_strchr(startSearchHere, '='); - if(!nextSeparator) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ - return; - } - /* strip leading & trailing spaces (TC decided to tolerate these) */ - while(*startSearchHere == ' ') { - startSearchHere++; + /* find the first keyword */ + while(startSearchHere) { + const char* keyValueTail; + + startSearchHere++; /* skip @ or ; */ + nextSeparator = uprv_strchr(startSearchHere, '='); + if(!nextSeparator) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ + return; + } + /* strip leading & trailing spaces (TC decided to tolerate these) */ + while(*startSearchHere == ' ') { + startSearchHere++; + } + keyValueTail = nextSeparator; + while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') { + keyValueTail--; + } + /* now keyValueTail points to first char after the keyName */ + /* copy & normalize keyName from locale */ + if (startSearchHere == keyValueTail) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ + return; + } + CharString localeKeywordName; + while (startSearchHere < keyValueTail) { + if (!UPRV_ISALPHANUM(*startSearchHere)) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return; } - keyValueTail = nextSeparator; - while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') { + localeKeywordName.append(uprv_tolower(*startSearchHere++), status); + } + if (U_FAILURE(status)) { + return; + } + + startSearchHere = uprv_strchr(nextSeparator, ';'); + + if (canonKeywordName == localeKeywordName) { + /* current entry matches the keyword. */ + nextSeparator++; /* skip '=' */ + /* First strip leading & trailing spaces (TC decided to tolerate these) */ + while(*nextSeparator == ' ') { + nextSeparator++; + } + keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator); + while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') { keyValueTail--; - } - /* now keyValueTail points to first char after the keyName */ - /* copy & normalize keyName from locale */ - if (startSearchHere == keyValueTail) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ - return; - } - keyValueLen = 0; - while (startSearchHere < keyValueTail) { - if (!UPRV_ISALPHANUM(*startSearchHere)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ - return; } - if (keyValueLen < ULOC_KEYWORD_BUFFER_LEN - 1) { - localeKeywordNameBuffer[keyValueLen++] = uprv_tolower(*startSearchHere++); - } else { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + /* Now copy the value, but check well-formedness */ + if (nextSeparator == keyValueTail) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */ return; } - } - localeKeywordNameBuffer[keyValueLen] = 0; /* terminate */ - - startSearchHere = uprv_strchr(nextSeparator, ';'); - - if(uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer) == 0) { - /* current entry matches the keyword. */ - nextSeparator++; /* skip '=' */ - /* First strip leading & trailing spaces (TC decided to tolerate these) */ - while(*nextSeparator == ' ') { - nextSeparator++; - } - keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator); - while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') { - keyValueTail--; - } - /* Now copy the value, but check well-formedness */ - if (nextSeparator == keyValueTail) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */ + while (nextSeparator < keyValueTail) { + if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ return; } - while (nextSeparator < keyValueTail) { - if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ - return; - } - /* Should we lowercase value to return here? Tests expect as-is. */ - sink.Append(nextSeparator++, 1); - } - return; - } - } + /* Should we lowercase value to return here? Tests expect as-is. */ + sink.Append(nextSeparator++, 1); + } + return; + } } } @@ -849,100 +863,136 @@ uloc_setKeywordValue(const char* keywordName, char* buffer, int32_t bufferCapacity, UErrorCode* status) { - /* TODO: sorting. removal. */ - int32_t keywordNameLen; - int32_t keywordValueLen; - int32_t bufLen; - int32_t needLen = 0; - char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - char keywordValueBuffer[ULOC_KEYWORDS_CAPACITY+1]; - char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - int32_t rc; - char* nextSeparator = nullptr; - char* nextEqualsign = nullptr; - char* startSearchHere = nullptr; - char* keywordStart = nullptr; - CharString updatedKeysAndValues; - UBool handledInputKeyAndValue = false; - char keyValuePrefix = '@'; + if (U_FAILURE(*status)) { return 0; } - if(U_FAILURE(*status)) { - return -1; - } - if (*status == U_STRING_NOT_TERMINATED_WARNING) { - *status = U_ZERO_ERROR; - } - if (keywordName == nullptr || keywordName[0] == 0 || bufferCapacity <= 1) { + if (bufferCapacity <= 1) { *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - bufLen = (int32_t)uprv_strlen(buffer); + + int32_t bufLen = (int32_t)uprv_strlen(buffer); if(bufferCapacity(locale_getKeywordsStart(buffer)); + int32_t baseLen = keywords == nullptr ? bufLen : keywords - buffer; + // Remove -1 from the capacity so that this function can guarantee NUL termination. + CheckedArrayByteSink sink(keywords == nullptr ? buffer + bufLen : keywords, + bufferCapacity - baseLen - 1); + int32_t reslen = ulocimp_setKeywordValue( + keywords, keywordName, keywordValue, sink, *status); + + if (U_FAILURE(*status)) { + return *status == U_BUFFER_OVERFLOW_ERROR ? reslen + baseLen : 0; + } + + // See the documentation for this function, it's guaranteed to never + // overflow the buffer but instead abort with BUFFER_OVERFLOW_ERROR. + // In this case, nothing has been written to the sink, so it cannot have Overflowed(). + U_ASSERT(!sink.Overflowed()); + U_ASSERT(reslen >= 0); + return u_terminateChars(buffer, bufferCapacity, reslen + baseLen, status); +} + +U_EXPORT void +ulocimp_setKeywordValue(const char* keywordName, + const char* keywordValue, + CharString& localeID, + UErrorCode& status) +{ + if (U_FAILURE(status)) { return; } + // This is safe because CharString::truncate() doesn't actually erase any + // data, but simply sets the position for where new data will be written. + const char* keywords = locale_getKeywordsStart(localeID.data()); + if (keywords != nullptr) localeID.truncate(keywords - localeID.data()); + CharStringByteSink sink(&localeID); + ulocimp_setKeywordValue(keywords, keywordName, keywordValue, sink, status); +} + +U_EXPORT int32_t +ulocimp_setKeywordValue(const char* keywords, + const char* keywordName, + const char* keywordValue, + ByteSink& sink, + UErrorCode& status) +{ + if (U_FAILURE(status)) { return 0; } + + /* TODO: sorting. removal. */ + int32_t needLen = 0; + int32_t rc; + const char* nextSeparator = nullptr; + const char* nextEqualsign = nullptr; + const char* keywordStart = nullptr; + CharString updatedKeysAndValues; + bool handledInputKeyAndValue = false; + char keyValuePrefix = '@'; + + if (status == U_STRING_NOT_TERMINATED_WARNING) { + status = U_ZERO_ERROR; + } + if (keywordName == nullptr || keywordName[0] == 0) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + CharString canonKeywordName = locale_canonKeywordName(keywordName, status); + if (U_FAILURE(status)) { return 0; } - keywordValueLen = 0; + CharString canonKeywordValue; if(keywordValue) { while (*keywordValue != 0) { if (!UPRV_ISALPHANUM(*keywordValue) && !UPRV_OK_VALUE_PUNCTUATION(*keywordValue)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ - return 0; - } - if (keywordValueLen < ULOC_KEYWORDS_CAPACITY) { - /* Should we force lowercase in value to set? */ - keywordValueBuffer[keywordValueLen++] = *keywordValue++; - } else { - /* keywordValue too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ return 0; } + /* Should we force lowercase in value to set? */ + canonKeywordValue.append(*keywordValue++, status); } } - keywordValueBuffer[keywordValueLen] = 0; /* terminate */ + if (U_FAILURE(status)) { + return 0; + } - startSearchHere = (char*)locale_getKeywordsStart(buffer); - if(startSearchHere == nullptr || (startSearchHere[1]==0)) { - if(keywordValueLen == 0) { /* no keywords = nothing to remove */ - U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING); - return bufLen; + if (keywords == nullptr || keywords[1] == '\0') { + if (canonKeywordValue.isEmpty()) { /* no keywords = nothing to remove */ + U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); + return 0; } - needLen = bufLen+1+keywordNameLen+1+keywordValueLen; - if(startSearchHere) { /* had a single @ */ - needLen--; /* already had the @ */ - /* startSearchHere points at the @ */ - } else { - startSearchHere=buffer+bufLen; - } - if(needLen >= bufferCapacity) { - *status = U_BUFFER_OVERFLOW_ERROR; + needLen = 1 + canonKeywordName.length() + 1 + canonKeywordValue.length(); + int32_t capacity = 0; + char* buffer = sink.GetAppendBuffer( + needLen, needLen, nullptr, needLen, &capacity); + if (capacity < needLen || buffer == nullptr) { + status = U_BUFFER_OVERFLOW_ERROR; return needLen; /* no change */ } - *startSearchHere++ = '@'; - uprv_strcpy(startSearchHere, keywordNameBuffer); - startSearchHere += keywordNameLen; - *startSearchHere++ = '='; - uprv_strcpy(startSearchHere, keywordValueBuffer); - U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING); + char* it = buffer; + + *it++ = '@'; + uprv_memcpy(it, canonKeywordName.data(), canonKeywordName.length()); + it += canonKeywordName.length(); + *it++ = '='; + uprv_memcpy(it, canonKeywordValue.data(), canonKeywordValue.length()); + sink.Append(buffer, needLen); + U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); return needLen; } /* end shortcut - no @ */ - keywordStart = startSearchHere; + keywordStart = keywords; /* search for keyword */ while(keywordStart) { const char* keyValueTail; - int32_t keyValueLen; keywordStart++; /* skip @ or ; */ nextEqualsign = uprv_strchr(keywordStart, '='); if (!nextEqualsign) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ + status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ return 0; } /* strip leading & trailing spaces (TC decided to tolerate these) */ @@ -956,24 +1006,20 @@ uloc_setKeywordValue(const char* keywordName, /* now keyValueTail points to first char after the keyName */ /* copy & normalize keyName from locale */ if (keywordStart == keyValueTail) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ return 0; } - keyValueLen = 0; + CharString localeKeywordName; while (keywordStart < keyValueTail) { if (!UPRV_ISALPHANUM(*keywordStart)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ - return 0; - } - if (keyValueLen < ULOC_KEYWORD_BUFFER_LEN - 1) { - localeKeywordNameBuffer[keyValueLen++] = uprv_tolower(*keywordStart++); - } else { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ return 0; } + localeKeywordName.append(uprv_tolower(*keywordStart++), status); + } + if (U_FAILURE(status)) { + return 0; } - localeKeywordNameBuffer[keyValueLen] = 0; /* terminate */ nextSeparator = uprv_strchr(nextEqualsign, ';'); @@ -988,46 +1034,46 @@ uloc_setKeywordValue(const char* keywordName, keyValueTail--; } if (nextEqualsign == keyValueTail) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value in passed-in locale */ + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value in passed-in locale */ return 0; } - rc = uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer); + rc = uprv_strcmp(canonKeywordName.data(), localeKeywordName.data()); if(rc == 0) { /* Current entry matches the input keyword. Update the entry */ - if(keywordValueLen > 0) { /* updating a value */ - updatedKeysAndValues.append(keyValuePrefix, *status); + if (!canonKeywordValue.isEmpty()) { /* updating a value */ + updatedKeysAndValues.append(keyValuePrefix, status); keyValuePrefix = ';'; /* for any subsequent key-value pair */ - updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); - updatedKeysAndValues.append('=', *status); - updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + updatedKeysAndValues.append(canonKeywordName, status); + updatedKeysAndValues.append('=', status); + updatedKeysAndValues.append(canonKeywordValue, status); } /* else removing this entry, don't emit anything */ handledInputKeyAndValue = true; } else { /* input keyword sorts earlier than current entry, add before current entry */ - if (rc < 0 && keywordValueLen > 0 && !handledInputKeyAndValue) { + if (rc < 0 && !canonKeywordValue.isEmpty() && !handledInputKeyAndValue) { /* insert new entry at this location */ - updatedKeysAndValues.append(keyValuePrefix, *status); + updatedKeysAndValues.append(keyValuePrefix, status); keyValuePrefix = ';'; /* for any subsequent key-value pair */ - updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); - updatedKeysAndValues.append('=', *status); - updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + updatedKeysAndValues.append(canonKeywordName, status); + updatedKeysAndValues.append('=', status); + updatedKeysAndValues.append(canonKeywordValue, status); handledInputKeyAndValue = true; } /* copy the current entry */ - updatedKeysAndValues.append(keyValuePrefix, *status); + updatedKeysAndValues.append(keyValuePrefix, status); keyValuePrefix = ';'; /* for any subsequent key-value pair */ - updatedKeysAndValues.append(localeKeywordNameBuffer, keyValueLen, *status); - updatedKeysAndValues.append('=', *status); - updatedKeysAndValues.append(nextEqualsign, static_cast(keyValueTail-nextEqualsign), *status); + updatedKeysAndValues.append(localeKeywordName, status); + updatedKeysAndValues.append('=', status); + updatedKeysAndValues.append(nextEqualsign, static_cast(keyValueTail-nextEqualsign), status); } - if (!nextSeparator && keywordValueLen > 0 && !handledInputKeyAndValue) { + if (!nextSeparator && !canonKeywordValue.isEmpty() && !handledInputKeyAndValue) { /* append new entry at the end, it sorts later than existing entries */ - updatedKeysAndValues.append(keyValuePrefix, *status); + updatedKeysAndValues.append(keyValuePrefix, status); /* skip keyValuePrefix update, no subsequent key-value pair */ - updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); - updatedKeysAndValues.append('=', *status); - updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + updatedKeysAndValues.append(canonKeywordName, status); + updatedKeysAndValues.append('=', status); + updatedKeysAndValues.append(canonKeywordValue, status); handledInputKeyAndValue = true; } keywordStart = nextSeparator; @@ -1041,44 +1087,57 @@ uloc_setKeywordValue(const char* keywordName, * error return but the passed-in locale is unmodified and the original bufLen is * returned. */ - if (!handledInputKeyAndValue || U_FAILURE(*status)) { + if (!handledInputKeyAndValue || U_FAILURE(status)) { /* if input key/value specified removal of a keyword not present in locale, or * there was an error in CharString.append, leave original locale alone. */ - U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING); - return bufLen; + U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); + return (int32_t)uprv_strlen(keywords); } - // needLen = length of the part before '@' - needLen = (int32_t)(startSearchHere - buffer); - // Check to see can we fit the startSearchHere, if not, return + needLen = updatedKeysAndValues.length(); + // Check to see can we fit the updatedKeysAndValues, if not, return // U_BUFFER_OVERFLOW_ERROR without copy updatedKeysAndValues into it. // We do this because this API function does not behave like most others: // It promises never to set a U_STRING_NOT_TERMINATED_WARNING. // When the contents fits but without the terminating NUL, in this case we need to not change // the buffer contents and return with a buffer overflow error. - int32_t appendLength = updatedKeysAndValues.length(); - if (appendLength >= bufferCapacity - needLen) { - *status = U_BUFFER_OVERFLOW_ERROR; - return needLen + appendLength; - } - needLen += updatedKeysAndValues.extract( - startSearchHere, bufferCapacity - needLen, *status); - U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING); + if (needLen > 0) { + int32_t capacity = 0; + char* buffer = sink.GetAppendBuffer( + needLen, needLen, nullptr, needLen, &capacity); + if (capacity < needLen || buffer == nullptr) { + status = U_BUFFER_OVERFLOW_ERROR; + return needLen; + } + uprv_memcpy(buffer, updatedKeysAndValues.data(), needLen); + sink.Append(buffer, needLen); + } + U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); return needLen; } /* ### ID parsing implementation **************************************************/ -#define _isPrefixLetter(a) ((a=='x')||(a=='X')||(a=='i')||(a=='I')) +namespace { + +inline bool _isPrefixLetter(char a) { return a == 'x' || a == 'X' || a == 'i' || a == 'I'; } /*returns true if one of the special prefixes is here (s=string) 'x-' or 'i-' */ -#define _isIDPrefix(s) (_isPrefixLetter(s[0])&&_isIDSeparator(s[1])) +inline bool _isIDPrefix(const char *s) { return _isPrefixLetter(s[0]) && _isIDSeparator(s[1]); } /* Dot terminates it because of POSIX form where dot precedes the codepage * except for variant */ -#define _isTerminator(a) ((a==0)||(a=='.')||(a=='@')) +inline bool _isTerminator(char a) { return a == 0 || a == '.' || a == '@'; } + +inline bool _isBCP47Extension(const char* p) { + return p[0] == '-' && + (p[1] == 't' || p[1] == 'T' || + p[1] == 'u' || p[1] == 'U' || + p[1] == 'x' || p[1] == 'X') && + p[2] == '-'; +} /** * Lookup 'key' in the array 'list'. The array 'list' should contain @@ -1087,7 +1146,7 @@ uloc_setKeywordValue(const char* keywordName, * The 'list' param should be LANGUAGES, LANGUAGES_3, COUNTRIES, or * COUNTRIES_3. */ -static int16_t _findIndex(const char* const* list, const char* key) +std::optional _findIndex(const char* const* list, const char* key) { const char* const* anchor = list; int32_t pass = 0; @@ -1102,38 +1161,40 @@ static int16_t _findIndex(const char* const* list, const char* key) } ++list; /* skip final nullptr *CWB*/ } - return -1; + return std::nullopt; } +} // namespace + U_CFUNC const char* uloc_getCurrentCountryID(const char* oldID){ - int32_t offset = _findIndex(DEPRECATED_COUNTRIES, oldID); - if (offset >= 0) { - return REPLACEMENT_COUNTRIES[offset]; - } - return oldID; + std::optional offset = _findIndex(DEPRECATED_COUNTRIES, oldID); + return offset.has_value() ? REPLACEMENT_COUNTRIES[*offset] : oldID; } U_CFUNC const char* uloc_getCurrentLanguageID(const char* oldID){ - int32_t offset = _findIndex(DEPRECATED_LANGUAGES, oldID); - if (offset >= 0) { - return REPLACEMENT_LANGUAGES[offset]; - } - return oldID; + std::optional offset = _findIndex(DEPRECATED_LANGUAGES, oldID); + return offset.has_value() ? REPLACEMENT_LANGUAGES[*offset] : oldID; } + +namespace { + /* - * the internal functions _getLanguage(), _getCountry(), _getVariant() + * the internal functions _getLanguage(), _getScript(), _getRegion(), _getVariant() * avoid duplicating code to handle the earlier locale ID pieces * in the functions for the later ones by * setting the *pEnd pointer to where they stopped parsing * * TODO try to use this in Locale */ -CharString U_EXPORT2 -ulocimp_getLanguage(const char *localeID, - const char **pEnd, - UErrorCode &status) { - CharString result; + +void +_getLanguage(const char* localeID, + ByteSink* sink, + const char** pEnd, + UErrorCode& status) { + U_ASSERT(pEnd != nullptr); + *pEnd = localeID; if (uprv_stricmp(localeID, "root") == 0) { localeID += 4; @@ -1145,150 +1206,381 @@ ulocimp_getLanguage(const char *localeID, localeID += 3; } + constexpr int32_t MAXLEN = ULOC_LANG_CAPACITY - 1; // Minus NUL. + /* if it starts with i- or x- then copy that prefix */ - if(_isIDPrefix(localeID)) { - result.append((char)uprv_tolower(*localeID), status); - result.append('-', status); - localeID+=2; + int32_t len = _isIDPrefix(localeID) ? 2 : 0; + while (!_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) { + if (len == MAXLEN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + len++; } - /* copy the language as far as possible and count its length */ - while(!_isTerminator(*localeID) && !_isIDSeparator(*localeID)) { - result.append((char)uprv_tolower(*localeID), status); - localeID++; + *pEnd = localeID + len; + if (sink == nullptr || len == 0) { return; } + + int32_t minCapacity = uprv_max(len, 4); // Minimum 3 letters plus NUL. + char scratch[MAXLEN]; + int32_t capacity = 0; + char* buffer = sink->GetAppendBuffer( + minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity); + + for (int32_t i = 0; i < len; ++i) { + buffer[i] = uprv_tolower(localeID[i]); + } + if (_isIDSeparator(localeID[1])) { + buffer[1] = '-'; } - if(result.length()==3) { + if (len == 3) { /* convert 3 character code to 2 character code if possible *CWB*/ - int32_t offset = _findIndex(LANGUAGES_3, result.data()); - if(offset>=0) { - result.clear(); - result.append(LANGUAGES[offset], status); + U_ASSERT(capacity >= 4); + buffer[3] = '\0'; + std::optional offset = _findIndex(LANGUAGES_3, buffer); + if (offset.has_value()) { + const char* const alias = LANGUAGES[*offset]; + sink->Append(alias, (int32_t)uprv_strlen(alias)); + return; } } - if(pEnd!=nullptr) { - *pEnd=localeID; - } - - return result; + sink->Append(buffer, len); } -CharString U_EXPORT2 -ulocimp_getScript(const char *localeID, - const char **pEnd, - UErrorCode &status) { - CharString result; - int32_t idLen = 0; +void +_getScript(const char* localeID, + ByteSink* sink, + const char** pEnd) { + U_ASSERT(pEnd != nullptr); + *pEnd = localeID; - if (pEnd != nullptr) { - *pEnd = localeID; - } + constexpr int32_t LENGTH = 4; - /* copy the second item as far as possible and count its length */ - while(!_isTerminator(localeID[idLen]) && !_isIDSeparator(localeID[idLen]) - && uprv_isASCIILetter(localeID[idLen])) { - idLen++; + int32_t len = 0; + while (!_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len]) && + uprv_isASCIILetter(localeID[len])) { + if (len == LENGTH) { return; } + len++; } + if (len != LENGTH) { return; } - /* If it's exactly 4 characters long, then it's a script and not a country. */ - if (idLen == 4) { - int32_t i; - if (pEnd != nullptr) { - *pEnd = localeID+idLen; - } - if (idLen >= 1) { - result.append((char)uprv_toupper(*(localeID++)), status); - } - for (i = 1; i < idLen; i++) { - result.append((char)uprv_tolower(*(localeID++)), status); - } + *pEnd = localeID + LENGTH; + if (sink == nullptr) { return; } + + char scratch[LENGTH]; + int32_t capacity = 0; + char* buffer = sink->GetAppendBuffer( + LENGTH, LENGTH, scratch, UPRV_LENGTHOF(scratch), &capacity); + + buffer[0] = uprv_toupper(localeID[0]); + for (int32_t i = 1; i < LENGTH; ++i) { + buffer[i] = uprv_tolower(localeID[i]); } - return result; + sink->Append(buffer, LENGTH); } -CharString U_EXPORT2 -ulocimp_getCountry(const char *localeID, - const char **pEnd, - UErrorCode &status) { - CharString result; - int32_t idLen=0; +void +_getRegion(const char* localeID, + ByteSink* sink, + const char** pEnd) { + U_ASSERT(pEnd != nullptr); + *pEnd = localeID; - /* copy the country as far as possible and count its length */ - while(!_isTerminator(localeID[idLen]) && !_isIDSeparator(localeID[idLen])) { - result.append((char)uprv_toupper(localeID[idLen]), status); - idLen++; + constexpr int32_t MINLEN = 2; + constexpr int32_t MAXLEN = ULOC_COUNTRY_CAPACITY - 1; // Minus NUL. + + int32_t len = 0; + while (!_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) { + if (len == MAXLEN) { return; } + len++; } + if (len < MINLEN) { return; } - /* the country should be either length 2 or 3 */ - if (idLen == 2 || idLen == 3) { - /* convert 3 character code to 2 character code if possible *CWB*/ - if(idLen==3) { - int32_t offset = _findIndex(COUNTRIES_3, result.data()); - if(offset>=0) { - result.clear(); - result.append(COUNTRIES[offset], status); - } - } - localeID+=idLen; - } else { - result.clear(); + *pEnd = localeID + len; + if (sink == nullptr) { return; } + + char scratch[ULOC_COUNTRY_CAPACITY]; + int32_t capacity = 0; + char* buffer = sink->GetAppendBuffer( + ULOC_COUNTRY_CAPACITY, + ULOC_COUNTRY_CAPACITY, + scratch, + UPRV_LENGTHOF(scratch), + &capacity); + + for (int32_t i = 0; i < len; ++i) { + buffer[i] = uprv_toupper(localeID[i]); } - if(pEnd!=nullptr) { - *pEnd=localeID; + if (len == 3) { + /* convert 3 character code to 2 character code if possible *CWB*/ + U_ASSERT(capacity >= 4); + buffer[3] = '\0'; + std::optional offset = _findIndex(COUNTRIES_3, buffer); + if (offset.has_value()) { + const char* const alias = COUNTRIES[*offset]; + sink->Append(alias, (int32_t)uprv_strlen(alias)); + return; + } } - return result; + sink->Append(buffer, len); } /** * @param needSeparator if true, then add leading '_' if any variants * are added to 'variant' */ -static void -_getVariant(const char *localeID, +void +_getVariant(const char* localeID, char prev, - ByteSink& sink, - UBool needSeparator) { - UBool hasVariant = false; + ByteSink* sink, + const char** pEnd, + bool needSeparator, + UErrorCode& status) { + if (U_FAILURE(status)) return; + if (pEnd != nullptr) { *pEnd = localeID; } + + // Reasonable upper limit for variants + // There are no strict limitation of the syntax of variant in the legacy + // locale format. If the locale is constructed from unicode_locale_id + // as defined in UTS35, then we know each unicode_variant_subtag + // could have max length of 8 ((alphanum{5,8} | digit alphanum{3}) + // 179 would allow 20 unicode_variant_subtag with sep in the + // unicode_locale_id + // 8*20 + 1*(20-1) = 179 + constexpr int32_t MAX_VARIANTS_LENGTH = 179; /* get one or more variant tags and separate them with '_' */ - if(_isIDSeparator(prev)) { + int32_t index = 0; + if (_isIDSeparator(prev)) { /* get a variant string after a '-' or '_' */ - while(!_isTerminator(*localeID)) { + for (index=0; !_isTerminator(localeID[index]); index++) { + if (index >= MAX_VARIANTS_LENGTH) { // same as length > MAX_VARIANTS_LENGTH + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } if (needSeparator) { - sink.Append("_", 1); + if (sink != nullptr) { + sink->Append("_", 1); + } needSeparator = false; } - char c = (char)uprv_toupper(*localeID); - if (c == '-') c = '_'; - sink.Append(&c, 1); - hasVariant = true; - localeID++; + if (sink != nullptr) { + char c = (char)uprv_toupper(localeID[index]); + if (c == '-') c = '_'; + sink->Append(&c, 1); + } } + if (pEnd != nullptr) { *pEnd = localeID+index; } } /* if there is no variant tag after a '-' or '_' then look for '@' */ - if(!hasVariant) { - if(prev=='@') { + if (index == 0) { + if (prev=='@') { /* keep localeID */ } else if((localeID=locale_getKeywordsStart(localeID))!=nullptr) { ++localeID; /* point after the '@' */ } else { return; } - while(!_isTerminator(*localeID)) { + for(; !_isTerminator(localeID[index]); index++) { + if (index >= MAX_VARIANTS_LENGTH) { // same as length > MAX_VARIANTS_LENGTH + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } if (needSeparator) { - sink.Append("_", 1); + if (sink != nullptr) { + sink->Append("_", 1); + } needSeparator = false; } - char c = (char)uprv_toupper(*localeID); - if (c == '-' || c == ',') c = '_'; - sink.Append(&c, 1); + if (sink != nullptr) { + char c = (char)uprv_toupper(localeID[index]); + if (c == '-' || c == ',') c = '_'; + sink->Append(&c, 1); + } + } + if (pEnd != nullptr) { *pEnd = localeID + index; } + } +} + +} // namespace + +U_EXPORT CharString +ulocimp_getLanguage(const char* localeID, UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + &sink, + nullptr, + nullptr, + nullptr, + nullptr, + status); + }, + status); +} + +U_EXPORT CharString +ulocimp_getScript(const char* localeID, UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + &sink, + nullptr, + nullptr, + nullptr, + status); + }, + status); +} + +U_EXPORT CharString +ulocimp_getRegion(const char* localeID, UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + &sink, + nullptr, + nullptr, + status); + }, + status); +} + +U_EXPORT CharString +ulocimp_getVariant(const char* localeID, UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + nullptr, + &sink, + nullptr, + status); + }, + status); +} + +U_EXPORT void +ulocimp_getSubtags( + const char* localeID, + CharString* language, + CharString* script, + CharString* region, + CharString* variant, + const char** pEnd, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + std::optional languageSink; + std::optional scriptSink; + std::optional regionSink; + std::optional variantSink; + + if (language != nullptr) { languageSink.emplace(language); } + if (script != nullptr) { scriptSink.emplace(script); } + if (region != nullptr) { regionSink.emplace(region); } + if (variant != nullptr) { variantSink.emplace(variant); } + + ulocimp_getSubtags( + localeID, + languageSink.has_value() ? &*languageSink : nullptr, + scriptSink.has_value() ? &*scriptSink : nullptr, + regionSink.has_value() ? &*regionSink : nullptr, + variantSink.has_value() ? &*variantSink : nullptr, + pEnd, + status); +} + +U_EXPORT void +ulocimp_getSubtags( + const char* localeID, + ByteSink* language, + ByteSink* script, + ByteSink* region, + ByteSink* variant, + const char** pEnd, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + if (pEnd != nullptr) { + *pEnd = localeID; + } else if (language == nullptr && + script == nullptr && + region == nullptr && + variant == nullptr) { + return; + } + + bool hasRegion = false; + + if (localeID == nullptr) { + localeID = uloc_getDefault(); + } + + _getLanguage(localeID, language, &localeID, status); + if (U_FAILURE(status)) { return; } + U_ASSERT(localeID != nullptr); + + if (pEnd != nullptr) { + *pEnd = localeID; + } else if (script == nullptr && + region == nullptr && + variant == nullptr) { + return; + } + + if (_isIDSeparator(*localeID)) { + const char* begin = localeID + 1; + const char* end = nullptr; + _getScript(begin, script, &end); + U_ASSERT(end != nullptr); + if (end != begin) { + localeID = end; + if (pEnd != nullptr) { *pEnd = localeID; } + } + } + + if (region == nullptr && variant == nullptr && pEnd == nullptr) { return; } + + if (_isIDSeparator(*localeID)) { + const char* begin = localeID + 1; + const char* end = nullptr; + _getRegion(begin, region, &end); + U_ASSERT(end != nullptr); + if (end != begin) { + hasRegion = true; + localeID = end; + if (pEnd != nullptr) { *pEnd = localeID; } + } + } + + if (variant == nullptr && pEnd == nullptr) { return; } + + if (_isIDSeparator(*localeID) && !_isBCP47Extension(localeID)) { + /* If there was no country ID, skip a possible extra IDSeparator */ + if (!hasRegion && _isIDSeparator(localeID[1])) { localeID++; } + const char* begin = localeID + 1; + const char* end = nullptr; + _getVariant(begin, *localeID, variant, &end, false, status); + if (U_FAILURE(status)) { return; } + U_ASSERT(end != nullptr); + if (end != begin && pEnd != nullptr) { *pEnd = end; } } } @@ -1359,12 +1651,11 @@ static const UEnumeration gKeywordsEnum = { U_CAPI UEnumeration* U_EXPORT2 uloc_openKeywordList(const char *keywordList, int32_t keywordListSize, UErrorCode* status) { + if (U_FAILURE(*status)) { return nullptr; } + LocalMemory myContext; LocalMemory result; - if (U_FAILURE(*status)) { - return nullptr; - } myContext.adoptInstead(static_cast(uprv_malloc(sizeof(UKeywordsContext)))); result.adoptInstead(static_cast(uprv_malloc(sizeof(UEnumeration)))); if (myContext.isNull() || result.isNull()) { @@ -1388,16 +1679,15 @@ U_CAPI UEnumeration* U_EXPORT2 uloc_openKeywords(const char* localeID, UErrorCode* status) { - CharString tempBuffer; - const char* tmpLocaleID; - if(status==nullptr || U_FAILURE(*status)) { - return 0; + return nullptr; } + CharString tempBuffer; + const char* tmpLocaleID; + if (_hasBCP47Extension(localeID)) { - CharStringByteSink sink(&tempBuffer); - ulocimp_forLanguageTag(localeID, -1, sink, nullptr, status); + tempBuffer = ulocimp_forLanguageTag(localeID, -1, nullptr, *status); tmpLocaleID = U_SUCCESS(*status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; } else { if (localeID==nullptr) { @@ -1406,37 +1696,21 @@ uloc_openKeywords(const char* localeID, tmpLocaleID=localeID; } - /* Skip the language */ - ulocimp_getLanguage(tmpLocaleID, &tmpLocaleID, *status); + ulocimp_getSubtags( + tmpLocaleID, + nullptr, + nullptr, + nullptr, + nullptr, + &tmpLocaleID, + *status); if (U_FAILURE(*status)) { - return 0; - } - - if(_isIDSeparator(*tmpLocaleID)) { - const char *scriptID; - /* Skip the script if available */ - ulocimp_getScript(tmpLocaleID+1, &scriptID, *status); - if (U_FAILURE(*status)) { - return 0; - } - if(scriptID != tmpLocaleID+1) { - /* Found optional script */ - tmpLocaleID = scriptID; - } - /* Skip the Country */ - if (_isIDSeparator(*tmpLocaleID)) { - ulocimp_getCountry(tmpLocaleID+1, &tmpLocaleID, *status); - if (U_FAILURE(*status)) { - return 0; - } - } + return nullptr; } /* keywords are located after '@' */ if((tmpLocaleID = locale_getKeywordsStart(tmpLocaleID)) != nullptr) { - CharString keywords; - CharStringByteSink sink(&keywords); - ulocimp_getKeywords(tmpLocaleID+1, '@', sink, false, status); + CharString keywords = ulocimp_getKeywords(tmpLocaleID + 1, '@', false, *status); if (U_FAILURE(*status)) { return nullptr; } @@ -1450,10 +1724,12 @@ uloc_openKeywords(const char* localeID, #define _ULOC_STRIP_KEYWORDS 0x2 #define _ULOC_CANONICALIZE 0x1 -#define OPTION_SET(options, mask) ((options & mask) != 0) +namespace { -static const char i_default[] = {'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}; -#define I_DEFAULT_LENGTH UPRV_LENGTHOF(i_default) +inline bool OPTION_SET(uint32_t options, uint32_t mask) { return (options & mask) != 0; } + +constexpr char i_default[] = {'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}; +constexpr int32_t I_DEFAULT_LENGTH = UPRV_LENGTHOF(i_default); /** * Canonicalize the given localeID, to level 1 or to level 2, @@ -1462,16 +1738,16 @@ static const char i_default[] = {'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}; * * This is the code underlying uloc_getName and uloc_canonicalize. */ -static void +void _canonicalize(const char* localeID, ByteSink& sink, uint32_t options, - UErrorCode* err) { - if (U_FAILURE(*err)) { + UErrorCode& err) { + if (U_FAILURE(err)) { return; } - int32_t j, fieldCount=0, scriptSize=0, variantSize=0; + int32_t j, fieldCount=0; CharString tempBuffer; // if localeID has a BCP47 extension, tmpLocaleID points to this CharString localeIDWithHyphens; // if localeID has a BPC47 extension and have _, tmpLocaleID points to this const char* origLocaleID; @@ -1484,8 +1760,8 @@ _canonicalize(const char* localeID, // convert all underbars to hyphens, unless the "BCP47 extension" comes at the beginning of the string if (uprv_strchr(localeID, '_') != nullptr && localeID[1] != '-' && localeID[1] != '_') { - localeIDWithHyphens.append(localeID, -1, *err); - if (U_SUCCESS(*err)) { + localeIDWithHyphens.append(localeID, -1, err); + if (U_SUCCESS(err)) { for (char* p = localeIDWithHyphens.data(); *p != '\0'; ++p) { if (*p == '_') { *p = '-'; @@ -1495,9 +1771,8 @@ _canonicalize(const char* localeID, } } - CharStringByteSink tempSink(&tempBuffer); - ulocimp_forLanguageTag(localeIDPtr, -1, tempSink, nullptr, err); - tmpLocaleID = U_SUCCESS(*err) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeIDPtr; + tempBuffer = ulocimp_forLanguageTag(localeIDPtr, -1, nullptr, err); + tmpLocaleID = U_SUCCESS(err) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeIDPtr; } else { if (localeID==nullptr) { localeID=uloc_getDefault(); @@ -1508,76 +1783,70 @@ _canonicalize(const char* localeID, origLocaleID=tmpLocaleID; /* get all pieces, one after another, and separate with '_' */ - CharString tag = ulocimp_getLanguage(tmpLocaleID, &tmpLocaleID, *err); + CharString tag; + CharString script; + CharString country; + CharString variant; + ulocimp_getSubtags( + tmpLocaleID, + &tag, + &script, + &country, + &variant, + &tmpLocaleID, + err); + if (U_FAILURE(err)) { + return; + } if (tag.length() == I_DEFAULT_LENGTH && uprv_strncmp(origLocaleID, i_default, I_DEFAULT_LENGTH) == 0) { tag.clear(); - tag.append(uloc_getDefault(), *err); - } else if(_isIDSeparator(*tmpLocaleID)) { - const char *scriptID; - - ++fieldCount; - tag.append('_', *err); - - CharString script = ulocimp_getScript(tmpLocaleID+1, &scriptID, *err); - tag.append(script, *err); - scriptSize = script.length(); - if(scriptSize > 0) { - /* Found optional script */ - tmpLocaleID = scriptID; + tag.append(uloc_getDefault(), err); + } else { + if (!script.isEmpty()) { ++fieldCount; - if (_isIDSeparator(*tmpLocaleID)) { - /* If there is something else, then we add the _ */ - tag.append('_', *err); - } + tag.append('_', err); + tag.append(script, err); } - - if (_isIDSeparator(*tmpLocaleID)) { - const char *cntryID; - - CharString country = ulocimp_getCountry(tmpLocaleID+1, &cntryID, *err); - tag.append(country, *err); - if (!country.isEmpty()) { - /* Found optional country */ - tmpLocaleID = cntryID; - } - if(_isIDSeparator(*tmpLocaleID)) { - /* If there is something else, then we add the _ if we found country before. */ - if (!_isIDSeparator(*(tmpLocaleID+1))) { - ++fieldCount; - tag.append('_', *err); - } - - variantSize = -tag.length(); - { - CharStringByteSink s(&tag); - _getVariant(tmpLocaleID+1, *tmpLocaleID, s, false); - } - variantSize += tag.length(); - if (variantSize > 0) { - tmpLocaleID += variantSize + 1; /* skip '_' and variant */ - } + if (!country.isEmpty()) { + ++fieldCount; + tag.append('_', err); + tag.append(country, err); + } + if (!variant.isEmpty()) { + ++fieldCount; + if (country.isEmpty()) { + tag.append('_', err); } + tag.append('_', err); + tag.append(variant, err); } } /* Copy POSIX-style charset specifier, if any [mr.utf8] */ if (!OPTION_SET(options, _ULOC_CANONICALIZE) && *tmpLocaleID == '.') { - UBool done = false; - do { - char c = *tmpLocaleID; - switch (c) { - case 0: - case '@': - done = true; - break; - default: - tag.append(c, *err); - ++tmpLocaleID; - break; - } - } while (!done); + tag.append('.', err); + ++tmpLocaleID; + const char *atPos = nullptr; + size_t length; + if((atPos = uprv_strchr(tmpLocaleID, '@')) != nullptr) { + length = atPos - tmpLocaleID; + } else { + length = uprv_strlen(tmpLocaleID); + } + // The longest charset name we found in IANA charset registry + // https://www.iana.org/assignments/character-sets/ is + // "Extended_UNIX_Code_Packed_Format_for_Japanese" in length 45. + // we therefore restrict the length here to be 64 which is a power of 2 + // number that is longer than 45. + constexpr size_t kMaxCharsetLength = 64; + if (length > kMaxCharsetLength) { + err = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return; + } + tag.append(tmpLocaleID, static_cast(length), err); + tmpLocaleID += length; } /* Scan ahead to next '@' and determine if it is followed by '=' and/or ';' @@ -1595,7 +1864,7 @@ _canonicalize(const char* localeID, if (c == 0) { break; } - tag.append(c, *err); + tag.append(c, err); ++tmpLocaleID; } } @@ -1604,22 +1873,16 @@ _canonicalize(const char* localeID, /* Handle @FOO variant if @ is present and not followed by = */ if (tmpLocaleID!=nullptr && keywordAssign==nullptr) { /* Add missing '_' if needed */ - if (fieldCount < 2 || (fieldCount < 3 && scriptSize > 0)) { + if (fieldCount < 2 || (fieldCount < 3 && !script.isEmpty())) { do { - tag.append('_', *err); + tag.append('_', err); ++fieldCount; } while(fieldCount<2); } - int32_t posixVariantSize = -tag.length(); - { - CharStringByteSink s(&tag); - _getVariant(tmpLocaleID+1, '@', s, (UBool)(variantSize > 0)); - } - posixVariantSize += tag.length(); - if (posixVariantSize > 0) { - variantSize += posixVariantSize; - } + CharStringByteSink s(&tag); + _getVariant(tmpLocaleID+1, '@', &s, nullptr, !variant.isEmpty(), err); + if (U_FAILURE(err)) { return; } } /* Look up the ID in the canonicalization map */ @@ -1630,7 +1893,7 @@ _canonicalize(const char* localeID, break; /* Don't remap "" if keywords present */ } tag.clear(); - tag.append(CANONICALIZE_MAP[j].canonicalID, *err); + tag.append(CANONICALIZE_MAP[j].canonicalID, err); break; } } @@ -1648,6 +1911,8 @@ _canonicalize(const char* localeID, } } +} // namespace + /* ### ID parsing API **************************************************/ U_CAPI int32_t U_EXPORT2 @@ -1656,39 +1921,35 @@ uloc_getParent(const char* localeID, int32_t parentCapacity, UErrorCode* err) { - if (U_FAILURE(*err)) { - return 0; - } - - CheckedArrayByteSink sink(parent, parentCapacity); - ulocimp_getParent(localeID, sink, err); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return reslen; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(parent, parentCapacity, reslen, err); - } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + parent, parentCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getParent(localeID, sink, status); + }, + *err); +} - return reslen; +U_EXPORT CharString +ulocimp_getParent(const char* localeID, + UErrorCode& err) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getParent(localeID, sink, status); + }, + err); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_getParent(const char* localeID, icu::ByteSink& sink, - UErrorCode* err) + UErrorCode& err) { + if (U_FAILURE(err)) { return; } + const char *lastUnderscore; int32_t i; - if (U_FAILURE(*err)) - return; - if (localeID == nullptr) localeID = uloc_getDefault(); @@ -1715,16 +1976,19 @@ uloc_getLanguage(const char* localeID, UErrorCode* err) { /* uloc_getLanguage will return a 2 character iso-639 code if one exists. *CWB*/ - - if (err==nullptr || U_FAILURE(*err)) { - return 0; - } - - if(localeID==nullptr) { - localeID=uloc_getDefault(); - } - - return ulocimp_getLanguage(localeID, nullptr, *err).extract(language, languageCapacity, *err); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + language, languageCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + &sink, + nullptr, + nullptr, + nullptr, + nullptr, + status); + }, + *err); } U_CAPI int32_t U_EXPORT2 @@ -1733,24 +1997,19 @@ uloc_getScript(const char* localeID, int32_t scriptCapacity, UErrorCode* err) { - if(err==nullptr || U_FAILURE(*err)) { - return 0; - } - - if(localeID==nullptr) { - localeID=uloc_getDefault(); - } - - /* skip the language */ - ulocimp_getLanguage(localeID, &localeID, *err); - if (U_FAILURE(*err)) { - return 0; - } - - if(_isIDSeparator(*localeID)) { - return ulocimp_getScript(localeID+1, nullptr, *err).extract(script, scriptCapacity, *err); - } - return u_terminateChars(script, scriptCapacity, 0, err); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + script, scriptCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + &sink, + nullptr, + nullptr, + nullptr, + status); + }, + *err); } U_CAPI int32_t U_EXPORT2 @@ -1759,36 +2018,19 @@ uloc_getCountry(const char* localeID, int32_t countryCapacity, UErrorCode* err) { - if(err==nullptr || U_FAILURE(*err)) { - return 0; - } - - if(localeID==nullptr) { - localeID=uloc_getDefault(); - } - - /* Skip the language */ - ulocimp_getLanguage(localeID, &localeID, *err); - if (U_FAILURE(*err)) { - return 0; - } - - if(_isIDSeparator(*localeID)) { - const char *scriptID; - /* Skip the script if available */ - ulocimp_getScript(localeID+1, &scriptID, *err); - if (U_FAILURE(*err)) { - return 0; - } - if(scriptID != localeID+1) { - /* Found optional script */ - localeID = scriptID; - } - if(_isIDSeparator(*localeID)) { - return ulocimp_getCountry(localeID+1, nullptr, *err).extract(country, countryCapacity, *err); - } - } - return u_terminateChars(country, countryCapacity, 0, err); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + country, countryCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + &sink, + nullptr, + nullptr, + status); + }, + *err); } U_CAPI int32_t U_EXPORT2 @@ -1797,77 +2039,19 @@ uloc_getVariant(const char* localeID, int32_t variantCapacity, UErrorCode* err) { - CharString tempBuffer; - const char* tmpLocaleID; - int32_t i=0; - - if(err==nullptr || U_FAILURE(*err)) { - return 0; - } - - if (_hasBCP47Extension(localeID)) { - CharStringByteSink sink(&tempBuffer); - ulocimp_forLanguageTag(localeID, -1, sink, nullptr, err); - tmpLocaleID = U_SUCCESS(*err) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; - } else { - if (localeID==nullptr) { - localeID=uloc_getDefault(); - } - tmpLocaleID=localeID; - } - - /* Skip the language */ - ulocimp_getLanguage(tmpLocaleID, &tmpLocaleID, *err); - if (U_FAILURE(*err)) { - return 0; - } - - if(_isIDSeparator(*tmpLocaleID)) { - const char *scriptID; - /* Skip the script if available */ - ulocimp_getScript(tmpLocaleID+1, &scriptID, *err); - if (U_FAILURE(*err)) { - return 0; - } - if(scriptID != tmpLocaleID+1) { - /* Found optional script */ - tmpLocaleID = scriptID; - } - /* Skip the Country */ - if (_isIDSeparator(*tmpLocaleID)) { - const char *cntryID; - ulocimp_getCountry(tmpLocaleID+1, &cntryID, *err); - if (U_FAILURE(*err)) { - return 0; - } - if (cntryID != tmpLocaleID+1) { - /* Found optional country */ - tmpLocaleID = cntryID; - } - if(_isIDSeparator(*tmpLocaleID)) { - /* If there was no country ID, skip a possible extra IDSeparator */ - if (tmpLocaleID != cntryID && _isIDSeparator(tmpLocaleID[1])) { - tmpLocaleID++; - } - - CheckedArrayByteSink sink(variant, variantCapacity); - _getVariant(tmpLocaleID+1, *tmpLocaleID, sink, false); - - i = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return i; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - return i; - } - } - } - } - - return u_terminateChars(variant, variantCapacity, i, err); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + variant, variantCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + nullptr, + &sink, + nullptr, + status); + }, + *err); } U_CAPI int32_t U_EXPORT2 @@ -1876,32 +2060,29 @@ uloc_getName(const char* localeID, int32_t nameCapacity, UErrorCode* err) { - if (U_FAILURE(*err)) { - return 0; - } - - CheckedArrayByteSink sink(name, nameCapacity); - ulocimp_getName(localeID, sink, err); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return reslen; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(name, nameCapacity, reslen, err); - } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + name, nameCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getName(localeID, sink, status); + }, + *err); +} - return reslen; +U_EXPORT CharString +ulocimp_getName(const char* localeID, + UErrorCode& err) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getName(localeID, sink, status); + }, + err); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_getName(const char* localeID, ByteSink& sink, - UErrorCode* err) + UErrorCode& err) { _canonicalize(localeID, sink, 0, err); } @@ -1912,32 +2093,29 @@ uloc_getBaseName(const char* localeID, int32_t nameCapacity, UErrorCode* err) { - if (U_FAILURE(*err)) { - return 0; - } - - CheckedArrayByteSink sink(name, nameCapacity); - ulocimp_getBaseName(localeID, sink, err); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return reslen; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(name, nameCapacity, reslen, err); - } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + name, nameCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getBaseName(localeID, sink, status); + }, + *err); +} - return reslen; +U_EXPORT CharString +ulocimp_getBaseName(const char* localeID, + UErrorCode& err) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getBaseName(localeID, sink, status); + }, + err); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_getBaseName(const char* localeID, ByteSink& sink, - UErrorCode* err) + UErrorCode& err) { _canonicalize(localeID, sink, _ULOC_STRIP_KEYWORDS, err); } @@ -1948,32 +2126,29 @@ uloc_canonicalize(const char* localeID, int32_t nameCapacity, UErrorCode* err) { - if (U_FAILURE(*err)) { - return 0; - } - - CheckedArrayByteSink sink(name, nameCapacity); - ulocimp_canonicalize(localeID, sink, err); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return reslen; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(name, nameCapacity, reslen, err); - } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + name, nameCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_canonicalize(localeID, sink, status); + }, + *err); +} - return reslen; +U_EXPORT CharString +ulocimp_canonicalize(const char* localeID, + UErrorCode& err) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_canonicalize(localeID, sink, status); + }, + err); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_canonicalize(const char* localeID, ByteSink& sink, - UErrorCode* err) + UErrorCode& err) { _canonicalize(localeID, sink, _ULOC_CANONICALIZE, err); } @@ -1981,49 +2156,39 @@ ulocimp_canonicalize(const char* localeID, U_CAPI const char* U_EXPORT2 uloc_getISO3Language(const char* localeID) { - int16_t offset; - char lang[ULOC_LANG_CAPACITY]; UErrorCode err = U_ZERO_ERROR; if (localeID == nullptr) { localeID = uloc_getDefault(); } - uloc_getLanguage(localeID, lang, ULOC_LANG_CAPACITY, &err); + CharString lang = ulocimp_getLanguage(localeID, err); if (U_FAILURE(err)) return ""; - offset = _findIndex(LANGUAGES, lang); - if (offset < 0) - return ""; - return LANGUAGES_3[offset]; + std::optional offset = _findIndex(LANGUAGES, lang.data()); + return offset.has_value() ? LANGUAGES_3[*offset] : ""; } U_CAPI const char* U_EXPORT2 uloc_getISO3Country(const char* localeID) { - int16_t offset; - char cntry[ULOC_LANG_CAPACITY]; UErrorCode err = U_ZERO_ERROR; if (localeID == nullptr) { localeID = uloc_getDefault(); } - uloc_getCountry(localeID, cntry, ULOC_LANG_CAPACITY, &err); + CharString cntry = ulocimp_getRegion(localeID, err); if (U_FAILURE(err)) return ""; - offset = _findIndex(COUNTRIES, cntry); - if (offset < 0) - return ""; - - return COUNTRIES_3[offset]; + std::optional offset = _findIndex(COUNTRIES, cntry.data()); + return offset.has_value() ? COUNTRIES_3[*offset] : ""; } U_CAPI uint32_t U_EXPORT2 uloc_getLCID(const char* localeID) { UErrorCode status = U_ZERO_ERROR; - char langID[ULOC_FULLNAME_CAPACITY]; uint32_t lcid = 0; /* Check for incomplete id. */ @@ -2042,37 +2207,20 @@ uloc_getLCID(const char* localeID) return lcid; } - uloc_getLanguage(localeID, langID, sizeof(langID), &status); - if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { + CharString langID = ulocimp_getLanguage(localeID, status); + if (U_FAILURE(status)) { return 0; } if (uprv_strchr(localeID, '@')) { // uprv_convertToLCID does not support keywords other than collation. // Remove all keywords except collation. - int32_t len; - char tmpLocaleID[ULOC_FULLNAME_CAPACITY]; - - CharString collVal; - { - CharStringByteSink sink(&collVal); - ulocimp_getKeywordValue(localeID, "collation", sink, &status); - } - + CharString collVal = ulocimp_getKeywordValue(localeID, "collation", status); if (U_SUCCESS(status) && !collVal.isEmpty()) { - len = uloc_getBaseName(localeID, tmpLocaleID, - UPRV_LENGTHOF(tmpLocaleID) - 1, &status); - - if (U_SUCCESS(status) && len > 0) { - tmpLocaleID[len] = 0; - - len = uloc_setKeywordValue("collation", collVal.data(), tmpLocaleID, - UPRV_LENGTHOF(tmpLocaleID) - len - 1, &status); - - if (U_SUCCESS(status) && len > 0) { - tmpLocaleID[len] = 0; - return uprv_convertToLCID(langID, tmpLocaleID, &status); - } + CharString tmpLocaleID = ulocimp_getBaseName(localeID, status); + ulocimp_setKeywordValue("collation", collVal.data(), tmpLocaleID, status); + if (U_SUCCESS(status)) { + return uprv_convertToLCID(langID.data(), tmpLocaleID.data(), &status); } } @@ -2080,7 +2228,7 @@ uloc_getLCID(const char* localeID) status = U_ZERO_ERROR; } - return uprv_convertToLCID(langID, localeID, &status); + return uprv_convertToLCID(langID.data(), localeID, &status); } U_CAPI int32_t U_EXPORT2 @@ -2156,7 +2304,9 @@ uloc_toUnicodeLocaleType(const char* keyword, const char* value) return bcpType; } -static UBool +namespace { + +bool isWellFormedLegacyKey(const char* legacyKey) { const char* p = legacyKey; @@ -2169,7 +2319,7 @@ isWellFormedLegacyKey(const char* legacyKey) return true; } -static UBool +bool isWellFormedLegacyType(const char* legacyType) { const char* p = legacyType; @@ -2190,6 +2340,8 @@ isWellFormedLegacyType(const char* legacyType) return (alphaNumLen != 0); } +} // namespace + U_CAPI const char* U_EXPORT2 uloc_toLegacyKey(const char* keyword) { diff --git a/deps/icu-small/source/common/uloc_keytype.cpp b/deps/icu-small/source/common/uloc_keytype.cpp index a84b8609079a3d..38694d4a185d81 100644 --- a/deps/icu-small/source/common/uloc_keytype.cpp +++ b/deps/icu-small/source/common/uloc_keytype.cpp @@ -74,8 +74,9 @@ uloc_key_type_cleanup() { U_CDECL_END +namespace { -static void U_CALLCONV +void U_CALLCONV initFromResourceBundle(UErrorCode& sts) { U_NAMESPACE_USE ucln_common_registerCleanup(UCLN_COMMON_LOCALE_KEY_TYPE, uloc_key_type_cleanup); @@ -141,7 +142,7 @@ initFromResourceBundle(UErrorCode& sts) { bcpKeyId = bcpKeyIdBuf->data(); } - UBool isTZ = uprv_strcmp(legacyKeyId, "timezone") == 0; + bool isTZ = uprv_strcmp(legacyKeyId, "timezone") == 0; UHashtable* typeDataMap = uhash_open(uhash_hashIChars, uhash_compareIChars, nullptr, &sts); if (U_FAILURE(sts)) { @@ -351,7 +352,7 @@ initFromResourceBundle(UErrorCode& sts) { } } -static UBool +bool init() { UErrorCode sts = U_ZERO_ERROR; umtx_initOnce(gLocExtKeyMapInitOnce, &initFromResourceBundle, sts); @@ -361,7 +362,7 @@ init() { return true; } -static UBool +bool isSpecialTypeCodepoints(const char* val) { int32_t subtagLen = 0; const char* p = val; @@ -383,7 +384,7 @@ isSpecialTypeCodepoints(const char* val) { return (subtagLen >= 4 && subtagLen <= 6); } -static UBool +bool isSpecialTypeReorderCode(const char* val) { int32_t subtagLen = 0; const char* p = val; @@ -403,7 +404,7 @@ isSpecialTypeReorderCode(const char* val) { return (subtagLen >=3 && subtagLen <=8); } -static UBool +bool isSpecialTypeRgKeyValue(const char* val) { int32_t subtagLen = 0; const char* p = val; @@ -419,7 +420,9 @@ isSpecialTypeRgKeyValue(const char* val) { return (subtagLen == 6); } -U_CFUNC const char* +} // namespace + +U_EXPORT const char* ulocimp_toBcpKey(const char* key) { if (!init()) { return nullptr; @@ -432,7 +435,7 @@ ulocimp_toBcpKey(const char* key) { return nullptr; } -U_CFUNC const char* +U_EXPORT const char* ulocimp_toLegacyKey(const char* key) { if (!init()) { return nullptr; @@ -445,8 +448,8 @@ ulocimp_toLegacyKey(const char* key) { return nullptr; } -U_CFUNC const char* -ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType) { +U_EXPORT const char* +ulocimp_toBcpType(const char* key, const char* type, bool* isKnownKey, bool* isSpecialType) { if (isKnownKey != nullptr) { *isKnownKey = false; } @@ -468,7 +471,7 @@ ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* i return t->bcpId; } if (keyData->specialTypes != SPECIALTYPE_NONE) { - UBool matched = false; + bool matched = false; if (keyData->specialTypes & SPECIALTYPE_CODEPOINTS) { matched = isSpecialTypeCodepoints(type); } @@ -490,8 +493,8 @@ ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* i } -U_CFUNC const char* -ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType) { +U_EXPORT const char* +ulocimp_toLegacyType(const char* key, const char* type, bool* isKnownKey, bool* isSpecialType) { if (isKnownKey != nullptr) { *isKnownKey = false; } @@ -513,7 +516,7 @@ ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool return t->legacyId; } if (keyData->specialTypes != SPECIALTYPE_NONE) { - UBool matched = false; + bool matched = false; if (keyData->specialTypes & SPECIALTYPE_CODEPOINTS) { matched = isSpecialTypeCodepoints(type); } @@ -533,4 +536,3 @@ ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool } return nullptr; } - diff --git a/deps/icu-small/source/common/uloc_tag.cpp b/deps/icu-small/source/common/uloc_tag.cpp index fe3261c75d939d..f5ab0c36a627a1 100644 --- a/deps/icu-small/source/common/uloc_tag.cpp +++ b/deps/icu-small/source/common/uloc_tag.cpp @@ -7,6 +7,8 @@ ********************************************************************** */ +#include + #include "unicode/bytestream.h" #include "unicode/utypes.h" #include "unicode/ures.h" @@ -14,7 +16,6 @@ #include "unicode/putil.h" #include "unicode/uenum.h" #include "unicode/uloc.h" -#include "ustr_imp.h" #include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" @@ -24,9 +25,10 @@ #include "ulocimp.h" #include "uassert.h" +namespace { /* struct holding a single variant */ -typedef struct VariantListEntry { +typedef struct VariantListEntry : public icu::UMemory { const char *variant; struct VariantListEntry *next; } VariantListEntry; @@ -67,18 +69,18 @@ typedef struct ULanguageTag { #define LOCALE_KEYWORD_SEP ';' #define LOCALE_KEY_TYPE_SEP '=' -#define ISALPHA(c) uprv_isASCIILetter(c) -#define ISNUMERIC(c) ((c)>='0' && (c)<='9') +constexpr auto ISALPHA = uprv_isASCIILetter; +inline bool ISNUMERIC(char c) { return c >= '0' && c <= '9'; } -static const char EMPTY[] = ""; -static const char LANG_UND[] = "und"; -static const char PRIVATEUSE_KEY[] = "x"; -static const char _POSIX[] = "_POSIX"; -static const char POSIX_KEY[] = "va"; -static const char POSIX_VALUE[] = "posix"; -static const char LOCALE_ATTRIBUTE_KEY[] = "attribute"; -static const char PRIVUSE_VARIANT_PREFIX[] = "lvariant"; -static const char LOCALE_TYPE_YES[] = "yes"; +constexpr char EMPTY[] = ""; +constexpr char LANG_UND[] = "und"; +constexpr char PRIVATEUSE_KEY[] = "x"; +constexpr char _POSIX[] = "_POSIX"; +constexpr char POSIX_KEY[] = "va"; +constexpr char POSIX_VALUE[] = "posix"; +constexpr char LOCALE_ATTRIBUTE_KEY[] = "attribute"; +constexpr char PRIVUSE_VARIANT_PREFIX[] = "lvariant"; +constexpr char LOCALE_TYPE_YES[] = "yes"; #define LANG_UND_LEN 3 @@ -102,7 +104,7 @@ static const char LOCALE_TYPE_YES[] = "yes"; values. They may have to be removed for the strict BCP 47 compliance. */ -static const char* const LEGACY[] = { +constexpr const char* LEGACY[] = { /* legacy preferred */ "art-lojban", "jbo", "en-gb-oed", "en-gb-oxendict", @@ -151,7 +153,7 @@ static const char* const LEGACY[] = { a variant tag 'hepburn-heploc' has the preferred subtag, 'alaic97'. */ -static const char* const REDUNDANT[] = { +constexpr const char* REDUNDANT[] = { // redundant preferred "sgn-br", "bzs", "sgn-co", "csn", @@ -193,7 +195,7 @@ static const char* const REDUNDANT[] = { Make sure that 2-letter language subtags come before 3-letter subtags. */ -static const char DEPRECATEDLANGS[][4] = { +constexpr char DEPRECATEDLANGS[][4] = { /* deprecated new */ "in", "id", "iw", "he", @@ -283,7 +285,7 @@ static const char DEPRECATEDLANGS[][4] = { grep -B1 'Preferred' | \ awk -n '/Subtag/ {printf(" \"%s\", ", $2);} /Preferred/ {printf("\"%s\",\n", $2);}' */ -static const char DEPRECATEDREGIONS[][3] = { +constexpr char DEPRECATEDREGIONS[][3] = { /* deprecated new */ "BU", "MM", "DD", "DE", @@ -301,55 +303,57 @@ static const char DEPRECATEDREGIONS[][3] = { * ------------------------------------------------- */ -static ULanguageTag* -ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status); +ULanguageTag* +ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& status); -static void +void ultag_close(ULanguageTag* langtag); -static const char* +const char* ultag_getLanguage(const ULanguageTag* langtag); #if 0 -static const char* +const char* ultag_getJDKLanguage(const ULanguageTag* langtag); #endif -static const char* +const char* ultag_getExtlang(const ULanguageTag* langtag, int32_t idx); -static int32_t +int32_t ultag_getExtlangSize(const ULanguageTag* langtag); -static const char* +const char* ultag_getScript(const ULanguageTag* langtag); -static const char* +const char* ultag_getRegion(const ULanguageTag* langtag); -static const char* +const char* ultag_getVariant(const ULanguageTag* langtag, int32_t idx); -static int32_t +int32_t ultag_getVariantsSize(const ULanguageTag* langtag); -static const char* +const char* ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx); -static const char* +const char* ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx); -static int32_t +int32_t ultag_getExtensionsSize(const ULanguageTag* langtag); -static const char* +const char* ultag_getPrivateUse(const ULanguageTag* langtag); #if 0 -static const char* +const char* ultag_getLegacy(const ULanguageTag* langtag); #endif +} // namespace + U_NAMESPACE_BEGIN /** @@ -373,7 +377,9 @@ U_NAMESPACE_END * ------------------------------------------------- */ -static UBool +namespace { + +bool _isAlphaString(const char* s, int32_t len) { int32_t i; for (i = 0; i < len; i++) { @@ -384,7 +390,7 @@ _isAlphaString(const char* s, int32_t len) { return true; } -static UBool +bool _isNumericString(const char* s, int32_t len) { int32_t i; for (i = 0; i < len; i++) { @@ -395,7 +401,7 @@ _isNumericString(const char* s, int32_t len) { return true; } -static UBool +bool _isAlphaNumericString(const char* s, int32_t len) { int32_t i; for (i = 0; i < len; i++) { @@ -406,7 +412,7 @@ _isAlphaNumericString(const char* s, int32_t len) { return true; } -static UBool +bool _isAlphaNumericStringLimitedLength(const char* s, int32_t len, int32_t min, int32_t max) { if (len < 0) { len = (int32_t)uprv_strlen(s); @@ -417,7 +423,9 @@ _isAlphaNumericStringLimitedLength(const char* s, int32_t len, int32_t min, int3 return false; } -U_CFUNC UBool +} // namespace + +bool ultag_isLanguageSubtag(const char* s, int32_t len) { /* * unicode_language_subtag = alpha{2,3} | alpha{5,8}; @@ -433,7 +441,9 @@ ultag_isLanguageSubtag(const char* s, int32_t len) { return false; } -static UBool +namespace { + +bool _isExtlangSubtag(const char* s, int32_t len) { /* * extlang = 3ALPHA ; selected ISO 639 codes @@ -448,7 +458,9 @@ _isExtlangSubtag(const char* s, int32_t len) { return false; } -U_CFUNC UBool +} // namespace + +bool ultag_isScriptSubtag(const char* s, int32_t len) { /* * script = 4ALPHA ; ISO 15924 code @@ -462,7 +474,7 @@ ultag_isScriptSubtag(const char* s, int32_t len) { return false; } -U_CFUNC UBool +bool ultag_isRegionSubtag(const char* s, int32_t len) { /* * region = 2ALPHA ; ISO 3166-1 code @@ -480,7 +492,9 @@ ultag_isRegionSubtag(const char* s, int32_t len) { return false; } -static UBool +namespace { + +bool _isVariantSubtag(const char* s, int32_t len) { /* * variant = 5*8alphanum ; registered variants @@ -498,8 +512,8 @@ _isVariantSubtag(const char* s, int32_t len) { return false; } -static UBool -_isSepListOf(UBool (*test)(const char*, int32_t), const char* s, int32_t len) { +bool +_isSepListOf(bool (*test)(const char*, int32_t), const char* s, int32_t len) { const char *p = s; const char *pSubtag = nullptr; @@ -527,13 +541,17 @@ _isSepListOf(UBool (*test)(const char*, int32_t), const char* s, int32_t len) { return test(pSubtag, (int32_t)(p - pSubtag)); } -U_CFUNC UBool +} // namespace + +bool ultag_isVariantSubtags(const char* s, int32_t len) { return _isSepListOf(&_isVariantSubtag, s, len); } +namespace { + // This is for the ICU-specific "lvariant" handling. -static UBool +bool _isPrivateuseVariantSubtag(const char* s, int32_t len) { /* * variant = 1*8alphanum ; registered variants @@ -542,7 +560,7 @@ _isPrivateuseVariantSubtag(const char* s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len , 1, 8); } -static UBool +bool _isExtensionSingleton(const char* s, int32_t len) { /* * extension = singleton 1*("-" (2*8alphanum)) @@ -562,7 +580,7 @@ _isExtensionSingleton(const char* s, int32_t len) { return false; } -static UBool +bool _isExtensionSubtag(const char* s, int32_t len) { /* * extension = singleton 1*("-" (2*8alphanum)) @@ -570,12 +588,16 @@ _isExtensionSubtag(const char* s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len, 2, 8); } -U_CFUNC UBool +} // namespace + +bool ultag_isExtensionSubtags(const char* s, int32_t len) { return _isSepListOf(&_isExtensionSubtag, s, len); } -static UBool +namespace { + +bool _isPrivateuseValueSubtag(const char* s, int32_t len) { /* * privateuse = "x" 1*("-" (1*8alphanum)) @@ -583,12 +605,14 @@ _isPrivateuseValueSubtag(const char* s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len, 1, 8); } -U_CFUNC UBool +} // namespace + +bool ultag_isPrivateuseValueSubtags(const char* s, int32_t len) { return _isSepListOf(&_isPrivateuseValueSubtag, s, len); } -U_CFUNC UBool +bool ultag_isUnicodeLocaleAttribute(const char* s, int32_t len) { /* * attribute = alphanum{3,8} ; @@ -596,12 +620,12 @@ ultag_isUnicodeLocaleAttribute(const char* s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len , 3, 8); } -U_CFUNC UBool +bool ultag_isUnicodeLocaleAttributes(const char* s, int32_t len) { return _isSepListOf(&ultag_isUnicodeLocaleAttribute, s, len); } -U_CFUNC UBool +bool ultag_isUnicodeLocaleKey(const char* s, int32_t len) { /* * key = alphanum alpha ; @@ -615,7 +639,7 @@ ultag_isUnicodeLocaleKey(const char* s, int32_t len) { return false; } -U_CFUNC UBool +bool _isUnicodeLocaleTypeSubtag(const char*s, int32_t len) { /* * alphanum{3,8} @@ -623,7 +647,7 @@ _isUnicodeLocaleTypeSubtag(const char*s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len , 3, 8); } -U_CFUNC UBool +bool ultag_isUnicodeLocaleType(const char*s, int32_t len) { /* * type = alphanum{3,8} (sep alphanum{3,8})* ; @@ -631,7 +655,9 @@ ultag_isUnicodeLocaleType(const char*s, int32_t len) { return _isSepListOf(&_isUnicodeLocaleTypeSubtag, s, len); } -static UBool +namespace { + +bool _isTKey(const char* s, int32_t len) { /* @@ -646,7 +672,9 @@ _isTKey(const char* s, int32_t len) return false; } -U_CAPI const char * U_EXPORT2 +} // namespace + +const char* ultag_getTKeyStart(const char *localeID) { const char *result = localeID; const char *sep; @@ -662,7 +690,9 @@ ultag_getTKeyStart(const char *localeID) { return nullptr; } -static UBool +namespace { + +bool _isTValue(const char* s, int32_t len) { /* @@ -671,7 +701,7 @@ _isTValue(const char* s, int32_t len) return _isAlphaNumericStringLimitedLength(s, len , 3, 8); } -static UBool +bool _isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) { const int32_t kStart = 0; // Start, wait for unicode_language_subtag, tkey or end @@ -744,7 +774,7 @@ _isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) return false; } -static UBool +bool _isUnicodeExtensionSubtag(int32_t& state, const char* s, int32_t len) { const int32_t kStart = 0; // Start, wait for a key or attribute or end @@ -783,8 +813,8 @@ _isUnicodeExtensionSubtag(int32_t& state, const char* s, int32_t len) return false; } -static UBool -_isStatefulSepListOf(UBool (*test)(int32_t&, const char*, int32_t), const char* s, int32_t len) +bool +_isStatefulSepListOf(bool (*test)(int32_t&, const char*, int32_t), const char* s, int32_t len) { int32_t state = 0; const char* p; @@ -813,17 +843,20 @@ _isStatefulSepListOf(UBool (*test)(int32_t&, const char*, int32_t), const char* return false; } -U_CFUNC UBool +} // namespace + +bool ultag_isTransformedExtensionSubtags(const char* s, int32_t len) { return _isStatefulSepListOf(&_isTransformedExtensionSubtag, s, len); } -U_CFUNC UBool +bool ultag_isUnicodeExtensionSubtags(const char* s, int32_t len) { return _isStatefulSepListOf(&_isUnicodeExtensionSubtag, s, len); } +namespace { /* * ------------------------------------------------- @@ -833,13 +866,11 @@ ultag_isUnicodeExtensionSubtags(const char* s, int32_t len) { * ------------------------------------------------- */ -static UBool -_addVariantToList(VariantListEntry **first, VariantListEntry *var) { - UBool bAdded = true; - +bool +_addVariantToList(VariantListEntry **first, icu::LocalPointer var) { if (*first == nullptr) { var->next = nullptr; - *first = var; + *first = var.orphan(); } else { VariantListEntry *prev, *cur; int32_t cmp; @@ -849,8 +880,8 @@ _addVariantToList(VariantListEntry **first, VariantListEntry *var) { cur = *first; while (true) { if (cur == nullptr) { - prev->next = var; var->next = nullptr; + prev->next = var.orphan(); break; } @@ -858,20 +889,19 @@ _addVariantToList(VariantListEntry **first, VariantListEntry *var) { cmp = uprv_compareInvCharsAsAscii(var->variant, cur->variant); if (cmp == 0) { /* duplicated variant */ - bAdded = false; - break; + return false; } prev = cur; cur = cur->next; } } - return bAdded; + return true; } -static UBool +bool _addAttributeToList(AttributeListEntry **first, AttributeListEntry *attr) { - UBool bAdded = true; + bool bAdded = true; if (*first == nullptr) { attr->next = nullptr; @@ -912,10 +942,9 @@ _addAttributeToList(AttributeListEntry **first, AttributeListEntry *attr) { return bAdded; } - -static UBool -_addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, UBool localeToBCP) { - UBool bAdded = true; +bool +_addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, bool localeToBCP) { + bool bAdded = true; if (*first == nullptr) { ext->next = nullptr; @@ -990,7 +1019,7 @@ _addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, UBool l return bAdded; } -static void +void _initializeULanguageTag(ULanguageTag* langtag) { int32_t i; @@ -1011,127 +1040,120 @@ _initializeULanguageTag(ULanguageTag* langtag) { langtag->privateuse = EMPTY; } -static void -_appendLanguageToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { - char buf[ULOC_LANG_CAPACITY]; +void +_appendLanguageToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } - len = uloc_getLanguage(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + icu::CharString buf = ulocimp_getLanguage(localeID, tmpStatus); + if (U_FAILURE(tmpStatus)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } - len = 0; } /* Note: returned language code is in lower case letters */ - if (len == 0) { + if (buf.isEmpty()) { sink.Append(LANG_UND, LANG_UND_LEN); - } else if (!ultag_isLanguageSubtag(buf, len)) { + } else if (!ultag_isLanguageSubtag(buf.data(), buf.length())) { /* invalid language code */ if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } sink.Append(LANG_UND, LANG_UND_LEN); } else { /* resolve deprecated */ - for (i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) { + for (int32_t i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) { // 2-letter deprecated subtags are listede before 3-letter // ones in DEPRECATEDLANGS[]. Get out of loop on coming // across the 1st 3-letter subtag, if the input is a 2-letter code. // to avoid continuing to try when there's no match. - if (uprv_strlen(buf) < uprv_strlen(DEPRECATEDLANGS[i])) break; - if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDLANGS[i]) == 0) { - uprv_strcpy(buf, DEPRECATEDLANGS[i + 1]); - len = (int32_t)uprv_strlen(buf); - break; + if (buf.length() < (int32_t)uprv_strlen(DEPRECATEDLANGS[i])) break; + if (uprv_compareInvCharsAsAscii(buf.data(), DEPRECATEDLANGS[i]) == 0) { + const char* const resolved = DEPRECATEDLANGS[i + 1]; + sink.Append(resolved, (int32_t)uprv_strlen(resolved)); + return; } } - sink.Append(buf, len); + sink.Append(buf.data(), buf.length()); } } -static void -_appendScriptToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { - char buf[ULOC_SCRIPT_CAPACITY]; +void +_appendScriptToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len; - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } - len = uloc_getScript(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + icu::CharString buf = ulocimp_getScript(localeID, tmpStatus); + if (U_FAILURE(tmpStatus)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } - if (len > 0) { - if (!ultag_isScriptSubtag(buf, len)) { + if (!buf.isEmpty()) { + if (!ultag_isScriptSubtag(buf.data(), buf.length())) { /* invalid script code */ if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } else { sink.Append("-", 1); - sink.Append(buf, len); + sink.Append(buf.data(), buf.length()); } } } -static void -_appendRegionToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { - char buf[ULOC_COUNTRY_CAPACITY]; +void +_appendRegionToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len; - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } - len = uloc_getCountry(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + icu::CharString buf = ulocimp_getRegion(localeID, tmpStatus); + if (U_FAILURE(tmpStatus)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } - if (len > 0) { - if (!ultag_isRegionSubtag(buf, len)) { + if (!buf.isEmpty()) { + if (!ultag_isRegionSubtag(buf.data(), buf.length())) { /* invalid region code */ if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } else { sink.Append("-", 1); /* resolve deprecated */ - for (int i = 0; i < UPRV_LENGTHOF(DEPRECATEDREGIONS); i += 2) { - if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDREGIONS[i]) == 0) { - uprv_strcpy(buf, DEPRECATEDREGIONS[i + 1]); - len = (int32_t)uprv_strlen(buf); - break; + for (int32_t i = 0; i < UPRV_LENGTHOF(DEPRECATEDREGIONS); i += 2) { + if (uprv_compareInvCharsAsAscii(buf.data(), DEPRECATEDREGIONS[i]) == 0) { + const char* const resolved = DEPRECATEDREGIONS[i + 1]; + sink.Append(resolved, (int32_t)uprv_strlen(resolved)); + return; } } - sink.Append(buf, len); + sink.Append(buf.data(), buf.length()); } } } -static void _sortVariants(VariantListEntry* first) { +void _sortVariants(VariantListEntry* first) { for (VariantListEntry* var1 = first; var1 != nullptr; var1 = var1->next) { for (VariantListEntry* var2 = var1->next; var2 != nullptr; var2 = var2->next) { // Swap var1->variant and var2->variant. @@ -1144,32 +1166,26 @@ static void _sortVariants(VariantListEntry* first) { } } -static void -_appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool *hadPosix, UErrorCode* status) { - char buf[ULOC_FULLNAME_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; - - if (U_FAILURE(*status)) { - return; - } +void +_appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, bool& hadPosix, UErrorCode& status) { + if (U_FAILURE(status)) { return; } - len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); + UErrorCode tmpStatus = U_ZERO_ERROR; + icu::CharString buf = ulocimp_getVariant(localeID, tmpStatus); if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } - if (len > 0) { + if (!buf.isEmpty()) { char *p, *pVar; - UBool bNext = true; - VariantListEntry *var; + bool bNext = true; VariantListEntry *varFirst = nullptr; pVar = nullptr; - p = buf; + p = buf.data(); while (bNext) { if (*p == SEP || *p == LOCALE_SEP || *p == 0) { if (*p == 0) { @@ -1179,42 +1195,40 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st } if (pVar == nullptr) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } /* ignore empty variant */ } else { /* ICU uses upper case letters for variants, but the canonical format is lowercase in BCP47 */ - for (i = 0; *(pVar + i) != 0; i++) { + for (int32_t i = 0; *(pVar + i) != 0; i++) { *(pVar + i) = uprv_tolower(*(pVar + i)); } /* validate */ if (_isVariantSubtag(pVar, -1)) { - if (uprv_strcmp(pVar,POSIX_VALUE) || len != (int32_t)uprv_strlen(POSIX_VALUE)) { + if (uprv_strcmp(pVar,POSIX_VALUE) || buf.length() != (int32_t)uprv_strlen(POSIX_VALUE)) { /* emit the variant to the list */ - var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); - if (var == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + icu::LocalPointer var(new VariantListEntry, status); + if (U_FAILURE(status)) { break; } var->variant = pVar; - if (!_addVariantToList(&varFirst, var)) { + if (!_addVariantToList(&varFirst, std::move(var))) { /* duplicated variant */ - uprv_free(var); if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } } } else { /* Special handling for POSIX variant, need to remember that we had it and then */ /* treat it like an extension later. */ - *hadPosix = true; + hadPosix = true; } } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } else if (_isPrivateuseValueSubtag(pVar, -1)) { /* Handle private use subtags separately */ @@ -1229,7 +1243,7 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st p++; } - if (U_SUCCESS(*status)) { + if (U_SUCCESS(status)) { if (varFirst != nullptr) { int32_t varLen; @@ -1237,7 +1251,7 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st _sortVariants(varFirst); /* write out validated/normalized variants to the target */ - var = varFirst; + VariantListEntry* var = varFirst; while (var != nullptr) { sink.Append("-", 1); varLen = (int32_t)uprv_strlen(var->variant); @@ -1248,30 +1262,28 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st } /* clean up */ - var = varFirst; - while (var != nullptr) { + for (VariantListEntry* var = varFirst; var != nullptr; ) { VariantListEntry *tmpVar = var->next; - uprv_free(var); + delete var; var = tmpVar; } - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } } } -static void -_appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) { - char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY] = { 0 }; - int32_t attrBufLength = 0; +void +_appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, bool hadPosix, UErrorCode& status) { + if (U_FAILURE(status)) { return; } icu::MemoryPool attrPool; icu::MemoryPool extPool; icu::MemoryPool strPool; - icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, status)); - if (U_FAILURE(*status) && !hadPosix) { + icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, &status)); + if (U_FAILURE(status) && !hadPosix) { return; } if (keywordEnum.isValid() || hadPosix) { @@ -1286,28 +1298,24 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st const char *bcpKey=nullptr, *bcpValue=nullptr; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t keylen; - UBool isBcpUExt; + bool isBcpUExt; while (true) { - key = uenum_next(keywordEnum.getAlias(), nullptr, status); + key = uenum_next(keywordEnum.getAlias(), nullptr, &status); if (key == nullptr) { break; } - icu::CharString buf; - { - icu::CharStringByteSink sink(&buf); - ulocimp_getKeywordValue(localeID, key, sink, &tmpStatus); - } + icu::CharString buf = ulocimp_getKeywordValue(localeID, key, tmpStatus); len = buf.length(); if (U_FAILURE(tmpStatus)) { if (tmpStatus == U_MEMORY_ALLOCATION_ERROR) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } /* ignore this keyword */ @@ -1323,51 +1331,40 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st if (len > 0) { int32_t i = 0; while (true) { - attrBufLength = 0; + icu::CharString attrBuf; for (; i < len; i++) { if (buf[i] != '-') { - if (static_cast(attrBufLength) < sizeof(attrBuf)) { - attrBuf[attrBufLength++] = buf[i]; - } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } + attrBuf.append(buf[i], status); } else { i++; break; } } - if (attrBufLength > 0) { - if (static_cast(attrBufLength) < sizeof(attrBuf)) { - attrBuf[attrBufLength] = 0; - } else { - *status = U_STRING_NOT_TERMINATED_WARNING; - } - - } else if (i >= len){ + if (U_FAILURE(status)) { + return; + } + if (attrBuf.isEmpty() && i >= len) { break; } /* create AttributeListEntry */ attr = attrPool.create(); if (attr == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; - break; - } - icu::CharString* attrValue = - strPool.create(attrBuf, attrBufLength, *status); - if (attrValue == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } - if (U_FAILURE(*status)) { + if (icu::CharString* str = + strPool.create(std::move(attrBuf), status)) { + if (U_FAILURE(status)) { break; } + attr->attribute = str->data(); + } else { + status = U_MEMORY_ALLOCATION_ERROR; break; } - attr->attribute = attrValue->data(); if (!_addAttributeToList(&firstAttr, attr)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } } @@ -1380,7 +1377,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st bcpKey = uloc_toUnicodeLocaleKey(key); if (bcpKey == nullptr) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } continue; @@ -1390,7 +1387,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st bcpValue = uloc_toUnicodeLocaleType(key, buf.data()); if (bcpValue == nullptr) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } continue; @@ -1405,11 +1402,11 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st icu::CharString* extBuf = extBufPool.create(buf, tmpStatus); if (extBuf == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } if (U_FAILURE(tmpStatus)) { - *status = tmpStatus; + status = tmpStatus; break; } @@ -1420,7 +1417,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st if (*key == PRIVATEUSE) { if (!ultag_isPrivateuseValueSubtags(buf.data(), len)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } continue; @@ -1428,7 +1425,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st } else { if (!_isExtensionSingleton(key, keylen) || !ultag_isExtensionSubtags(buf.data(), len)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } continue; @@ -1438,11 +1435,11 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st icu::CharString* extBuf = extBufPool.create(buf.data(), len, tmpStatus); if (extBuf == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } if (U_FAILURE(tmpStatus)) { - *status = tmpStatus; + status = tmpStatus; break; } bcpValue = extBuf->data(); @@ -1451,7 +1448,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st /* create ExtensionListEntry */ ext = extPool.create(); if (ext == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } ext->key = bcpKey; @@ -1459,7 +1456,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st if (!_addExtensionToList(&firstExt, ext, true)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } } @@ -1470,7 +1467,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st /* create ExtensionListEntry for POSIX */ ext = extPool.create(); if (ext == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } ext->key = POSIX_KEY; @@ -1481,8 +1478,8 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st } } - if (U_SUCCESS(*status) && (firstExt != nullptr || firstAttr != nullptr)) { - UBool startLDMLExtension = false; + if (U_SUCCESS(status) && (firstExt != nullptr || firstAttr != nullptr)) { + bool startLDMLExtension = false; for (ext = firstExt; ext; ext = ext->next) { if (!startLDMLExtension && uprv_strlen(ext->key) > 1) { /* first LDML u singlton extension */ @@ -1517,11 +1514,13 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st * e.g. "u-ca-gregory-co-trad" -> {calendar = gregorian} {collation = traditional} * Note: char* buf is used for storing keywords */ -static void -_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, icu::MemoryPool& extPool, icu::MemoryPool& kwdBuf, UBool *posixVariant, UErrorCode *status) { +void +_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, icu::MemoryPool& extPool, icu::MemoryPool& kwdBuf, bool& posixVariant, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + const char *pTag; /* beginning of current subtag */ const char *pKwds; /* beginning of key-type pairs */ - UBool variantExists = *posixVariant; + bool variantExists = posixVariant; ExtensionListEntry *kwdFirst = nullptr; /* first LDML keyword */ ExtensionListEntry *kwd, *nextKwd; @@ -1529,7 +1528,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT int32_t len; /* Reset the posixVariant value */ - *posixVariant = false; + posixVariant = false; pTag = ldmlext; pKwds = nullptr; @@ -1538,9 +1537,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT AttributeListEntry *attrFirst = nullptr; /* first attribute */ AttributeListEntry *attr, *nextAttr; - char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; - int32_t attrBufIdx = 0; - + icu::MemoryPool strPool; icu::MemoryPool attrPool; /* Iterate through u extension attributes */ @@ -1556,17 +1553,15 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT /* add this attribute to the list */ attr = attrPool.create(); if (attr == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } - if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) { - uprv_memcpy(&attrBuf[attrBufIdx], pTag, len); - attrBuf[attrBufIdx + len] = 0; - attr->attribute = &attrBuf[attrBufIdx]; - attrBufIdx += (len + 1); + if (icu::CharString* str = strPool.create(pTag, len, status)) { + if (U_FAILURE(status)) { return; } + attr->attribute = str->data(); } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1586,13 +1581,13 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT kwd = extPool.create(); if (kwd == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } icu::CharString* value = kwdBuf.create(); if (value == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1601,12 +1596,12 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT while (attr != nullptr) { nextAttr = attr->next; if (attr != attrFirst) { - value->append('-', *status); + value->append('-', status); } - value->append(attr->attribute, *status); + value->append(attr->attribute, status); attr = nextAttr; } - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } @@ -1614,7 +1609,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT kwd->value = value->data(); if (!_addExtensionToList(&kwdFirst, kwd, false)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } } @@ -1625,14 +1620,14 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT const char *pBcpType = nullptr; /* beginning of u extension type subtag(s) */ int32_t bcpKeyLen = 0; int32_t bcpTypeLen = 0; - UBool isDone = false; + bool isDone = false; pTag = pKwds; /* BCP47 representation of LDML key/type pairs */ while (!isDone) { const char *pNextBcpKey = nullptr; int32_t nextBcpKeyLen = 0; - UBool emitKeyword = false; + bool emitKeyword = false; if (*pTag) { /* locate next separator char */ @@ -1680,7 +1675,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT if (bcpKeyLen >= (int32_t)sizeof(bcpKeyBuf)) { /* the BCP key is invalid */ - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } U_ASSERT(bcpKeyLen <= 2); @@ -1691,7 +1686,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT /* u extension key to LDML key */ pKey = uloc_toLegacyKey(bcpKeyBuf); if (pKey == nullptr) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } if (pKey == bcpKeyBuf) { @@ -1700,50 +1695,44 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT We normalize the result key to lower case. */ T_CString_toLowerCase(bcpKeyBuf); - icu::CharString* key = kwdBuf.create(bcpKeyBuf, bcpKeyLen, *status); + icu::CharString* key = kwdBuf.create(bcpKeyBuf, bcpKeyLen, status); if (key == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } pKey = key->data(); } if (pBcpType) { - char bcpTypeBuf[128]; /* practically long enough even considering multiple subtag type */ - if (bcpTypeLen >= (int32_t)sizeof(bcpTypeBuf)) { - /* the BCP type is too long */ - *status = U_ILLEGAL_ARGUMENT_ERROR; + icu::CharString bcpTypeBuf(pBcpType, bcpTypeLen, status); + if (U_FAILURE(status)) { return; } - uprv_strncpy(bcpTypeBuf, pBcpType, bcpTypeLen); - bcpTypeBuf[bcpTypeLen] = 0; - /* BCP type to locale type */ - pType = uloc_toLegacyType(pKey, bcpTypeBuf); + pType = uloc_toLegacyType(pKey, bcpTypeBuf.data()); if (pType == nullptr) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } - if (pType == bcpTypeBuf) { + if (pType == bcpTypeBuf.data()) { /* The type returned by toLegacyType points to the input buffer. We normalize the result type to lower case. */ /* normalize to lower case */ - T_CString_toLowerCase(bcpTypeBuf); - icu::CharString* type = kwdBuf.create(bcpTypeBuf, bcpTypeLen, *status); - if (type == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; - return; - } - if (U_FAILURE(*status)) { + T_CString_toLowerCase(bcpTypeBuf.data()); + if (icu::CharString* type = + kwdBuf.create(std::move(bcpTypeBuf), status)) { + if (U_FAILURE(status)) { return; } + pType = type->data(); + } else { + status = U_MEMORY_ALLOCATION_ERROR; return; } - pType = type->data(); } } else { /* typeless - default type value is "yes" */ @@ -1753,12 +1742,12 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT /* Special handling for u-va-posix, since we want to treat this as a variant, not as a keyword */ if (!variantExists && !uprv_strcmp(pKey, POSIX_KEY) && !uprv_strcmp(pType, POSIX_VALUE) ) { - *posixVariant = true; + posixVariant = true; } else { /* create an ExtensionListEntry for this keyword */ kwd = extPool.create(); if (kwd == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1787,9 +1776,10 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT } } +void +_appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode& status) { + if (U_FAILURE(status)) { return; } -static void -_appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) { int32_t i, n; int32_t len; ExtensionListEntry *kwdFirst = nullptr; @@ -1797,11 +1787,7 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) const char *key, *type; icu::MemoryPool extPool; icu::MemoryPool kwdBuf; - UBool posixVariant = false; - - if (U_FAILURE(*status)) { - return; - } + bool posixVariant = false; n = ultag_getExtensionsSize(langtag); @@ -1815,37 +1801,37 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) posixVariant = true; } - _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, &posixVariant, status); - if (U_FAILURE(*status)) { + _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, posixVariant, status); + if (U_FAILURE(status)) { break; } } else { kwd = extPool.create(); if (kwd == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } kwd->key = key; kwd->value = type; if (!_addExtensionToList(&kwdFirst, kwd, false)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } } } - if (U_SUCCESS(*status)) { + if (U_SUCCESS(status)) { type = ultag_getPrivateUse(langtag); if ((int32_t)uprv_strlen(type) > 0) { /* add private use as a keyword */ kwd = extPool.create(); if (kwd == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; } else { kwd->key = PRIVATEUSE_KEY; kwd->value = type; if (!_addExtensionToList(&kwdFirst, kwd, false)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } } } @@ -1853,14 +1839,14 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) /* If a POSIX variant was in the extensions, write it out before writing the keywords. */ - if (U_SUCCESS(*status) && posixVariant) { + if (U_SUCCESS(status) && posixVariant) { len = (int32_t) uprv_strlen(_POSIX); sink.Append(_POSIX, len); } - if (U_SUCCESS(*status) && kwdFirst != nullptr) { + if (U_SUCCESS(status) && kwdFirst != nullptr) { /* write out the sorted keywords */ - UBool firstValue = true; + bool firstValue = true; kwd = kwdFirst; do { if (firstValue) { @@ -1884,33 +1870,27 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) } } -static void -_appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) { - (void)hadPosix; - char buf[ULOC_FULLNAME_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; - - if (U_FAILURE(*status)) { - return; - } +void +_appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, bool /*hadPosix*/, UErrorCode& status) { + if (U_FAILURE(status)) { return; } - len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + UErrorCode tmpStatus = U_ZERO_ERROR; + icu::CharString buf = ulocimp_getVariant(localeID, tmpStatus); + if (U_FAILURE(tmpStatus)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } - if (len > 0) { + if (!buf.isEmpty()) { char *p, *pPriv; - UBool bNext = true; - UBool firstValue = true; - UBool writeValue; + bool bNext = true; + bool firstValue = true; + bool writeValue; pPriv = nullptr; - p = buf; + p = buf.data(); while (bNext) { writeValue = false; if (*p == SEP || *p == LOCALE_SEP || *p == 0) { @@ -1921,7 +1901,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool } if (pPriv != nullptr) { /* Private use in the canonical format is lowercase in BCP47 */ - for (i = 0; *(pPriv + i) != 0; i++) { + for (int32_t i = 0; *(pPriv + i) != 0; i++) { *(pPriv + i) = uprv_tolower(*(pPriv + i)); } @@ -1935,7 +1915,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool writeValue = true; } } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } else { break; @@ -1952,7 +1932,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool firstValue = false; } - len = (int32_t)uprv_strlen(pPriv); + int32_t len = (int32_t)uprv_strlen(pPriv); sink.Append(pPriv, len); } } @@ -1994,27 +1974,25 @@ _appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool #pragma optimize( "", off ) #endif -static ULanguageTag* -ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status) { +ULanguageTag* +ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& status) { + if (U_FAILURE(status)) { return nullptr; } + char *tagBuf; int16_t next; char *pSubtag, *pNext, *pLastGoodPosition; int32_t subtagLen; int32_t extlangIdx; - ExtensionListEntry *pExtension; + icu::LocalPointer pExtension; char *pExtValueSubtag, *pExtValueSubtagEnd; int32_t i; - UBool privateuseVar = false; + bool privateuseVar = false; int32_t legacyLen = 0; if (parsedLen != nullptr) { *parsedLen = 0; } - if (U_FAILURE(*status)) { - return nullptr; - } - if (tagLen < 0) { tagLen = (int32_t)uprv_strlen(tag); } @@ -2022,7 +2000,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta /* copy the entire string */ tagBuf = (char*)uprv_malloc(tagLen + 1); if (tagBuf == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } @@ -2036,7 +2014,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag))); if (t.isNull()) { uprv_free(tagBuf); - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } _initializeULanguageTag(t.getAlias()); @@ -2074,7 +2052,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta // the destructor of t when t is out of scope. t->buf = tagBuf = (char*)uprv_malloc(newTagLength + 1); if (tagBuf == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } tagLen = newTagLength; @@ -2133,7 +2111,6 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta next = LANG | PRIV; pNext = pLastGoodPosition = tagBuf; extlangIdx = 0; - pExtension = nullptr; pExtValueSubtag = nullptr; pExtValueSubtagEnd = nullptr; @@ -2219,20 +2196,14 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta if (next & VART) { if (_isVariantSubtag(pSubtag, subtagLen) || (privateuseVar && _isPrivateuseVariantSubtag(pSubtag, subtagLen))) { - VariantListEntry *var; - UBool isAdded; - - var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); - if (var == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + icu::LocalPointer var(new VariantListEntry, status); + if (U_FAILURE(status)) { return nullptr; } *pSep = 0; var->variant = T_CString_toUpperCase(pSubtag); - isAdded = _addVariantToList(&(t->variants), var); - if (!isAdded) { + if (!_addVariantToList(&(t->variants), std::move(var))) { /* duplicated variant entry */ - uprv_free(var); break; } pLastGoodPosition = pSep; @@ -2242,11 +2213,10 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } if (next & EXTS) { if (_isExtensionSingleton(pSubtag, subtagLen)) { - if (pExtension != nullptr) { + if (pExtension.isValid()) { if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) { /* the previous extension is incomplete */ - uprv_free(pExtension); - pExtension = nullptr; + delete pExtension.orphan(); break; } @@ -2255,20 +2225,19 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta pExtension->value = T_CString_toLowerCase(pExtValueSubtag); /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, false)) { + if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) { + pExtension.orphan(); pLastGoodPosition = pExtValueSubtagEnd; } else { /* stop parsing here */ - uprv_free(pExtension); - pExtension = nullptr; + delete pExtension.orphan(); break; } } /* create a new extension */ - pExtension = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (pExtension == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + pExtension.adoptInsteadAndCheckErrorCode(new ExtensionListEntry, status); + if (U_FAILURE(status)) { return nullptr; } *pSep = 0; @@ -2305,12 +2274,11 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta if (uprv_tolower(*pSubtag) == PRIVATEUSE && subtagLen == 1) { char *pPrivuseVal; - if (pExtension != nullptr) { + if (pExtension.isValid()) { /* Process the last extension */ if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) { /* the previous extension is incomplete */ - uprv_free(pExtension); - pExtension = nullptr; + delete pExtension.orphan(); break; } else { /* terminate the previous extension value */ @@ -2318,13 +2286,12 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta pExtension->value = T_CString_toLowerCase(pExtValueSubtag); /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, false)) { + if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) { + pExtension.orphan(); pLastGoodPosition = pExtValueSubtagEnd; - pExtension = nullptr; } else { /* stop parsing here */ - uprv_free(pExtension); - pExtension = nullptr; + delete pExtension.orphan(); break; } } @@ -2386,20 +2353,21 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta break; } - if (pExtension != nullptr) { + if (pExtension.isValid()) { /* Process the last extension */ if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) { /* the previous extension is incomplete */ - uprv_free(pExtension); + delete pExtension.orphan(); } else { /* terminate the previous extension value */ *pExtValueSubtagEnd = 0; pExtension->value = T_CString_toLowerCase(pExtValueSubtag); /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, false)) { + if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) { + pExtension.orphan(); pLastGoodPosition = pExtValueSubtagEnd; } else { - uprv_free(pExtension); + delete pExtension.orphan(); } } } @@ -2416,7 +2384,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta #pragma optimize( "", on ) #endif -static void +void ultag_close(ULanguageTag* langtag) { if (langtag == nullptr) { @@ -2429,7 +2397,7 @@ ultag_close(ULanguageTag* langtag) { VariantListEntry *curVar = langtag->variants; while (curVar) { VariantListEntry *nextVar = curVar->next; - uprv_free(curVar); + delete curVar; curVar = nextVar; } } @@ -2438,7 +2406,7 @@ ultag_close(ULanguageTag* langtag) { ExtensionListEntry *curExt = langtag->extensions; while (curExt) { ExtensionListEntry *nextExt = curExt->next; - uprv_free(curExt); + delete curExt; curExt = nextExt; } } @@ -2446,13 +2414,13 @@ ultag_close(ULanguageTag* langtag) { uprv_free(langtag); } -static const char* +const char* ultag_getLanguage(const ULanguageTag* langtag) { return langtag->language; } #if 0 -static const char* +const char* ultag_getJDKLanguage(const ULanguageTag* langtag) { int32_t i; for (i = 0; DEPRECATEDLANGS[i] != nullptr; i += 2) { @@ -2464,7 +2432,7 @@ ultag_getJDKLanguage(const ULanguageTag* langtag) { } #endif -static const char* +const char* ultag_getExtlang(const ULanguageTag* langtag, int32_t idx) { if (idx >= 0 && idx < MAXEXTLANG) { return langtag->extlang[idx]; @@ -2472,7 +2440,7 @@ ultag_getExtlang(const ULanguageTag* langtag, int32_t idx) { return nullptr; } -static int32_t +int32_t ultag_getExtlangSize(const ULanguageTag* langtag) { int32_t size = 0; int32_t i; @@ -2484,17 +2452,17 @@ ultag_getExtlangSize(const ULanguageTag* langtag) { return size; } -static const char* +const char* ultag_getScript(const ULanguageTag* langtag) { return langtag->script; } -static const char* +const char* ultag_getRegion(const ULanguageTag* langtag) { return langtag->region; } -static const char* +const char* ultag_getVariant(const ULanguageTag* langtag, int32_t idx) { const char *var = nullptr; VariantListEntry *cur = langtag->variants; @@ -2510,7 +2478,7 @@ ultag_getVariant(const ULanguageTag* langtag, int32_t idx) { return var; } -static int32_t +int32_t ultag_getVariantsSize(const ULanguageTag* langtag) { int32_t size = 0; VariantListEntry *cur = langtag->variants; @@ -2524,7 +2492,7 @@ ultag_getVariantsSize(const ULanguageTag* langtag) { return size; } -static const char* +const char* ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) { const char *key = nullptr; ExtensionListEntry *cur = langtag->extensions; @@ -2540,7 +2508,7 @@ ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) { return key; } -static const char* +const char* ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx) { const char *val = nullptr; ExtensionListEntry *cur = langtag->extensions; @@ -2556,7 +2524,7 @@ ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx) { return val; } -static int32_t +int32_t ultag_getExtensionsSize(const ULanguageTag* langtag) { int32_t size = 0; ExtensionListEntry *cur = langtag->extensions; @@ -2570,18 +2538,19 @@ ultag_getExtensionsSize(const ULanguageTag* langtag) { return size; } -static const char* +const char* ultag_getPrivateUse(const ULanguageTag* langtag) { return langtag->privateuse; } #if 0 -static const char* +const char* ultag_getLegacy(const ULanguageTag* langtag) { return langtag->legacy; } #endif +} // namespace /* * ------------------------------------------------- @@ -2596,46 +2565,40 @@ uloc_toLanguageTag(const char* localeID, int32_t langtagCapacity, UBool strict, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - icu::CheckedArrayByteSink sink(langtag, langtagCapacity); - ulocimp_toLanguageTag(localeID, sink, strict, status); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return reslen; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(langtag, langtagCapacity, reslen, status); - } - - return reslen; + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + langtag, langtagCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_toLanguageTag(localeID, sink, strict, status); + }, + *status); } +U_EXPORT icu::CharString +ulocimp_toLanguageTag(const char* localeID, + bool strict, + UErrorCode& status) { + return icu::ByteSinkUtil::viaByteSinkToCharString( + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_toLanguageTag(localeID, sink, strict, status); + }, + status); +} -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_toLanguageTag(const char* localeID, icu::ByteSink& sink, - UBool strict, - UErrorCode* status) { - icu::CharString canonical; + bool strict, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + UErrorCode tmpStatus = U_ZERO_ERROR; - UBool hadPosix = false; + bool hadPosix = false; const char* pKeywordStart; /* Note: uloc_canonicalize returns "en_US_POSIX" for input locale ID "". See #6835 */ - { - icu::CharStringByteSink canonicalSink(&canonical); - ulocimp_canonicalize(localeID, canonicalSink, &tmpStatus); - } + icu::CharString canonical = ulocimp_canonicalize(localeID, tmpStatus); if (U_FAILURE(tmpStatus)) { - *status = tmpStatus; + status = tmpStatus; return; } @@ -2643,7 +2606,7 @@ ulocimp_toLanguageTag(const char* localeID, pKeywordStart = locale_getKeywordsStart(canonical.data()); if (pKeywordStart == canonical.data()) { int kwdCnt = 0; - UBool done = false; + bool done = false; icu::LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus)); if (U_SUCCESS(tmpStatus)) { @@ -2654,11 +2617,7 @@ ulocimp_toLanguageTag(const char* localeID, key = uenum_next(kwdEnum.getAlias(), &len, &tmpStatus); if (len == 1 && *key == PRIVATEUSE) { - icu::CharString buf; - { - icu::CharStringByteSink sink(&buf); - ulocimp_getKeywordValue(localeID, key, sink, &tmpStatus); - } + icu::CharString buf = ulocimp_getKeywordValue(localeID, key, tmpStatus); if (U_SUCCESS(tmpStatus)) { if (ultag_isPrivateuseValueSubtags(buf.data(), buf.length())) { /* return private use only tag */ @@ -2666,12 +2625,12 @@ ulocimp_toLanguageTag(const char* localeID, sink.Append(buf.data(), buf.length()); done = true; } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; done = true; } /* if not strict mode, then "und" will be returned */ } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; done = true; } } @@ -2685,7 +2644,7 @@ ulocimp_toLanguageTag(const char* localeID, _appendLanguageToLanguageTag(canonical.data(), sink, strict, status); _appendScriptToLanguageTag(canonical.data(), sink, strict, status); _appendRegionToLanguageTag(canonical.data(), sink, strict, status); - _appendVariantsToLanguageTag(canonical.data(), sink, strict, &hadPosix, status); + _appendVariantsToLanguageTag(canonical.data(), sink, strict, hadPosix, status); _appendKeywordsToLanguageTag(canonical.data(), sink, strict, hadPosix, status); _appendPrivateuseToLanguageTag(canonical.data(), sink, strict, hadPosix, status); } @@ -2697,43 +2656,42 @@ uloc_forLanguageTag(const char* langtag, int32_t localeIDCapacity, int32_t* parsedLength, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - icu::CheckedArrayByteSink sink(localeID, localeIDCapacity); - ulocimp_forLanguageTag(langtag, -1, sink, parsedLength, status); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return reslen; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(localeID, localeIDCapacity, reslen, status); - } - - return reslen; + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + localeID, localeIDCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_forLanguageTag(langtag, -1, sink, parsedLength, status); + }, + *status); } +U_EXPORT icu::CharString +ulocimp_forLanguageTag(const char* langtag, + int32_t tagLen, + int32_t* parsedLength, + UErrorCode& status) { + return icu::ByteSinkUtil::viaByteSinkToCharString( + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_forLanguageTag(langtag, tagLen, sink, parsedLength, status); + }, + status); +} -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_forLanguageTag(const char* langtag, int32_t tagLen, icu::ByteSink& sink, int32_t* parsedLength, - UErrorCode* status) { - UBool isEmpty = true; + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + bool isEmpty = true; const char *subtag, *p; int32_t len; int32_t i, n; - UBool noRegion = true; + bool noRegion = true; icu::LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status)); - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } diff --git a/deps/icu-small/source/common/ulocale.cpp b/deps/icu-small/source/common/ulocale.cpp index 471ef0ce79a63f..aaa17954a393e0 100644 --- a/deps/icu-small/source/common/ulocale.cpp +++ b/deps/icu-small/source/common/ulocale.cpp @@ -1,6 +1,7 @@ // © 2023 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // +#include "unicode/bytestream.h" #include "unicode/errorcode.h" #include "unicode/stringpiece.h" #include "unicode/utypes.h" @@ -8,9 +9,9 @@ #include "unicode/ulocale.h" #include "unicode/locid.h" +#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" -#include "ustr_imp.h" U_NAMESPACE_USE #define EXTERNAL(i) (reinterpret_cast(i)) @@ -19,15 +20,17 @@ U_NAMESPACE_USE ULocale* ulocale_openForLocaleID(const char* localeID, int32_t length, UErrorCode* err) { + if (U_FAILURE(*err)) { return nullptr; } CharString str(length < 0 ? StringPiece(localeID) : StringPiece(localeID, length), *err); - if (U_FAILURE(*err)) return nullptr; + if (U_FAILURE(*err)) { return nullptr; } return EXTERNAL(icu::Locale::createFromName(str.data()).clone()); } ULocale* ulocale_openForLanguageTag(const char* tag, int32_t length, UErrorCode* err) { + if (U_FAILURE(*err)) { return nullptr; } Locale l = icu::Locale::forLanguageTag(length < 0 ? StringPiece(tag) : StringPiece(tag, length), *err); - if (U_FAILURE(*err)) return nullptr; + if (U_FAILURE(*err)) { return nullptr; } return EXTERNAL(l.clone()); } @@ -53,20 +56,14 @@ int32_t ulocale_get ##N ( \ *err = U_ILLEGAL_ARGUMENT_ERROR; \ return 0; \ } \ - CheckedArrayByteSink sink(valueBuffer, bufferCapacity); \ - CONST_INTERNAL(locale)->get ## N( \ - keywordLength < 0 ? StringPiece(keyword) : StringPiece(keyword, keywordLength), \ - sink, *err); \ - int32_t reslen = sink.NumberOfBytesAppended(); \ - if (U_FAILURE(*err)) { \ - return reslen; \ - } \ - if (sink.Overflowed()) { \ - *err = U_BUFFER_OVERFLOW_ERROR; \ - } else { \ - u_terminateChars(valueBuffer, bufferCapacity, reslen, err); \ - } \ - return reslen; \ + return ByteSinkUtil::viaByteSinkToTerminatedChars( \ + valueBuffer, bufferCapacity, \ + [&](ByteSink& sink, UErrorCode& status) { \ + CONST_INTERNAL(locale)->get ## N( \ + keywordLength < 0 ? StringPiece(keyword) : StringPiece(keyword, keywordLength), \ + sink, status); \ + }, \ + *err); \ } #define IMPL_ULOCALE_GET_KEYWORDS(N) \ diff --git a/deps/icu-small/source/common/ulocbuilder.cpp b/deps/icu-small/source/common/ulocbuilder.cpp index a5af73bef49004..3b466473624f45 100644 --- a/deps/icu-small/source/common/ulocbuilder.cpp +++ b/deps/icu-small/source/common/ulocbuilder.cpp @@ -9,10 +9,10 @@ #include "unicode/stringpiece.h" #include "unicode/umachine.h" #include "unicode/ulocbuilder.h" +#include "bytesinkutil.h" #include "cstring.h" #include "ustr_imp.h" -using icu::CheckedArrayByteSink; using icu::StringPiece; #define EXTERNAL(i) (reinterpret_cast(i)) @@ -112,12 +112,13 @@ ULocale* ulocbld_buildULocale(ULocaleBuilder* builder, UErrorCode* err) { int32_t ulocbld_buildLocaleID(ULocaleBuilder* builder, char* buffer, int32_t bufferCapacity, UErrorCode* err) { + if (U_FAILURE(*err)) { return 0; } if (builder == nullptr) { *err = U_ILLEGAL_ARGUMENT_ERROR; return 0; } icu::Locale l = INTERNAL(builder)->build(*err); - if (U_FAILURE(*err)) return 0; + if (U_FAILURE(*err)) { return 0; } int32_t length = (int32_t)(uprv_strlen(l.getName())); if (0 < length && length <= bufferCapacity) { uprv_memcpy(buffer, l.getName(), length); @@ -127,24 +128,18 @@ int32_t ulocbld_buildLocaleID(ULocaleBuilder* builder, int32_t ulocbld_buildLanguageTag(ULocaleBuilder* builder, char* buffer, int32_t bufferCapacity, UErrorCode* err) { + if (U_FAILURE(*err)) { return 0; } if (builder == nullptr) { *err = U_ILLEGAL_ARGUMENT_ERROR; return 0; } icu::Locale l = INTERNAL(builder)->build(*err); - if (U_FAILURE(*err)) return 0; - CheckedArrayByteSink sink(buffer, bufferCapacity); - l.toLanguageTag(sink, *err); - int32_t reslen = sink.NumberOfBytesAppended(); - if (U_FAILURE(*err)) { - return reslen; - } - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(buffer, bufferCapacity, reslen, err); - } - return reslen; + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + buffer, bufferCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + l.toLanguageTag(sink, status); + }, + *err); } UBool ulocbld_copyErrorTo(const ULocaleBuilder* builder, UErrorCode *outErrorCode) { diff --git a/deps/icu-small/source/common/ulocimp.h b/deps/icu-small/source/common/ulocimp.h index efa0fa72e6a1f0..7fb64062884c69 100644 --- a/deps/icu-small/source/common/ulocimp.h +++ b/deps/icu-small/source/common/ulocimp.h @@ -10,6 +10,8 @@ #ifndef ULOCIMP_H #define ULOCIMP_H +#include + #include "unicode/bytestream.h" #include "unicode/uloc.h" @@ -40,8 +42,10 @@ uloc_getTableStringWithFallback( int32_t *pLength, UErrorCode *pErrorCode); +namespace { /*returns true if a is an ID separator false otherwise*/ -#define _isIDSeparator(a) (a == '_' || a == '-') +inline bool _isIDSeparator(char a) { return a == '_' || a == '-'; } +} // namespace U_CFUNC const char* uloc_getCurrentCountryID(const char* oldID); @@ -49,53 +53,134 @@ uloc_getCurrentCountryID(const char* oldID); U_CFUNC const char* uloc_getCurrentLanguageID(const char* oldID); -U_CFUNC void -ulocimp_getKeywords(const char *localeID, - char prev, - icu::ByteSink& sink, - UBool valuesToo, - UErrorCode *status); - -icu::CharString U_EXPORT2 -ulocimp_getLanguage(const char *localeID, - const char **pEnd, - UErrorCode &status); - -icu::CharString U_EXPORT2 -ulocimp_getScript(const char *localeID, - const char **pEnd, - UErrorCode &status); - -icu::CharString U_EXPORT2 -ulocimp_getCountry(const char *localeID, - const char **pEnd, - UErrorCode &status); - -U_CAPI void U_EXPORT2 +U_EXPORT icu::CharString +ulocimp_getKeywords(const char* localeID, + char prev, + bool valuesToo, + UErrorCode& status); + +U_EXPORT void +ulocimp_getKeywords(const char* localeID, + char prev, + icu::ByteSink& sink, + bool valuesToo, + UErrorCode& status); + +U_EXPORT icu::CharString +ulocimp_getName(const char* localeID, + UErrorCode& err); + +U_EXPORT void ulocimp_getName(const char* localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); + +U_EXPORT icu::CharString +ulocimp_getBaseName(const char* localeID, + UErrorCode& err); -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_getBaseName(const char* localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); + +U_EXPORT icu::CharString +ulocimp_canonicalize(const char* localeID, + UErrorCode& err); -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_canonicalize(const char* localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); -U_CAPI void U_EXPORT2 +U_EXPORT icu::CharString +ulocimp_getKeywordValue(const char* localeID, + const char* keywordName, + UErrorCode& status); + +U_EXPORT void ulocimp_getKeywordValue(const char* localeID, const char* keywordName, icu::ByteSink& sink, - UErrorCode* status); + UErrorCode& status); + +U_EXPORT icu::CharString +ulocimp_getLanguage(const char* localeID, UErrorCode& status); + +U_EXPORT icu::CharString +ulocimp_getScript(const char* localeID, UErrorCode& status); + +U_EXPORT icu::CharString +ulocimp_getRegion(const char* localeID, UErrorCode& status); + +U_EXPORT icu::CharString +ulocimp_getVariant(const char* localeID, UErrorCode& status); + +U_EXPORT void +ulocimp_setKeywordValue(const char* keywordName, + const char* keywordValue, + icu::CharString& localeID, + UErrorCode& status); -U_CAPI void U_EXPORT2 +U_EXPORT int32_t +ulocimp_setKeywordValue(const char* keywords, + const char* keywordName, + const char* keywordValue, + icu::ByteSink& sink, + UErrorCode& status); + +U_EXPORT void +ulocimp_getSubtags( + const char* localeID, + icu::CharString* language, + icu::CharString* script, + icu::CharString* region, + icu::CharString* variant, + const char** pEnd, + UErrorCode& status); + +U_EXPORT void +ulocimp_getSubtags( + const char* localeID, + icu::ByteSink* language, + icu::ByteSink* script, + icu::ByteSink* region, + icu::ByteSink* variant, + const char** pEnd, + UErrorCode& status); + +inline void +ulocimp_getSubtags( + const char* localeID, + std::nullptr_t, + std::nullptr_t, + std::nullptr_t, + std::nullptr_t, + const char** pEnd, + UErrorCode& status) { + ulocimp_getSubtags( + localeID, + static_cast(nullptr), + static_cast(nullptr), + static_cast(nullptr), + static_cast(nullptr), + pEnd, + status); +} + +U_EXPORT icu::CharString +ulocimp_getParent(const char* localeID, + UErrorCode& err); + +U_EXPORT void ulocimp_getParent(const char* localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); + +U_EXPORT icu::CharString +ulocimp_toLanguageTag(const char* localeID, + bool strict, + UErrorCode& status); /** * Writes a well-formed language tag for this locale ID. @@ -116,11 +201,17 @@ ulocimp_getParent(const char* localeID, * * @internal ICU 64 */ -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_toLanguageTag(const char* localeID, icu::ByteSink& sink, - UBool strict, - UErrorCode* err); + bool strict, + UErrorCode& err); + +U_EXPORT icu::CharString +ulocimp_forLanguageTag(const char* langtag, + int32_t tagLen, + int32_t* parsedLength, + UErrorCode& status); /** * Returns a locale ID for the specified BCP47 language tag string. @@ -148,12 +239,12 @@ ulocimp_toLanguageTag(const char* localeID, * failed. * @internal ICU 63 */ -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_forLanguageTag(const char* langtag, int32_t tagLen, icu::ByteSink& sink, int32_t* parsedLength, - UErrorCode* err); + UErrorCode& err); /** * Get the region to use for supplemental data lookup. Uses @@ -161,28 +252,27 @@ ulocimp_forLanguageTag(const char* langtag, * (2) any unicode_region_tag in the locale ID; if none then * (3) if inferRegion is true, the region suggested by * getLikelySubtags on the localeID. - * If no region is found, returns length 0. - * + * If no region is found, returns an empty string. + * * @param localeID * The complete locale ID (with keywords) from which * to get the region to use for supplemental data. * @param inferRegion * If true, will try to infer region from localeID if * no other region is found. - * @param region - * Buffer in which to put the region ID found; should - * have a capacity at least ULOC_COUNTRY_CAPACITY. - * @param regionCapacity - * The actual capacity of the region buffer. * @param status * Pointer to in/out UErrorCode value for latest status. * @return - * The length of any region code found, or 0 if none. + * The region code found, empty if none found. * @internal ICU 57 */ -U_CAPI int32_t U_EXPORT2 -ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, - char *region, int32_t regionCapacity, UErrorCode* status); +U_EXPORT icu::CharString +ulocimp_getRegionForSupplementalData(const char *localeID, bool inferRegion, + UErrorCode& status); + +U_EXPORT icu::CharString +ulocimp_addLikelySubtags(const char* localeID, + UErrorCode& status); /** * Add the likely subtags for a provided locale ID, per the algorithm described @@ -213,10 +303,15 @@ ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR. * @internal ICU 64 */ -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_addLikelySubtags(const char* localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); + +U_EXPORT icu::CharString +ulocimp_minimizeSubtags(const char* localeID, + bool favorScript, + UErrorCode& status); /** * Minimize the subtags for a provided locale ID, per the algorithm described @@ -248,70 +343,72 @@ ulocimp_addLikelySubtags(const char* localeID, * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR. * @internal ICU 64 */ -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_minimizeSubtags(const char* localeID, icu::ByteSink& sink, bool favorScript, - UErrorCode* err); + UErrorCode& err); U_CAPI const char * U_EXPORT2 locale_getKeywordsStart(const char *localeID); -U_CFUNC UBool +bool ultag_isExtensionSubtags(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isLanguageSubtag(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isPrivateuseValueSubtags(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isRegionSubtag(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isScriptSubtag(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isTransformedExtensionSubtags(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeExtensionSubtags(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeLocaleAttribute(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeLocaleAttributes(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeLocaleKey(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeLocaleType(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isVariantSubtags(const char* s, int32_t len); -U_CAPI const char * U_EXPORT2 -ultag_getTKeyStart(const char *localeID); +const char* +ultag_getTKeyStart(const char* localeID); -U_CFUNC const char* +U_EXPORT const char* ulocimp_toBcpKey(const char* key); -U_CFUNC const char* +U_EXPORT const char* ulocimp_toLegacyKey(const char* key); -U_CFUNC const char* -ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType); +U_EXPORT const char* +ulocimp_toBcpType(const char* key, const char* type, bool* isKnownKey, bool* isSpecialType); -U_CFUNC const char* -ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType); +U_EXPORT const char* +ulocimp_toLegacyType(const char* key, const char* type, bool* isKnownKey, bool* isSpecialType); /* Function for testing purpose */ -U_CAPI const char* const* ulocimp_getKnownCanonicalizedLocaleForTest(int32_t* length); +U_EXPORT const char* const* +ulocimp_getKnownCanonicalizedLocaleForTest(int32_t& length); // Return true if the value is already canonicalized. -U_CAPI bool ulocimp_isCanonicalizedLocaleForTest(const char* localeName); +U_EXPORT bool +ulocimp_isCanonicalizedLocaleForTest(const char* localeName); #endif diff --git a/deps/icu-small/source/common/umapfile.cpp b/deps/icu-small/source/common/umapfile.cpp index faa6d807868885..8dddf0e78dcc5a 100644 --- a/deps/icu-small/source/common/umapfile.cpp +++ b/deps/icu-small/source/common/umapfile.cpp @@ -236,9 +236,9 @@ typedef HANDLE MemoryMap; /* get a view of the mapping */ #if U_PLATFORM != U_PF_HPUX - data=mmap(0, length, PROT_READ, MAP_SHARED, fd, 0); + data=mmap(nullptr, length, PROT_READ, MAP_SHARED, fd, 0); #else - data=mmap(0, length, PROT_READ, MAP_PRIVATE, fd, 0); + data=mmap(nullptr, length, PROT_READ, MAP_PRIVATE, fd, 0); #endif close(fd); /* no longer needed */ if(data==MAP_FAILED) { @@ -262,7 +262,7 @@ typedef HANDLE MemoryMap; if(munmap(pData->mapAddr, dataLen)==-1) { } pData->pHeader=nullptr; - pData->map=0; + pData->map=nullptr; pData->mapAddr=nullptr; } } diff --git a/deps/icu-small/source/common/umutex.cpp b/deps/icu-small/source/common/umutex.cpp index ccbee9960a39e7..0c053968dcc85a 100644 --- a/deps/icu-small/source/common/umutex.cpp +++ b/deps/icu-small/source/common/umutex.cpp @@ -189,7 +189,6 @@ u_setMutexFunctions(const void * /*context */, UMtxInitFn *, UMtxFn *, if (U_SUCCESS(*status)) { *status = U_UNSUPPORTED_ERROR; } - return; } @@ -200,5 +199,4 @@ u_setAtomicIncDecFunctions(const void * /*context */, UMtxAtomicFn *, UMtxAtomic if (U_SUCCESS(*status)) { *status = U_UNSUPPORTED_ERROR; } - return; } diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index 1b10e6ef11656d..bd96629285bcd4 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -146,14 +146,13 @@ class U_COMMON_API BreakIterator : public UObject { * will return distinct unequal values. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; + virtual UClassID getDynamicClassID() const override = 0; /** * Return a CharacterIterator over the text being analyzed. * @stable ICU 2.0 */ - virtual CharacterIterator& getText(void) const = 0; - + virtual CharacterIterator& getText() const = 0; /** * Get a UText for the text being analyzed. @@ -228,14 +227,14 @@ class U_COMMON_API BreakIterator : public UObject { * @return The offset of the beginning of the text, zero. * @stable ICU 2.0 */ - virtual int32_t first(void) = 0; + virtual int32_t first() = 0; /** * Set the iterator position to the index immediately BEYOND the last character in the text being scanned. * @return The index immediately BEYOND the last character in the text being scanned. * @stable ICU 2.0 */ - virtual int32_t last(void) = 0; + virtual int32_t last() = 0; /** * Set the iterator position to the boundary preceding the current boundary. @@ -243,7 +242,7 @@ class U_COMMON_API BreakIterator : public UObject { * boundaries have been returned. * @stable ICU 2.0 */ - virtual int32_t previous(void) = 0; + virtual int32_t previous() = 0; /** * Advance the iterator to the boundary following the current boundary. @@ -251,14 +250,14 @@ class U_COMMON_API BreakIterator : public UObject { * boundaries have been returned. * @stable ICU 2.0 */ - virtual int32_t next(void) = 0; + virtual int32_t next() = 0; /** * Return character index of the current iterator position within the text. * @return The boundary most recently returned. * @stable ICU 2.0 */ - virtual int32_t current(void) const = 0; + virtual int32_t current() const = 0; /** * Advance the iterator to the first boundary following the specified offset. @@ -530,7 +529,7 @@ class U_COMMON_API BreakIterator : public UObject { * must be closed by an explicit call to the destructor (not delete). * @deprecated ICU 52. Always delete the BreakIterator. */ - inline UBool isBufferClone(void); + inline UBool isBufferClone(); #endif /* U_HIDE_DEPRECATED_API */ @@ -575,7 +574,7 @@ class U_COMMON_API BreakIterator : public UObject { * @return a StringEnumeration over the locales available at the time of the call * @stable ICU 2.4 */ - static StringEnumeration* U_EXPORT2 getAvailableLocales(void); + static StringEnumeration* U_EXPORT2 getAvailableLocales(); #endif /** diff --git a/deps/icu-small/source/common/unicode/caniter.h b/deps/icu-small/source/common/unicode/caniter.h index 035bd0e64eb924..b904ef2ff8b047 100644 --- a/deps/icu-small/source/common/unicode/caniter.h +++ b/deps/icu-small/source/common/unicode/caniter.h @@ -128,9 +128,10 @@ class U_COMMON_API CanonicalIterator final : public UObject { * @param skipZeros determine if skip zeros * @param result the results in a set. * @param status Fill-in parameter which receives the status of this operation. + * @param depth depth of the call. * @internal */ - static void U_EXPORT2 permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status); + static void U_EXPORT2 permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status, int32_t depth=0); #endif /* U_HIDE_INTERNAL_API */ /** @@ -182,8 +183,8 @@ class U_COMMON_API CanonicalIterator final : public UObject { // transient fields UnicodeString buffer; - const Normalizer2 &nfd; - const Normalizer2Impl &nfcImpl; + const Normalizer2 *nfd; + const Normalizer2Impl *nfcImpl; // we have a segment, in NFD. Find all the strings that are canonically equivalent to it. UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment) diff --git a/deps/icu-small/source/common/unicode/chariter.h b/deps/icu-small/source/common/unicode/chariter.h index 45f4d984c74d35..411825677fd5e7 100644 --- a/deps/icu-small/source/common/unicode/chariter.h +++ b/deps/icu-small/source/common/unicode/chariter.h @@ -133,8 +133,8 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return the hash code. * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const = 0; - + virtual int32_t hashCode() const = 0; + /** * Returns a UClassID for this ForwardCharacterIterator ("poor man's * RTTI").

Despite the fact that this function is public, @@ -142,8 +142,8 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return a UClassID for this ForwardCharacterIterator * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; - + virtual UClassID getDynamicClassID() const override = 0; + /** * Gets the current code unit for returning and advances to the next code unit * in the iteration range @@ -152,8 +152,8 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return the current code unit. * @stable ICU 2.0 */ - virtual char16_t nextPostInc(void) = 0; - + virtual char16_t nextPostInc() = 0; + /** * Gets the current code point for returning and advances to the next code point * in the iteration range @@ -162,8 +162,8 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return the current code point. * @stable ICU 2.0 */ - virtual UChar32 next32PostInc(void) = 0; - + virtual UChar32 next32PostInc() = 0; + /** * Returns false if there are no more code units or code points * at or after the current position in the iteration range. @@ -389,7 +389,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the first code unit in its iteration range. * @stable ICU 2.0 */ - virtual char16_t first(void) = 0; + virtual char16_t first() = 0; /** * Sets the iterator to refer to the first code unit in its @@ -399,7 +399,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the first code unit in its iteration range. * @stable ICU 2.0 */ - virtual char16_t firstPostInc(void); + virtual char16_t firstPostInc(); /** * Sets the iterator to refer to the first code point in its @@ -410,7 +410,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the first code point in its iteration range. * @stable ICU 2.0 */ - virtual UChar32 first32(void) = 0; + virtual UChar32 first32() = 0; /** * Sets the iterator to refer to the first code point in its @@ -420,7 +420,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the first code point in its iteration range. * @stable ICU 2.0 */ - virtual UChar32 first32PostInc(void); + virtual UChar32 first32PostInc(); /** * Sets the iterator to refer to the first code unit or code point in its @@ -438,8 +438,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the last code unit. * @stable ICU 2.0 */ - virtual char16_t last(void) = 0; - + virtual char16_t last() = 0; + /** * Sets the iterator to refer to the last code point in its * iteration range, and returns that code unit. @@ -447,7 +447,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the last code point. * @stable ICU 2.0 */ - virtual UChar32 last32(void) = 0; + virtual UChar32 last32() = 0; /** * Sets the iterator to the end of its iteration range, just behind @@ -486,15 +486,15 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the current code unit. * @stable ICU 2.0 */ - virtual char16_t current(void) const = 0; - + virtual char16_t current() const = 0; + /** * Returns the code point the iterator currently refers to. * @return the current code point. * @stable ICU 2.0 */ - virtual UChar32 current32(void) const = 0; - + virtual UChar32 current32() const = 0; + /** * Advances to the next code unit in the iteration range * (toward endIndex()), and returns that code unit. If there are @@ -502,8 +502,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the next code unit. * @stable ICU 2.0 */ - virtual char16_t next(void) = 0; - + virtual char16_t next() = 0; + /** * Advances to the next code point in the iteration range * (toward endIndex()), and returns that code point. If there are @@ -514,8 +514,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the next code point. * @stable ICU 2.0 */ - virtual UChar32 next32(void) = 0; - + virtual UChar32 next32() = 0; + /** * Advances to the previous code unit in the iteration range * (toward startIndex()), and returns that code unit. If there are @@ -523,7 +523,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the previous code unit. * @stable ICU 2.0 */ - virtual char16_t previous(void) = 0; + virtual char16_t previous() = 0; /** * Advances to the previous code point in the iteration range @@ -532,7 +532,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the previous code point. * @stable ICU 2.0 */ - virtual UChar32 previous32(void) = 0; + virtual UChar32 previous32() = 0; /** * Returns false if there are no more code units or code points @@ -555,8 +555,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * object of the character returned by first(). * @stable ICU 2.0 */ - inline int32_t startIndex(void) const; - + inline int32_t startIndex() const; + /** * Returns the numeric index in the underlying text-storage * object of the position immediately BEYOND the character @@ -566,8 +566,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * returned by last(). * @stable ICU 2.0 */ - inline int32_t endIndex(void) const; - + inline int32_t endIndex() const; + /** * Returns the numeric index in the underlying text-storage * object of the character the iterator currently refers to @@ -576,7 +576,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * the character the iterator currently refers to * @stable ICU 2.0 */ - inline int32_t getIndex(void) const; + inline int32_t getIndex() const; /** * Returns the length of the entire text in the underlying @@ -708,22 +708,22 @@ CharacterIterator::setToEnd() { } inline int32_t -CharacterIterator::startIndex(void) const { +CharacterIterator::startIndex() const { return begin; } inline int32_t -CharacterIterator::endIndex(void) const { +CharacterIterator::endIndex() const { return end; } inline int32_t -CharacterIterator::getIndex(void) const { +CharacterIterator::getIndex() const { return pos; } inline int32_t -CharacterIterator::getLength(void) const { +CharacterIterator::getLength() const { return textLength; } diff --git a/deps/icu-small/source/common/unicode/docmain.h b/deps/icu-small/source/common/unicode/docmain.h index 581b2e186d5ad4..fa4dbbc052237c 100644 --- a/deps/icu-small/source/common/unicode/docmain.h +++ b/deps/icu-small/source/common/unicode/docmain.h @@ -143,6 +143,11 @@ * icu::MessageFormat * * + * Message Formatting 2
(technology preview) + * (no C API) + * icu::message2::MessageFormatter + * + * * List Formatting * ulistformatter.h * icu::ListFormatter diff --git a/deps/icu-small/source/common/unicode/dtintrv.h b/deps/icu-small/source/common/unicode/dtintrv.h index 8c172eb7a59acc..1fd0ba5deee92c 100644 --- a/deps/icu-small/source/common/unicode/dtintrv.h +++ b/deps/icu-small/source/common/unicode/dtintrv.h @@ -76,7 +76,7 @@ class U_COMMON_API DateInterval : public UObject { * @return The class ID for all objects of this class. * @stable ICU 4.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -89,9 +89,8 @@ class U_COMMON_API DateInterval : public UObject { * other classes have different class IDs. * @stable ICU 4.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; - /** * Copy constructor. * @stable ICU 4.0 diff --git a/deps/icu-small/source/common/unicode/localematcher.h b/deps/icu-small/source/common/unicode/localematcher.h index 603daf7231dd1a..e16f1a31ca507a 100644 --- a/deps/icu-small/source/common/unicode/localematcher.h +++ b/deps/icu-small/source/common/unicode/localematcher.h @@ -11,6 +11,8 @@ #if U_SHOW_CPLUSPLUS_API +#include + #include "unicode/locid.h" #include "unicode/stringpiece.h" #include "unicode/uobject.h" @@ -133,10 +135,10 @@ U_NAMESPACE_BEGIN struct LSR; +class LikelySubtags; class LocaleDistance; class LocaleLsrIterator; class UVector; -class XLikelySubtags; /** * Immutable class that picks the best match between a user's desired locales and @@ -678,9 +680,9 @@ class U_COMMON_API LocaleMatcher : public UMemory { int32_t putIfAbsent(const LSR &lsr, int32_t i, int32_t suppLength, UErrorCode &errorCode); - int32_t getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remainingIter, UErrorCode &errorCode) const; + std::optional getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remainingIter, UErrorCode &errorCode) const; - const XLikelySubtags &likelySubtags; + const LikelySubtags &likelySubtags; const LocaleDistance &localeDistance; int32_t thresholdDistance; int32_t demotionPerDesiredLocale; diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index b8be3d7942eacc..9c891bf3088515 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -162,11 +162,11 @@ class LocalPointerBase { T *ptr; private: // No comparison operators with other LocalPointerBases. - bool operator==(const LocalPointerBase &other); - bool operator!=(const LocalPointerBase &other); + bool operator==(const LocalPointerBase &other) = delete; + bool operator!=(const LocalPointerBase &other) = delete; // No ownership sharing: No copy constructor, no assignment operator. - LocalPointerBase(const LocalPointerBase &other); - void operator=(const LocalPointerBase &other); + LocalPointerBase(const LocalPointerBase &other) = delete; + void operator=(const LocalPointerBase &other) = delete; }; /** @@ -548,46 +548,60 @@ class LocalArray : public LocalPointerBase { * @stable ICU 4.4 */ #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ - class LocalPointerClassName : public LocalPointerBase { \ - public: \ - using LocalPointerBase::operator*; \ - using LocalPointerBase::operator->; \ - explicit LocalPointerClassName(Type *p=nullptr) : LocalPointerBase(p) {} \ - LocalPointerClassName(LocalPointerClassName &&src) noexcept \ - : LocalPointerBase(src.ptr) { \ - src.ptr=nullptr; \ - } \ - /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ - explicit LocalPointerClassName(std::unique_ptr &&p) \ - : LocalPointerBase(p.release()) {} \ - ~LocalPointerClassName() { if (ptr != nullptr) { closeFunction(ptr); } } \ - LocalPointerClassName &operator=(LocalPointerClassName &&src) noexcept { \ - if (ptr != nullptr) { closeFunction(ptr); } \ - LocalPointerBase::ptr=src.ptr; \ - src.ptr=nullptr; \ - return *this; \ - } \ - /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ - LocalPointerClassName &operator=(std::unique_ptr &&p) { \ - adoptInstead(p.release()); \ - return *this; \ - } \ - void swap(LocalPointerClassName &other) noexcept { \ - Type *temp=LocalPointerBase::ptr; \ - LocalPointerBase::ptr=other.ptr; \ - other.ptr=temp; \ - } \ - friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) noexcept { \ - p1.swap(p2); \ - } \ - void adoptInstead(Type *p) { \ - if (ptr != nullptr) { closeFunction(ptr); } \ - ptr=p; \ - } \ - operator std::unique_ptr () && { \ - return std::unique_ptr(LocalPointerBase::orphan(), closeFunction); \ - } \ + using LocalPointerClassName = internal::LocalOpenPointer + +#ifndef U_IN_DOXYGEN +namespace internal { +/** + * Implementation, do not use directly: use U_DEFINE_LOCAL_OPEN_POINTER. + * + * @see U_DEFINE_LOCAL_OPEN_POINTER + * @internal + */ +template +class LocalOpenPointer : public LocalPointerBase { + using LocalPointerBase::ptr; +public: + using LocalPointerBase::operator*; + using LocalPointerBase::operator->; + explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase(p) {} + LocalOpenPointer(LocalOpenPointer &&src) noexcept + : LocalPointerBase(src.ptr) { + src.ptr=nullptr; + } + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ + explicit LocalOpenPointer(std::unique_ptr &&p) + : LocalPointerBase(p.release()) {} + ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } } + LocalOpenPointer &operator=(LocalOpenPointer &&src) noexcept { + if (ptr != nullptr) { closeFunction(ptr); } + LocalPointerBase::ptr=src.ptr; + src.ptr=nullptr; + return *this; + } + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ + LocalOpenPointer &operator=(std::unique_ptr &&p) { + adoptInstead(p.release()); + return *this; + } + void swap(LocalOpenPointer &other) noexcept { + Type *temp=LocalPointerBase::ptr; + LocalPointerBase::ptr=other.ptr; + other.ptr=temp; + } + friend inline void swap(LocalOpenPointer &p1, LocalOpenPointer &p2) noexcept { + p1.swap(p2); } + void adoptInstead(Type *p) { + if (ptr != nullptr) { closeFunction(ptr); } + ptr=p; + } + operator std::unique_ptr () && { + return std::unique_ptr(LocalPointerBase::orphan(), closeFunction); + } +}; +} // namespace internal +#endif U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index f0bdc7ca51416c..60282d623dc9f0 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -195,51 +195,50 @@ class UnicodeString; class U_COMMON_API Locale : public UObject { public: /** Useful constant for the Root locale. @stable ICU 4.4 */ - static const Locale &U_EXPORT2 getRoot(void); + static const Locale& U_EXPORT2 getRoot(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getEnglish(void); + static const Locale& U_EXPORT2 getEnglish(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getFrench(void); + static const Locale& U_EXPORT2 getFrench(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getGerman(void); + static const Locale& U_EXPORT2 getGerman(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getItalian(void); + static const Locale& U_EXPORT2 getItalian(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getJapanese(void); + static const Locale& U_EXPORT2 getJapanese(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getKorean(void); + static const Locale& U_EXPORT2 getKorean(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getChinese(void); + static const Locale& U_EXPORT2 getChinese(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getSimplifiedChinese(void); + static const Locale& U_EXPORT2 getSimplifiedChinese(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getTraditionalChinese(void); + static const Locale& U_EXPORT2 getTraditionalChinese(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getFrance(void); + static const Locale& U_EXPORT2 getFrance(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getGermany(void); + static const Locale& U_EXPORT2 getGermany(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getItaly(void); + static const Locale& U_EXPORT2 getItaly(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getJapan(void); + static const Locale& U_EXPORT2 getJapan(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getKorea(void); + static const Locale& U_EXPORT2 getKorea(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getChina(void); + static const Locale& U_EXPORT2 getChina(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getPRC(void); + static const Locale& U_EXPORT2 getPRC(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getTaiwan(void); + static const Locale& U_EXPORT2 getTaiwan(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getUK(void); + static const Locale& U_EXPORT2 getUK(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getUS(void); + static const Locale& U_EXPORT2 getUS(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getCanada(void); + static const Locale& U_EXPORT2 getCanada(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getCanadaFrench(void); - + static const Locale& U_EXPORT2 getCanadaFrench(); /** * Construct a default locale object, a Locale for the default locale ID. @@ -274,10 +273,10 @@ class U_COMMON_API Locale : public UObject { * @see uloc_getDefault * @stable ICU 2.0 */ - Locale( const char * language, - const char * country = 0, - const char * variant = 0, - const char * keywordsAndValues = 0); + Locale(const char* language, + const char* country = nullptr, + const char* variant = nullptr, + const char* keywordsAndValues = nullptr); /** * Initializes a Locale object from another Locale object. @@ -370,7 +369,7 @@ class U_COMMON_API Locale : public UObject { * @system * @stable ICU 2.0 */ - static const Locale& U_EXPORT2 getDefault(void); + static const Locale& U_EXPORT2 getDefault(); /** * Sets the default. Normally set once at the beginning of a process, @@ -518,20 +517,20 @@ class U_COMMON_API Locale : public UObject { * If this Locale is already in the maximal form, or not valid, or there is * no data available for maximization, the Locale will be unchanged. * - * For example, "und-Zzzz" cannot be maximized, since there is no + * For example, "sh" cannot be maximized, since there is no * reasonable maximization. * * Examples: * + * "und_Zzzz" maximizes to "en_Latn_US" + * * "en" maximizes to "en_Latn_US" * - * "de" maximizes to "de_Latn_US" + * "de" maximizes to "de_Latn_DE" * * "sr" maximizes to "sr_Cyrl_RS" * - * "sh" maximizes to "sr_Latn_RS" (Note this will not reverse.) - * - * "zh_Hani" maximizes to "zh_Hans_CN" (Note this will not reverse.) + * "zh_Hani" maximizes to "zh_Hani_CN" * * @param status error information if maximizing this Locale failed. * If this Locale is not well-formed, the error code is @@ -792,7 +791,7 @@ class U_COMMON_API Locale : public UObject { * there is no Windows LCID value that corresponds to this locale, returns 0. * @stable ICU 2.0 */ - uint32_t getLCID(void) const; + uint32_t getLCID() const; /** * Returns whether this locale's script is written right-to-left. @@ -944,7 +943,7 @@ class U_COMMON_API Locale : public UObject { * Generates a hash code for the locale. * @stable ICU 2.0 */ - int32_t hashCode(void) const; + int32_t hashCode() const; /** * Sets the locale to bogus @@ -961,7 +960,7 @@ class U_COMMON_API Locale : public UObject { * @return false if it is a real locale, true if it is a bogus locale * @stable ICU 2.1 */ - inline UBool isBogus(void) const; + inline UBool isBogus() const; /** * Returns a list of all installed locales. @@ -1147,7 +1146,7 @@ class U_COMMON_API Locale : public UObject { /** * Initialize the locale cache for commonly used locales */ - static Locale *getLocaleCache(void); + static Locale* getLocaleCache(); char language[ULOC_LANG_CAPACITY]; char script[ULOC_SCRIPT_CAPACITY]; @@ -1184,6 +1183,7 @@ Locale::operator!=(const Locale& other) const template inline StringClass Locale::toLanguageTag(UErrorCode& status) const { + if (U_FAILURE(status)) { return {}; } StringClass result; StringByteSink sink(&result); toLanguageTag(sink, status); @@ -1211,7 +1211,7 @@ Locale::getScript() const inline const char * Locale::getVariant() const { - return &baseName[variantBegin]; + return fIsBogus ? "" : &baseName[variantBegin]; } inline const char * @@ -1223,6 +1223,7 @@ Locale::getName() const template inline void Locale::getKeywords(OutputIterator iterator, UErrorCode& status) const { + if (U_FAILURE(status)) { return; } LocalPointer keys(createKeywords(status)); if (U_FAILURE(status) || keys.isNull()) { return; @@ -1240,6 +1241,7 @@ Locale::getKeywords(OutputIterator iterator, UErrorCode& status) const template inline void Locale::getUnicodeKeywords(OutputIterator iterator, UErrorCode& status) const { + if (U_FAILURE(status)) { return; } LocalPointer keys(createUnicodeKeywords(status)); if (U_FAILURE(status) || keys.isNull()) { return; @@ -1257,6 +1259,7 @@ Locale::getUnicodeKeywords(OutputIterator iterator, UErrorCode& status) const template inline StringClass Locale::getKeywordValue(StringPiece keywordName, UErrorCode& status) const { + if (U_FAILURE(status)) { return {}; } StringClass result; StringByteSink sink(&result); getKeywordValue(keywordName, sink, status); @@ -1266,6 +1269,7 @@ Locale::getKeywordValue(StringPiece keywordName, UErrorCode& status) const template inline StringClass Locale::getUnicodeKeywordValue(StringPiece keywordName, UErrorCode& status) const { + if (U_FAILURE(status)) { return {}; } StringClass result; StringByteSink sink(&result); getUnicodeKeywordValue(keywordName, sink, status); @@ -1273,7 +1277,7 @@ Locale::getUnicodeKeywordValue(StringPiece keywordName, UErrorCode& status) cons } inline UBool -Locale::isBogus(void) const { +Locale::isBogus() const { return fIsBogus; } diff --git a/deps/icu-small/source/common/unicode/normlzr.h b/deps/icu-small/source/common/unicode/normlzr.h index 03a7aa080d1a78..0309bce5382dc8 100644 --- a/deps/icu-small/source/common/unicode/normlzr.h +++ b/deps/icu-small/source/common/unicode/normlzr.h @@ -466,7 +466,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the current normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 current(void); + UChar32 current(); /** * Return the first character in the normalized text. @@ -476,7 +476,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the first normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 first(void); + UChar32 first(); /** * Return the last character in the normalized text. @@ -486,7 +486,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the last normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 last(void); + UChar32 last(); /** * Return the next character in the normalized text. @@ -502,7 +502,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the next normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 next(void); + UChar32 next(); /** * Return the previous character in the normalized text and decrement. @@ -518,7 +518,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the previous normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 previous(void); + UChar32 previous(); /** * Set the iteration position in the input text that is being normalized, @@ -536,7 +536,7 @@ class U_COMMON_API Normalizer : public UObject { * This is equivalent to setIndexOnly(startIndex)). * @deprecated ICU 56 Use Normalizer2 instead. */ - void reset(void); + void reset(); /** * Retrieve the current iteration position in the input text that is @@ -552,7 +552,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the current index in the input text * @deprecated ICU 56 Use Normalizer2 instead. */ - int32_t getIndex(void) const; + int32_t getIndex() const; /** * Retrieve the index of the start of the input text. This is the begin index @@ -562,7 +562,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the smallest index in the input text where the Normalizer operates * @deprecated ICU 56 Use Normalizer2 instead. */ - int32_t startIndex(void) const; + int32_t startIndex() const; /** * Retrieve the index of the end of the input text. This is the end index @@ -574,7 +574,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the first index in the input text where the Normalizer does not operate * @deprecated ICU 56 Use Normalizer2 instead. */ - int32_t endIndex(void) const; + int32_t endIndex() const; /** * Returns true when both iterators refer to the same character in the same @@ -610,7 +610,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the hash code * @deprecated ICU 56 Use Normalizer2 instead. */ - int32_t hashCode(void) const; + int32_t hashCode() const; //------------------------------------------------------------------------- // Property access methods @@ -643,7 +643,7 @@ class U_COMMON_API Normalizer : public UObject { * @see #setMode * @deprecated ICU 56 Use Normalizer2 instead. */ - UNormalizationMode getUMode(void) const; + UNormalizationMode getUMode() const; /** * Set options that affect this Normalizer's operation. @@ -749,7 +749,7 @@ class U_COMMON_API Normalizer : public UObject { UBool previousNormalize(); void init(); - void clearBuffer(void); + void clearBuffer(); //------------------------------------------------------------------------- // Private data diff --git a/deps/icu-small/source/common/unicode/parsepos.h b/deps/icu-small/source/common/unicode/parsepos.h index d33a812ad0b4f3..99cdd7edab80ca 100644 --- a/deps/icu-small/source/common/unicode/parsepos.h +++ b/deps/icu-small/source/common/unicode/parsepos.h @@ -129,7 +129,7 @@ class U_COMMON_API ParsePosition : public UObject { * @return the current index. * @stable ICU 2.0 */ - inline int32_t getIndex(void) const; + inline int32_t getIndex() const; /** * Set the current parse position. @@ -152,7 +152,7 @@ class U_COMMON_API ParsePosition : public UObject { * error index has not been set. * @stable ICU 2.0 */ - inline int32_t getErrorIndex(void) const; + inline int32_t getErrorIndex() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. diff --git a/deps/icu-small/source/common/unicode/platform.h b/deps/icu-small/source/common/unicode/platform.h index a997843660c9ad..7aca76c67db827 100644 --- a/deps/icu-small/source/common/unicode/platform.h +++ b/deps/icu-small/source/common/unicode/platform.h @@ -206,6 +206,17 @@ # define U_PLATFORM U_PF_UNKNOWN #endif +/** + * \def U_REAL_MSVC + * Defined if the compiler is the real MSVC compiler (and not something like + * Clang setting _MSC_VER in order to compile Windows code that requires it). + * Otherwise undefined. + * @internal + */ +#if (defined(_MSC_VER) && !(defined(__clang__) && __clang__)) || defined(U_IN_DOXYGEN) +# define U_REAL_MSVC +#endif + /** * \def CYGWINMSVC * Defined if this is Windows with Cygwin, but using MSVC rather than gcc. @@ -302,51 +313,6 @@ # define U_PLATFORM_IS_DARWIN_BASED 0 #endif -/** - * \def U_HAVE_STDINT_H - * Defines whether stdint.h is available. It is a C99 standard header. - * We used to include inttypes.h which includes stdint.h but we usually do not need - * the additional definitions from inttypes.h. - * @internal - */ -#ifdef U_HAVE_STDINT_H - /* Use the predefined value. */ -#elif U_PLATFORM_USES_ONLY_WIN32_API -# if defined(__BORLANDC__) || U_PLATFORM == U_PF_MINGW || (defined(_MSC_VER) && _MSC_VER>=1600) - /* Windows Visual Studio 9 and below do not have stdint.h & inttypes.h, but VS 2010 adds them. */ -# define U_HAVE_STDINT_H 1 -# else -# define U_HAVE_STDINT_H 0 -# endif -#elif U_PLATFORM == U_PF_SOLARIS - /* Solaris has inttypes.h but not stdint.h. */ -# define U_HAVE_STDINT_H 0 -#elif U_PLATFORM == U_PF_AIX && !defined(_AIX51) && defined(_POWER) - /* PPC AIX <= 4.3 has inttypes.h but not stdint.h. */ -# define U_HAVE_STDINT_H 0 -#else -# define U_HAVE_STDINT_H 1 -#endif - -/** - * \def U_HAVE_INTTYPES_H - * Defines whether inttypes.h is available. It is a C99 standard header. - * We include inttypes.h where it is available but stdint.h is not. - * @internal - */ -#ifdef U_HAVE_INTTYPES_H - /* Use the predefined value. */ -#elif U_PLATFORM == U_PF_SOLARIS - /* Solaris has inttypes.h but not stdint.h. */ -# define U_HAVE_INTTYPES_H 1 -#elif U_PLATFORM == U_PF_AIX && !defined(_AIX51) && defined(_POWER) - /* PPC AIX <= 4.3 has inttypes.h but not stdint.h. */ -# define U_HAVE_INTTYPES_H 1 -#else - /* Most platforms have both inttypes.h and stdint.h, or neither. */ -# define U_HAVE_INTTYPES_H U_HAVE_STDINT_H -#endif - /*===========================================================================*/ /** @{ Compiler and environment features */ /*===========================================================================*/ @@ -507,6 +473,8 @@ /* Otherwise use the predefined value. */ #elif !defined(__cplusplus) # define U_CPLUSPLUS_VERSION 0 +#elif __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define U_CPLUSPLUS_VERSION 17 #elif __cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) # define U_CPLUSPLUS_VERSION 14 #elif __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L) @@ -754,9 +722,9 @@ /* * Notes: * C++11 and C11 require support for UTF-16 literals - * TODO: Fix for plain C. Doesn't work on Mac. + * Doesn't work on Mac C11 (see workaround in ptypes.h). */ -# if U_CPLUSPLUS_VERSION >= 11 || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) +# if defined(__cplusplus) || !U_PLATFORM_IS_DARWIN_BASED # define U_HAVE_CHAR16_T 1 # else # define U_HAVE_CHAR16_T 0 diff --git a/deps/icu-small/source/common/unicode/ptypes.h b/deps/icu-small/source/common/unicode/ptypes.h index 70324ffee3b9c4..270a729ccb030e 100644 --- a/deps/icu-small/source/common/unicode/ptypes.h +++ b/deps/icu-small/source/common/unicode/ptypes.h @@ -42,89 +42,25 @@ /* NULL, size_t, wchar_t */ #include -/* - * If all compilers provided all of the C99 headers and types, - * we would just unconditionally #include here - * and not need any of the stuff after including platform.h. - */ - -/* Find out if we have stdint.h etc. */ +/* More platform-specific definitions. */ #include "unicode/platform.h" /*===========================================================================*/ /* Generic data types */ /*===========================================================================*/ -/* If your platform does not have the header, you may - need to edit the typedefs in the #else section below. - Use #if...#else...#endif with predefined compiler macros if possible. */ -#if U_HAVE_STDINT_H - -/* - * We mostly need (which defines the standard integer types) but not . - * includes and adds the printf/scanf helpers PRId32, SCNx16 etc. - * which we almost never use, plus stuff like imaxabs() which we never use. - */ #include -#if U_PLATFORM == U_PF_OS390 -/* The features header is needed to get (u)int64_t sometimes. */ -#include -/* z/OS has , but some versions are missing uint8_t (APAR PK62248). */ -#if !defined(__uint8_t) -#define __uint8_t 1 -typedef unsigned char uint8_t; -#endif -#endif /* U_PLATFORM == U_PF_OS390 */ - -#elif U_HAVE_INTTYPES_H - -# include - -#else /* neither U_HAVE_STDINT_H nor U_HAVE_INTTYPES_H */ - -/// \cond -#if ! U_HAVE_INT8_T -typedef signed char int8_t; -#endif - -#if ! U_HAVE_UINT8_T -typedef unsigned char uint8_t; -#endif - -#if ! U_HAVE_INT16_T -typedef signed short int16_t; -#endif - -#if ! U_HAVE_UINT16_T -typedef unsigned short uint16_t; -#endif - -#if ! U_HAVE_INT32_T -typedef signed int int32_t; -#endif - -#if ! U_HAVE_UINT32_T -typedef unsigned int uint32_t; +// C++11 and C11 both specify that the data type char16_t should exist, C++11 +// as a keyword and C11 as a typedef in the uchar.h header file, but not all +// implementations (looking at you, Apple, spring 2024) actually do this, so +// ICU4C must detect and deal with that. +#if !defined(__cplusplus) && !defined(U_IN_DOXYGEN) +# if U_HAVE_CHAR16_T +# include +# else + typedef uint16_t char16_t; +# endif #endif -#if ! U_HAVE_INT64_T -#ifdef _MSC_VER - typedef signed __int64 int64_t; -#else - typedef signed long long int64_t; -#endif -#endif - -#if ! U_HAVE_UINT64_T -#ifdef _MSC_VER - typedef unsigned __int64 uint64_t; -#else - typedef unsigned long long uint64_t; -#endif -#endif -/// \endcond - -#endif /* U_HAVE_STDINT_H / U_HAVE_INTTYPES_H */ - #endif /* _PTYPES_H */ diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index 045238ac5d79de..659e3e46b35203 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -44,7 +44,7 @@ class UnhandledEngine; class UStack; -#ifndef U_HIDE_DRAFT_API +#ifndef U_HIDE_INTERNAL_API /** * The ExternalBreakEngine class define an abstract interface for the host environment * to provide a low level facility to break text for unicode text in script that the text boundary @@ -103,7 +103,7 @@ class ExternalBreakEngine : public UObject { int32_t* foundBreaks, int32_t foundBreaksCapacity, UErrorCode& status) const = 0; }; -#endif /* U_HIDE_DRAFT_API */ +#endif /* U_HIDE_INTERNAL_API */ /** @@ -388,14 +388,14 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return A hash code * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const; + virtual int32_t hashCode() const; /** * Returns the description used to create this iterator * @return the description used to create this iterator * @stable ICU 2.0 */ - virtual const UnicodeString& getRules(void) const; + virtual const UnicodeString& getRules() const; //======================================================================= // BreakIterator overrides @@ -425,8 +425,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return An iterator over the text being analyzed. * @stable ICU 2.0 */ - virtual CharacterIterator& getText(void) const override; - + virtual CharacterIterator& getText() const override; /** * Get a UText for the text being analyzed. @@ -486,14 +485,14 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return The offset of the beginning of the text, zero. * @stable ICU 2.0 */ - virtual int32_t first(void) override; + virtual int32_t first() override; /** * Sets the current iteration position to the end of the text. * @return The text's past-the-end offset. * @stable ICU 2.0 */ - virtual int32_t last(void) override; + virtual int32_t last() override; /** * Advances the iterator either forward or backward the specified number of steps. @@ -512,14 +511,14 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return The position of the first boundary after this one. * @stable ICU 2.0 */ - virtual int32_t next(void) override; + virtual int32_t next() override; /** * Moves the iterator backwards, to the last boundary preceding this one. * @return The position of the last boundary position preceding this one. * @stable ICU 2.0 */ - virtual int32_t previous(void) override; + virtual int32_t previous() override; /** * Sets the iterator to refer to the first boundary position following @@ -557,8 +556,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return The current iteration position. * @stable ICU 2.0 */ - virtual int32_t current(void) const override; - + virtual int32_t current() const override; /** * Return the status tag from the break rule that determined the boundary at @@ -629,7 +627,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; /** * Returns the class ID for this class. This is useful only for @@ -642,7 +640,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -799,7 +797,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { void dumpTables(); #endif /* U_HIDE_INTERNAL_API */ -#ifndef U_HIDE_DRAFT_API +#ifndef U_HIDE_INTERNAL_API /** * Register a new external break engine. The external break engine will be adopted. * Because ICU may choose to cache break engine internally, this must @@ -811,7 +809,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { */ static void U_EXPORT2 registerExternalBreakEngine( ExternalBreakEngine* toAdopt, UErrorCode& status); -#endif /* U_HIDE_DRAFT_API */ +#endif /* U_HIDE_INTERNAL_API */ }; diff --git a/deps/icu-small/source/common/unicode/resbund.h b/deps/icu-small/source/common/unicode/resbund.h index 30fc2ac0ab235e..3965371729d814 100644 --- a/deps/icu-small/source/common/unicode/resbund.h +++ b/deps/icu-small/source/common/unicode/resbund.h @@ -209,8 +209,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return number of resources in a given resource. * @stable ICU 2.0 */ - int32_t - getSize(void) const; + int32_t getSize() const; /** * returns a string from a string resource type @@ -289,16 +288,14 @@ class U_COMMON_API ResourceBundle : public UObject { * @return true if there are more elements, false if there is no more elements * @stable ICU 2.0 */ - UBool - hasNext(void) const; + UBool hasNext() const; /** * Resets the internal context of a resource so that iteration starts from the first element. * * @stable ICU 2.0 */ - void - resetIterator(void); + void resetIterator(); /** * Returns the key associated with this resource. Not all the resources have a key - only @@ -307,8 +304,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a key associated to this resource, or nullptr if it doesn't have a key * @stable ICU 2.0 */ - const char* - getKey(void) const; + const char* getKey() const; /** * Gets the locale ID of the resource bundle as a string. @@ -317,9 +313,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return the locale ID of the resource bundle as a string * @stable ICU 2.0 */ - const char* - getName(void) const; - + const char* getName() const; /** * Returns the type of a resource. Available types are defined in enum UResType @@ -327,8 +321,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return type of the given resource. * @stable ICU 2.0 */ - UResType - getType(void) const; + UResType getType() const; /** * Returns the next resource in a given resource or nullptr if there are no more resources @@ -424,8 +417,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @see getVersion * @deprecated ICU 2.8 Use getVersion instead. */ - const char* - getVersionNumber(void) const; + const char* getVersionNumber() const; #endif /* U_HIDE_DEPRECATED_API */ /** @@ -445,8 +437,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a Locale object * @deprecated ICU 2.8 Use getLocale(ULocDataLocaleType type, UErrorCode &status) overload instead. */ - const Locale& - getLocale(void) const; + const Locale& getLocale() const; #endif /* U_HIDE_DEPRECATED_API */ /** diff --git a/deps/icu-small/source/common/unicode/schriter.h b/deps/icu-small/source/common/unicode/schriter.h index a2ab17982d1010..96f03604ade53a 100644 --- a/deps/icu-small/source/common/unicode/schriter.h +++ b/deps/icu-small/source/common/unicode/schriter.h @@ -156,14 +156,14 @@ class U_COMMON_API StringCharacterIterator : public UCharCharacterIterator { * @return a class ID for this object. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; /** * Return a class ID for this class (not really public) * @return a class ID for this class * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); protected: /** diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 7f58106fadb3b7..33bdd6d48fc84c 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -25,11 +25,9 @@ U_NAMESPACE_BEGIN // Forward declaration: -namespace number { -namespace impl { +namespace number::impl { class SimpleModifier; } -} /** * Formats simple patterns like "{1} was born in {0}". diff --git a/deps/icu-small/source/common/unicode/stringpiece.h b/deps/icu-small/source/common/unicode/stringpiece.h index df7f36089dd7c5..6f2a50eafca537 100644 --- a/deps/icu-small/source/common/unicode/stringpiece.h +++ b/deps/icu-small/source/common/unicode/stringpiece.h @@ -130,13 +130,13 @@ class U_COMMON_API StringPiece : public UMemory { * @stable ICU 65 */ template ::value + typename = std::enable_if_t< + (std::is_same_v #if defined(__cpp_char8_t) - || std::is_same::value + || std::is_same_v #endif ) && - std::is_same::value>::type> + std::is_same_v>> StringPiece(T str) : ptr_(reinterpret_cast(str.data())), length_(static_cast(str.size())) {} diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index 7470891338aa66..4572230d9fe229 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -25,6 +25,7 @@ #ifndef UCHAR_H #define UCHAR_H +#include #include "unicode/utypes.h" #include "unicode/stringoptions.h" #include "unicode/ucpmap.h" @@ -668,12 +669,21 @@ typedef enum UProperty { * @stable ICU 63 */ UCHAR_VERTICAL_ORIENTATION=0x1018, +#ifndef U_HIDE_DRAFT_API + /** + * Enumerated property Identifier_Status. + * Used for UTS #39 General Security Profile for Identifiers + * (https://www.unicode.org/reports/tr39/#General_Security_Profile). + * @draft ICU 75 + */ + UCHAR_IDENTIFIER_STATUS=0x1019, +#endif // U_HIDE_DRAFT_API #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for enumerated/integer Unicode properties. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UCHAR_INT_LIMIT=0x1019, + UCHAR_INT_LIMIT=0x101A, #endif // U_HIDE_DEPRECATED_API /** Bitmask property General_Category_Mask. @@ -774,12 +784,28 @@ typedef enum UProperty { UCHAR_SCRIPT_EXTENSIONS=0x7000, /** First constant for Unicode properties with unusual value types. @stable ICU 4.6 */ UCHAR_OTHER_PROPERTY_START=UCHAR_SCRIPT_EXTENSIONS, +#ifndef U_HIDE_DRAFT_API + /** + * Miscellaneous property Identifier_Type. + * Used for UTS #39 General Security Profile for Identifiers + * (https://www.unicode.org/reports/tr39/#General_Security_Profile). + * + * Corresponds to u_hasIDType() and u_getIDTypes(). + * + * Each code point maps to a set of UIdentifierType values. + * + * @see u_hasIDType + * @see u_getIDTypes + * @draft ICU 75 + */ + UCHAR_IDENTIFIER_TYPE=0x7001, +#endif // U_HIDE_DRAFT_API #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for Unicode properties with unusual value types. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UCHAR_OTHER_PROPERTY_LIMIT=0x7001, + UCHAR_OTHER_PROPERTY_LIMIT=0x7002, #endif // U_HIDE_DEPRECATED_API /** Represents a nonexistent or invalid property or property value. @stable ICU 2.4 */ @@ -2701,6 +2727,68 @@ typedef enum UVerticalOrientation { U_VO_UPRIGHT, } UVerticalOrientation; +#ifndef U_HIDE_DRAFT_API +/** + * Identifier Status constants. + * See https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type. + * + * @see UCHAR_IDENTIFIER_STATUS + * @draft ICU 75 + */ +typedef enum UIdentifierStatus { + /* + * Note: UIdentifierStatus constants are parsed by preparseucd.py. + * It matches lines like + * U_ID_STATUS_ + */ + + /** @draft ICU 75 */ + U_ID_STATUS_RESTRICTED, + /** @draft ICU 75 */ + U_ID_STATUS_ALLOWED, +} UIdentifierStatus; + +/** + * Identifier Type constants. + * See https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type. + * + * @see UCHAR_IDENTIFIER_TYPE + * @draft ICU 75 + */ +typedef enum UIdentifierType { + /* + * Note: UIdentifierType constants are parsed by preparseucd.py. + * It matches lines like + * U_ID_TYPE_ + */ + + /** @draft ICU 75 */ + U_ID_TYPE_NOT_CHARACTER, + /** @draft ICU 75 */ + U_ID_TYPE_DEPRECATED, + /** @draft ICU 75 */ + U_ID_TYPE_DEFAULT_IGNORABLE, + /** @draft ICU 75 */ + U_ID_TYPE_NOT_NFKC, + /** @draft ICU 75 */ + U_ID_TYPE_NOT_XID, + /** @draft ICU 75 */ + U_ID_TYPE_EXCLUSION, + /** @draft ICU 75 */ + U_ID_TYPE_OBSOLETE, + /** @draft ICU 75 */ + U_ID_TYPE_TECHNICAL, + /** @draft ICU 75 */ + U_ID_TYPE_UNCOMMON_USE, + /** @draft ICU 75 */ + U_ID_TYPE_LIMITED_USE, + /** @draft ICU 75 */ + U_ID_TYPE_INCLUSION, + /** @draft ICU 75 */ + U_ID_TYPE_RECOMMENDED, +} UIdentifierType; +#endif // U_HIDE_DRAFT_API + /** * Check a binary Unicode property for a code point. * @@ -3905,6 +3993,59 @@ u_isIDStart(UChar32 c); U_CAPI UBool U_EXPORT2 u_isIDPart(UChar32 c); +#ifndef U_HIDE_DRAFT_API +/** + * Does the set of Identifier_Type values code point c contain the given type? + * + * Used for UTS #39 General Security Profile for Identifiers + * (https://www.unicode.org/reports/tr39/#General_Security_Profile). + * + * Each code point maps to a set of UIdentifierType values. + * + * @param c code point + * @param type Identifier_Type to check + * @return true if type is in Identifier_Type(c) + * @draft ICU 75 + */ +U_CAPI bool U_EXPORT2 +u_hasIDType(UChar32 c, UIdentifierType type); + +/** + * Writes code point c's Identifier_Type as a list of UIdentifierType values + * to the output types array and returns the number of types. + * + * Used for UTS #39 General Security Profile for Identifiers + * (https://www.unicode.org/reports/tr39/#General_Security_Profile). + * + * Each code point maps to a set of UIdentifierType values. + * There is always at least one type. + * The order of output values is undefined. + * Each type is output at most once; + * there cannot be more output values than UIdentifierType constants. + * In addition, only some of the types can be combined with others, + * and usually only a small number of types occur together. + * Future versions might add additional types. + * See UTS #39 and its data files for details. + * + * If there are more than capacity types to be written, then + * U_BUFFER_OVERFLOW_ERROR is set and the number of types is returned. + * (Usual ICU buffer handling behavior.) + * + * @param c code point + * @param types output array + * @param capacity capacity of the array + * @param pErrorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return number of values in c's Identifier_Type, + * written to types unless U_BUFFER_OVERFLOW_ERROR indicates insufficient capacity + * @draft ICU 75 + */ +U_CAPI int32_t U_EXPORT2 +u_getIDTypes(UChar32 c, UIdentifierType *types, int32_t capacity, UErrorCode *pErrorCode); +#endif // U_HIDE_DRAFT_API + /** * Determines if the specified character should be regarded * as an ignorable character in an identifier, diff --git a/deps/icu-small/source/common/unicode/uchriter.h b/deps/icu-small/source/common/unicode/uchriter.h index 9fae5e7de08fee..bd2f29877b9944 100644 --- a/deps/icu-small/source/common/unicode/uchriter.h +++ b/deps/icu-small/source/common/unicode/uchriter.h @@ -126,7 +126,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the hash code. * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const override; + virtual int32_t hashCode() const override; /** * Returns a new UCharCharacterIterator referring to the same @@ -144,7 +144,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code unit in its iteration range. * @stable ICU 2.0 */ - virtual char16_t first(void) override; + virtual char16_t first() override; /** * Sets the iterator to refer to the first code unit in its @@ -154,7 +154,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code unit in its iteration range * @stable ICU 2.0 */ - virtual char16_t firstPostInc(void) override; + virtual char16_t firstPostInc() override; /** * Sets the iterator to refer to the first code point in its @@ -165,7 +165,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code point in its iteration range * @stable ICU 2.0 */ - virtual UChar32 first32(void) override; + virtual UChar32 first32() override; /** * Sets the iterator to refer to the first code point in its @@ -175,7 +175,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code point in its iteration range. * @stable ICU 2.0 */ - virtual UChar32 first32PostInc(void) override; + virtual UChar32 first32PostInc() override; /** * Sets the iterator to refer to the last code unit in its @@ -184,7 +184,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the last code unit in its iteration range. * @stable ICU 2.0 */ - virtual char16_t last(void) override; + virtual char16_t last() override; /** * Sets the iterator to refer to the last code point in its @@ -193,7 +193,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the last code point in its iteration range. * @stable ICU 2.0 */ - virtual UChar32 last32(void) override; + virtual UChar32 last32() override; /** * Sets the iterator to refer to the "position"-th code unit @@ -223,14 +223,14 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the code unit the iterator currently refers to. * @stable ICU 2.0 */ - virtual char16_t current(void) const override; + virtual char16_t current() const override; /** * Returns the code point the iterator currently refers to. * @return the code point the iterator currently refers to. * @stable ICU 2.0 */ - virtual UChar32 current32(void) const override; + virtual UChar32 current32() const override; /** * Advances to the next code unit in the iteration range (toward @@ -239,7 +239,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the next code unit in the iteration range. * @stable ICU 2.0 */ - virtual char16_t next(void) override; + virtual char16_t next() override; /** * Gets the current code unit for returning and advances to the next code unit @@ -249,7 +249,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the current code unit. * @stable ICU 2.0 */ - virtual char16_t nextPostInc(void) override; + virtual char16_t nextPostInc() override; /** * Advances to the next code point in the iteration range (toward @@ -261,7 +261,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the next code point in the iteration range. * @stable ICU 2.0 */ - virtual UChar32 next32(void) override; + virtual UChar32 next32() override; /** * Gets the current code point for returning and advances to the next code point @@ -271,7 +271,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the current point. * @stable ICU 2.0 */ - virtual UChar32 next32PostInc(void) override; + virtual UChar32 next32PostInc() override; /** * Returns false if there are no more code units or code points @@ -291,7 +291,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the previous code unit in the iteration range. * @stable ICU 2.0 */ - virtual char16_t previous(void) override; + virtual char16_t previous() override; /** * Advances to the previous code point in the iteration range (toward @@ -300,7 +300,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the previous code point in the iteration range. * @stable ICU 2.0 */ - virtual UChar32 previous32(void) override; + virtual UChar32 previous32() override; /** * Returns false if there are no more code units or code points @@ -363,14 +363,14 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return a class ID for this class * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Return a class ID for this object (not really public) * @return a class ID for this object. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; protected: /** diff --git a/deps/icu-small/source/common/unicode/ucnv.h b/deps/icu-small/source/common/unicode/ucnv.h index 20c173b662832d..4a7972c95b7574 100644 --- a/deps/icu-small/source/common/unicode/ucnv.h +++ b/deps/icu-small/source/common/unicode/ucnv.h @@ -344,8 +344,6 @@ ucnv_compareNames(const char *name1, const char *name2); * other than its an alias starting with the letters "cp". Please do not * associate any meaning to these aliases.

* - * \snippet samples/ucnv/convsamp.cpp ucnv_open - * * @param converterName Name of the coded character set table. * This may have options appended to the string. * IANA alias character set names, IBM CCSIDs starting with "ibm-", @@ -1986,7 +1984,6 @@ ucnv_usesFallback(const UConverter *cnv); * instead of the input signature bytes. *

* Usage: - * \snippet samples/ucnv/convsamp.cpp ucnv_detectUnicodeSignature * * @param source The source string in which the signature should be detected. * @param sourceLength Length of the input string, or -1 if terminated with a NUL byte. diff --git a/deps/icu-small/source/common/unicode/uconfig.h b/deps/icu-small/source/common/unicode/uconfig.h index 3818ca02ef85d2..c0488d502bfc64 100644 --- a/deps/icu-small/source/common/unicode/uconfig.h +++ b/deps/icu-small/source/common/unicode/uconfig.h @@ -413,6 +413,17 @@ # define UCONFIG_NO_FORMATTING 0 #endif +/** + * \def UCONFIG_NO_MF2 + * This switch turns off the experimental MessageFormat 2.0 API. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ +#ifndef UCONFIG_NO_MF2 +# define UCONFIG_NO_MF2 0 +#endif + /** * \def UCONFIG_NO_TRANSLITERATION * This switch turns off transliteration. diff --git a/deps/icu-small/source/common/unicode/uloc.h b/deps/icu-small/source/common/unicode/uloc.h index 21179c1b628e1c..9cd7f5e1b0d610 100644 --- a/deps/icu-small/source/common/unicode/uloc.h +++ b/deps/icu-small/source/common/unicode/uloc.h @@ -399,6 +399,9 @@ uloc_setDefault(const char* localeID, /** * Gets the language code for the specified locale. * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * @param localeID the locale to get the ISO language code with * @param language the language code for localeID * @param languageCapacity the size of the language buffer to store the @@ -417,6 +420,9 @@ uloc_getLanguage(const char* localeID, /** * Gets the script code for the specified locale. * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * @param localeID the locale to get the ISO language code with * @param script the language code for localeID * @param scriptCapacity the size of the language buffer to store the @@ -435,6 +441,9 @@ uloc_getScript(const char* localeID, /** * Gets the country code for the specified locale. * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * @param localeID the locale to get the country code with * @param country the country code for localeID * @param countryCapacity the size of the country buffer to store the @@ -453,6 +462,9 @@ uloc_getCountry(const char* localeID, /** * Gets the variant code for the specified locale. * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * @param localeID the locale to get the variant code with * @param variant the variant code for localeID * @param variantCapacity the size of the variant buffer to store the @@ -471,6 +483,10 @@ uloc_getVariant(const char* localeID, /** * Gets the full name for the specified locale. + * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * Note: This has the effect of 'canonicalizing' the ICU locale ID to * a certain extent. Upper and lower case are set as needed. * It does NOT map aliased names in any way. @@ -1158,19 +1174,20 @@ uloc_getLocaleForLCID(uint32_t hostID, char *locale, int32_t localeCapacity, * * If localeID is already in the maximal form, or there is no data available * for maximization, it will be copied to the output buffer. For example, - * "und-Zzzz" cannot be maximized, since there is no reasonable maximization. + * "sh" cannot be maximized, since there is no reasonable maximization. * * Examples: * + * "und_Zzzz" maximizes to "en_Latn_US" + * * "en" maximizes to "en_Latn_US" * - * "de" maximizes to "de_Latn_US" + * "de" maximizes to "de_Latn_DE" * * "sr" maximizes to "sr_Cyrl_RS" * - * "sh" maximizes to "sr_Latn_RS" (Note this will not reverse.) + * "zh_Hani" maximizes to "zh_Hani_CN" * - * "zh_Hani" maximizes to "zh_Hans_CN" (Note this will not reverse.) * * @param localeID The locale to maximize * @param maximizedLocaleID The maximized locale diff --git a/deps/icu-small/source/common/unicode/ulocbuilder.h b/deps/icu-small/source/common/unicode/ulocbuilder.h index f2e98612f0a012..9b147292f49e8d 100644 --- a/deps/icu-small/source/common/unicode/ulocbuilder.h +++ b/deps/icu-small/source/common/unicode/ulocbuilder.h @@ -74,7 +74,7 @@ typedef struct ULocaleBuilder ULocaleBuilder; * @draft ICU 74 */ U_CAPI ULocaleBuilder* U_EXPORT2 -ulocbld_open(); +ulocbld_open(void); /** * Close the builder and destroy it's internal states. diff --git a/deps/icu-small/source/common/unicode/umachine.h b/deps/icu-small/source/common/unicode/umachine.h index 545abef5956964..c501b253b01936 100644 --- a/deps/icu-small/source/common/unicode/umachine.h +++ b/deps/icu-small/source/common/unicode/umachine.h @@ -370,22 +370,14 @@ typedef int8_t UBool; #if 1 // #if 1 is normal. UChar defaults to char16_t in C++. // For configuration testing of UChar=uint16_t temporarily change this to #if 0. - // The intltest Makefile #defines UCHAR_TYPE=char16_t, - // so we only #define it to uint16_t if it is undefined so far. -#elif !defined(UCHAR_TYPE) +#else # define UCHAR_TYPE uint16_t #endif -#if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \ - defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) - // Inside the ICU library code, never configurable. +#if defined(U_ALL_IMPLEMENTATION) || !defined(UCHAR_TYPE) typedef char16_t UChar; -#elif defined(UCHAR_TYPE) - typedef UCHAR_TYPE UChar; -#elif U_CPLUSPLUS_VERSION != 0 - typedef char16_t UChar; // C++ #else - typedef uint16_t UChar; // C + typedef UCHAR_TYPE UChar; #endif /** diff --git a/deps/icu-small/source/common/unicode/unifunct.h b/deps/icu-small/source/common/unicode/unifunct.h index 8751302494bcdb..4aeb0f5d7da530 100644 --- a/deps/icu-small/source/common/unicode/unifunct.h +++ b/deps/icu-small/source/common/unicode/unifunct.h @@ -83,7 +83,7 @@ class U_COMMON_API UnicodeFunctor : public UObject { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID polymorphically. This method @@ -100,7 +100,7 @@ class U_COMMON_API UnicodeFunctor : public UObject { * different class IDs. * @stable ICU 2.4 */ - virtual UClassID getDynamicClassID(void) const override = 0; + virtual UClassID getDynamicClassID() const override = 0; /** * Set the data object associated with this functor. The data diff --git a/deps/icu-small/source/common/unicode/uniset.h b/deps/icu-small/source/common/unicode/uniset.h index 84774d9f36ecf6..127e4ce063b364 100644 --- a/deps/icu-small/source/common/unicode/uniset.h +++ b/deps/icu-small/source/common/unicode/uniset.h @@ -333,7 +333,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see setToBogus() * @stable ICU 4.0 */ - inline UBool isBogus(void) const; + inline UBool isBogus() const; /** * Make this UnicodeSet object invalid. @@ -522,7 +522,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see Object#hashCode() * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const; + virtual int32_t hashCode() const; /** * Get a UnicodeSet pointer from a USet @@ -792,7 +792,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @stable ICU 2.0 * @see getRangeCount */ - virtual int32_t size(void) const; + virtual int32_t size() const; /** * Returns true if this set contains no elements. @@ -800,7 +800,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return true if this set contains no elements. * @stable ICU 2.0 */ - virtual UBool isEmpty(void) const; + virtual UBool isEmpty() const; /** * @return true if this set contains multi-character strings or the empty string. @@ -1394,7 +1394,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * A frozen set will not be modified. * @stable ICU 2.0 */ - virtual UnicodeSet& clear(void); + virtual UnicodeSet& clear(); /** * Close this set over the given attribute. For the attribute @@ -1440,7 +1440,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see #getRangeEnd * @stable ICU 2.4 */ - virtual int32_t getRangeCount(void) const; + virtual int32_t getRangeCount() const; /** * Iteration method that returns the first character in the @@ -1529,7 +1529,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Implement UnicodeFunctor API. @@ -1539,9 +1539,9 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * different class IDs. * @stable ICU 2.4 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; -private: + private: // Private API for the USet API @@ -1602,7 +1602,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { bool ensureBufferCapacity(int32_t newLen); - void swapBuffers(void); + void swapBuffers(); UBool allocateStrings(UErrorCode &status); int32_t stringsSize() const; diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index 4074e8d07b248e..a41e6358facd7d 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -1611,9 +1611,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline int32_t extract(int32_t start, - int32_t startLength, - char *target, - const char *codepage = 0) const; + int32_t startLength, + char* target, + const char* codepage = nullptr) const; /** * Copy the characters in the range @@ -1759,7 +1759,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see countChar32 * @stable ICU 2.0 */ - inline int32_t length(void) const; + inline int32_t length() const; /** * Count Unicode code points in the length char16_t code units of the string. @@ -1808,7 +1808,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return true if this string contains 0 characters, false otherwise. * @stable ICU 2.0 */ - inline UBool isEmpty(void) const; + inline UBool isEmpty() const; /** * Return the capacity of the internal buffer of the UnicodeString object. @@ -1819,7 +1819,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see getBuffer * @stable ICU 2.0 */ - inline int32_t getCapacity(void) const; + inline int32_t getCapacity() const; /* Other operations */ @@ -1828,7 +1828,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return The hash code of this UnicodeString. * @stable ICU 2.0 */ - inline int32_t hashCode(void) const; + inline int32_t hashCode() const; /** * Determine if this object contains a valid string. @@ -1842,8 +1842,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see setToBogus() * @stable ICU 2.0 */ - inline UBool isBogus(void) const; - + inline UBool isBogus() const; //======================================== // Write operations @@ -2624,8 +2623,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& trim(void); - + UnicodeString& trim(); /* Miscellaneous operations */ @@ -2634,7 +2632,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& reverse(void); + inline UnicodeString& reverse(); /** * Reverse the range [`start`, `start + length`) in @@ -2653,7 +2651,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString& toUpper(void); + UnicodeString& toUpper(); /** * Convert the characters in this to UPPER CASE following the conventions of @@ -2670,7 +2668,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString& toLower(void); + UnicodeString& toLower(); /** * Convert the characters in this to lower case following the conventions of @@ -3590,12 +3588,12 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length); // calculate hash code - int32_t doHashCode(void) const; + int32_t doHashCode() const; // get pointer to start of array // these do not check for kOpenGetBuffer, unlike the public getBuffer() function - inline char16_t* getArrayStart(void); - inline const char16_t* getArrayStart(void) const; + inline char16_t* getArrayStart(); + inline const char16_t* getArrayStart() const; inline UBool hasShortLength() const; inline int32_t getShortLength() const; @@ -3622,7 +3620,7 @@ class U_COMMON_API UnicodeString : public Replaceable UBool allocate(int32_t capacity); // release the array if owned - void releaseArray(void); + void releaseArray(); // turn a bogus string into an empty one void unBogus(); @@ -3684,10 +3682,10 @@ class U_COMMON_API UnicodeString : public Replaceable * Return false if memory could not be allocated. */ UBool cloneArrayIfNeeded(int32_t newCapacity = -1, - int32_t growCapacity = -1, - UBool doCopyArray = true, - int32_t **pBufferToDelete = 0, - UBool forceClone = false); + int32_t growCapacity = -1, + UBool doCopyArray = true, + int32_t** pBufferToDelete = nullptr, + UBool forceClone = false); /** * Common function for UnicodeString case mappings. @@ -3702,9 +3700,9 @@ class U_COMMON_API UnicodeString : public Replaceable UStringCaseMapper *stringCaseMapper); // ref counting - void addRef(void); - int32_t removeRef(void); - int32_t refCount(void) const; + void addRef(); + int32_t removeRef(); + int32_t refCount() const; // constants enum { @@ -4510,7 +4508,7 @@ UnicodeString::extract(int32_t start, { // This dstSize value will be checked explicitly - return extract(start, _length, dst, dst!=0 ? 0xffffffff : 0, codepage); + return extract(start, _length, dst, dst != nullptr ? 0xffffffff : 0, codepage); } #endif diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index 74f2cae510637d..c94592ec034864 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -272,6 +272,7 @@ #define u_getDataVersion U_ICU_ENTRY_POINT_RENAME(u_getDataVersion) #define u_getDefaultConverter U_ICU_ENTRY_POINT_RENAME(u_getDefaultConverter) #define u_getFC_NFKC_Closure U_ICU_ENTRY_POINT_RENAME(u_getFC_NFKC_Closure) +#define u_getIDTypes U_ICU_ENTRY_POINT_RENAME(u_getIDTypes) #define u_getISOComment U_ICU_ENTRY_POINT_RENAME(u_getISOComment) #define u_getIntPropertyMap U_ICU_ENTRY_POINT_RENAME(u_getIntPropertyMap) #define u_getIntPropertyMaxValue U_ICU_ENTRY_POINT_RENAME(u_getIntPropertyMaxValue) @@ -289,6 +290,7 @@ #define u_getVersion U_ICU_ENTRY_POINT_RENAME(u_getVersion) #define u_get_stdout U_ICU_ENTRY_POINT_RENAME(u_get_stdout) #define u_hasBinaryProperty U_ICU_ENTRY_POINT_RENAME(u_hasBinaryProperty) +#define u_hasIDType U_ICU_ENTRY_POINT_RENAME(u_hasIDType) #define u_init U_ICU_ENTRY_POINT_RENAME(u_init) #define u_isIDIgnorable U_ICU_ENTRY_POINT_RENAME(u_isIDIgnorable) #define u_isIDPart U_ICU_ENTRY_POINT_RENAME(u_isIDPart) @@ -1192,16 +1194,20 @@ #define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize) #define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag) #define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName) -#define ulocimp_getCountry U_ICU_ENTRY_POINT_RENAME(ulocimp_getCountry) #define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue) #define ulocimp_getKeywords U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywords) #define ulocimp_getKnownCanonicalizedLocaleForTest U_ICU_ENTRY_POINT_RENAME(ulocimp_getKnownCanonicalizedLocaleForTest) #define ulocimp_getLanguage U_ICU_ENTRY_POINT_RENAME(ulocimp_getLanguage) #define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName) +#define ulocimp_getParent U_ICU_ENTRY_POINT_RENAME(ulocimp_getParent) +#define ulocimp_getRegion U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegion) #define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData) #define ulocimp_getScript U_ICU_ENTRY_POINT_RENAME(ulocimp_getScript) +#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags) +#define ulocimp_getVariant U_ICU_ENTRY_POINT_RENAME(ulocimp_getVariant) #define ulocimp_isCanonicalizedLocaleForTest U_ICU_ENTRY_POINT_RENAME(ulocimp_isCanonicalizedLocaleForTest) #define ulocimp_minimizeSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_minimizeSubtags) +#define ulocimp_setKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_setKeywordValue) #define ulocimp_toBcpKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpKey) #define ulocimp_toBcpType U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpType) #define ulocimp_toLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_toLanguageTag) @@ -1800,6 +1806,7 @@ #define usnum_multiplyByPowerOfTen U_ICU_ENTRY_POINT_RENAME(usnum_multiplyByPowerOfTen) #define usnum_openForInt64 U_ICU_ENTRY_POINT_RENAME(usnum_openForInt64) #define usnum_roundTo U_ICU_ENTRY_POINT_RENAME(usnum_roundTo) +#define usnum_setMaximumIntegerDigits U_ICU_ENTRY_POINT_RENAME(usnum_setMaximumIntegerDigits) #define usnum_setMinimumFractionDigits U_ICU_ENTRY_POINT_RENAME(usnum_setMinimumFractionDigits) #define usnum_setMinimumIntegerDigits U_ICU_ENTRY_POINT_RENAME(usnum_setMinimumIntegerDigits) #define usnum_setSign U_ICU_ENTRY_POINT_RENAME(usnum_setSign) diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index dc97ab2ba56c17..2c9cee1bfa44ba 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -500,6 +500,9 @@ typedef enum UScriptCode { /** @stable ICU 72 */ USCRIPT_NAG_MUNDARI = 199,/* Nagm */ + /** @stable ICU 75 */ + USCRIPT_ARABIC_NASTALIQ = 200, /* Aran */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UScriptCode value. @@ -507,7 +510,7 @@ typedef enum UScriptCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - USCRIPT_CODE_LIMIT = 200 + USCRIPT_CODE_LIMIT = 201 #endif // U_HIDE_DEPRECATED_API } UScriptCode; diff --git a/deps/icu-small/source/common/unicode/uset.h b/deps/icu-small/source/common/unicode/uset.h index ee4e0036d2289b..cce95ce92120dd 100644 --- a/deps/icu-small/source/common/unicode/uset.h +++ b/deps/icu-small/source/common/unicode/uset.h @@ -109,7 +109,6 @@ enum { */ USET_ADD_CASE_MAPPINGS = 4, -#ifndef U_HIDE_DRAFT_API /** * Enable case insensitive matching. * Same as USET_CASE_INSENSITIVE but using only Simple_Case_Folding (scf) mappings, @@ -120,10 +119,9 @@ enum { * regular expression implementations where only Simple_Case_Folding mappings are used, * such as in ECMAScript (JavaScript) regular expressions. * - * @draft ICU 73 + * @stable ICU 73 */ USET_SIMPLE_CASE_INSENSITIVE = 6 -#endif // U_HIDE_DRAFT_API }; /** diff --git a/deps/icu-small/source/common/unicode/utypes.h b/deps/icu-small/source/common/unicode/utypes.h index f890d5d1dbbebf..6c7cc5134588ea 100644 --- a/deps/icu-small/source/common/unicode/utypes.h +++ b/deps/icu-small/source/common/unicode/utypes.h @@ -438,6 +438,7 @@ typedef enum UErrorCode { U_PLUGIN_CHANGED_LEVEL_WARNING = -120, /**< A plugin caused a level change. May not be an error, but later plugins may not load. */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UErrorCode warning value. @@ -568,12 +569,27 @@ typedef enum UErrorCode { U_FORMAT_INEXACT_ERROR, /**< Cannot format a number exactly and rounding mode is ROUND_UNNECESSARY @stable ICU 4.8 */ U_NUMBER_ARG_OUTOFBOUNDS_ERROR, /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @stable ICU 61 */ U_NUMBER_SKELETON_SYNTAX_ERROR, /**< The number skeleton passed to C++ NumberFormatter or C UNumberFormatter was invalid or contained a syntax error. @stable ICU 62 */ + + /* MessageFormat 2.0 errors */ + U_MF_UNRESOLVED_VARIABLE_ERROR, /**< A variable is referred to but not bound by any definition @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_SYNTAX_ERROR, /**< Includes all syntax errors @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_UNKNOWN_FUNCTION_ERROR, /**< An annotation refers to a function not defined by the standard or custom function registry @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_VARIANT_KEY_MISMATCH_ERROR, /**< In a match-construct, one or more variants had a different number of keys from the number of selectors @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_FORMATTING_ERROR, /**< Covers all runtime errors: for example, an internally inconsistent set of options. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_NONEXHAUSTIVE_PATTERN_ERROR, /**< In a match-construct, the variants do not cover all possible values @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_DUPLICATE_OPTION_NAME_ERROR, /**< In an annotation, the same option name appears more than once @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_SELECTOR_ERROR, /**< A selector function is applied to an operand of the wrong type @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_MISSING_SELECTOR_ANNOTATION_ERROR, /**< A selector expression evaluates to an unannotated operand. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_DUPLICATE_DECLARATION_ERROR, /**< The same variable is declared in more than one .local or .input declaration. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_OPERAND_MISMATCH_ERROR, /**< An operand provided to a function does not have the required form for that function @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_UNSUPPORTED_STATEMENT_ERROR, /**< A message includes a reserved statement. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_UNSUPPORTED_EXPRESSION_ERROR, /**< A message includes syntax reserved for future standardization or private implementation use. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal formatting API error code. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - U_FMT_PARSE_ERROR_LIMIT = 0x10114, + U_FMT_PARSE_ERROR_LIMIT = 0x10121, #endif // U_HIDE_DEPRECATED_API /* diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index 1cdf8912f94b6e..eb7c50f385605e 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -53,13 +53,13 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 74 +#define U_ICU_VERSION_MAJOR_NUM 75 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 2 +#define U_ICU_VERSION_MINOR_NUM 1 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -79,7 +79,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _74 +#define U_ICU_VERSION_SUFFIX _75 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -132,7 +132,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "74.2" +#define U_ICU_VERSION "75.1" /** * The current ICU library major version number as a string, for library name suffixes. @@ -145,13 +145,13 @@ * * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "74" +#define U_ICU_VERSION_SHORT "75" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "74.2" +#define U_ICU_DATA_VERSION "75.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unifunct.cpp b/deps/icu-small/source/common/unifunct.cpp index f3995b298d2c46..5e939cb67e3f1c 100644 --- a/deps/icu-small/source/common/unifunct.cpp +++ b/deps/icu-small/source/common/unifunct.cpp @@ -16,11 +16,11 @@ UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFunctor) UnicodeFunctor::~UnicodeFunctor() {} UnicodeMatcher* UnicodeFunctor::toMatcher() const { - return 0; + return nullptr; } UnicodeReplacer* UnicodeFunctor::toReplacer() const { - return 0; + return nullptr; } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index b3dbdf93c8858e..e6f880c9f261bc 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -106,7 +106,7 @@ uniset_getUnicode32Instance(UErrorCode &errorCode) { // caseCompare(), but they also make UnicodeSet work for simple patterns when // no Unicode properties data is available - when caseCompare() fails -static inline UBool +inline UBool isPerlOpen(const UnicodeString &pattern, int32_t pos) { char16_t c; return pattern.charAt(pos)==u'\\' && ((c=pattern.charAt(pos+1))==u'p' || c==u'P'); @@ -117,12 +117,12 @@ isPerlClose(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==u'}'; }*/ -static inline UBool +inline UBool isNameOpen(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==u'\\' && pattern.charAt(pos+1)==u'N'; } -static inline UBool +inline UBool isPOSIXOpen(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==u'[' && pattern.charAt(pos+1)==u':'; } @@ -226,14 +226,14 @@ namespace { class UnicodeSetPointer { UnicodeSet* p; public: - inline UnicodeSetPointer() : p(0) {} + inline UnicodeSetPointer() : p(nullptr) {} inline ~UnicodeSetPointer() { delete p; } inline UnicodeSet* pointer() { return p; } inline UBool allocate() { - if (p == 0) { + if (p == nullptr) { p = new UnicodeSet(); } - return p != 0; + return p != nullptr; } }; @@ -300,7 +300,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, UChar32 c = 0; UBool literal = false; - UnicodeSet* nested = 0; // alias - do not delete + UnicodeSet* nested = nullptr; // alias - do not delete // -------- Check for property pattern @@ -352,9 +352,9 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, continue; } } - } else if (symbols != 0) { + } else if (symbols != nullptr) { const UnicodeFunctor *m = symbols->lookupMatcher(c); - if (m != 0) { + if (m != nullptr) { const UnicodeSet *ms = dynamic_cast(m); if (ms == nullptr) { ec = U_MALFORMED_SET; @@ -390,7 +390,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, patLocal.append(op); } - if (nested == 0) { + if (nested == nullptr) { // lazy allocation if (!scratch.allocate()) { ec = U_MEMORY_ALLOCATION_ERROR; @@ -549,7 +549,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; UBool anchor = (c == u']' && !literal); - if (symbols == 0 && !anchor) { + if (symbols == nullptr && !anchor) { c = SymbolTable::SYMBOL_REF; chars.setPos(backup); break; // literal '$' @@ -657,16 +657,16 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, namespace { -static UBool numericValueFilter(UChar32 ch, void* context) { +UBool numericValueFilter(UChar32 ch, void* context) { return u_getNumericValue(ch) == *(double*)context; } -static UBool generalCategoryMaskFilter(UChar32 ch, void* context) { +UBool generalCategoryMaskFilter(UChar32 ch, void* context) { int32_t value = *(int32_t*)context; return (U_GET_GC_MASK((UChar32) ch) & value) != 0; } -static UBool versionFilter(UChar32 ch, void* context) { +UBool versionFilter(UChar32 ch, void* context) { static const UVersionInfo none = { 0, 0, 0, 0 }; UVersionInfo v; u_charAge(ch, v); @@ -679,15 +679,19 @@ typedef struct { int32_t value; } IntPropertyContext; -static UBool intPropertyFilter(UChar32 ch, void* context) { +UBool intPropertyFilter(UChar32 ch, void* context) { IntPropertyContext* c = (IntPropertyContext*)context; return u_getIntPropertyValue((UChar32) ch, c->prop) == c->value; } -static UBool scriptExtensionsFilter(UChar32 ch, void* context) { +UBool scriptExtensionsFilter(UChar32 ch, void* context) { return uscript_hasScript(ch, *(UScriptCode*)context); } +UBool idTypeFilter(UChar32 ch, void* context) { + return u_hasIDType(ch, *(UIdentifierType*)context); +} + } // namespace /** @@ -744,7 +748,7 @@ void UnicodeSet::applyFilter(UnicodeSet::Filter filter, namespace { -static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { +UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { /* Note: we use ' ' in compiler code page */ int32_t j = 0; char ch; @@ -782,6 +786,10 @@ UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); UScriptCode script = (UScriptCode)value; applyFilter(scriptExtensionsFilter, &script, inclusions, ec); + } else if (prop == UCHAR_IDENTIFIER_TYPE) { + const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); + UIdentifierType idType = (UIdentifierType)value; + applyFilter(idTypeFilter, &idType, inclusions, ec); } else if (0 <= prop && prop < UCHAR_BINARY_LIMIT) { if (value == 0 || value == 1) { const USet *set = u_getBinaryPropertySet(prop, &ec); @@ -915,6 +923,13 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, } // fall through to calling applyIntPropertyValue() break; + case UCHAR_IDENTIFIER_TYPE: + v = u_getPropertyValueEnum(p, vname.data()); + if (v == UCHAR_INVALID_CODE) { + FAIL(ec); + } + // fall through to calling applyIntPropertyValue() + break; default: // p is a non-binary, non-enumerated property that we // don't support (yet). diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index 04f01cfa16cde5..ce81138c2ca3f0 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -283,7 +283,7 @@ UnicodeString::UnicodeString(const char *src, int32_t length, EInvariant) { UnicodeString::UnicodeString(const char *codepageData) { fUnion.fFields.fLengthAndFlags = kShortString; - if(codepageData != 0) { + if (codepageData != nullptr) { setToUTF8(codepageData); } } @@ -291,7 +291,7 @@ UnicodeString::UnicodeString(const char *codepageData) { UnicodeString::UnicodeString(const char *codepageData, int32_t dataLength) { fUnion.fFields.fLengthAndFlags = kShortString; // if there's nothing to convert, do nothing - if(codepageData == 0 || dataLength == 0 || dataLength < -1) { + if (codepageData == nullptr || dataLength == 0 || dataLength < -1) { return; } if(dataLength == -1) { @@ -393,7 +393,7 @@ UnicodeString::allocate(int32_t capacity) { } } fUnion.fFields.fLengthAndFlags = kIsBogus; - fUnion.fFields.fArray = 0; + fUnion.fFields.fArray = nullptr; fUnion.fFields.fCapacity = 0; return false; } @@ -564,7 +564,7 @@ UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) { // if src is bogus, set ourselves to bogus // do not call setToBogus() here because fArray and flags are not consistent here fUnion.fFields.fLengthAndFlags = kIsBogus; - fUnion.fFields.fArray = 0; + fUnion.fFields.fArray = nullptr; fUnion.fFields.fCapacity = 0; break; } @@ -919,7 +919,7 @@ UnicodeString::extract(Char16Ptr dest, int32_t destCapacity, UErrorCode &errorCode) const { int32_t len = length(); if(U_SUCCESS(errorCode)) { - if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) { + if (isBogus() || destCapacity < 0 || (destCapacity > 0 && dest == nullptr)) { errorCode=U_ILLEGAL_ARGUMENT_ERROR; } else { const char16_t *array = getArrayStart(); @@ -986,7 +986,7 @@ int32_t UnicodeString::extract(int32_t start, int32_t len, char *target, uint32_t dstSize) const { // if the arguments are illegal, then do nothing - if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) { + if (/*dstSize < 0 || */(dstSize > 0 && target == nullptr)) { return 0; } return toUTF8(start, len, target, dstSize <= 0x7fffffff ? (int32_t)dstSize : 0x7fffffff); @@ -1071,7 +1071,7 @@ UnicodeString::indexOf(const char16_t *srcChars, int32_t start, int32_t length) const { - if(isBogus() || srcChars == 0 || srcStart < 0 || srcLength == 0) { + if (isBogus() || srcChars == nullptr || srcStart < 0 || srcLength == 0) { return -1; } @@ -1135,7 +1135,7 @@ UnicodeString::lastIndexOf(const char16_t *srcChars, int32_t start, int32_t length) const { - if(isBogus() || srcChars == 0 || srcStart < 0 || srcLength == 0) { + if (isBogus() || srcChars == nullptr || srcStart < 0 || srcLength == 0) { return -1; } @@ -1245,7 +1245,7 @@ UnicodeString::setToBogus() releaseArray(); fUnion.fFields.fLengthAndFlags = kIsBogus; - fUnion.fFields.fArray = 0; + fUnion.fFields.fArray = nullptr; fUnion.fFields.fCapacity = 0; } @@ -1488,7 +1488,7 @@ UnicodeString::doReplace(int32_t start, return doAppend(srcChars, srcStart, srcLength); } - if(srcChars == 0) { + if (srcChars == nullptr) { srcLength = 0; } else { // Perform all remaining operations relative to srcChars + srcStart. @@ -1537,7 +1537,7 @@ UnicodeString::doReplace(int32_t start, } // clone our array and allocate a bigger array if needed - int32_t *bufferToDelete = 0; + int32_t *bufferToDelete = nullptr; if(!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength), false, &bufferToDelete) ) { @@ -1607,41 +1607,58 @@ UnicodeString::doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcL int32_t oldLength = length(); int32_t newLength; - if (uprv_add32_overflow(oldLength, srcLength, &newLength)) { - setToBogus(); - return *this; - } - // Check for append onto ourself - const char16_t* oldArray = getArrayStart(); - if (isBufferWritable() && - oldArray < srcChars + srcLength && - srcChars < oldArray + oldLength) { - // Copy into a new UnicodeString and start over - UnicodeString copy(srcChars, srcLength); - if (copy.isBogus()) { + if (srcLength <= getCapacity() - oldLength && isBufferWritable()) { + newLength = oldLength + srcLength; + // Faster than a memmove + if (srcLength <= 4) { + char16_t *arr = getArrayStart(); + arr[oldLength] = srcChars[0]; + if (srcLength > 1) arr[oldLength+1] = srcChars[1]; + if (srcLength > 2) arr[oldLength+2] = srcChars[2]; + if (srcLength > 3) arr[oldLength+3] = srcChars[3]; + setLength(newLength); + return *this; + } + } else { + if (uprv_add32_overflow(oldLength, srcLength, &newLength)) { setToBogus(); return *this; } - return doAppend(copy.getArrayStart(), 0, srcLength); - } - - // optimize append() onto a large-enough, owned string - if((newLength <= getCapacity() && isBufferWritable()) || - cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) { - char16_t *newArray = getArrayStart(); - // Do not copy characters when - // char16_t *buffer=str.getAppendBuffer(...); - // is followed by - // str.append(buffer, length); - // or - // str.appendString(buffer, length) - // or similar. - if(srcChars != newArray + oldLength) { - us_arrayCopy(srcChars, 0, newArray, oldLength, srcLength); + + // Check for append onto ourself + const char16_t* oldArray = getArrayStart(); + if (isBufferWritable() && + oldArray < srcChars + srcLength && + srcChars < oldArray + oldLength) { + // Copy into a new UnicodeString and start over + UnicodeString copy(srcChars, srcLength); + if (copy.isBogus()) { + setToBogus(); + return *this; + } + return doAppend(copy.getArrayStart(), 0, srcLength); } - setLength(newLength); + + // optimize append() onto a large-enough, owned string + if (!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) { + return *this; + } + } + + char16_t *newArray = getArrayStart(); + // Do not copy characters when + // char16_t *buffer=str.getAppendBuffer(...); + // is followed by + // str.append(buffer, length); + // or + // str.appendString(buffer, length) + // or similar. + if(srcChars != newArray + oldLength) { + us_arrayCopy(srcChars, 0, newArray, oldLength, srcLength); } + setLength(newLength); + return *this; } @@ -1913,7 +1930,7 @@ UnicodeString::cloneArrayIfNeeded(int32_t newCapacity, // the array is refCounted; decrement and release if 0 u_atomic_int32_t *pRefCount = ((u_atomic_int32_t *)oldArray - 1); if(umtx_atomic_dec(pRefCount) == 0) { - if(pBufferToDelete == 0) { + if (pBufferToDelete == nullptr) { // Note: cast to (void *) is needed with MSVC, where u_atomic_int32_t // is defined as volatile. (Volatile has useful non-standard behavior // with this compiler.) diff --git a/deps/icu-small/source/common/unistr_case.cpp b/deps/icu-small/source/common/unistr_case.cpp index 57f307c203a511..b04d957bdcc992 100644 --- a/deps/icu-small/source/common/unistr_case.cpp +++ b/deps/icu-small/source/common/unistr_case.cpp @@ -193,7 +193,7 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER // This is very similar to how doReplace() keeps the old array pointer // and deletes the old array itself after it is done. // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array. - int32_t *bufferToDelete = 0; + int32_t *bufferToDelete = nullptr; if (!cloneArrayIfNeeded(newLength, newLength, false, &bufferToDelete, true)) { return *this; } diff --git a/deps/icu-small/source/common/unistr_cnv.cpp b/deps/icu-small/source/common/unistr_cnv.cpp index 2d649b2d511d6a..e300a79ce5175f 100644 --- a/deps/icu-small/source/common/unistr_cnv.cpp +++ b/deps/icu-small/source/common/unistr_cnv.cpp @@ -62,7 +62,7 @@ UnicodeString::UnicodeString(const char *codepageData, UnicodeString::UnicodeString(const char *codepageData, const char *codepage) { fUnion.fFields.fLengthAndFlags = kShortString; - if(codepageData != 0) { + if (codepageData != nullptr) { doCodepageCreate(codepageData, (int32_t)uprv_strlen(codepageData), codepage); } } @@ -71,7 +71,7 @@ UnicodeString::UnicodeString(const char *codepageData, int32_t dataLength, const char *codepage) { fUnion.fFields.fLengthAndFlags = kShortString; - if(codepageData != 0) { + if (codepageData != nullptr) { doCodepageCreate(codepageData, dataLength, codepage); } } @@ -92,7 +92,7 @@ UnicodeString::UnicodeString(const char *src, int32_t srcLength, srcLength=(int32_t)uprv_strlen(src); } if(srcLength>0) { - if(cnv!=0) { + if (cnv != nullptr) { // use the provided converter ucnv_resetToUnicode(cnv); doCodepageCreate(src, srcLength, cnv, errorCode); @@ -136,7 +136,7 @@ UnicodeString::extract(int32_t start, const char *codepage) const { // if the arguments are illegal, then do nothing - if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) { + if (/*dstSize < 0 || */(dstSize > 0 && target == nullptr)) { return 0; } @@ -171,7 +171,7 @@ UnicodeString::extract(int32_t start, // if the codepage is the default, use our cache // if it is an empty string, then use the "invariant character" conversion - if (codepage == 0) { + if (codepage == nullptr) { const char *defaultName = ucnv_getDefaultName(); if(UCNV_FAST_IS_UTF8(defaultName)) { return toUTF8(start, length, target, capacity); @@ -194,7 +194,7 @@ UnicodeString::extract(int32_t start, length = doExtract(start, length, target, capacity, converter, status); // close the converter - if (codepage == 0) { + if (codepage == nullptr) { u_releaseDefaultConverter(converter); } else { ucnv_close(converter); @@ -212,7 +212,7 @@ UnicodeString::extract(char *dest, int32_t destCapacity, return 0; } - if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) { + if (isBogus() || destCapacity < 0 || (destCapacity > 0 && dest == nullptr)) { errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -224,7 +224,7 @@ UnicodeString::extract(char *dest, int32_t destCapacity, // get the converter UBool isDefaultConverter; - if(cnv==0) { + if (cnv == nullptr) { isDefaultConverter=true; cnv=u_getDefaultConverter(&errorCode); if(U_FAILURE(errorCode)) { @@ -264,7 +264,7 @@ UnicodeString::doExtract(int32_t start, int32_t length, const char *destLimit; if(destCapacity==0) { - destLimit=dest=0; + destLimit=dest=nullptr; } else if(destCapacity==-1) { // Pin the limit to U_MAX_PTR if the "magic" destCapacity is used. destLimit=(char*)U_MAX_PTR(dest); @@ -275,7 +275,7 @@ UnicodeString::doExtract(int32_t start, int32_t length, } // perform the conversion - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, &errorCode); + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &errorCode); length=(int32_t)(dest-originalDest); // if an overflow occurs, then get the preflighting length @@ -286,7 +286,7 @@ UnicodeString::doExtract(int32_t start, int32_t length, do { dest=buffer; errorCode=U_ZERO_ERROR; - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, &errorCode); + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &errorCode); length+=(int32_t)(dest-buffer); } while(errorCode==U_BUFFER_OVERFLOW_ERROR); } @@ -300,7 +300,7 @@ UnicodeString::doCodepageCreate(const char *codepageData, const char *codepage) { // if there's nothing to convert, do nothing - if(codepageData == 0 || dataLength == 0 || dataLength < -1) { + if (codepageData == nullptr || dataLength == 0 || dataLength < -1) { return; } if(dataLength == -1) { @@ -313,14 +313,14 @@ UnicodeString::doCodepageCreate(const char *codepageData, // if the codepage is the default, use our cache // if it is an empty string, then use the "invariant character" conversion UConverter *converter; - if (codepage == 0) { + if (codepage == nullptr) { const char *defaultName = ucnv_getDefaultName(); if(UCNV_FAST_IS_UTF8(defaultName)) { setToUTF8(StringPiece(codepageData, dataLength)); return; } converter = u_getDefaultConverter(&status); - } else if(*codepage == 0) { + } else if (*codepage == 0) { // use the "invariant characters" conversion if(cloneArrayIfNeeded(dataLength, dataLength, false)) { u_charsToUChars(codepageData, getArrayStart(), dataLength); @@ -346,7 +346,7 @@ UnicodeString::doCodepageCreate(const char *codepageData, } // close the converter - if(codepage == 0) { + if (codepage == nullptr) { u_releaseDefaultConverter(converter); } else { ucnv_close(converter); @@ -390,7 +390,7 @@ UnicodeString::doCodepageCreate(const char *codepageData, array = getArrayStart(); myTarget = array + length(); ucnv_toUnicode(converter, &myTarget, array + getCapacity(), - &mySource, mySourceEnd, 0, true, &status); + &mySource, mySourceEnd, nullptr, true, &status); // update the conversion parameters setLength((int32_t)(myTarget - array)); diff --git a/deps/icu-small/source/common/unistr_props.cpp b/deps/icu-small/source/common/unistr_props.cpp index 3d05233bb9a083..e5bbb538640960 100644 --- a/deps/icu-small/source/common/unistr_props.cpp +++ b/deps/icu-small/source/common/unistr_props.cpp @@ -68,7 +68,7 @@ UnicodeString::trim() // move string forward over leading white space if(start > 0) { - doReplace(0, start, 0, 0, 0); + doReplace(0, start, nullptr, 0, 0); } return *this; diff --git a/deps/icu-small/source/common/unormcmp.cpp b/deps/icu-small/source/common/unormcmp.cpp index e11e716c8db6dd..028b28643c66b1 100644 --- a/deps/icu-small/source/common/unormcmp.cpp +++ b/deps/icu-small/source/common/unormcmp.cpp @@ -403,7 +403,7 @@ unorm_cmpEquivFold(const char16_t *s1, int32_t length1, } if( level1<2 && (options&_COMPARE_EQUIV) && - 0!=(p=nfcImpl->getDecomposition((UChar32)cp1, decomp1, length)) + nullptr != (p = nfcImpl->getDecomposition((UChar32)cp1, decomp1, length)) ) { /* cp1 decomposes into p[length] */ if(U_IS_SURROGATE(c1)) { @@ -444,7 +444,7 @@ unorm_cmpEquivFold(const char16_t *s1, int32_t length1, } if( level2<2 && (options&_COMPARE_EQUIV) && - 0!=(p=nfcImpl->getDecomposition((UChar32)cp2, decomp2, length)) + nullptr != (p = nfcImpl->getDecomposition((UChar32)cp2, decomp2, length)) ) { /* cp2 decomposes into p[length] */ if(U_IS_SURROGATE(c2)) { @@ -566,7 +566,7 @@ unorm_compare(const char16_t *s1, int32_t length1, if(U_FAILURE(*pErrorCode)) { return 0; } - if(s1==0 || length1<-1 || s2==0 || length2<-1) { + if (s1 == nullptr || length1 < -1 || s2 == nullptr || length2 < -1) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index 314fa6fb868069..c87eeff3810ec5 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -668,6 +668,11 @@ static int32_t layoutGetMaxValue(const IntProperty &/*prop*/, UProperty which) { } } +static int32_t getIDStatusValue(const IntProperty & /*prop*/, UChar32 c, UProperty /*which*/) { + uint32_t value = u_getUnicodeProperties(c, 2) >> UPROPS_2_ID_TYPE_SHIFT; + return value >= UPROPS_ID_TYPE_ALLOWED_MIN ? U_ID_STATUS_ALLOWED : U_ID_STATUS_RESTRICTED; +} + static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ /* * column, mask and shift values for int-value properties from u_getUnicodeProperties(). @@ -706,6 +711,7 @@ static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ { UPROPS_SRC_INPC, 0, 0, getInPC, layoutGetMaxValue }, { UPROPS_SRC_INSC, 0, 0, getInSC, layoutGetMaxValue }, { UPROPS_SRC_VO, 0, 0, getVo, layoutGetMaxValue }, + { UPROPS_SRC_PROPSVEC, 0, (int32_t)U_ID_STATUS_ALLOWED, getIDStatusValue, getMaxValueFromShift }, }; U_CAPI int32_t U_EXPORT2 @@ -800,6 +806,7 @@ uprops_getSource(UProperty which) { } else { switch(which) { case UCHAR_SCRIPT_EXTENSIONS: + case UCHAR_IDENTIFIER_TYPE: return UPROPS_SRC_PROPSVEC; default: return UPROPS_SRC_NONE; /* undefined */ @@ -853,6 +860,86 @@ uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *p } } +U_CAPI bool U_EXPORT2 +u_hasIDType(UChar32 c, UIdentifierType type) { + uint32_t typeIndex = type; // also guards against negative type integers + if (typeIndex >= UPRV_LENGTHOF(uprops_idTypeToEncoded)) { + return false; + } + uint32_t encodedType = uprops_idTypeToEncoded[typeIndex]; + uint32_t value = u_getUnicodeProperties(c, 2) >> UPROPS_2_ID_TYPE_SHIFT; + if ((encodedType & UPROPS_ID_TYPE_BIT) != 0) { + return value < UPROPS_ID_TYPE_FORBIDDEN && (value & encodedType) != 0; + } else { + return value == encodedType; + } +} + +namespace { + +void maybeAppendType(uint32_t value, uint32_t bit, UIdentifierType t, + UIdentifierType *types, int32_t &length, int32_t capacity) { + if ((value & bit) != 0) { + if (length < capacity) { + types[length] = t; + } + ++length; + } +} + +} // namespace + +U_CAPI int32_t U_EXPORT2 +u_getIDTypes(UChar32 c, UIdentifierType *types, int32_t capacity, UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { return 0; } + if (capacity < 0 || (capacity > 0 && types == nullptr)) { + *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + uint32_t value = u_getUnicodeProperties(c, 2) >> UPROPS_2_ID_TYPE_SHIFT; + if ((value & UPROPS_ID_TYPE_FORBIDDEN) == UPROPS_ID_TYPE_FORBIDDEN || + value == UPROPS_ID_TYPE_NOT_CHARACTER) { + // single value + if (capacity > 0) { + UIdentifierType t; + switch (value) { + case UPROPS_ID_TYPE_NOT_CHARACTER: t = U_ID_TYPE_NOT_CHARACTER; break; + case UPROPS_ID_TYPE_DEPRECATED: t = U_ID_TYPE_DEPRECATED; break; + case UPROPS_ID_TYPE_DEFAULT_IGNORABLE: t = U_ID_TYPE_DEFAULT_IGNORABLE; break; + case UPROPS_ID_TYPE_NOT_NFKC: t = U_ID_TYPE_NOT_NFKC; break; + case UPROPS_ID_TYPE_INCLUSION: t = U_ID_TYPE_INCLUSION; break; + case UPROPS_ID_TYPE_RECOMMENDED: t = U_ID_TYPE_RECOMMENDED; break; + default: + *pErrorCode = U_INVALID_FORMAT_ERROR; + return 0; + } + types[0] = t; + } else { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + } + return 1; + } else { + // one or more combinable bits + int32_t length = 0; + maybeAppendType(value, UPROPS_ID_TYPE_NOT_XID, U_ID_TYPE_NOT_XID, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_EXCLUSION, U_ID_TYPE_EXCLUSION, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_OBSOLETE, U_ID_TYPE_OBSOLETE, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_TECHNICAL, U_ID_TYPE_TECHNICAL, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_UNCOMMON_USE, U_ID_TYPE_UNCOMMON_USE, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_LIMITED_USE, U_ID_TYPE_LIMITED_USE, + types, length, capacity); + if (length >= capacity) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + } + return length; + } +} + #if !UCONFIG_NO_NORMALIZATION U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/common/uprops.h b/deps/icu-small/source/common/uprops.h index 80347eab5777f8..93120017f0fc67 100644 --- a/deps/icu-small/source/common/uprops.h +++ b/deps/icu-small/source/common/uprops.h @@ -224,23 +224,80 @@ enum { /* * Properties in vector word 2 * Bits - * 31..26 unused since ICU 70 added uemoji.icu; - * in ICU 57..69 stored emoji properties + * 31..26 ICU 75: Identifier_Type bit set + * ICU 70..74: unused + * ICU 57..69: emoji properties; moved to uemoji.icu in ICU 70 * 25..20 Line Break * 19..15 Sentence Break * 14..10 Word Break * 9.. 5 Grapheme Cluster Break * 4.. 0 Decomposition Type */ + +#ifdef __cplusplus + +// https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type +// The Identifier_Type maps each code point to a *set* of one or more values. +// Some can be combined with others, some can only occur alone. +// Exclusion & Limited_Use are combinable bits, but cannot occur together. +// We use this forbidden combination for enumerated values. +// We use 6 bits for all possible combinations. +// If more combinable values are added, then we need to use more bits. +// +// We do not store separate data for Identifier_Status: +// We can derive that from the encoded Identifier_Type via a simple range check. + +inline constexpr uint32_t UPROPS_2_ID_TYPE_MASK = 0xfc000000; +inline constexpr int32_t UPROPS_2_ID_TYPE_SHIFT = 26; + enum { - UPROPS_2_UNUSED_WAS_EXTENDED_PICTOGRAPHIC=26, // ICU 62..69 - UPROPS_2_UNUSED_WAS_EMOJI_COMPONENT, // ICU 60..69 - UPROPS_2_UNUSED_WAS_EMOJI, // ICU 57..69 - UPROPS_2_UNUSED_WAS_EMOJI_PRESENTATION, // ICU 57..69 - UPROPS_2_UNUSED_WAS_EMOJI_MODIFIER, // ICU 57..69 - UPROPS_2_UNUSED_WAS_EMOJI_MODIFIER_BASE // ICU 57..69 + // A high bit for use in idTypeToEncoded[] but not used in the data + UPROPS_ID_TYPE_BIT = 0x80, + + // Combinable bits + UPROPS_ID_TYPE_EXCLUSION = 0x20, + UPROPS_ID_TYPE_LIMITED_USE = 0x10, + UPROPS_ID_TYPE_UNCOMMON_USE = 8, + UPROPS_ID_TYPE_TECHNICAL = 4, + UPROPS_ID_TYPE_OBSOLETE = 2, + UPROPS_ID_TYPE_NOT_XID = 1, + + // Exclusive values + UPROPS_ID_TYPE_NOT_CHARACTER = 0, + + // Forbidden bit combination used for enumerating other exclusive values + UPROPS_ID_TYPE_FORBIDDEN = UPROPS_ID_TYPE_EXCLUSION | UPROPS_ID_TYPE_LIMITED_USE, // 0x30 + UPROPS_ID_TYPE_DEPRECATED = UPROPS_ID_TYPE_FORBIDDEN, // 0x30 + UPROPS_ID_TYPE_DEFAULT_IGNORABLE, // 0x31 + UPROPS_ID_TYPE_NOT_NFKC, // 0x32 + + UPROPS_ID_TYPE_ALLOWED_MIN = UPROPS_ID_TYPE_FORBIDDEN + 0xc, // 0x3c + UPROPS_ID_TYPE_INCLUSION = UPROPS_ID_TYPE_FORBIDDEN + 0xe, // 0x3e + UPROPS_ID_TYPE_RECOMMENDED = UPROPS_ID_TYPE_FORBIDDEN + 0xf, // 0x3f }; +/** + * Maps UIdentifierType to encoded bits. + * When UPROPS_ID_TYPE_BIT is set, then use "&" to test whether the value bit is set. + * When UPROPS_ID_TYPE_BIT is not set, then compare ("==") the array value with the data value. + */ +inline constexpr uint8_t uprops_idTypeToEncoded[] = { + UPROPS_ID_TYPE_NOT_CHARACTER, + UPROPS_ID_TYPE_DEPRECATED, + UPROPS_ID_TYPE_DEFAULT_IGNORABLE, + UPROPS_ID_TYPE_NOT_NFKC, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_NOT_XID, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_EXCLUSION, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_OBSOLETE, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_TECHNICAL, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_UNCOMMON_USE, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_LIMITED_USE, + UPROPS_ID_TYPE_INCLUSION, + UPROPS_ID_TYPE_RECOMMENDED +}; + +#endif // __cplusplus + #define UPROPS_LB_MASK 0x03f00000 #define UPROPS_LB_SHIFT 20 diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index 5aa1c5fa2f10cf..ea4327b31489af 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -94,8 +94,16 @@ static UBool chopLocale(char *name) { static UBool hasVariant(const char* localeID) { UErrorCode err = U_ZERO_ERROR; - int32_t variantLength = uloc_getVariant(localeID, nullptr, 0, &err); - return variantLength != 0; + CheckedArrayByteSink sink(nullptr, 0); + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + nullptr, + &sink, + nullptr, + err); + return sink.NumberOfBytesAppended() != 0; } // This file contains the tables for doing locale fallback, which are generated @@ -209,17 +217,11 @@ static bool getParentLocaleID(char *name, const char *origName, UResOpenType ope } UErrorCode err = U_ZERO_ERROR; - const char* tempNamePtr = name; - CharString language = ulocimp_getLanguage(tempNamePtr, &tempNamePtr, err); - if (*tempNamePtr == '_') { - ++tempNamePtr; - } - CharString script = ulocimp_getScript(tempNamePtr, &tempNamePtr, err); - if (*tempNamePtr == '_') { - ++tempNamePtr; - } - CharString region = ulocimp_getCountry(tempNamePtr, &tempNamePtr, err); - CharString workingLocale; + CharString language; + CharString script; + CharString region; + ulocimp_getSubtags(name, &language, &script, ®ion, nullptr, nullptr, err); + if (U_FAILURE(err)) { // hopefully this never happens... return chopLocale(name); @@ -238,13 +240,15 @@ static bool getParentLocaleID(char *name, const char *origName, UResOpenType ope } } + CharString workingLocale; + // if it's not in the parent locale table, figure out the fallback script algorithmically // (see CLDR-15265 for an explanation of the algorithm) if (!script.isEmpty() && !region.isEmpty()) { // if "name" has both script and region, is the script the default script? // - if so, remove it and keep the region // - if not, remove the region and keep the script - if (getDefaultScript(language, region) == script.toStringPiece()) { + if (getDefaultScript(language, region) == script) { workingLocale.append(language, err).append("_", err).append(region, err); } else { workingLocale.append(language, err).append("_", err).append(script, err); @@ -254,12 +258,9 @@ static bool getParentLocaleID(char *name, const char *origName, UResOpenType ope // - if yes, replace the region with the script from the original locale ID // - if no, replace the region with the default script for that language and region UErrorCode err = U_ZERO_ERROR; - tempNamePtr = origName; - CharString origNameLanguage = ulocimp_getLanguage(tempNamePtr, &tempNamePtr, err); - if (*tempNamePtr == '_') { - ++tempNamePtr; - } - CharString origNameScript = ulocimp_getScript(origName, nullptr, err); + CharString origNameLanguage; + CharString origNameScript; + ulocimp_getSubtags(origName, &origNameLanguage, &origNameScript, nullptr, nullptr, nullptr, err); if (!origNameScript.isEmpty()) { workingLocale.append(language, err).append("_", err).append(origNameScript, err); } else { @@ -272,7 +273,7 @@ static bool getParentLocaleID(char *name, const char *origName, UResOpenType ope // - if not, return false to continue up the chain // (we don't do this for other open types for the same reason we don't look things up in the parent // locale table for other open types-- see the reference to UTS #35 above) - if (openType != URES_OPEN_LOCALE_DEFAULT_ROOT || getDefaultScript(language, CharString()) == script.toStringPiece()) { + if (openType != URES_OPEN_LOCALE_DEFAULT_ROOT || getDefaultScript(language, CharString()) == script) { workingLocale.append(language, err); } else { return false; @@ -1708,7 +1709,7 @@ U_CAPI int32_t U_EXPORT2 ures_getSize(const UResourceBundle *resB) { static const char16_t* ures_getStringWithAlias(const UResourceBundle *resB, Resource r, int32_t sIndex, int32_t *len, UErrorCode *status) { if(RES_GET_TYPE(r) == URES_ALIAS) { - const char16_t* result = 0; + const char16_t* result = nullptr; UResourceBundle *tempRes = ures_getByIndex(resB, sIndex, nullptr, status); result = ures_getString(tempRes, len, status); ures_close(tempRes); @@ -2573,7 +2574,7 @@ U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB return res_getString({resB, key}, &dataEntry->fData, res, len); case URES_ALIAS: { - const char16_t* result = 0; + const char16_t* result = nullptr; UResourceBundle *tempRes = ures_getByKey(resB, inKey, nullptr, status); result = ures_getString(tempRes, len, status); ures_close(tempRes); @@ -2595,7 +2596,7 @@ U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB return res_getString({resB, key}, &resB->getResData(), res, len); case URES_ALIAS: { - const char16_t* result = 0; + const char16_t* result = nullptr; UResourceBundle *tempRes = ures_getByKey(resB, inKey, nullptr, status); result = ures_getString(tempRes, len, status); ures_close(tempRes); @@ -2717,11 +2718,7 @@ ures_openWithType(UResourceBundle *r, const char* path, const char* localeID, UResourceDataEntry *entry; if(openType != URES_OPEN_DIRECT) { /* first "canonicalize" the locale ID */ - CharString canonLocaleID; - { - CharStringByteSink sink(&canonLocaleID); - ulocimp_getBaseName(localeID, sink, status); - } + CharString canonLocaleID = ulocimp_getBaseName(localeID, *status); if(U_FAILURE(*status)) { *status = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; @@ -2952,7 +2949,7 @@ ures_loc_nextLocale(UEnumeration* en, UResourceBundle *k = nullptr; const char *result = nullptr; int32_t len = 0; - if(ures_hasNext(res) && (k = ures_getNextResource(res, &ctx->curr, status)) != 0) { + if (ures_hasNext(res) && (k = ures_getNextResource(res, &ctx->curr, status)) != nullptr) { result = ures_getKey(k); len = (int32_t)uprv_strlen(result); } @@ -3040,25 +3037,25 @@ static UBool isLocaleInList(UEnumeration *locEnum, const char *locToSearch, UErr static void getParentForFunctionalEquivalent(const char* localeID, UResourceBundle* res, UResourceBundle* bund1, - char* parent, - int32_t parentCapacity) { + CharString& parent) { // Get parent. // First check for a parent from %%Parent resource (Note that in resource trees // such as collation, data may have different parents than in parentLocales). UErrorCode subStatus = U_ZERO_ERROR; - parent[0] = '\0'; - if (res != NULL) { + parent.clear(); + if (res != nullptr) { ures_getByKey(res, "%%Parent", bund1, &subStatus); if (U_SUCCESS(subStatus)) { - int32_t parentLen = parentCapacity; - ures_getUTF8String(bund1, parent, &parentLen, true, &subStatus); + int32_t length16; + const char16_t* s16 = ures_getString(bund1, &length16, &subStatus); + parent.appendInvariantChars(s16, length16, subStatus); } } // If none there, use normal truncation parent - if (U_FAILURE(subStatus) || parent[0] == 0) { + if (U_FAILURE(subStatus) || parent.isEmpty()) { subStatus = U_ZERO_ERROR; - uloc_getParent(localeID, parent, parentCapacity, &subStatus); + parent = ulocimp_getParent(localeID, subStatus); } } @@ -3067,29 +3064,21 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, const char *path, const char *resName, const char *keyword, const char *locid, UBool *isAvailable, UBool omitDefault, UErrorCode *status) { - char defVal[1024] = ""; /* default value for given locale */ - char defLoc[1024] = ""; /* default value for given locale */ - CharString base; /* base locale */ - char found[1024] = ""; - char parent[1024] = ""; - char full[1024] = ""; + CharString defVal; /* default value for given locale */ + CharString defLoc; /* default value for given locale */ + CharString found; + CharString parent; + CharString full; UResourceBundle bund1, bund2; UResourceBundle *res = nullptr; UErrorCode subStatus = U_ZERO_ERROR; int32_t length = 0; if(U_FAILURE(*status)) return 0; - CharString kwVal; - { - CharStringByteSink sink(&kwVal); - ulocimp_getKeywordValue(locid, keyword, sink, &subStatus); - } + CharString kwVal = ulocimp_getKeywordValue(locid, keyword, subStatus); if(kwVal == DEFAULT_TAG) { kwVal.clear(); } - { - CharStringByteSink sink(&base); - ulocimp_getBaseName(locid, sink, &subStatus); - } + CharString base = ulocimp_getBaseName(locid, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "getFunctionalEquivalent: \"%s\" [%s=%s] in %s - %s\n", locid, keyword, kwVal.data(), base.data(), u_errorName(subStatus)); @@ -3097,14 +3086,14 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, ures_initStackObject(&bund1); ures_initStackObject(&bund2); - base.extract(parent, UPRV_LENGTHOF(parent), subStatus); - base.extract(found, UPRV_LENGTHOF(found), subStatus); + parent.copyFrom(base, subStatus); + found.copyFrom(base, subStatus); if(isAvailable) { UEnumeration *locEnum = ures_openAvailableLocales(path, &subStatus); *isAvailable = true; if (U_SUCCESS(subStatus)) { - *isAvailable = isLocaleInList(locEnum, parent, &subStatus); + *isAvailable = isLocaleInList(locEnum, parent.data(), &subStatus); } uenum_close(locEnum); } @@ -3116,7 +3105,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, do { subStatus = U_ZERO_ERROR; - res = ures_open(path, parent, &subStatus); + res = ures_open(path, parent.data(), &subStatus); if(((subStatus == U_USING_FALLBACK_WARNING) || (subStatus == U_USING_DEFAULT_WARNING)) && isAvailable) { @@ -3125,7 +3114,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, isAvailable = nullptr; /* only want to set this the first time around */ #if defined(URES_TREE_DEBUG) - fprintf(stderr, "%s;%s -> %s [%s]\n", path?path:"ICUDATA", parent, u_errorName(subStatus), ures_getLocale(res, &subStatus)); + fprintf(stderr, "%s;%s -> %s [%s]\n", path?path:"ICUDATA", parent.data(), u_errorName(subStatus), ures_getLocale(res, &subStatus)); #endif if(U_FAILURE(subStatus)) { *status = subStatus; @@ -3137,21 +3126,21 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, /* look for default item */ #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s : loaded default -> %s\n", - path?path:"ICUDATA", parent, u_errorName(subStatus)); + path?path:"ICUDATA", parent.data(), u_errorName(subStatus)); #endif defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); if(U_SUCCESS(subStatus) && defLen) { - u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); + defVal.clear().appendInvariantChars(defUstr, defLen, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> default %s=%s, %s\n", - path?path:"ICUDATA", parent, keyword, defVal, u_errorName(subStatus)); + path?path:"ICUDATA", parent.data(), keyword, defVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(defLoc, parent); + defLoc.copyFrom(parent, subStatus); if(kwVal.isEmpty()) { - kwVal.append(defVal, defLen, subStatus); + kwVal.append(defVal, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> kwVal = %s\n", - path?path:"ICUDATA", parent, keyword, kwVal.data()); + path?path:"ICUDATA", parent.data(), keyword, kwVal.data()); #endif } } @@ -3161,23 +3150,23 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, subStatus = U_ZERO_ERROR; if (res != nullptr) { - uprv_strcpy(found, ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus)); + found.clear().append(ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus), subStatus); } - if (uprv_strcmp(found, parent) != 0) { - uprv_strcpy(parent, found); + if (found != parent) { + parent.copyFrom(found, subStatus); } else { - getParentForFunctionalEquivalent(found,res,&bund1,parent,sizeof(parent)); + getParentForFunctionalEquivalent(found.data(),res,&bund1,parent); } ures_close(res); - } while(!defVal[0] && *found && uprv_strcmp(found, "root") != 0 && U_SUCCESS(*status)); + } while(defVal.isEmpty() && !found.isEmpty() && found != "root" && U_SUCCESS(*status)); /* Now, see if we can find the kwVal collator.. start the search over.. */ - base.extract(parent, UPRV_LENGTHOF(parent), subStatus); - base.extract(found, UPRV_LENGTHOF(found), subStatus); + parent.copyFrom(base, subStatus); + found.copyFrom(base, subStatus); do { - res = ures_open(path, parent, &subStatus); + res = ures_open(path, parent.data(), &subStatus); if((subStatus == U_USING_FALLBACK_WARNING) && isAvailable) { *isAvailable = false; } @@ -3185,7 +3174,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> %s (looking for %s)\n", - path?path:"ICUDATA", parent, u_errorName(subStatus), kwVal.data()); + path?path:"ICUDATA", parent.data(), u_errorName(subStatus), kwVal.data()); #endif if(U_FAILURE(subStatus)) { *status = subStatus; @@ -3202,86 +3191,85 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, if(subStatus == U_ZERO_ERROR) { #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> full0 %s=%s, %s\n", - path?path:"ICUDATA", parent, keyword, kwVal.data(), u_errorName(subStatus)); + path?path:"ICUDATA", parent.data(), keyword, kwVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(full, parent); - if(*full == 0) { - uprv_strcpy(full, "root"); + if (parent.isEmpty()) { + full.clear().append("root", subStatus); + } else { + full.copyFrom(parent, subStatus); } /* now, recalculate default kw if need be */ - if(uprv_strlen(defLoc) > uprv_strlen(full)) { + if(defLoc.length() > full.length()) { const char16_t *defUstr; int32_t defLen; /* look for default item */ #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> recalculating Default0\n", - path?path:"ICUDATA", full); + path?path:"ICUDATA", full.data()); #endif defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); if(U_SUCCESS(subStatus) && defLen) { - u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); + defVal.clear().appendInvariantChars(defUstr, defLen, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> default0 %s=%s, %s\n", - path?path:"ICUDATA", full, keyword, defVal, u_errorName(subStatus)); + path?path:"ICUDATA", full.data(), keyword, defVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(defLoc, full); + defLoc.copyFrom(full, subStatus); } } /* end of recalculate default KW */ #if defined(URES_TREE_DEBUG) else { - fprintf(stderr, "No trim0, %s <= %s\n", defLoc, full); + fprintf(stderr, "No trim0, %s <= %s\n", defLoc.data(), full.data()); } #endif } else { #if defined(URES_TREE_DEBUG) fprintf(stderr, "err=%s in %s looking for %s\n", - u_errorName(subStatus), parent, kwVal.data()); + u_errorName(subStatus), parent.data(), kwVal.data()); #endif } } } + subStatus = U_ZERO_ERROR; UBool haveFound = false; // At least for collations which may be aliased, we need to use the VALID locale // as the parent instead of just truncating, as long as the VALID locale is not // root and has a different language than the parent. Use of the VALID locale // here is similar to the procedure used at the end of the previous do-while loop // for all resource types. - if (res != NULL && uprv_strcmp(resName, "collations") == 0) { - subStatus = U_ZERO_ERROR; + if (res != nullptr && uprv_strcmp(resName, "collations") == 0) { const char *validLoc = ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus); - if (U_SUCCESS(subStatus) && validLoc != NULL && validLoc[0] != 0 && uprv_strcmp(validLoc, "root") != 0) { - char validLang[ULOC_LANG_CAPACITY]; - char parentLang[ULOC_LANG_CAPACITY]; - uloc_getLanguage(validLoc, validLang, ULOC_LANG_CAPACITY, &subStatus); - uloc_getLanguage(parent, parentLang, ULOC_LANG_CAPACITY, &subStatus); - if (U_SUCCESS(subStatus) && uprv_strcmp(validLang, parentLang) != 0) { + if (U_SUCCESS(subStatus) && validLoc != nullptr && validLoc[0] != 0 && uprv_strcmp(validLoc, "root") != 0) { + CharString validLang = ulocimp_getLanguage(validLoc, subStatus); + CharString parentLang = ulocimp_getLanguage(parent.data(), subStatus); + if (U_SUCCESS(subStatus) && validLang != parentLang) { // validLoc is not root and has a different language than parent, use it instead - uprv_strcpy(found, validLoc); + found.clear().append(validLoc, subStatus); haveFound = true; } } subStatus = U_ZERO_ERROR; } if (!haveFound) { - uprv_strcpy(found, parent); + found.copyFrom(parent, subStatus); } - getParentForFunctionalEquivalent(found,res,&bund1,parent,1023); + getParentForFunctionalEquivalent(found.data(),res,&bund1,parent); ures_close(res); subStatus = U_ZERO_ERROR; - } while(!full[0] && *found && U_SUCCESS(*status)); + } while(full.isEmpty() && !found.isEmpty() && U_SUCCESS(*status)); - if((full[0]==0) && kwVal != defVal) { + if(full.isEmpty() && kwVal != defVal) { #if defined(URES_TREE_DEBUG) - fprintf(stderr, "Failed to locate kw %s - try default %s\n", kwVal.data(), defVal); + fprintf(stderr, "Failed to locate kw %s - try default %s\n", kwVal.data(), defVal.data()); #endif kwVal.clear().append(defVal, subStatus); - base.extract(parent, UPRV_LENGTHOF(parent), subStatus); - base.extract(found, UPRV_LENGTHOF(found), subStatus); + parent.copyFrom(base, subStatus); + found.copyFrom(base, subStatus); do { /* search for 'default' named item */ - res = ures_open(path, parent, &subStatus); + res = ures_open(path, parent.data(), &subStatus); if((subStatus == U_USING_FALLBACK_WARNING) && isAvailable) { *isAvailable = false; } @@ -3289,7 +3277,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> %s (looking for default %s)\n", - path?path:"ICUDATA", parent, u_errorName(subStatus), kwVal.data()); + path?path:"ICUDATA", parent.data(), u_errorName(subStatus), kwVal.data()); #endif if(U_FAILURE(subStatus)) { *status = subStatus; @@ -3300,59 +3288,61 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, if(subStatus == U_ZERO_ERROR) { #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> full1 %s=%s, %s\n", path?path:"ICUDATA", - parent, keyword, kwVal.data(), u_errorName(subStatus)); + parent.data(), keyword, kwVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(full, parent); - if(*full == 0) { - uprv_strcpy(full, "root"); + if (parent.isEmpty()) { + full.clear().append("root", subStatus); + } else { + full.copyFrom(parent, subStatus); } /* now, recalculate default kw if need be */ - if(uprv_strlen(defLoc) > uprv_strlen(full)) { + if(defLoc.length() > full.length()) { const char16_t *defUstr; int32_t defLen; /* look for default item */ #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> recalculating Default1\n", - path?path:"ICUDATA", full); + path?path:"ICUDATA", full.data()); #endif defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); if(U_SUCCESS(subStatus) && defLen) { - u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); + defVal.clear().appendInvariantChars(defUstr, defLen, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> default %s=%s, %s\n", - path?path:"ICUDATA", full, keyword, defVal, u_errorName(subStatus)); + path?path:"ICUDATA", full.data(), keyword, defVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(defLoc, full); + defLoc.copyFrom(full, subStatus); } } /* end of recalculate default KW */ #if defined(URES_TREE_DEBUG) else { - fprintf(stderr, "No trim1, %s <= %s\n", defLoc, full); + fprintf(stderr, "No trim1, %s <= %s\n", defLoc.data(), full.data()); } #endif } } } - uprv_strcpy(found, parent); - getParentForFunctionalEquivalent(found,res,&bund1,parent,1023); + subStatus = U_ZERO_ERROR; + found.copyFrom(parent, subStatus); + getParentForFunctionalEquivalent(found.data(),res,&bund1,parent); ures_close(res); subStatus = U_ZERO_ERROR; - } while(!full[0] && *found && U_SUCCESS(*status)); + } while(full.isEmpty() && !found.isEmpty() && U_SUCCESS(*status)); } if(U_SUCCESS(*status)) { - if(!full[0]) { + if(full.isEmpty()) { #if defined(URES_TREE_DEBUG) fprintf(stderr, "Still could not load keyword %s=%s\n", keyword, kwVal.data()); #endif *status = U_MISSING_RESOURCE_ERROR; } else if(omitDefault) { #if defined(URES_TREE_DEBUG) - fprintf(stderr,"Trim? full=%s, defLoc=%s, found=%s\n", full, defLoc, found); + fprintf(stderr,"Trim? full=%s, defLoc=%s, found=%s\n", full.data(), defLoc.data(), found.data()); #endif - if(uprv_strlen(defLoc) <= uprv_strlen(full)) { + if(defLoc.length() <= full.length()) { /* found the keyword in a *child* of where the default tag was present. */ if(kwVal == defVal) { /* if the requested kw is default, */ /* and the default is in or in an ancestor of the current locale */ @@ -3363,17 +3353,19 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, } } } - uprv_strcpy(found, full); + found.copyFrom(full, subStatus); if(!kwVal.isEmpty()) { - uprv_strcat(found, "@"); - uprv_strcat(found, keyword); - uprv_strcat(found, "="); - uprv_strcat(found, kwVal.data()); + found + .append("@", subStatus) + .append(keyword, subStatus) + .append("=", subStatus) + .append(kwVal, subStatus); } else if(!omitDefault) { - uprv_strcat(found, "@"); - uprv_strcat(found, keyword); - uprv_strcat(found, "="); - uprv_strcat(found, defVal); + found + .append("@", subStatus) + .append(keyword, subStatus) + .append("=", subStatus) + .append(defVal, subStatus); } } /* we found the default locale - no need to repeat it.*/ @@ -3381,12 +3373,12 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, ures_close(&bund1); ures_close(&bund2); - length = (int32_t)uprv_strlen(found); + length = found.length(); if(U_SUCCESS(*status)) { int32_t copyLength = uprv_min(length, resultCapacity); if(copyLength>0) { - uprv_strncpy(result, found, copyLength); + found.extract(result, copyLength, subStatus); } if(length == 0) { *status = U_MISSING_RESOURCE_ERROR; @@ -3429,8 +3421,8 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) valuesBuf[0]=0; valuesBuf[1]=0; - - while((locale = uenum_next(locs, &locLen, status)) != 0) { + + while ((locale = uenum_next(locs, &locLen, status)) != nullptr) { UResourceBundle *bund = nullptr; UResourceBundle *subPtr = nullptr; UErrorCode subStatus = U_ZERO_ERROR; /* don't fail if a bundle is unopenable */ @@ -3454,8 +3446,8 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) bund = nullptr; continue; } - - while((subPtr = ures_getNextResource(&item,&subItem,&subStatus)) != 0 + + while ((subPtr = ures_getNextResource(&item, &subItem, &subStatus)) != nullptr && U_SUCCESS(subStatus)) { const char *k; int32_t i; diff --git a/deps/icu-small/source/common/uresdata.cpp b/deps/icu-small/source/common/uresdata.cpp index b219e40e218539..c38e75c65b27b9 100644 --- a/deps/icu-small/source/common/uresdata.cpp +++ b/deps/icu-small/source/common/uresdata.cpp @@ -571,7 +571,7 @@ const uint8_t *ResourceDataValue::getBinary(int32_t &length, UErrorCode &errorCo ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const { if(U_FAILURE(errorCode)) { - return ResourceArray(); + return {}; } const uint16_t *items16 = nullptr; const Resource *items32 = nullptr; @@ -590,14 +590,14 @@ ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const { break; default: errorCode = U_RESOURCE_TYPE_MISMATCH; - return ResourceArray(); + return {}; } return ResourceArray(items16, items32, length, fTraceInfo); } ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const { if(U_FAILURE(errorCode)) { - return ResourceTable(); + return {}; } const uint16_t *keys16 = nullptr; const int32_t *keys32 = nullptr; @@ -627,7 +627,7 @@ ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const { break; default: errorCode = U_RESOURCE_TYPE_MISMATCH; - return ResourceTable(); + return {}; } return ResourceTable(keys16, keys32, items16, items32, length, fTraceInfo); } diff --git a/deps/icu-small/source/common/uscript.cpp b/deps/icu-small/source/common/uscript.cpp index 3cc2b6675c9bd0..2e9012a982cd06 100644 --- a/deps/icu-small/source/common/uscript.cpp +++ b/deps/icu-small/source/common/uscript.cpp @@ -18,7 +18,6 @@ #include "unicode/uchar.h" #include "unicode/uscript.h" #include "unicode/uloc.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -57,33 +56,25 @@ setOneCode(UScriptCode script, UScriptCode *scripts, int32_t capacity, UErrorCod static int32_t getCodesFromLocale(const char *locale, UScriptCode *scripts, int32_t capacity, UErrorCode *err) { - UErrorCode internalErrorCode = U_ZERO_ERROR; - char lang[8] = {0}; - char script[8] = {0}; - int32_t scriptLength; - if(U_FAILURE(*err)) { return 0; } + if (U_FAILURE(*err)) { return 0; } + icu::CharString lang; + icu::CharString script; + ulocimp_getSubtags(locale, &lang, &script, nullptr, nullptr, nullptr, *err); + if (U_FAILURE(*err)) { return 0; } // Multi-script languages, equivalent to the LocaleScript data // that we used to load from locale resource bundles. - /*length = */ uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &internalErrorCode); - if(U_FAILURE(internalErrorCode) || internalErrorCode == U_STRING_NOT_TERMINATED_WARNING) { - return 0; - } - if(0 == uprv_strcmp(lang, "ja")) { + if (lang == "ja") { return setCodes(JAPANESE, UPRV_LENGTHOF(JAPANESE), scripts, capacity, err); } - if(0 == uprv_strcmp(lang, "ko")) { + if (lang == "ko") { return setCodes(KOREAN, UPRV_LENGTHOF(KOREAN), scripts, capacity, err); } - scriptLength = uloc_getScript(locale, script, UPRV_LENGTHOF(script), &internalErrorCode); - if(U_FAILURE(internalErrorCode) || internalErrorCode == U_STRING_NOT_TERMINATED_WARNING) { - return 0; - } - if(0 == uprv_strcmp(lang, "zh") && 0 == uprv_strcmp(script, "Hant")) { + if (lang == "zh" && script == "Hant") { return setCodes(HAN_BOPO, UPRV_LENGTHOF(HAN_BOPO), scripts, capacity, err); } // Explicit script code. - if(scriptLength != 0) { - UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script); + if (!script.isEmpty()) { + UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script.data()); if(scriptCode != USCRIPT_INVALID_CODE) { if(scriptCode == USCRIPT_SIMPLIFIED_HAN || scriptCode == USCRIPT_TRADITIONAL_HAN) { scriptCode = USCRIPT_HAN; @@ -140,11 +131,7 @@ uscript_getCode(const char* nameOrAbbrOrLocale, if(U_FAILURE(*err) || length != 0) { return length; } - icu::CharString likely; - { - icu::CharStringByteSink sink(&likely); - ulocimp_addLikelySubtags(nameOrAbbrOrLocale, sink, &internalErrorCode); - } + icu::CharString likely = ulocimp_addLikelySubtags(nameOrAbbrOrLocale, internalErrorCode); if(U_SUCCESS(internalErrorCode) && internalErrorCode != U_STRING_NOT_TERMINATED_WARNING) { length = getCodesFromLocale(likely.data(), fillIn, capacity, err); if(U_FAILURE(*err) || length != 0) { diff --git a/deps/icu-small/source/common/uset_props.cpp b/deps/icu-small/source/common/uset_props.cpp index 6f6e0c550f9366..c5efde1ff7f243 100644 --- a/deps/icu-small/source/common/uset_props.cpp +++ b/deps/icu-small/source/common/uset_props.cpp @@ -36,9 +36,9 @@ uset_openPattern(const char16_t* pattern, int32_t patternLength, UnicodeString pat(patternLength==-1, pattern, patternLength); UnicodeSet* set = new UnicodeSet(pat, *ec); /* test for nullptr */ - if(set == 0) { + if (set == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } if (U_FAILURE(*ec)) { @@ -56,9 +56,9 @@ uset_openPatternOptions(const char16_t* pattern, int32_t patternLength, UnicodeString pat(patternLength==-1, pattern, patternLength); UnicodeSet* set = new UnicodeSet(pat, options, nullptr, *ec); /* test for nullptr */ - if(set == 0) { + if (set == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } if (U_FAILURE(*ec)) { diff --git a/deps/icu-small/source/common/usprep.cpp b/deps/icu-small/source/common/usprep.cpp index fc9d0ac208f76a..22ab0c24ebb838 100644 --- a/deps/icu-small/source/common/usprep.cpp +++ b/deps/icu-small/source/common/usprep.cpp @@ -228,7 +228,7 @@ loadData(UStringPrepProfile* profile, const char* type, UErrorCode* errorCode) { /* load Unicode SPREP data from file */ - UTrie _sprepTrie={ 0,0,0,0,0,0,0 }; + UTrie _sprepTrie = {nullptr, nullptr, nullptr, 0, 0, 0, 0}; UDataMemory *dataMemory; const int32_t *p=nullptr; const uint8_t *pb; diff --git a/deps/icu-small/source/common/ustrcase.cpp b/deps/icu-small/source/common/ustrcase.cpp index e4aec8a1c73d0d..4c726d47db1258 100644 --- a/deps/icu-small/source/common/ustrcase.cpp +++ b/deps/icu-small/source/common/ustrcase.cpp @@ -1857,7 +1857,7 @@ u_strCaseCompare(const char16_t *s1, int32_t length1, uint32_t options, UErrorCode *pErrorCode) { /* argument checking */ - if(pErrorCode==0 || U_FAILURE(*pErrorCode)) { + if (pErrorCode == nullptr || U_FAILURE(*pErrorCode)) { return 0; } if(s1==nullptr || length1<-1 || s2==nullptr || length2<-1) { diff --git a/deps/icu-small/source/common/ustrenum.cpp b/deps/icu-small/source/common/ustrenum.cpp index a60b2208f683ed..f4fc5906ed7187 100644 --- a/deps/icu-small/source/common/ustrenum.cpp +++ b/deps/icu-small/source/common/ustrenum.cpp @@ -168,8 +168,8 @@ const char *UStringEnumeration::next(int32_t *resultLength, UErrorCode &status) const UnicodeString* UStringEnumeration::snext(UErrorCode& status) { int32_t length; const char16_t* str = uenum_unext(uenum, &length, &status); - if (str == 0 || U_FAILURE(status)) { - return 0; + if (str == nullptr || U_FAILURE(status)) { + return nullptr; } return &unistr.setTo(str, length); } @@ -360,7 +360,7 @@ U_CAPI UEnumeration* U_EXPORT2 uenum_openCharStringsEnumeration(const char* const strings[], int32_t count, UErrorCode* ec) { UCharStringEnumeration* result = nullptr; - if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != 0)) { + if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != nullptr)) { result = (UCharStringEnumeration*) uprv_malloc(sizeof(UCharStringEnumeration)); if (result == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; @@ -379,7 +379,7 @@ U_CAPI UEnumeration* U_EXPORT2 uenum_openUCharStringsEnumeration(const char16_t* const strings[], int32_t count, UErrorCode* ec) { UCharStringEnumeration* result = nullptr; - if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != 0)) { + if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != nullptr)) { result = (UCharStringEnumeration*) uprv_malloc(sizeof(UCharStringEnumeration)); if (result == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/util_props.cpp b/deps/icu-small/source/common/util_props.cpp index 5991769d0681fe..366a555eeebdb3 100644 --- a/deps/icu-small/source/common/util_props.cpp +++ b/deps/icu-small/source/common/util_props.cpp @@ -198,12 +198,11 @@ int32_t ICU_Utility::parseNumber(const UnicodeString& text, if (d < 0) { break; } - n = radix*n + d; - // ASSUME that when a 32-bit integer overflows it becomes - // negative. E.g., 214748364 * 10 + 8 => negative value. - if (n < 0) { + int64_t update = radix*static_cast(n) + d; + if (update > INT32_MAX) { return -1; } + n = static_cast(update); ++p; } if (p == pos) { diff --git a/deps/icu-small/source/common/utrie2.cpp b/deps/icu-small/source/common/utrie2.cpp index 74f91bc8139026..2c3488a4cd02fb 100644 --- a/deps/icu-small/source/common/utrie2.cpp +++ b/deps/icu-small/source/common/utrie2.cpp @@ -137,33 +137,33 @@ utrie2_openFromSerialized(UTrie2ValueBits valueBits, UTrie2 *trie; if(U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } if( length<=0 || (U_POINTER_MASK_LSB(data, 3)!=0) || valueBits<0 || UTRIE2_COUNT_VALUE_BITS<=valueBits ) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } /* enough data for a trie header? */ if(length<(int32_t)sizeof(UTrie2Header)) { *pErrorCode=U_INVALID_FORMAT_ERROR; - return 0; + return nullptr; } /* check the signature */ header=(const UTrie2Header *)data; if(header->signature!=UTRIE2_SIG) { *pErrorCode=U_INVALID_FORMAT_ERROR; - return 0; + return nullptr; } /* get the options */ if(valueBits!=(UTrie2ValueBits)(header->options&UTRIE2_OPTIONS_VALUE_BITS_MASK)) { *pErrorCode=U_INVALID_FORMAT_ERROR; - return 0; + return nullptr; } /* get the length values and offsets */ @@ -188,14 +188,14 @@ utrie2_openFromSerialized(UTrie2ValueBits valueBits, } if(lengthmemory=(uint32_t *)data; @@ -226,7 +226,7 @@ utrie2_openFromSerialized(UTrie2ValueBits valueBits, break; default: *pErrorCode=U_INVALID_FORMAT_ERROR; - return 0; + return nullptr; } if(pActualLength!=nullptr) { @@ -247,12 +247,12 @@ utrie2_openDummy(UTrie2ValueBits valueBits, int32_t dataMove; /* >0 if the data is moved to the end of the index array */ if(U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } if(valueBits<0 || UTRIE2_COUNT_VALUE_BITS<=valueBits) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } /* calculate the total length of the dummy trie data */ @@ -269,14 +269,14 @@ utrie2_openDummy(UTrie2ValueBits valueBits, trie=(UTrie2 *)uprv_malloc(sizeof(UTrie2)); if(trie==nullptr) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } uprv_memset(trie, 0, sizeof(UTrie2)); trie->memory=uprv_malloc(length); if(trie->memory==nullptr) { uprv_free(trie); *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } trie->length=length; trie->isMemoryOwned=true; @@ -364,7 +364,7 @@ utrie2_openDummy(UTrie2ValueBits valueBits, break; default: *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } return trie; diff --git a/deps/icu-small/source/common/utrie2_builder.cpp b/deps/icu-small/source/common/utrie2_builder.cpp index 1254e8cba682f8..02a62e3fd4d3df 100644 --- a/deps/icu-small/source/common/utrie2_builder.cpp +++ b/deps/icu-small/source/common/utrie2_builder.cpp @@ -131,7 +131,7 @@ utrie2_open(uint32_t initialValue, uint32_t errorValue, UErrorCode *pErrorCode) uprv_free(newTrie); uprv_free(data); *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } uprv_memset(trie, 0, sizeof(UTrie2)); @@ -880,8 +880,6 @@ utrie2_setRange32(UTrie2 *trie, fillBlock(newTrie->data+block, 0, rest, value, newTrie->initialValue, overwrite); } - - return; } /* compaction --------------------------------------------------------------- */ diff --git a/deps/icu-small/source/common/uts46.cpp b/deps/icu-small/source/common/uts46.cpp index 28f15f7175dde9..f0e1372422daee 100644 --- a/deps/icu-small/source/common/uts46.cpp +++ b/deps/icu-small/source/common/uts46.cpp @@ -18,16 +18,17 @@ #if !UCONFIG_NO_IDNA +#include "unicode/bytestream.h" #include "unicode/idna.h" #include "unicode/normalizer2.h" #include "unicode/uscript.h" #include "unicode/ustring.h" #include "unicode/utf16.h" +#include "bytesinkutil.h" #include "cmemory.h" #include "cstring.h" #include "punycode.h" #include "ubidi_props.h" -#include "ustr_imp.h" // Note about tests for UIDNA_ERROR_DOMAIN_NAME_TOO_LONG: // @@ -1425,11 +1426,14 @@ uidna_labelToASCII_UTF8(const UIDNA *idna, return 0; } StringPiece src(label, length<0 ? static_cast(uprv_strlen(label)) : length); - CheckedArrayByteSink sink(dest, capacity); - IDNAInfo info; - reinterpret_cast(idna)->labelToASCII_UTF8(src, sink, info, *pErrorCode); - idnaInfoToStruct(info, pInfo); - return u_terminateChars(dest, capacity, sink.NumberOfBytesAppended(), pErrorCode); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, capacity, + [&](ByteSink& sink, UErrorCode& status) { + IDNAInfo info; + reinterpret_cast(idna)->labelToASCII_UTF8(src, sink, info, status); + idnaInfoToStruct(info, pInfo); + }, + *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -1441,11 +1445,14 @@ uidna_labelToUnicodeUTF8(const UIDNA *idna, return 0; } StringPiece src(label, length<0 ? static_cast(uprv_strlen(label)) : length); - CheckedArrayByteSink sink(dest, capacity); - IDNAInfo info; - reinterpret_cast(idna)->labelToUnicodeUTF8(src, sink, info, *pErrorCode); - idnaInfoToStruct(info, pInfo); - return u_terminateChars(dest, capacity, sink.NumberOfBytesAppended(), pErrorCode); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, capacity, + [&](ByteSink& sink, UErrorCode& status) { + IDNAInfo info; + reinterpret_cast(idna)->labelToUnicodeUTF8(src, sink, info, status); + idnaInfoToStruct(info, pInfo); + }, + *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -1457,11 +1464,14 @@ uidna_nameToASCII_UTF8(const UIDNA *idna, return 0; } StringPiece src(name, length<0 ? static_cast(uprv_strlen(name)) : length); - CheckedArrayByteSink sink(dest, capacity); - IDNAInfo info; - reinterpret_cast(idna)->nameToASCII_UTF8(src, sink, info, *pErrorCode); - idnaInfoToStruct(info, pInfo); - return u_terminateChars(dest, capacity, sink.NumberOfBytesAppended(), pErrorCode); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, capacity, + [&](ByteSink& sink, UErrorCode& status) { + IDNAInfo info; + reinterpret_cast(idna)->nameToASCII_UTF8(src, sink, info, status); + idnaInfoToStruct(info, pInfo); + }, + *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -1473,11 +1483,14 @@ uidna_nameToUnicodeUTF8(const UIDNA *idna, return 0; } StringPiece src(name, length<0 ? static_cast(uprv_strlen(name)) : length); - CheckedArrayByteSink sink(dest, capacity); - IDNAInfo info; - reinterpret_cast(idna)->nameToUnicodeUTF8(src, sink, info, *pErrorCode); - idnaInfoToStruct(info, pInfo); - return u_terminateChars(dest, capacity, sink.NumberOfBytesAppended(), pErrorCode); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, capacity, + [&](ByteSink& sink, UErrorCode& status) { + IDNAInfo info; + reinterpret_cast(idna)->nameToUnicodeUTF8(src, sink, info, status); + idnaInfoToStruct(info, pInfo); + }, + *pErrorCode); } #endif // UCONFIG_NO_IDNA diff --git a/deps/icu-small/source/common/utypes.cpp b/deps/icu-small/source/common/utypes.cpp index 63e05b1249b6ff..715994d67f04dd 100644 --- a/deps/icu-small/source/common/utypes.cpp +++ b/deps/icu-small/source/common/utypes.cpp @@ -129,6 +129,19 @@ _uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = { "U_FORMAT_INEXACT_ERROR", "U_NUMBER_ARG_OUTOFBOUNDS_ERROR", "U_NUMBER_SKELETON_SYNTAX_ERROR", + "U_MF_UNRESOLVED_VARIABLE_ERROR", + "U_MF_SYNTAX_ERROR", + "U_MF_UNKNOWN_FUNCTION_ERROR", + "U_MF_VARIANT_KEY_MISMATCH_ERROR", + "U_MF_FORMATTING_ERROR", + "U_MF_NONEXHAUSTIVE_PATTERN_ERROR", + "U_MF_DUPLICATE_OPTION_NAME_ERROR", + "U_MF_SELECTOR_ERROR", + "U_MF_MISSING_SELECTOR_ANNOTATION_ERROR", + "U_MF_DUPLICATE_DECLARATION_ERROR", + "U_MF_OPERAND_MISMATCH_ERROR", + "U_MF_UNSUPPORTED_STATEMENT_ERROR", + "U_MF_UNSUPPORTED_EXPRESSION_ERROR" }; static const char * const diff --git a/deps/icu-small/source/common/uvector.cpp b/deps/icu-small/source/common/uvector.cpp index f93d73a3c69ebf..85c322cea75ab9 100644 --- a/deps/icu-small/source/common/uvector.cpp +++ b/deps/icu-small/source/common/uvector.cpp @@ -183,7 +183,7 @@ void UVector::insertElementAt(int32_t elem, int32_t index, UErrorCode &status) { } void* UVector::elementAt(int32_t index) const { - return (0 <= index && index < count) ? elements[index].pointer : 0; + return (0 <= index && index < count) ? elements[index].pointer : nullptr; } int32_t UVector::elementAti(int32_t index) const { diff --git a/deps/icu-small/source/common/uvectr32.cpp b/deps/icu-small/source/common/uvectr32.cpp index fb554729fe69e5..a2dc1bdbc9832f 100644 --- a/deps/icu-small/source/common/uvectr32.cpp +++ b/deps/icu-small/source/common/uvectr32.cpp @@ -39,7 +39,7 @@ UVector32::UVector32(int32_t initialCapacity, UErrorCode &status) : count(0), capacity(0), maxCapacity(0), - elements(0) + elements(nullptr) { _init(initialCapacity, status); } @@ -58,7 +58,7 @@ void UVector32::_init(int32_t initialCapacity, UErrorCode &status) { initialCapacity = uprv_min(DEFAULT_CAPACITY, maxCapacity); } elements = (int32_t *)uprv_malloc(sizeof(int32_t)*initialCapacity); - if (elements == 0) { + if (elements == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { capacity = initialCapacity; @@ -67,7 +67,7 @@ void UVector32::_init(int32_t initialCapacity, UErrorCode &status) { UVector32::~UVector32() { uprv_free(elements); - elements = 0; + elements = nullptr; } /** diff --git a/deps/icu-small/source/common/uvectr64.cpp b/deps/icu-small/source/common/uvectr64.cpp index 05559dd8337135..58b0b1f8b86a5a 100644 --- a/deps/icu-small/source/common/uvectr64.cpp +++ b/deps/icu-small/source/common/uvectr64.cpp @@ -36,7 +36,7 @@ UVector64::UVector64(int32_t initialCapacity, UErrorCode &status) : count(0), capacity(0), maxCapacity(0), - elements(0) + elements(nullptr) { _init(initialCapacity, status); } @@ -55,7 +55,7 @@ void UVector64::_init(int32_t initialCapacity, UErrorCode &status) { initialCapacity = uprv_min(DEFAULT_CAPACITY, maxCapacity); } elements = (int64_t *)uprv_malloc(sizeof(int64_t)*initialCapacity); - if (elements == 0) { + if (elements == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { capacity = initialCapacity; @@ -64,7 +64,7 @@ void UVector64::_init(int32_t initialCapacity, UErrorCode &status) { UVector64::~UVector64() { uprv_free(elements); - elements = 0; + elements = nullptr; } /** diff --git a/deps/icu-small/source/data/in/icudt74l.dat.bz2 b/deps/icu-small/source/data/in/icudt75l.dat.bz2 similarity index 57% rename from deps/icu-small/source/data/in/icudt74l.dat.bz2 rename to deps/icu-small/source/data/in/icudt75l.dat.bz2 index 67a0cf45606af3..c257cf22f696fe 100644 Binary files a/deps/icu-small/source/data/in/icudt74l.dat.bz2 and b/deps/icu-small/source/data/in/icudt75l.dat.bz2 differ diff --git a/deps/icu-small/source/i18n/astro.cpp b/deps/icu-small/source/i18n/astro.cpp index 575efeb17581a1..f91f6fe08978c9 100644 --- a/deps/icu-small/source/i18n/astro.cpp +++ b/deps/icu-small/source/i18n/astro.cpp @@ -242,7 +242,7 @@ inline static double normPI(double angle) { * @deprecated ICU 2.4. This class may be removed or modified. */ CalendarAstronomer::CalendarAstronomer(): - fTime(Calendar::getNow()), fLongitude(0.0), fLatitude(0.0), fGmtOffset(0.0), moonPosition(0,0), moonPositionSet(false) { + fTime(Calendar::getNow()), moonPosition(0,0), moonPositionSet(false) { clearCache(); } @@ -252,30 +252,7 @@ CalendarAstronomer::CalendarAstronomer(): * @internal * @deprecated ICU 2.4. This class may be removed or modified. */ -CalendarAstronomer::CalendarAstronomer(UDate d): fTime(d), fLongitude(0.0), fLatitude(0.0), fGmtOffset(0.0), moonPosition(0,0), moonPositionSet(false) { - clearCache(); -} - -/** - * Construct a new CalendarAstronomer object with the given - * latitude and longitude. The object's time is set to the current - * date and time. - *

- * @param longitude The desired longitude, in degrees east of - * the Greenwich meridian. - * - * @param latitude The desired latitude, in degrees. Positive - * values signify North, negative South. - * - * @see java.util.Date#getTime() - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::CalendarAstronomer(double longitude, double latitude) : - fTime(Calendar::getNow()), moonPosition(0,0), moonPositionSet(false) { - fLongitude = normPI(longitude * (double)DEG_RAD); - fLatitude = normPI(latitude * (double)DEG_RAD); - fGmtOffset = (double)(fLongitude * 24. * (double)HOUR_MS / (double)CalendarAstronomer_PI2); +CalendarAstronomer::CalendarAstronomer(UDate d): fTime(d), moonPosition(0,0), moonPositionSet(false) { clearCache(); } @@ -301,31 +278,9 @@ CalendarAstronomer::~CalendarAstronomer() */ void CalendarAstronomer::setTime(UDate aTime) { fTime = aTime; - U_DEBUG_ASTRO_MSG(("setTime(%.1lf, %sL)\n", aTime, debug_astro_date(aTime+fGmtOffset))); clearCache(); } -/** - * Set the current date and time of this CalendarAstronomer object. All - * astronomical calculations are performed based on this time setting. - * - * @param jdn the desired time, expressed as a "julian day number", - * which is the number of elapsed days since - * 1/1/4713 BC (Julian), 12:00 GMT. Note that julian day - * numbers start at noon. To get the jdn for - * the corresponding midnight, subtract 0.5. - * - * @see #getJulianDay - * @see #JULIAN_EPOCH_MS - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -void CalendarAstronomer::setJulianDay(double jdn) { - fTime = (double)(jdn * DAY_MS) + JULIAN_EPOCH_MS; - clearCache(); - julianDay = jdn; -} - /** * Get the current time of this CalendarAstronomer object, * represented as the number of milliseconds since @@ -357,97 +312,10 @@ double CalendarAstronomer::getJulianDay() { return julianDay; } -/** - * Return this object's time expressed in julian centuries: - * the number of centuries after 1/1/1900 AD, 12:00 GMT - * - * @see #getJulianDay - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::getJulianCentury() { - if (isINVALID(julianCentury)) { - julianCentury = (getJulianDay() - 2415020.0) / 36525.0; - } - return julianCentury; -} - -/** - * Returns the current Greenwich sidereal time, measured in hours - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::getGreenwichSidereal() { - if (isINVALID(siderealTime)) { - // See page 86 of "Practical Astronomy with your Calculator", - // by Peter Duffet-Smith, for details on the algorithm. - - double UT = normalize(fTime/(double)HOUR_MS, 24.); - - siderealTime = normalize(getSiderealOffset() + UT*1.002737909, 24.); - } - return siderealTime; -} - -double CalendarAstronomer::getSiderealOffset() { - if (isINVALID(siderealT0)) { - double JD = uprv_floor(getJulianDay() - 0.5) + 0.5; - double S = JD - 2451545.0; - double T = S / 36525.0; - siderealT0 = normalize(6.697374558 + 2400.051336*T + 0.000025862*T*T, 24); - } - return siderealT0; -} - -/** - * Returns the current local sidereal time, measured in hours - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::getLocalSidereal() { - return normalize(getGreenwichSidereal() + (fGmtOffset/(double)HOUR_MS), 24.); -} - -/** - * Converts local sidereal time to Universal Time. - * - * @param lst The Local Sidereal Time, in hours since sidereal midnight - * on this object's current date. - * - * @return The corresponding Universal Time, in milliseconds since - * 1 Jan 1970, GMT. - */ -double CalendarAstronomer::lstToUT(double lst) { - // Convert to local mean time - double lt = normalize((lst - getSiderealOffset()) * 0.9972695663, 24); - - // Then find local midnight on this day - double base = (DAY_MS * ClockMath::floorDivide(fTime + fGmtOffset,(double)DAY_MS)) - fGmtOffset; - - //out(" lt =" + lt + " hours"); - //out(" base=" + new Date(base)); - - return base + (long)(lt * HOUR_MS); -} - - //------------------------------------------------------------------------- // Coordinate transformations, all based on the current time of this object //------------------------------------------------------------------------- -/** - * Convert from ecliptic to equatorial coordinates. - * - * @param ecliptic A point in the sky in ecliptic coordinates. - * @return The corresponding point in equatorial coordinates. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(CalendarAstronomer::Equatorial& result, const CalendarAstronomer::Ecliptic& ecliptic) -{ - return eclipticToEquatorial(result, ecliptic.longitude, ecliptic.latitude); -} - /** * Convert from ecliptic to equatorial coordinates. * @@ -479,46 +347,6 @@ CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(Calenda return result; } -/** - * Convert from ecliptic longitude to equatorial coordinates. - * - * @param eclipLong The ecliptic longitude - * - * @return The corresponding point in equatorial coordinates. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(CalendarAstronomer::Equatorial& result, double eclipLong) -{ - return eclipticToEquatorial(result, eclipLong, 0); // TODO: optimize -} - -/** - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::Horizon& CalendarAstronomer::eclipticToHorizon(CalendarAstronomer::Horizon& result, double eclipLong) -{ - Equatorial equatorial; - eclipticToEquatorial(equatorial, eclipLong); - - double H = getLocalSidereal()*CalendarAstronomer::PI/12 - equatorial.ascension; // Hour-angle - - double sinH = ::sin(H); - double cosH = cos(H); - double sinD = ::sin(equatorial.declination); - double cosD = cos(equatorial.declination); - double sinL = ::sin(fLatitude); - double cosL = cos(fLatitude); - - double altitude = asin(sinD*sinL + cosD*cosL*cosH); - double azimuth = atan2(-cosD*cosL*sinH, sinD - sinL * ::sin(altitude)); - - result.set(azimuth, altitude); - return result; -} - - //------------------------------------------------------------------------- // The Sun //------------------------------------------------------------------------- @@ -657,50 +485,6 @@ double CalendarAstronomer::getSunLongitude() longitude = norm2PI(trueAnomaly(meanAnomaly, SUN_E) + SUN_OMEGA_G); } -/** - * The position of the sun at this object's current date and time, - * in equatorial coordinates. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::Equatorial& CalendarAstronomer::getSunPosition(CalendarAstronomer::Equatorial& result) { - return eclipticToEquatorial(result, getSunLongitude(), 0); -} - - -/** - * Constant representing the vernal equinox. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "vernal" refers to the northern hemisphere's seasons. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -/*double CalendarAstronomer::VERNAL_EQUINOX() { - return 0; -}*/ - -/** - * Constant representing the summer solstice. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "summer" refers to the northern hemisphere's seasons. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::SUMMER_SOLSTICE() { - return (CalendarAstronomer::PI/2); -} - -/** - * Constant representing the autumnal equinox. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "autumn" refers to the northern hemisphere's seasons. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -/*double CalendarAstronomer::AUTUMN_EQUINOX() { - return (CalendarAstronomer::PI); -}*/ - /** * Constant representing the winter solstice. * For use with {@link #getSunTime getSunTime}. @@ -738,310 +522,6 @@ UDate CalendarAstronomer::getSunTime(double desired, UBool next) next); } -CalendarAstronomer::CoordFunc::~CoordFunc() {} - -class RiseSetCoordFunc : public CalendarAstronomer::CoordFunc { -public: - virtual ~RiseSetCoordFunc(); - virtual void eval(CalendarAstronomer::Equatorial& result, CalendarAstronomer& a) override { a.getSunPosition(result); } -}; - -RiseSetCoordFunc::~RiseSetCoordFunc() {} - -UDate CalendarAstronomer::getSunRiseSet(UBool rise) -{ - UDate t0 = fTime; - - // Make a rough guess: 6am or 6pm local time on the current day - double noon = ClockMath::floorDivide(fTime + fGmtOffset, (double)DAY_MS)*DAY_MS - fGmtOffset + (12*HOUR_MS); - - U_DEBUG_ASTRO_MSG(("Noon=%.2lf, %sL, gmtoff %.2lf\n", noon, debug_astro_date(noon+fGmtOffset), fGmtOffset)); - setTime(noon + ((rise ? -6 : 6) * HOUR_MS)); - U_DEBUG_ASTRO_MSG(("added %.2lf ms as a guess,\n", ((rise ? -6. : 6.) * HOUR_MS))); - - RiseSetCoordFunc func; - double t = riseOrSet(func, - rise, - .533 * DEG_RAD, // Angular Diameter - 34. /60.0 * DEG_RAD, // Refraction correction - MINUTE_MS / 12.); // Desired accuracy - - setTime(t0); - return t; -} - -// Commented out - currently unused. ICU 2.6, Alan -// //------------------------------------------------------------------------- -// // Alternate Sun Rise/Set -// // See Duffett-Smith p.93 -// //------------------------------------------------------------------------- -// -// // This yields worse results (as compared to USNO data) than getSunRiseSet(). -// /** -// * TODO Make this when the entire class is package-private. -// */ -// /*public*/ long getSunRiseSet2(boolean rise) { -// // 1. Calculate coordinates of the sun's center for midnight -// double jd = uprv_floor(getJulianDay() - 0.5) + 0.5; -// double[] sl = getSunLongitude(jd);// double lambda1 = sl[0]; -// Equatorial pos1 = eclipticToEquatorial(lambda1, 0); -// -// // 2. Add ... to lambda to get position 24 hours later -// double lambda2 = lambda1 + 0.985647*DEG_RAD; -// Equatorial pos2 = eclipticToEquatorial(lambda2, 0); -// -// // 3. Calculate LSTs of rising and setting for these two positions -// double tanL = ::tan(fLatitude); -// double H = ::acos(-tanL * ::tan(pos1.declination)); -// double lst1r = (CalendarAstronomer_PI2 + pos1.ascension - H) * 24 / CalendarAstronomer_PI2; -// double lst1s = (pos1.ascension + H) * 24 / CalendarAstronomer_PI2; -// H = ::acos(-tanL * ::tan(pos2.declination)); -// double lst2r = (CalendarAstronomer_PI2-H + pos2.ascension ) * 24 / CalendarAstronomer_PI2; -// double lst2s = (H + pos2.ascension ) * 24 / CalendarAstronomer_PI2; -// if (lst1r > 24) lst1r -= 24; -// if (lst1s > 24) lst1s -= 24; -// if (lst2r > 24) lst2r -= 24; -// if (lst2s > 24) lst2s -= 24; -// -// // 4. Convert LSTs to GSTs. If GST1 > GST2, add 24 to GST2. -// double gst1r = lstToGst(lst1r); -// double gst1s = lstToGst(lst1s); -// double gst2r = lstToGst(lst2r); -// double gst2s = lstToGst(lst2s); -// if (gst1r > gst2r) gst2r += 24; -// if (gst1s > gst2s) gst2s += 24; -// -// // 5. Calculate GST at 0h UT of this date -// double t00 = utToGst(0); -// -// // 6. Calculate GST at 0h on the observer's longitude -// double offset = ::round(fLongitude*12/PI); // p.95 step 6; he _rounds_ to nearest 15 deg. -// double t00p = t00 - offset*1.002737909; -// if (t00p < 0) t00p += 24; // do NOT normalize -// -// // 7. Adjust -// if (gst1r < t00p) { -// gst1r += 24; -// gst2r += 24; -// } -// if (gst1s < t00p) { -// gst1s += 24; -// gst2s += 24; -// } -// -// // 8. -// double gstr = (24.07*gst1r-t00*(gst2r-gst1r))/(24.07+gst1r-gst2r); -// double gsts = (24.07*gst1s-t00*(gst2s-gst1s))/(24.07+gst1s-gst2s); -// -// // 9. Correct for parallax, refraction, and sun's diameter -// double dec = (pos1.declination + pos2.declination) / 2; -// double psi = ::acos(sin(fLatitude) / cos(dec)); -// double x = 0.830725 * DEG_RAD; // parallax+refraction+diameter -// double y = ::asin(sin(x) / ::sin(psi)) * RAD_DEG; -// double delta_t = 240 * y / cos(dec) / 3600; // hours -// -// // 10. Add correction to GSTs, subtract from GSTr -// gstr -= delta_t; -// gsts += delta_t; -// -// // 11. Convert GST to UT and then to local civil time -// double ut = gstToUt(rise ? gstr : gsts); -// //System.out.println((rise?"rise=":"set=") + ut + ", delta_t=" + delta_t); -// long midnight = DAY_MS * (time / DAY_MS); // Find UT midnight on this day -// return midnight + (long) (ut * 3600000); -// } - -// Commented out - currently unused. ICU 2.6, Alan -// /** -// * Convert local sidereal time to Greenwich sidereal time. -// * Section 15. Duffett-Smith p.21 -// * @param lst in hours (0..24) -// * @return GST in hours (0..24) -// */ -// double lstToGst(double lst) { -// double delta = fLongitude * 24 / CalendarAstronomer_PI2; -// return normalize(lst - delta, 24); -// } - -// Commented out - currently unused. ICU 2.6, Alan -// /** -// * Convert UT to GST on this date. -// * Section 12. Duffett-Smith p.17 -// * @param ut in hours -// * @return GST in hours -// */ -// double utToGst(double ut) { -// return normalize(getT0() + ut*1.002737909, 24); -// } - -// Commented out - currently unused. ICU 2.6, Alan -// /** -// * Convert GST to UT on this date. -// * Section 13. Duffett-Smith p.18 -// * @param gst in hours -// * @return UT in hours -// */ -// double gstToUt(double gst) { -// return normalize(gst - getT0(), 24) * 0.9972695663; -// } - -// Commented out - currently unused. ICU 2.6, Alan -// double getT0() { -// // Common computation for UT <=> GST -// -// // Find JD for 0h UT -// double jd = uprv_floor(getJulianDay() - 0.5) + 0.5; -// -// double s = jd - 2451545.0; -// double t = s / 36525.0; -// double t0 = 6.697374558 + (2400.051336 + 0.000025862*t)*t; -// return t0; -// } - -// Commented out - currently unused. ICU 2.6, Alan -// //------------------------------------------------------------------------- -// // Alternate Sun Rise/Set -// // See sci.astro FAQ -// // http://www.faqs.org/faqs/astronomy/faq/part3/section-5.html -// //------------------------------------------------------------------------- -// -// // Note: This method appears to produce inferior accuracy as -// // compared to getSunRiseSet(). -// -// /** -// * TODO Make this when the entire class is package-private. -// */ -// /*public*/ long getSunRiseSet3(boolean rise) { -// -// // Compute day number for 0.0 Jan 2000 epoch -// double d = (double)(time - EPOCH_2000_MS) / DAY_MS; -// -// // Now compute the Local Sidereal Time, LST: -// // -// double LST = 98.9818 + 0.985647352 * d + /*UT*15 + long*/ -// fLongitude*RAD_DEG; -// // -// // (east long. positive). Note that LST is here expressed in degrees, -// // where 15 degrees corresponds to one hour. Since LST really is an angle, -// // it's convenient to use one unit---degrees---throughout. -// -// // COMPUTING THE SUN'S POSITION -// // ---------------------------- -// // -// // To be able to compute the Sun's rise/set times, you need to be able to -// // compute the Sun's position at any time. First compute the "day -// // number" d as outlined above, for the desired moment. Next compute: -// // -// double oblecl = 23.4393 - 3.563E-7 * d; -// // -// double w = 282.9404 + 4.70935E-5 * d; -// double M = 356.0470 + 0.9856002585 * d; -// double e = 0.016709 - 1.151E-9 * d; -// // -// // This is the obliquity of the ecliptic, plus some of the elements of -// // the Sun's apparent orbit (i.e., really the Earth's orbit): w = -// // argument of perihelion, M = mean anomaly, e = eccentricity. -// // Semi-major axis is here assumed to be exactly 1.0 (while not strictly -// // true, this is still an accurate approximation). Next compute E, the -// // eccentric anomaly: -// // -// double E = M + e*(180/PI) * ::sin(M*DEG_RAD) * ( 1.0 + e*cos(M*DEG_RAD) ); -// // -// // where E and M are in degrees. This is it---no further iterations are -// // needed because we know e has a sufficiently small value. Next compute -// // the true anomaly, v, and the distance, r: -// // -// /* r * cos(v) = */ double A = cos(E*DEG_RAD) - e; -// /* r * ::sin(v) = */ double B = ::sqrt(1 - e*e) * ::sin(E*DEG_RAD); -// // -// // and -// // -// // r = sqrt( A*A + B*B ) -// double v = ::atan2( B, A )*RAD_DEG; -// // -// // The Sun's true longitude, slon, can now be computed: -// // -// double slon = v + w; -// // -// // Since the Sun is always at the ecliptic (or at least very very close to -// // it), we can use simplified formulae to convert slon (the Sun's ecliptic -// // longitude) to sRA and sDec (the Sun's RA and Dec): -// // -// // ::sin(slon) * cos(oblecl) -// // tan(sRA) = ------------------------- -// // cos(slon) -// // -// // ::sin(sDec) = ::sin(oblecl) * ::sin(slon) -// // -// // As was the case when computing az, the Azimuth, if possible use an -// // atan2() function to compute sRA. -// -// double sRA = ::atan2(sin(slon*DEG_RAD) * cos(oblecl*DEG_RAD), cos(slon*DEG_RAD))*RAD_DEG; -// -// double sin_sDec = ::sin(oblecl*DEG_RAD) * ::sin(slon*DEG_RAD); -// double sDec = ::asin(sin_sDec)*RAD_DEG; -// -// // COMPUTING RISE AND SET TIMES -// // ---------------------------- -// // -// // To compute when an object rises or sets, you must compute when it -// // passes the meridian and the HA of rise/set. Then the rise time is -// // the meridian time minus HA for rise/set, and the set time is the -// // meridian time plus the HA for rise/set. -// // -// // To find the meridian time, compute the Local Sidereal Time at 0h local -// // time (or 0h UT if you prefer to work in UT) as outlined above---name -// // that quantity LST0. The Meridian Time, MT, will now be: -// // -// // MT = RA - LST0 -// double MT = normalize(sRA - LST, 360); -// // -// // where "RA" is the object's Right Ascension (in degrees!). If negative, -// // add 360 deg to MT. If the object is the Sun, leave the time as it is, -// // but if it's stellar, multiply MT by 365.2422/366.2422, to convert from -// // sidereal to solar time. Now, compute HA for rise/set, name that -// // quantity HA0: -// // -// // ::sin(h0) - ::sin(lat) * ::sin(Dec) -// // cos(HA0) = --------------------------------- -// // cos(lat) * cos(Dec) -// // -// // where h0 is the altitude selected to represent rise/set. For a purely -// // mathematical horizon, set h0 = 0 and simplify to: -// // -// // cos(HA0) = - tan(lat) * tan(Dec) -// // -// // If you want to account for refraction on the atmosphere, set h0 = -35/60 -// // degrees (-35 arc minutes), and if you want to compute the rise/set times -// // for the Sun's upper limb, set h0 = -50/60 (-50 arc minutes). -// // -// double h0 = -50/60 * DEG_RAD; -// -// double HA0 = ::acos( -// (sin(h0) - ::sin(fLatitude) * sin_sDec) / -// (cos(fLatitude) * cos(sDec*DEG_RAD)))*RAD_DEG; -// -// // When HA0 has been computed, leave it as it is for the Sun but multiply -// // by 365.2422/366.2422 for stellar objects, to convert from sidereal to -// // solar time. Finally compute: -// // -// // Rise time = MT - HA0 -// // Set time = MT + HA0 -// // -// // convert the times from degrees to hours by dividing by 15. -// // -// // If you'd like to check that your calculations are accurate or just -// // need a quick result, check the USNO's Sun or Moon Rise/Set Table, -// // . -// -// double result = MT + (rise ? -HA0 : HA0); // in degrees -// -// // Find UT midnight on this day -// long midnight = DAY_MS * (time / DAY_MS); -// -// return midnight + (long) (result * 3600000 / 15); -// } - //------------------------------------------------------------------------- // The Moon //------------------------------------------------------------------------- @@ -1083,7 +563,7 @@ const CalendarAstronomer::Equatorial& CalendarAstronomer::getMoonPosition() // Calculate the mean longitude and anomaly of the moon, based on // a circular orbit. Similar to the corresponding solar calculation. double meanLongitude = norm2PI(13.1763966*PI/180*day + moonL0); - meanAnomalyMoon = norm2PI(meanLongitude - 0.1114041*PI/180 * day - moonP0); + double meanAnomalyMoon = norm2PI(meanLongitude - 0.1114041*PI/180 * day - moonP0); // // Calculate the following corrections: @@ -1109,7 +589,7 @@ const CalendarAstronomer::Equatorial& CalendarAstronomer::getMoonPosition() double a4 = 0.2140*PI/180 * ::sin(2 * meanAnomalyMoon); // Now find the moon's corrected longitude - moonLongitude = meanLongitude + evection + center - annual + a4; + double moonLongitude = meanLongitude + evection + center - annual + a4; // // And finally, find the variation, caused by the fact that the sun's @@ -1149,7 +629,6 @@ const CalendarAstronomer::Equatorial& CalendarAstronomer::getMoonPosition() * current ecliptic longitudes of the sun and the moon, * measured in radians. * - * @see #getMoonPhase * @internal * @deprecated ICU 2.4. This class may be removed or modified. */ @@ -1165,56 +644,16 @@ double CalendarAstronomer::getMoonAge() { return norm2PI(moonEclipLong - sunLongitude); } -/** - * Calculate the phase of the moon at the time set in this object. - * The returned phase is a double in the range - * 0 <= phase < 1, interpreted as follows: - *

    - *
  • 0.00: New moon - *
  • 0.25: First quarter - *
  • 0.50: Full moon - *
  • 0.75: Last quarter - *
- * - * @see #getMoonAge - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::getMoonPhase() { - // See page 147 of "Practical Astronomy with your Calculator", - // by Peter Duffet-Smith, for details on the algorithm. - return 0.5 * (1 - cos(getMoonAge())); -} - /** * Constant representing a new moon. * For use with {@link #getMoonTime getMoonTime} * @internal * @deprecated ICU 2.4. This class may be removed or modified. */ -const CalendarAstronomer::MoonAge CalendarAstronomer::NEW_MOON() { +CalendarAstronomer::MoonAge CalendarAstronomer::NEW_MOON() { return CalendarAstronomer::MoonAge(0); } -/** - * Constant representing the moon's first quarter. - * For use with {@link #getMoonTime getMoonTime} - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -/*const CalendarAstronomer::MoonAge CalendarAstronomer::FIRST_QUARTER() { - return CalendarAstronomer::MoonAge(CalendarAstronomer::PI/2); -}*/ - -/** - * Constant representing a full moon. - * For use with {@link #getMoonTime getMoonTime} - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -const CalendarAstronomer::MoonAge CalendarAstronomer::FULL_MOON() { - return CalendarAstronomer::MoonAge(CalendarAstronomer::PI); -} /** * Constant representing the moon's last quarter. * For use with {@link #getMoonTime getMoonTime} @@ -1235,63 +674,24 @@ MoonTimeAngleFunc::~MoonTimeAngleFunc() {} }*/ /** - * Find the next or previous time at which the Moon's ecliptic - * longitude will have the desired value. + * Find the next or previous time at which the moon will be in the + * desired phase. *

- * @param desired The desired longitude. + * @param desired The desired phase of the moon. * @param next true if the next occurrence of the phase * is desired, false for the previous occurrence. * @internal * @deprecated ICU 2.4. This class may be removed or modified. */ -UDate CalendarAstronomer::getMoonTime(double desired, UBool next) -{ +UDate CalendarAstronomer::getMoonTime(const CalendarAstronomer::MoonAge& desired, UBool next) { MoonTimeAngleFunc func; return timeOfAngle( func, - desired, + desired.value, SYNODIC_MONTH, MINUTE_MS, next); } -/** - * Find the next or previous time at which the moon will be in the - * desired phase. - *

- * @param desired The desired phase of the moon. - * @param next true if the next occurrence of the phase - * is desired, false for the previous occurrence. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -UDate CalendarAstronomer::getMoonTime(const CalendarAstronomer::MoonAge& desired, UBool next) { - return getMoonTime(desired.value, next); -} - -class MoonRiseSetCoordFunc : public CalendarAstronomer::CoordFunc { -public: - virtual ~MoonRiseSetCoordFunc(); - virtual void eval(CalendarAstronomer::Equatorial& result, CalendarAstronomer& a) override { result = a.getMoonPosition(); } -}; - -MoonRiseSetCoordFunc::~MoonRiseSetCoordFunc() {} - -/** - * Returns the time (GMT) of sunrise or sunset on the local date to which - * this calendar is currently set. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -UDate CalendarAstronomer::getMoonRiseSet(UBool rise) -{ - MoonRiseSetCoordFunc func; - return riseOrSet(func, - rise, - .533 * DEG_RAD, // Angular Diameter - 34 /60.0 * DEG_RAD, // Refraction correction - MINUTE_MS); // Desired accuracy -} - //------------------------------------------------------------------------- // Interpolation methods for finding the time at which a given event occurs //------------------------------------------------------------------------- @@ -1364,48 +764,7 @@ UDate CalendarAstronomer::timeOfAngle(AngleFunc& func, double desired, return fTime; } -UDate CalendarAstronomer::riseOrSet(CoordFunc& func, UBool rise, - double diameter, double refraction, - double epsilon) -{ - Equatorial pos; - double tanL = ::tan(fLatitude); - double deltaT = 0; - int32_t count = 0; - - // - // Calculate the object's position at the current time, then use that - // position to calculate the time of rising or setting. The position - // will be different at that time, so iterate until the error is allowable. - // - U_DEBUG_ASTRO_MSG(("setup rise=%s, dia=%.3lf, ref=%.3lf, eps=%.3lf\n", - rise?"T":"F", diameter, refraction, epsilon)); - do { - // See "Practical Astronomy With Your Calculator, section 33. - func.eval(pos, *this); - double angle = ::acos(-tanL * ::tan(pos.declination)); - double lst = ((rise ? CalendarAstronomer_PI2-angle : angle) + pos.ascension ) * 24 / CalendarAstronomer_PI2; - - // Convert from LST to Universal Time. - UDate newTime = lstToUT( lst ); - - deltaT = newTime - fTime; - setTime(newTime); - U_DEBUG_ASTRO_MSG(("%d] dT=%.3lf, angle=%.3lf, lst=%.3lf, A=%.3lf/D=%.3lf\n", - count, deltaT, angle, lst, pos.ascension, pos.declination)); - } - while (++ count < 5 && uprv_fabs(deltaT) > epsilon); - - // Calculate the correction due to refraction and the object's angular diameter - double cosD = ::cos(pos.declination); - double psi = ::acos(sin(fLatitude) / cosD); - double x = diameter / 2 + refraction; - double y = ::asin(sin(x) / ::sin(psi)); - long delta = (long)((240 * y * RAD_DEG / cosD)*SECOND_MS); - - return fTime + (rise ? -delta : delta); -} - /** +/** * Return the obliquity of the ecliptic (the angle between the ecliptic * and the earth's equator) at the current time. This varies due to * the precession of the earth's axis. @@ -1414,19 +773,16 @@ UDate CalendarAstronomer::riseOrSet(CoordFunc& func, UBool rise, * measured in radians. */ double CalendarAstronomer::eclipticObliquity() { - if (isINVALID(eclipObliquity)) { - const double epoch = 2451545.0; // 2000 AD, January 1.5 + const double epoch = 2451545.0; // 2000 AD, January 1.5 - double T = (getJulianDay() - epoch) / 36525; + double T = (getJulianDay() - epoch) / 36525; - eclipObliquity = 23.439292 - - 46.815/3600 * T - - 0.0006/3600 * T*T - + 0.00181/3600 * T*T*T; + double eclipObliquity = 23.439292 + - 46.815/3600 * T + - 0.0006/3600 * T*T + + 0.00181/3600 * T*T*T; - eclipObliquity *= DEG_RAD; - } - return eclipObliquity; + return eclipObliquity * DEG_RAD; } @@ -1437,45 +793,13 @@ void CalendarAstronomer::clearCache() { const double INVALID = uprv_getNaN(); julianDay = INVALID; - julianCentury = INVALID; sunLongitude = INVALID; meanAnomalySun = INVALID; - moonLongitude = INVALID; moonEclipLong = INVALID; - meanAnomalyMoon = INVALID; - eclipObliquity = INVALID; - siderealTime = INVALID; - siderealT0 = INVALID; + moonPositionSet = false; } -//private static void out(String s) { -// System.out.println(s); -//} - -//private static String deg(double rad) { -// return Double.toString(rad * RAD_DEG); -//} - -//private static String hours(long ms) { -// return Double.toString((double)ms / HOUR_MS) + " hours"; -//} - -/** - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -/*UDate CalendarAstronomer::local(UDate localMillis) { - // TODO - srl ? - TimeZone *tz = TimeZone::createDefault(); - int32_t rawOffset; - int32_t dstOffset; - UErrorCode status = U_ZERO_ERROR; - tz->getOffset(localMillis, true, rawOffset, dstOffset, status); - delete tz; - return localMillis - rawOffset; -}*/ - // Debugging functions UnicodeString CalendarAstronomer::Ecliptic::toString() const { @@ -1484,7 +808,7 @@ UnicodeString CalendarAstronomer::Ecliptic::toString() const snprintf(tmp, sizeof(tmp), "[%.5f,%.5f]", longitude*RAD_DEG, latitude*RAD_DEG); return UnicodeString(tmp, ""); #else - return UnicodeString(); + return {}; #endif } @@ -1496,37 +820,10 @@ UnicodeString CalendarAstronomer::Equatorial::toString() const (ascension*RAD_DEG), (declination*RAD_DEG)); return UnicodeString(tmp, ""); #else - return UnicodeString(); + return {}; #endif } -UnicodeString CalendarAstronomer::Horizon::toString() const -{ -#ifdef U_DEBUG_ASTRO - char tmp[800]; - snprintf(tmp, sizeof(tmp), "[%.5f,%.5f]", altitude*RAD_DEG, azimuth*RAD_DEG); - return UnicodeString(tmp, ""); -#else - return UnicodeString(); -#endif -} - - -// static private String radToHms(double angle) { -// int hrs = (int) (angle*RAD_HOUR); -// int min = (int)((angle*RAD_HOUR - hrs) * 60); -// int sec = (int)((angle*RAD_HOUR - hrs - min/60.0) * 3600); - -// return Integer.toString(hrs) + "h" + min + "m" + sec + "s"; -// } - -// static private String radToDms(double angle) { -// int deg = (int) (angle*RAD_DEG); -// int min = (int)((angle*RAD_DEG - deg) * 60); -// int sec = (int)((angle*RAD_DEG - deg - min/60.0) * 3600); - -// return Integer.toString(deg) + "\u00b0" + min + "'" + sec + "\""; -// } // =============== Calendar Cache ================ diff --git a/deps/icu-small/source/i18n/astro.h b/deps/icu-small/source/i18n/astro.h index 372a79ac6714cc..ef297c4b3cc063 100644 --- a/deps/icu-small/source/i18n/astro.h +++ b/deps/icu-small/source/i18n/astro.h @@ -31,7 +31,7 @@ U_NAMESPACE_BEGIN * at a given moment in time. Accordingly, each CalendarAstronomer * object has a time property that determines the date * and time for which its calculations are performed. You can set and - * retrieve this property with {@link #setDate setDate}, {@link #getDate getDate} + * retrieve this property with {@link #setTime setTime}, {@link #getTime getTime} * and related methods. *

* Almost all of the calculations performed by this class, or by any @@ -72,7 +72,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { * value without worrying about whether other code will modify them. * * @see CalendarAstronomer.Equatorial - * @see CalendarAstronomer.Horizon * @internal */ class U_I18N_API Ecliptic : public UMemory { @@ -141,7 +140,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { * value without worrying about whether other code will modify them. * * @see CalendarAstronomer.Ecliptic - * @see CalendarAstronomer.Horizon * @internal */ class U_I18N_API Equatorial : public UMemory { @@ -201,66 +199,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { double declination; }; - /** - * Represents the position of an object in the sky relative to - * the local horizon. - * The Altitude represents the object's elevation above the horizon, - * with objects below the horizon having a negative altitude. - * The Azimuth is the geographic direction of the object from the - * observer's position, with 0 representing north. The azimuth increases - * clockwise from north. - *

- * Note that Horizon objects are immutable and cannot be modified - * once they are constructed. This allows them to be passed and returned by - * value without worrying about whether other code will modify them. - * - * @see CalendarAstronomer.Ecliptic - * @see CalendarAstronomer.Equatorial - * @internal - */ - class U_I18N_API Horizon : public UMemory { - public: - /** - * Constructs a Horizon coordinate object. - *

- * @param alt The altitude, measured in radians above the horizon. - * @param azim The azimuth, measured in radians clockwise from north. - * @internal - */ - Horizon(double alt=0, double azim=0) - : altitude(alt), azimuth(azim) { } - - /** - * Setter for Ecliptic Coordinate object - * @param alt The altitude, measured in radians above the horizon. - * @param azim The azimuth, measured in radians clockwise from north. - * @internal - */ - void set(double alt, double azim) { - altitude = alt; - azimuth = azim; - } - - /** - * Return a string representation of this object, with the - * angles measured in degrees. - * @internal - */ - UnicodeString toString() const; - - /** - * The object's altitude above the horizon, in radians. - * @internal - */ - double altitude; - - /** - * The object's direction, in radians clockwise from north. - * @internal - */ - double azimuth; - }; - public: //------------------------------------------------------------------------- // Assorted private data used for conversions @@ -300,22 +238,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ CalendarAstronomer(UDate d); - /** - * Construct a new CalendarAstronomer object with the given - * latitude and longitude. The object's time is set to the current - * date and time. - *

- * @param longitude The desired longitude, in degrees east of - * the Greenwich meridian. - * - * @param latitude The desired latitude, in degrees. Positive - * values signify North, negative South. - * - * @see java.util.Date#getTime() - * @internal - */ - CalendarAstronomer(double longitude, double latitude); - /** * Destructor * @internal @@ -333,48 +255,17 @@ class U_I18N_API CalendarAstronomer : public UMemory { * @param aTime the date and time, expressed as the number of milliseconds since * 1/1/1970 0:00 GMT (Gregorian). * - * @see #setDate * @see #getTime * @internal */ void setTime(UDate aTime); - - /** - * Set the current date and time of this CalendarAstronomer object. All - * astronomical calculations are performed based on this time setting. - * - * @param aTime the date and time, expressed as the number of milliseconds since - * 1/1/1970 0:00 GMT (Gregorian). - * - * @see #getTime - * @internal - */ - void setDate(UDate aDate) { setTime(aDate); } - - /** - * Set the current date and time of this CalendarAstronomer object. All - * astronomical calculations are performed based on this time setting. - * - * @param jdn the desired time, expressed as a "julian day number", - * which is the number of elapsed days since - * 1/1/4713 BC (Julian), 12:00 GMT. Note that julian day - * numbers start at noon. To get the jdn for - * the corresponding midnight, subtract 0.5. - * - * @see #getJulianDay - * @see #JULIAN_EPOCH_MS - * @internal - */ - void setJulianDay(double jdn); - /** * Get the current time of this CalendarAstronomer object, * represented as the number of milliseconds since * 1/1/1970 AD 0:00 GMT (Gregorian). * * @see #setTime - * @see #getDate * @internal */ UDate getTime(); @@ -384,58 +275,12 @@ class U_I18N_API CalendarAstronomer : public UMemory { * expressed as a "julian day number", which is the number of elapsed * days since 1/1/4713 BC (Julian), 12:00 GMT. * - * @see #setJulianDay * @see #JULIAN_EPOCH_MS * @internal */ double getJulianDay(); - /** - * Return this object's time expressed in julian centuries: - * the number of centuries after 1/1/1900 AD, 12:00 GMT - * - * @see #getJulianDay - * @internal - */ - double getJulianCentury(); - - /** - * Returns the current Greenwich sidereal time, measured in hours - * @internal - */ - double getGreenwichSidereal(); - -private: - double getSiderealOffset(); public: - /** - * Returns the current local sidereal time, measured in hours - * @internal - */ - double getLocalSidereal(); - - /** - * Converts local sidereal time to Universal Time. - * - * @param lst The Local Sidereal Time, in hours since sidereal midnight - * on this object's current date. - * - * @return The corresponding Universal Time, in milliseconds since - * 1 Jan 1970, GMT. - */ - //private: - double lstToUT(double lst); - - /** - * - * Convert from ecliptic to equatorial coordinates. - * - * @param ecliptic The ecliptic - * @param result Fillin result - * @return reference to result - */ - Equatorial& eclipticToEquatorial(Equatorial& result, const Ecliptic& ecliptic); - /** * Convert from ecliptic to equatorial coordinates. * @@ -447,21 +292,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong, double eclipLat); - /** - * Convert from ecliptic longitude to equatorial coordinates. - * - * @param eclipLong The ecliptic longitude - * - * @return The corresponding point in equatorial coordinates. - * @internal - */ - Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong) ; - - /** - * @internal - */ - Horizon& eclipticToHorizon(Horizon& result, double eclipLong) ; - //------------------------------------------------------------------------- // The Sun //------------------------------------------------------------------------- @@ -484,39 +314,7 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ /*public*/ void getSunLongitude(double julianDay, double &longitude, double &meanAnomaly); - /** - * The position of the sun at this object's current date and time, - * in equatorial coordinates. - * @param result fillin for the result - * @internal - */ - Equatorial& getSunPosition(Equatorial& result); - public: - /** - * Constant representing the vernal equinox. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "vernal" refers to the northern hemisphere's seasons. - * @internal - */ -// static double VERNAL_EQUINOX(); - - /** - * Constant representing the summer solstice. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "summer" refers to the northern hemisphere's seasons. - * @internal - */ - static double SUMMER_SOLSTICE(); - - /** - * Constant representing the autumnal equinox. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "autumn" refers to the northern hemisphere's seasons. - * @internal - */ -// static double AUTUMN_EQUINOX(); - /** * Constant representing the winter solstice. * For use with {@link #getSunTime getSunTime}. @@ -532,20 +330,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ UDate getSunTime(double desired, UBool next); - /** - * Returns the time (GMT) of sunrise or sunset on the local date to which - * this calendar is currently set. - * - * NOTE: This method only works well if this object is set to a - * time near local noon. Because of variations between the local - * official time zone and the geographic longitude, the - * computation can flop over into an adjacent day if this object - * is set to a time near local midnight. - * - * @internal - */ - UDate getSunRiseSet(UBool rise); - //------------------------------------------------------------------------- // The Moon //------------------------------------------------------------------------- @@ -569,22 +353,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ double getMoonAge(); - /** - * Calculate the phase of the moon at the time set in this object. - * The returned phase is a double in the range - * 0 <= phase < 1, interpreted as follows: - *

    - *
  • 0.00: New moon - *
  • 0.25: First quarter - *
  • 0.50: Full moon - *
  • 0.75: Last quarter - *
- * - * @see #getMoonAge - * @internal - */ - double getMoonPhase(); - class U_I18N_API MoonAge : public UMemory { public: MoonAge(double l) @@ -598,28 +366,7 @@ class U_I18N_API CalendarAstronomer : public UMemory { * For use with {@link #getMoonTime getMoonTime} * @internal */ - static const MoonAge NEW_MOON(); - - /** - * Constant representing the moon's first quarter. - * For use with {@link #getMoonTime getMoonTime} - * @internal - */ -// static const MoonAge FIRST_QUARTER(); - - /** - * Constant representing a full moon. - * For use with {@link #getMoonTime getMoonTime} - * @internal - */ - static const MoonAge FULL_MOON(); - - /** - * Constant representing the moon's last quarter. - * For use with {@link #getMoonTime getMoonTime} - * @internal - */ -// static const MoonAge LAST_QUARTER(); + static MoonAge NEW_MOON(); /** * Find the next or previous time at which the Moon's ecliptic @@ -630,21 +377,13 @@ class U_I18N_API CalendarAstronomer : public UMemory { * is desired, false for the previous occurrence. * @internal */ - UDate getMoonTime(double desired, UBool next); UDate getMoonTime(const MoonAge& desired, UBool next); - /** - * Returns the time (GMT) of sunrise or sunset on the local date to which - * this calendar is currently set. - * @internal - */ - UDate getMoonRiseSet(UBool rise); - //------------------------------------------------------------------------- // Interpolation methods for finding the time at which a given event occurs //------------------------------------------------------------------------- - // private +public: class AngleFunc : public UMemory { public: virtual double eval(CalendarAstronomer&) = 0; @@ -652,20 +391,10 @@ class U_I18N_API CalendarAstronomer : public UMemory { }; friend class AngleFunc; +private: UDate timeOfAngle(AngleFunc& func, double desired, double periodDays, double epsilon, UBool next); - class CoordFunc : public UMemory { - public: - virtual void eval(Equatorial& result, CalendarAstronomer&) = 0; - virtual ~CoordFunc(); - }; - friend class CoordFunc; - - double riseOrSet(CoordFunc& func, UBool rise, - double diameter, double refraction, - double epsilon); - //------------------------------------------------------------------------- // Other utility methods //------------------------------------------------------------------------- @@ -691,29 +420,13 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ UDate fTime; - /* These aren't used yet, but they'll be needed for sunset calculations - * and equatorial to horizon coordinate conversions - */ - double fLongitude; - double fLatitude; - double fGmtOffset; - - // // The following fields are used to cache calculated results for improved // performance. These values all depend on the current time setting // of this object, so the clearCache method is provided. - // - double julianDay; - double julianCentury; double sunLongitude; double meanAnomalySun; - double moonLongitude; double moonEclipLong; - double meanAnomalyMoon; - double eclipObliquity; - double siderealT0; - double siderealTime; void clearCache(); diff --git a/deps/icu-small/source/i18n/basictz.cpp b/deps/icu-small/source/i18n/basictz.cpp index 2490fadcc91f7a..d03c50adac0f61 100644 --- a/deps/icu-small/source/i18n/basictz.cpp +++ b/deps/icu-small/source/i18n/basictz.cpp @@ -511,7 +511,6 @@ BasicTimeZone::getTimeZoneRulesAfter(UDate start, InitialTimeZoneRule*& initial, // Set the results initial = res_initial.orphan(); transitionRules = filteredRules.orphan(); - return; } void diff --git a/deps/icu-small/source/i18n/brktrans.h b/deps/icu-small/source/i18n/brktrans.h index 5dcc8c50c02abe..45de01aa596842 100644 --- a/deps/icu-small/source/i18n/brktrans.h +++ b/deps/icu-small/source/i18n/brktrans.h @@ -38,7 +38,7 @@ class BreakTransliterator : public Transliterator { * Constructs a transliterator. * @param adoptedFilter the filter for this transliterator. */ - BreakTransliterator(UnicodeFilter* adoptedFilter = 0); + BreakTransliterator(UnicodeFilter* adoptedFilter = nullptr); /** * Destructor. diff --git a/deps/icu-small/source/i18n/buddhcal.cpp b/deps/icu-small/source/i18n/buddhcal.cpp index dc14af00bf9c36..7723ade105d2c5 100644 --- a/deps/icu-small/source/i18n/buddhcal.cpp +++ b/deps/icu-small/source/i18n/buddhcal.cpp @@ -18,6 +18,7 @@ #if !UCONFIG_NO_FORMATTING #include "buddhcal.h" +#include "gregoimp.h" #include "unicode/gregocal.h" #include "umutex.h" #include @@ -63,17 +64,21 @@ const char *BuddhistCalendar::getType() const return "buddhist"; } -int32_t BuddhistCalendar::handleGetExtendedYear() +int32_t BuddhistCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // EXTENDED_YEAR in BuddhistCalendar is a Gregorian year. // The default value of EXTENDED_YEAR is 1970 (Buddhist 2513) - int32_t year; if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); - } else { - // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc - year = internalGet(UCAL_YEAR, kGregorianEpoch - kBuddhistEraStart) - + kBuddhistEraStart; + return internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); + } + // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc + int32_t year = internalGet(UCAL_YEAR, kGregorianEpoch - kBuddhistEraStart); + if (uprv_add32_overflow(year, kBuddhistEraStart, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } return year; } @@ -90,84 +95,11 @@ int32_t BuddhistCalendar::handleGetLimit(UCalendarDateFields field, ELimitType l { if(field == UCAL_ERA) { return BE; - } else { - return GregorianCalendar::handleGetLimit(field,limitType); - } -} - -#if 0 -void BuddhistCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) -{ - //Calendar::timeToFields(theTime, quick, status); - - int32_t era = internalGet(UCAL_ERA); - int32_t year = internalGet(UCAL_YEAR); - - if(era == GregorianCalendar::BC) { - year = 1-year; - era = BuddhistCalendar::BE; - } else if(era == GregorianCalendar::AD) { - era = BuddhistCalendar::BE; - } else { - status = U_INTERNAL_PROGRAM_ERROR; - } - - year = year - kBuddhistEraStart; - - internalSet(UCAL_ERA, era); - internalSet(UCAL_YEAR, year); -} -#endif - -/** - * The system maintains a static default century start date. This is initialized - * the first time it is used. Once the system default century date and year - * are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gBCInitOnce {}; - - -UBool BuddhistCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV -initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - BuddhistCalendar calendar(Locale("@calendar=buddhist"),status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - UDate newStart = calendar.getTime(status); - int32_t newYear = calendar.get(UCAL_YEAR, status); - gSystemDefaultCenturyStartYear = newYear; - gSystemDefaultCenturyStart = newStart; } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate BuddhistCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart and systemDefaultCenturyStartYear - umtx_initOnce(gBCInitOnce, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t BuddhistCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear and systemDefaultCenturyStart - umtx_initOnce(gBCInitOnce, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; + return GregorianCalendar::handleGetLimit(field,limitType); } +IMPL_SYSTEM_DEFAULT_CENTURY(BuddhistCalendar, "@calendar=buddhist") U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/buddhcal.h b/deps/icu-small/source/i18n/buddhcal.h index 01b59341c12eda..1fa8395b35b216 100644 --- a/deps/icu-small/source/i18n/buddhcal.h +++ b/deps/icu-small/source/i18n/buddhcal.h @@ -139,10 +139,11 @@ class BuddhistCalendar : public GregorianCalendar { * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such * as UCAL_ERA) specific to the calendar system, depending on which set of * fields is newer. + * @param status * @return the extended year * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Subclasses may override this method to compute several fields * specific to each calendar system. @@ -158,24 +159,9 @@ class BuddhistCalendar : public GregorianCalendar { */ virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; - /** - * Returns true because the Buddhist Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; + virtual bool isEra0CountingBackward() const override { return false; } - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/calendar.cpp b/deps/icu-small/source/i18n/calendar.cpp index 4b6edc87c9147e..8d5246966e270b 100644 --- a/deps/icu-small/source/i18n/calendar.cpp +++ b/deps/icu-small/source/i18n/calendar.cpp @@ -63,7 +63,6 @@ #include "sharedcalendar.h" #include "unifiedcache.h" #include "ulocimp.h" -#include "bytesinkutil.h" #include "charstr.h" #if !UCONFIG_NO_SERVICE @@ -259,20 +258,12 @@ static ECalType getCalendarTypeForLocale(const char *locid) { // e.g ja_JP_TRADITIONAL -> ja_JP@calendar=japanese // NOTE: Since ICU-20187, ja_JP_TRADITIONAL no longer canonicalizes, and // the Gregorian calendar is returned instead. - CharString canonicalName; - { - CharStringByteSink sink(&canonicalName); - ulocimp_canonicalize(locid, sink, &status); - } + CharString canonicalName = ulocimp_canonicalize(locid, status); if (U_FAILURE(status)) { return CALTYPE_GREGORIAN; } - CharString calTypeBuf; - { - CharStringByteSink sink(&calTypeBuf); - ulocimp_getKeywordValue(canonicalName.data(), "calendar", sink, &status); - } + CharString calTypeBuf = ulocimp_getKeywordValue(canonicalName.data(), "calendar", status); if (U_SUCCESS(status)) { calType = getCalendarType(calTypeBuf.data()); if (calType != CALTYPE_UNKNOWN) { @@ -283,8 +274,7 @@ static ECalType getCalendarTypeForLocale(const char *locid) { // when calendar keyword is not available or not supported, read supplementalData // to get the default calendar type for the locale's region - char region[ULOC_COUNTRY_CAPACITY]; - (void)ulocimp_getRegionForSupplementalData(canonicalName.data(), true, region, sizeof(region), &status); + CharString region = ulocimp_getRegionForSupplementalData(canonicalName.data(), true, status); if (U_FAILURE(status)) { return CALTYPE_GREGORIAN; } @@ -292,7 +282,7 @@ static ECalType getCalendarTypeForLocale(const char *locid) { // Read preferred calendar values from supplementalData calendarPreference UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", &status); ures_getByKey(rb, "calendarPreferenceData", rb, &status); - UResourceBundle *order = ures_getByKey(rb, region, nullptr, &status); + UResourceBundle *order = ures_getByKey(rb, region.data(), nullptr, &status); if (status == U_MISSING_RESOURCE_ERROR && rb != nullptr) { status = U_ZERO_ERROR; order = ures_getByKey(rb, "001", nullptr, &status); @@ -751,7 +741,7 @@ fSkippedWallTime(UCAL_WALLTIME_LAST) delete zone; return; } - if(zone == 0) { + if (zone == nullptr) { #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: ILLEGAL ARG because timezone cannot be 0\n", __FILE__, __LINE__); @@ -1462,9 +1452,15 @@ void Calendar::computeFields(UErrorCode &ec) // 11/6/00 int32_t millisInDay; - int32_t days = ClockMath::floorDivide(localMillis, kOneDay, &millisInDay); + double days = ClockMath::floorDivide( + localMillis, U_MILLIS_PER_DAY, &millisInDay) + + kEpochStartAsJulianDay; + if (days > INT32_MAX || days < INT32_MIN) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + return; + } - internalSet(UCAL_JULIAN_DAY,days + kEpochStartAsJulianDay); + internalSet(UCAL_JULIAN_DAY, static_cast(days)); #if defined (U_DEBUG_CAL) //fprintf(stderr, "%s:%d- Hmm! Jules @ %d, as per %.0lf millis\n", @@ -1532,11 +1528,11 @@ void Calendar::computeFields(UErrorCode &ec) U_ASSERT(fFields[UCAL_DST_OFFSET] <= getMaximum(UCAL_DST_OFFSET)); } -uint8_t Calendar::julianDayToDayOfWeek(double julian) +uint8_t Calendar::julianDayToDayOfWeek(int32_t julian) { // If julian is negative, then julian%7 will be negative, so we adjust // accordingly. We add 1 because Julian day 0 is Monday. - int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7); + int8_t dayOfWeek = (int8_t) ((julian + 1LL) % 7); uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7+UCAL_SUNDAY ) : UCAL_SUNDAY)); return result; @@ -1580,7 +1576,14 @@ void Calendar::computeGregorianFields(int32_t julianDay, UErrorCode& ec) { return; } int32_t gregorianDayOfWeekUnused; - Grego::dayToFields(julianDay - kEpochStartAsJulianDay, fGregorianYear, fGregorianMonth, fGregorianDayOfMonth, gregorianDayOfWeekUnused, fGregorianDayOfYear); + if (uprv_add32_overflow( + julianDay, -kEpochStartAsJulianDay, &julianDay)) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + Grego::dayToFields(julianDay, fGregorianYear, fGregorianMonth, + fGregorianDayOfMonth, gregorianDayOfWeekUnused, + fGregorianDayOfYear); } /** @@ -1761,8 +1764,8 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu int32_t max = getActualMaximum(field,status); int32_t gap = max - min + 1; - int32_t value = internalGet(field) + amount; - value = (value - min) % gap; + int64_t value = internalGet(field); + value = (value + amount - min) % gap; if (value < 0) { value += gap; } @@ -1784,7 +1787,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu { // Assume min == 0 in calculations below double start = getTimeInMillis(status); - int32_t oldHour = internalGet(field); + int64_t oldHour = internalGet(field); int32_t max = getMaximum(field); int32_t newHour = (oldHour + amount) % (max + 1); if (newHour < 0) { @@ -1801,11 +1804,12 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu // DAY_OF_MONTH if, after updating the MONTH field, it is illegal. // E.g., .roll(MONTH, 1) -> or . { - int32_t max = getActualMaximum(UCAL_MONTH, status); - int32_t mon = (internalGet(UCAL_MONTH) + amount) % (max+1); + int32_t max = getActualMaximum(UCAL_MONTH, status) + 1; + int64_t mon = internalGet(UCAL_MONTH); + mon = (mon + amount) % max; if (mon < 0) { - mon += (max + 1); + mon += max; } set(UCAL_MONTH, mon); @@ -1822,16 +1826,19 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu // * If era==0 and years go backwards in time, change sign of amount. // * Until we have new API per #9393, we temporarily hardcode knowledge of // which calendars have era 0 years that go backwards. - UBool era0WithYearsThatGoBackwards = false; - int32_t era = get(UCAL_ERA, status); - if (era == 0) { - const char * calType = getType(); - if ( uprv_strcmp(calType,"gregorian")==0 || uprv_strcmp(calType,"roc")==0 || uprv_strcmp(calType,"coptic")==0 ) { - amount = -amount; - era0WithYearsThatGoBackwards = true; + int32_t era = internalGet(UCAL_ERA); + if (era == 0 && isEra0CountingBackward()) { + if (uprv_mul32_overflow(amount, -1, &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } } - int32_t newYear = internalGet(field) + amount; + int32_t newYear; + if (uprv_add32_overflow( + amount, internalGet(field), &newYear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } if (era > 0 || newYear >= 1) { int32_t maxYear = getActualMaximum(field, status); if (maxYear < 32768) { @@ -1848,7 +1855,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu // else we are in era 0 with newYear < 1; // calendars with years that go backwards must pin the year value at 0, // other calendars can have years < 0 in era 0 - } else if (era0WithYearsThatGoBackwards) { + } else if (era == 0 && isEra0CountingBackward()) { newYear = 1; } set(field, newYear); @@ -1859,7 +1866,12 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu case UCAL_EXTENDED_YEAR: // Rolling the year can involve pinning the DAY_OF_MONTH. - set(field, internalGet(field) + amount); + if (uprv_add32_overflow( + amount, internalGet(field), &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + set(field, amount); pinField(UCAL_MONTH,status); pinField(UCAL_DAY_OF_MONTH,status); return; @@ -1931,7 +1943,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu status = U_INTERNAL_PROGRAM_ERROR; return; } - int32_t day_of_month = (internalGet(UCAL_DAY_OF_MONTH) + amount*7 - + int32_t day_of_month = (internalGet(UCAL_DAY_OF_MONTH) + amount*7LL - start) % gap; if (day_of_month < 0) day_of_month += gap; day_of_month += start; @@ -1993,7 +2005,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu status = U_INTERNAL_PROGRAM_ERROR; return; } - int32_t day_of_year = (internalGet(UCAL_DAY_OF_YEAR) + amount*7 - + int32_t day_of_year = (internalGet(UCAL_DAY_OF_YEAR) + amount*7LL - start) % gap; if (day_of_year < 0) day_of_year += gap; day_of_year += start; @@ -2072,7 +2084,12 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu return; } case UCAL_JULIAN_DAY: - set(field, internalGet(field) + amount); + if (uprv_add32_overflow( + amount, internalGet(field), &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + set(field, amount); return; default: // Other fields cannot be rolled by this method @@ -2129,9 +2146,19 @@ void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status switch (field) { case UCAL_ERA: - set(field, get(field, status) + amount); + { + int32_t era = get(UCAL_ERA, status); + if (U_FAILURE(status)) { + return; + } + if (uprv_add32_overflow(era, amount, &era)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + set(UCAL_ERA, era); pinField(UCAL_ERA, status); return; + } case UCAL_YEAR: case UCAL_YEAR_WOY: @@ -2143,11 +2170,10 @@ void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status // this by applying the amount to the UCAL_EXTENDED_YEAR field; but since // we would still need to handle UCAL_YEAR_WOY as below, might as well // also handle UCAL_YEAR the same way. - int32_t era = get(UCAL_ERA, status); - if (era == 0) { - const char * calType = getType(); - if ( uprv_strcmp(calType,"gregorian")==0 || uprv_strcmp(calType,"roc")==0 || uprv_strcmp(calType,"coptic")==0 ) { - amount = -amount; + if (get(UCAL_ERA, status) == 0 && isEra0CountingBackward()) { + if (uprv_mul32_overflow(amount, -1, &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } } } @@ -2159,7 +2185,16 @@ void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status { UBool oldLenient = isLenient(); setLenient(true); - set(field, get(field, status) + amount); + int32_t value = get(field, status); + if (U_FAILURE(status)) { + return; + } + if (uprv_add32_overflow(value, amount, &value)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + set(field, value); + pinField(UCAL_DAY_OF_MONTH, status); if(oldLenient==false) { complete(status); /* force recalculate */ @@ -2324,6 +2359,7 @@ int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UEr __FILE__, __LINE__, fldName(field)); #endif ec = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } } // Do a binary search @@ -2361,6 +2397,7 @@ int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UEr __FILE__, __LINE__, fldName(field)); #endif ec = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } } } @@ -2895,11 +2932,17 @@ void Calendar::validateField(UCalendarDateFields field, UErrorCode &status) { int32_t y; switch (field) { case UCAL_DAY_OF_MONTH: - y = handleGetExtendedYear(); - validateField(field, 1, handleGetMonthLength(y, internalGetMonth()), status); + y = handleGetExtendedYear(status); + if (U_FAILURE(status)) { + return; + } + validateField(field, 1, handleGetMonthLength(y, internalGetMonth(status), status), status); break; case UCAL_DAY_OF_YEAR: - y = handleGetExtendedYear(); + y = handleGetExtendedYear(status); + if (U_FAILURE(status)) { + return; + } validateField(field, 1, handleGetYearLength(y), status); break; case UCAL_DAY_OF_WEEK_IN_MONTH: @@ -3078,7 +3121,10 @@ void Calendar::computeTime(UErrorCode& status) { } // Compute the Julian day - int32_t julianDay = computeJulianDay(); + int32_t julianDay = computeJulianDay(status); + if (U_FAILURE(status)) { + return; + } double millis = Grego::julianDayToMillis(julianDay); @@ -3107,7 +3153,7 @@ void Calendar::computeTime(UErrorCode& status) { UDate t = 0; if (fStamp[UCAL_ZONE_OFFSET] >= ((int32_t)kMinimumUserStamp) || fStamp[UCAL_DST_OFFSET] >= ((int32_t)kMinimumUserStamp)) { - t = millis + millisInDay - (internalGet(UCAL_ZONE_OFFSET) + internalGet(UCAL_DST_OFFSET)); + t = millis + millisInDay - internalGet(UCAL_ZONE_OFFSET) - internalGet(UCAL_DST_OFFSET); } else { // Compute the time zone offset and DST offset. There are two potential // ambiguities here. We'll assume a 2:00 am (wall time) switchover time @@ -3236,7 +3282,9 @@ double Calendar::computeMillisInDay() { // Don't normalize here; let overflow bump into the next period. // This is consistent with how we handle other fields. millisInDay += internalGet(UCAL_HOUR); - millisInDay += 12 * internalGet(UCAL_AM_PM); // Default works for unset AM_PM + // Treat even number as AM and odd nubmber as PM to align with the + // logic in roll() + millisInDay += (internalGet(UCAL_AM_PM) % 2 == 0) ? 0 : 12; } } @@ -3309,7 +3357,7 @@ int32_t Calendar::computeZoneOffset(double millis, double millisInDay, UErrorCod return rawOffset + dstOffset; } -int32_t Calendar::computeJulianDay() +int32_t Calendar::computeJulianDay(UErrorCode &status) { // We want to see if any of the date fields is newer than the // JULIAN_DAY. If not, then we use JULIAN_DAY. If so, then we do @@ -3333,12 +3381,15 @@ int32_t Calendar::computeJulianDay() bestField = UCAL_DAY_OF_MONTH; } - return handleComputeJulianDay(bestField); + return handleComputeJulianDay(bestField, status); } // ------------------------------------------- -int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { +int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField, UErrorCode &status) { + if (U_FAILURE(status)) { + return 0; + } UBool useMonth = (bestField == UCAL_DAY_OF_MONTH || bestField == UCAL_WEEK_OF_MONTH || bestField == UCAL_DAY_OF_WEEK_IN_MONTH); @@ -3347,10 +3398,19 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { if (bestField == UCAL_WEEK_OF_YEAR && newerField(UCAL_YEAR_WOY, UCAL_YEAR) == UCAL_YEAR_WOY) { year = internalGet(UCAL_YEAR_WOY); } else { - year = handleGetExtendedYear(); + year = handleGetExtendedYear(status); + if (U_FAILURE(status)) { + return 0; + } } internalSet(UCAL_EXTENDED_YEAR, year); + // Return U_ILLEGAL_ARGUMENT_ERROR if year is too large that may cuase int32_t overflow + // later. + if (year > INT32_MAX / 400) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: bestField= %s - y=%d\n", __FILE__, __LINE__, fldName(bestField), year); @@ -3363,12 +3423,21 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { int32_t month; if(isSet(UCAL_MONTH) || isSet(UCAL_ORDINAL_MONTH)) { - month = internalGetMonth(); + month = internalGetMonth(status); + if (U_FAILURE(status)) { + return 0; + } } else { - month = getDefaultMonthInYear(year); + month = getDefaultMonthInYear(year, status); + if (U_FAILURE(status)) { + return 0; + } } - int32_t julianDay = handleComputeMonthStart(year, useMonth ? month : 0, useMonth); + int32_t julianDay = handleComputeMonthStart(year, useMonth ? month : 0, useMonth, status); + if (U_FAILURE(status)) { + return 0; + } if (bestField == UCAL_DAY_OF_MONTH) { @@ -3379,11 +3448,20 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { } else { dayOfMonth = getDefaultDayInMonth(year, month); } - return julianDay + dayOfMonth; + if (uprv_add32_overflow(dayOfMonth, julianDay, &dayOfMonth)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return dayOfMonth; } if (bestField == UCAL_DAY_OF_YEAR) { - return julianDay + internalGet(UCAL_DAY_OF_YEAR); + int32_t result; + if (uprv_add32_overflow(internalGet(UCAL_DAY_OF_YEAR), julianDay, &result)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return result; } int32_t firstDayOfWeek = getFirstDayOfWeek(); // Localized fdw @@ -3405,7 +3483,10 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { first += 7; } - int32_t dowLocal = getLocalDOW(); + int32_t dowLocal = getLocalDOW(status); + if (U_FAILURE(status)) { + return 0; + } // Find the first target DOW (dowLocal) in the month or year. // Actually, it may be just before the first of the month or year. @@ -3422,7 +3503,12 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { // negative. int32_t dim = internalGet(UCAL_DAY_OF_WEEK_IN_MONTH, 1); if (dim >= 0) { - date += 7*(dim - 1); + int32_t temp; + if (uprv_mul32_overflow(7, dim - 1, &temp) || + uprv_add32_overflow(date, temp, &date)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } else { // Move date to the last of this day-of-week in this month, @@ -3431,9 +3517,18 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { // past the first of the given day-of-week in this month. // Note that we handle -2, -3, etc. correctly, even though // values < -1 are technically disallowed. - int32_t m = internalGetMonth(UCAL_JANUARY); - int32_t monthLength = handleGetMonthLength(year, m); - date += ((monthLength - date) / 7 + dim + 1) * 7; + int32_t m = internalGetMonth(UCAL_JANUARY, status); + int32_t monthLength = handleGetMonthLength(year, m, status); + if (U_FAILURE(status)) { + return 0; + } + int32_t temp; + if (uprv_add32_overflow((monthLength - date) / 7, dim+1, &temp) || + uprv_mul32_overflow(temp, 7, &temp) || + uprv_add32_overflow(date, temp, &date)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } } else { #if defined (U_DEBUG_CAL) @@ -3448,7 +3543,10 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { // need to be sure to stay in 'real' year. int32_t woy = internalGet(bestField); - int32_t nextJulianDay = handleComputeMonthStart(year+1, 0, false); // jd of day before jan 1 + int32_t nextJulianDay = handleComputeMonthStart(year+1, 0, false, status); // jd of day before jan 1 + if (U_FAILURE(status)) { + return 0; + } int32_t nextFirst = julianDayToDayOfWeek(nextJulianDay + 1) - firstDayOfWeek; if (nextFirst < 0) { // 0..6 ldow of Jan 1 @@ -3491,7 +3589,12 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { } // Now adjust for the week number. - testDate += 7 * (woy - 1); + int32_t weeks; + if (uprv_mul32_overflow(woy-1, 7, &weeks) || + uprv_add32_overflow(weeks, testDate, &testDate)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d - y=%d, y-1=%d doy%d, njd%d (C.F. %d)\n", @@ -3499,7 +3602,10 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { #endif if(julianDay+testDate > nextJulianDay) { // is it past Dec 31? (nextJulianDay is day BEFORE year+1's Jan 1) // Fire up the calculating engines.. retry YWOY = (year-1) - julianDay = handleComputeMonthStart(year-1, 0, false); // jd before Jan 1 of previous year + julianDay = handleComputeMonthStart(year-1, 0, false, status); // jd before Jan 1 of previous year + if (U_FAILURE(status)) { + return 0; + } first = julianDayToDayOfWeek(julianDay + 1) - firstDayOfWeek; // 0 based local dow of first week if(first < 0) { // 0..6 @@ -3525,14 +3631,24 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { } // Now adjust for the week number. - date += 7 * (internalGet(bestField) - 1); + int32_t weeks = internalGet(bestField); + if (uprv_add32_overflow(weeks, -1, &weeks) || + uprv_mul32_overflow(7, weeks, &weeks) || + uprv_add32_overflow(date, weeks, &date)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } - return julianDay + date; + if (uprv_add32_overflow(julianDay, date, &julianDay)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return julianDay; } int32_t -Calendar::getDefaultMonthInYear(int32_t /*eyear*/) +Calendar::getDefaultMonthInYear(int32_t /*eyear*/, UErrorCode& /* status */) { return 0; } @@ -3544,17 +3660,28 @@ Calendar::getDefaultDayInMonth(int32_t /*eyear*/, int32_t /*month*/) } -int32_t Calendar::getLocalDOW() +int32_t Calendar::getLocalDOW(UErrorCode& status) { - // Get zero-based localized DOW, valid range 0..6. This is the DOW + if (U_FAILURE(status)) { + return 0; + } + // Get zero-based localized DOW, valid range 0..6. This is the DOW // we are looking for. int32_t dowLocal = 0; switch (resolveFields(kDOWPrecedence)) { case UCAL_DAY_OF_WEEK: - dowLocal = internalGet(UCAL_DAY_OF_WEEK) - fFirstDayOfWeek; + dowLocal = internalGet(UCAL_DAY_OF_WEEK); + if (uprv_add32_overflow(dowLocal, -fFirstDayOfWeek, &dowLocal)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } break; case UCAL_DOW_LOCAL: - dowLocal = internalGet(UCAL_DOW_LOCAL) - 1; + dowLocal = internalGet(UCAL_DOW_LOCAL); + if (uprv_add32_overflow(dowLocal, -1, &dowLocal)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } break; default: break; @@ -3566,8 +3693,11 @@ int32_t Calendar::getLocalDOW() return dowLocal; } -int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy) +int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // We have UCAL_YEAR_WOY and UCAL_WEEK_OF_YEAR - from those, determine // what year we fall in, so that other code can set it properly. // (code borrowed from computeWeekFields and handleComputeJulianDay) @@ -3577,10 +3707,21 @@ int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t w UCalendarDateFields bestField = resolveFields(kDatePrecedence); // !! Note: if subclasses have a different table, they should override handleGetExtendedYearFromWeekFields // Now, a local DOW - int32_t dowLocal = getLocalDOW(); // 0..6 + int32_t dowLocal = getLocalDOW(status); // 0..6 + if (U_FAILURE(status)) { + return 0; + } int32_t firstDayOfWeek = getFirstDayOfWeek(); // Localized fdw - int32_t jan1Start = handleComputeMonthStart(yearWoy, 0, false); - int32_t nextJan1Start = handleComputeMonthStart(yearWoy+1, 0, false); // next year's Jan1 start + int32_t jan1Start = handleComputeMonthStart(yearWoy, 0, false, status); + int32_t yearWoyPlus1; + if (uprv_add32_overflow(yearWoy, 1, &yearWoyPlus1)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + int32_t nextJan1Start = handleComputeMonthStart(yearWoyPlus1, 0, false, status); // next year's Jan1 start + if (U_FAILURE(status)) { + return 0; + } // At this point julianDay is the 0-based day BEFORE the first day of // January 1, year 1 of the given calendar. If julianDay == 0, it @@ -3657,7 +3798,10 @@ int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t w case UCAL_DATE: { - int32_t m = internalGetMonth(); + int32_t m = internalGetMonth(status); + if (U_FAILURE(status)) { + return 0; + } if((m == 0) && (woy >= getLeastMaximum(UCAL_WEEK_OF_YEAR))) { return yearWoy+1; // month 0, late woy = in the next year @@ -3681,15 +3825,19 @@ int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t w } } -int32_t Calendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const +int32_t Calendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const { - return handleComputeMonthStart(extendedYear, month+1, true) - - handleComputeMonthStart(extendedYear, month, true); + return handleComputeMonthStart(extendedYear, month+1, true, status) - + handleComputeMonthStart(extendedYear, month, true, status); } -int32_t Calendar::handleGetYearLength(int32_t eyear) const { - return handleComputeMonthStart(eyear+1, 0, false) - - handleComputeMonthStart(eyear, 0, false); +int32_t Calendar::handleGetYearLength(int32_t eyear) const +{ + UErrorCode status = U_ZERO_ERROR; + int32_t result = handleComputeMonthStart(eyear+1, 0, false, status) - + handleComputeMonthStart(eyear, 0, false, status); + U_ASSERT(U_SUCCESS(status)); + return result; } int32_t @@ -3713,7 +3861,7 @@ Calendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const } cal->setLenient(true); cal->prepareGetActual(field,false,status); - result = handleGetMonthLength(cal->get(UCAL_EXTENDED_YEAR, status), cal->get(UCAL_MONTH, status)); + result = handleGetMonthLength(cal->get(UCAL_EXTENDED_YEAR, status), cal->get(UCAL_MONTH, status), status); delete cal; } break; @@ -3992,13 +4140,12 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& return; } - char region[ULOC_COUNTRY_CAPACITY]; - (void)ulocimp_getRegionForSupplementalData(desiredLocale.getName(), true, region, sizeof(region), &status); + CharString region = ulocimp_getRegionForSupplementalData(desiredLocale.getName(), true, status); // Read week data values from supplementalData week data UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", &status); ures_getByKey(rb, "weekData", rb, &status); - UResourceBundle *weekData = ures_getByKey(rb, region, nullptr, &status); + UResourceBundle *weekData = ures_getByKey(rb, region.data(), nullptr, &status); if (status == U_MISSING_RESOURCE_ERROR && rb != nullptr) { status = U_ZERO_ERROR; weekData = ures_getByKey(rb, "001", nullptr, &status); @@ -4119,14 +4266,17 @@ Calendar::internalSet(EDateFields field, int32_t value) internalSet((UCalendarDateFields) field, value); } -int32_t Calendar::internalGetMonth() const { +int32_t Calendar::internalGetMonth(UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } if (resolveFields(kMonthPrecedence) == UCAL_MONTH) { - return internalGet(UCAL_MONTH); + return internalGet(UCAL_MONTH, status); } - return internalGet(UCAL_ORDINAL_MONTH); + return internalGet(UCAL_ORDINAL_MONTH, status); } -int32_t Calendar::internalGetMonth(int32_t defaultValue) const { +int32_t Calendar::internalGetMonth(int32_t defaultValue, UErrorCode& /* status */) const { if (resolveFields(kMonthPrecedence) == UCAL_MONTH) { return internalGet(UCAL_MONTH, defaultValue); } diff --git a/deps/icu-small/source/i18n/casetrn.cpp b/deps/icu-small/source/i18n/casetrn.cpp index 2f9699ee9dc90b..f159171e088d38 100644 --- a/deps/icu-small/source/i18n/casetrn.cpp +++ b/deps/icu-small/source/i18n/casetrn.cpp @@ -91,7 +91,7 @@ UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(CaseMapTransliterator) * Constructs a transliterator. */ CaseMapTransliterator::CaseMapTransliterator(const UnicodeString &id, UCaseMapFull *map) : - Transliterator(id, 0), + Transliterator(id, nullptr), fMap(map) { // TODO test incremental mode with context-sensitive text (e.g. greek sigma) diff --git a/deps/icu-small/source/i18n/cecal.cpp b/deps/icu-small/source/i18n/cecal.cpp index 456801ee37081a..b550684b79880c 100644 --- a/deps/icu-small/source/i18n/cecal.cpp +++ b/deps/icu-small/source/i18n/cecal.cpp @@ -76,10 +76,27 @@ CECalendar::operator=(const CECalendar& right) // Calendar framework //------------------------------------------------------------------------- -int32_t -CECalendar::handleComputeMonthStart(int32_t eyear,int32_t emonth, UBool /*useMonth*/) const +int64_t +CECalendar::handleComputeMonthStart(int32_t eyear,int32_t emonth, UBool /*useMonth*/, UErrorCode& /*status*/) const { - return ceToJD(eyear, emonth, 0, getJDEpochOffset()); + int64_t year64 = eyear; + // handle month > 12, < 0 (e.g. from add/set) + if ( emonth >= 0 ) { + year64 += emonth/13; + emonth %= 13; + } else { + ++emonth; + year64 += emonth/13 - 1; + emonth = emonth%13 + 12; + } + + return ( + getJDEpochOffset() // difference from Julian epoch to 1,1,1 + + 365LL * year64 // number of days from years + + ClockMath::floorDivideInt64(year64, 4LL) // extra day of leap year + + 30 * emonth // number of days from months (months are 0-based) + - 1 // number of days for present month (1 based) + ); } int32_t @@ -88,35 +105,9 @@ CECalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) cons return LIMITS[field][limitType]; } -UBool -CECalendar::haveDefaultCentury() const -{ - return true; -} - //------------------------------------------------------------------------- // Calendar system Conversion methods... //------------------------------------------------------------------------- -int32_t -CECalendar::ceToJD(int32_t year, int32_t month, int32_t date, int32_t jdEpochOffset) -{ - // handle month > 12, < 0 (e.g. from add/set) - if ( month >= 0 ) { - year += month/13; - month %= 13; - } else { - ++month; - year += month/13 - 1; - month = month%13 + 12; - } - return (int32_t) ( - jdEpochOffset // difference from Julian epoch to 1,1,1 - + 365 * year // number of days from years - + ClockMath::floorDivide(year, 4) // extra day of leap year - + 30 * month // number of days from months (months are 0-based) - + date - 1 // number of days for present month (1 based) - ); -} void CECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day) @@ -137,13 +128,17 @@ CECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int3 static const char* kMonthCode13 = "M13"; const char* CECalendar::getTemporalMonthCode(UErrorCode& status) const { - if (get(UCAL_MONTH, status) == 12) return kMonthCode13; + if (get(UCAL_MONTH, status) == 12) { + return kMonthCode13; + } return Calendar::getTemporalMonthCode(status); } void CECalendar::setTemporalMonthCode(const char* code, UErrorCode& status) { - if (U_FAILURE(status)) return; + if (U_FAILURE(status)) { + return; + } if (uprv_strcmp(code, kMonthCode13) == 0) { set(UCAL_MONTH, 12); set(UCAL_IS_LEAP_MONTH, 0); diff --git a/deps/icu-small/source/i18n/cecal.h b/deps/icu-small/source/i18n/cecal.h index 16f36a7976c3de..8f634e796357b4 100644 --- a/deps/icu-small/source/i18n/cecal.h +++ b/deps/icu-small/source/i18n/cecal.h @@ -98,7 +98,7 @@ class U_I18N_API CECalendar : public Calendar { * Return JD of start of given month/extended year * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; /** * Calculate the limit for a specified type of limit and field @@ -106,12 +106,6 @@ class U_I18N_API CECalendar : public Calendar { */ virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; - /** - * Returns true because Coptic/Ethiopic Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - protected: /** * The Coptic and Ethiopic calendars differ only in their epochs. @@ -121,19 +115,6 @@ class U_I18N_API CECalendar : public Calendar { */ virtual int32_t getJDEpochOffset() const = 0; - /** - * Convert an Coptic/Ethiopic year, month, and day to a Julian day. - * - * @param year the extended year - * @param month the month - * @param day the day - * @param jdEpochOffset the epoch offset from Julian epoch - * @return Julian day - * @internal - */ - static int32_t ceToJD(int32_t year, int32_t month, int32_t date, - int32_t jdEpochOffset); - /** * Convert a Julian day to an Coptic/Ethiopic year, month and day * diff --git a/deps/icu-small/source/i18n/chnsecal.cpp b/deps/icu-small/source/i18n/chnsecal.cpp index c7c573bacc7959..7db5b4800bf594 100644 --- a/deps/icu-small/source/i18n/chnsecal.cpp +++ b/deps/icu-small/source/i18n/chnsecal.cpp @@ -24,7 +24,7 @@ #include "umutex.h" #include #include "gregoimp.h" // Math -#include "astro.h" // CalendarAstronomer +#include "astro.h" // CalendarAstronomer and CalendarCache #include "unicode/simpletz.h" #include "uhash.h" #include "ucln_in.h" @@ -53,16 +53,12 @@ static void debug_chnsecal_msg(const char *pat, ...) #endif -// --- The cache -- -static icu::UMutex astroLock; -static icu::CalendarAstronomer *gChineseCalendarAstro = nullptr; - // Lazy Creation & Access synchronized by class CalendarCache with a mutex. -static icu::CalendarCache *gChineseCalendarWinterSolsticeCache = nullptr; -static icu::CalendarCache *gChineseCalendarNewYearCache = nullptr; +static icu::CalendarCache *gWinterSolsticeCache = nullptr; +static icu::CalendarCache *gNewYearCache = nullptr; -static icu::TimeZone *gChineseCalendarZoneAstroCalc = nullptr; -static icu::UInitOnce gChineseCalendarZoneAstroCalcInitOnce {}; +static icu::TimeZone *gAstronomerTimeZone = nullptr; +static icu::UInitOnce gAstronomerTimeZoneInitOnce {}; /** * The start year of the Chinese calendar, the 61st year of the reign @@ -89,23 +85,19 @@ static const int32_t SYNODIC_GAP = 25; U_CDECL_BEGIN static UBool calendar_chinese_cleanup() { - if (gChineseCalendarAstro) { - delete gChineseCalendarAstro; - gChineseCalendarAstro = nullptr; - } - if (gChineseCalendarWinterSolsticeCache) { - delete gChineseCalendarWinterSolsticeCache; - gChineseCalendarWinterSolsticeCache = nullptr; + if (gWinterSolsticeCache) { + delete gWinterSolsticeCache; + gWinterSolsticeCache = nullptr; } - if (gChineseCalendarNewYearCache) { - delete gChineseCalendarNewYearCache; - gChineseCalendarNewYearCache = nullptr; + if (gNewYearCache) { + delete gNewYearCache; + gNewYearCache = nullptr; } - if (gChineseCalendarZoneAstroCalc) { - delete gChineseCalendarZoneAstroCalc; - gChineseCalendarZoneAstroCalc = nullptr; + if (gAstronomerTimeZone) { + delete gAstronomerTimeZone; + gAstronomerTimeZone = nullptr; } - gChineseCalendarZoneAstroCalcInitOnce.reset(); + gAstronomerTimeZoneInitOnce.reset(); return true; } U_CDECL_END @@ -121,33 +113,28 @@ U_NAMESPACE_BEGIN //------------------------------------------------------------------------- +namespace { + +const TimeZone* getAstronomerTimeZone(); +int32_t newMoonNear(const TimeZone*, double, UBool); +int32_t newYear(const icu::ChineseCalendar::Setting&, int32_t); +UBool isLeapMonthBetween(const TimeZone*, int32_t, int32_t); + +} // namespace + ChineseCalendar* ChineseCalendar::clone() const { return new ChineseCalendar(*this); } ChineseCalendar::ChineseCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success), - hasLeapMonthBetweenWinterSolstices(false), - fEpochYear(CHINESE_EPOCH_YEAR), - fZoneAstroCalc(getChineseCalZoneAstroCalc()) -{ - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. -} - -ChineseCalendar::ChineseCalendar(const Locale& aLocale, int32_t epochYear, - const TimeZone* zoneAstroCalc, UErrorCode &success) -: Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success), - hasLeapMonthBetweenWinterSolstices(false), - fEpochYear(epochYear), - fZoneAstroCalc(zoneAstroCalc) + hasLeapMonthBetweenWinterSolstices(false) { setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } ChineseCalendar::ChineseCalendar(const ChineseCalendar& other) : Calendar(other) { hasLeapMonthBetweenWinterSolstices = other.hasLeapMonthBetweenWinterSolstices; - fEpochYear = other.fEpochYear; - fZoneAstroCalc = other.fZoneAstroCalc; } ChineseCalendar::~ChineseCalendar() @@ -158,16 +145,20 @@ const char *ChineseCalendar::getType() const { return "chinese"; } -static void U_CALLCONV initChineseCalZoneAstroCalc() { - gChineseCalendarZoneAstroCalc = new SimpleTimeZone(CHINA_OFFSET, UNICODE_STRING_SIMPLE("CHINA_ZONE") ); +namespace { // anonymous + +static void U_CALLCONV initAstronomerTimeZone() { + gAstronomerTimeZone = new SimpleTimeZone(CHINA_OFFSET, UNICODE_STRING_SIMPLE("CHINA_ZONE") ); ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); } -const TimeZone* ChineseCalendar::getChineseCalZoneAstroCalc() const { - umtx_initOnce(gChineseCalendarZoneAstroCalcInitOnce, &initChineseCalZoneAstroCalc); - return gChineseCalendarZoneAstroCalc; +const TimeZone* getAstronomerTimeZone() { + umtx_initOnce(gAstronomerTimeZoneInitOnce, &initAstronomerTimeZone); + return gAstronomerTimeZone; } +} // namespace anonymous + //------------------------------------------------------------------------- // Minimum / Maximum access functions //------------------------------------------------------------------------- @@ -222,14 +213,32 @@ int32_t ChineseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType li * field as the continuous year count, depending on which is newer. * @stable ICU 2.8 */ -int32_t ChineseCalendar::handleGetExtendedYear() { +int32_t ChineseCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + int32_t year; if (newestStamp(UCAL_ERA, UCAL_YEAR, kUnset) <= fStamp[UCAL_EXTENDED_YEAR]) { year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } else { - int32_t cycle = internalGet(UCAL_ERA, 1) - 1; // 0-based cycle // adjust to the instance specific epoch - year = cycle * 60 + internalGet(UCAL_YEAR, 1) - (fEpochYear - CHINESE_EPOCH_YEAR); + int32_t cycle = internalGet(UCAL_ERA, 1); + year = internalGet(UCAL_YEAR, 1); + const Setting setting = getSetting(status); + if (U_FAILURE(status)) { + return 0; + } + // Handle int32 overflow calculation for + // year = year + (cycle-1) * 60 -(fEpochYear - CHINESE_EPOCH_YEAR) + if (uprv_add32_overflow(cycle, -1, &cycle) || // 0-based cycle + uprv_mul32_overflow(cycle, 60, &cycle) || + uprv_add32_overflow(year, cycle, &year) || + uprv_add32_overflow(year, -(setting.epochYear-CHINESE_EPOCH_YEAR), + &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } return year; } @@ -242,38 +251,18 @@ int32_t ChineseCalendar::handleGetExtendedYear() { * whether or not the given month is a leap month. * @stable ICU 2.8 */ -int32_t ChineseCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { - int32_t thisStart = handleComputeMonthStart(extendedYear, month, true) - +int32_t ChineseCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const { + const Setting setting = getSetting(status); + int32_t thisStart = handleComputeMonthStart(extendedYear, month, true, status); + if (U_FAILURE(status)) { + return 0; + } + thisStart = thisStart - kEpochStartAsJulianDay + 1; // Julian day -> local days - int32_t nextStart = newMoonNear(thisStart + SYNODIC_GAP, true); + int32_t nextStart = newMoonNear(setting.zoneAstroCalc, thisStart + SYNODIC_GAP, true); return nextStart - thisStart; } -/** - * Override Calendar to compute several fields specific to the Chinese - * calendar system. These are: - * - *
  • ERA - *
  • YEAR - *
  • MONTH - *
  • DAY_OF_MONTH - *
  • DAY_OF_YEAR - *
  • EXTENDED_YEAR
- * - * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this - * method is called. The getGregorianXxx() methods return Gregorian - * calendar equivalents for the given Julian day. - * - *

Compute the ChineseCalendar-specific field IS_LEAP_MONTH. - * @stable ICU 2.8 - */ -void ChineseCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) { - - computeChineseFields(julianDay - kEpochStartAsJulianDay, // local days - getGregorianYear(), getGregorianMonth(), - true); // set all fields -} - /** * Field resolution table that incorporates IS_LEAP_MONTH. */ @@ -311,6 +300,21 @@ const UFieldResolutionTable* ChineseCalendar::getFieldResolutionTable() const { return CHINESE_DATE_PRECEDENCE; } +namespace { + +struct MonthInfo { + int32_t month; + int32_t ordinalMonth; + int32_t thisMoon; + bool isLeapMonth; + bool hasLeapMonthBetweenWinterSolstices; +}; +struct MonthInfo computeMonthInfo( + const icu::ChineseCalendar::Setting& setting, + int32_t gyear, int32_t days); + +} // namespace + /** * Return the Julian day number of day before the first day of the * given month in the given extended year. @@ -324,50 +328,57 @@ const UFieldResolutionTable* ChineseCalendar::getFieldResolutionTable() const { * day of the given month and year * @stable ICU 2.8 */ -int32_t ChineseCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const { - ChineseCalendar *nonConstThis = (ChineseCalendar*)this; // cast away const - +int64_t ChineseCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } // If the month is out of range, adjust it into range, and // modify the extended year value accordingly. if (month < 0 || month > 11) { double m = month; - eyear += (int32_t)ClockMath::floorDivide(m, 12.0, &m); + if (uprv_add32_overflow(eyear, ClockMath::floorDivide(m, 12.0, &m), &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } month = (int32_t)m; } - int32_t gyear = eyear + fEpochYear - 1; // Gregorian year - int32_t theNewYear = newYear(gyear); - int32_t newMoon = newMoonNear(theNewYear + month * 29, true); - - int32_t julianDay = newMoon + kEpochStartAsJulianDay; + const Setting setting = getSetting(status); + if (U_FAILURE(status)) { + return 0; + } + int32_t gyear; + if (uprv_add32_overflow(eyear, setting.epochYear - 1, &gyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } - // Save fields for later restoration - int32_t saveMonth = internalGet(UCAL_MONTH); - int32_t saveOrdinalMonth = internalGet(UCAL_ORDINAL_MONTH); - int32_t saveIsLeapMonth = internalGet(UCAL_IS_LEAP_MONTH); + int32_t theNewYear = newYear(setting, gyear); + int32_t newMoon = newMoonNear(setting.zoneAstroCalc, theNewYear + month * 29, true); // Ignore IS_LEAP_MONTH field if useMonth is false - int32_t isLeapMonth = useMonth ? saveIsLeapMonth : 0; + bool isLeapMonth = false; + if (useMonth) { + isLeapMonth = internalGet(UCAL_IS_LEAP_MONTH) != 0; + } - UErrorCode status = U_ZERO_ERROR; - nonConstThis->computeGregorianFields(julianDay, status); - if (U_FAILURE(status)) - return 0; - - // This will modify the MONTH and IS_LEAP_MONTH fields (only) - nonConstThis->computeChineseFields(newMoon, getGregorianYear(), - getGregorianMonth(), false); + int32_t unusedMonth; + int32_t unusedDayOfWeek; + int32_t unusedDayOfMonth; + int32_t unusedDayOfYear; + Grego::dayToFields(newMoon, gyear, unusedMonth, unusedDayOfWeek, unusedDayOfMonth, unusedDayOfYear); - if (month != internalGet(UCAL_MONTH) || - isLeapMonth != internalGet(UCAL_IS_LEAP_MONTH)) { - newMoon = newMoonNear(newMoon + SYNODIC_GAP, true); - julianDay = newMoon + kEpochStartAsJulianDay; + struct MonthInfo monthInfo = computeMonthInfo(setting, gyear, newMoon); + if (month != monthInfo.month-1 || isLeapMonth != monthInfo.isLeapMonth) { + newMoon = newMoonNear(setting.zoneAstroCalc, newMoon + SYNODIC_GAP, true); + } + int32_t julianDay; + if (uprv_add32_overflow(newMoon-1, kEpochStartAsJulianDay, &julianDay)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } - nonConstThis->internalSet(UCAL_MONTH, saveMonth); - nonConstThis->internalSet(UCAL_ORDINAL_MONTH, saveOrdinalMonth); - nonConstThis->internalSet(UCAL_IS_LEAP_MONTH, saveIsLeapMonth); - return julianDay - 1; + return julianDay; } @@ -402,6 +413,66 @@ void ChineseCalendar::add(EDateFields field, int32_t amount, UErrorCode& status) add((UCalendarDateFields)field, amount, status); } +namespace { + +struct RollMonthInfo { + int32_t month; + int32_t newMoon; + int32_t thisMoon; +}; + +struct RollMonthInfo rollMonth(const TimeZone* timeZone, int32_t amount, int32_t day, int32_t month, int32_t dayOfMonth, + bool isLeapMonth, bool hasLeapMonthBetweenWinterSolstices, + UErrorCode& status) { + struct RollMonthInfo output = {0, 0, 0}; + if (U_FAILURE(status)) { + return output; + } + + output.thisMoon = day - dayOfMonth + 1; // New moon (start of this month) + + // Note throughout the following: Months 12 and 1 are never + // followed by a leap month (D&R p. 185). + + // Compute the adjusted month number m. This is zero-based + // value from 0..11 in a non-leap year, and from 0..12 in a + // leap year. + if (hasLeapMonthBetweenWinterSolstices) { // (member variable) + if (isLeapMonth) { + ++month; + } else { + // Check for a prior leap month. (In the + // following, month 0 is the first month of the + // year.) Month 0 is never followed by a leap + // month, and we know month m is not a leap month. + // moon1 will be the start of month 0 if there is + // no leap month between month 0 and month m; + // otherwise it will be the start of month 1. + int prevMoon = output.thisMoon - + (int) (CalendarAstronomer::SYNODIC_MONTH * (month - 0.5)); + prevMoon = newMoonNear(timeZone, prevMoon, true); + if (isLeapMonthBetween(timeZone, prevMoon, output.thisMoon)) { + ++month; + } + } + } + // Now do the standard roll computation on month, with the + // allowed range of 0..n-1, where n is 12 or 13. + int32_t numberOfMonths = hasLeapMonthBetweenWinterSolstices ? 13 : 12; // Months in this year + if (uprv_add32_overflow(amount, month, &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return output; + } + output.newMoon = amount % numberOfMonths; + if (output.newMoon < 0) { + output.newMoon += numberOfMonths; + } + output.month = month; + return output; +} + +} // namespace + /** * Override Calendar to handle leap months properly. * @stable ICU 2.8 @@ -411,51 +482,17 @@ void ChineseCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode case UCAL_MONTH: case UCAL_ORDINAL_MONTH: if (amount != 0) { - int32_t dom = get(UCAL_DAY_OF_MONTH, status); - if (U_FAILURE(status)) break; + const Setting setting = getSetting(status); int32_t day = get(UCAL_JULIAN_DAY, status) - kEpochStartAsJulianDay; // Get local day + int32_t month = get(UCAL_MONTH, status); // 0-based month + int32_t dayOfMonth = get(UCAL_DAY_OF_MONTH, status); + bool isLeapMonth = get(UCAL_IS_LEAP_MONTH, status) == 1; if (U_FAILURE(status)) break; - int32_t moon = day - dom + 1; // New moon (start of this month) - - // Note throughout the following: Months 12 and 1 are never - // followed by a leap month (D&R p. 185). - - // Compute the adjusted month number m. This is zero-based - // value from 0..11 in a non-leap year, and from 0..12 in a - // leap year. - int32_t m = get(UCAL_MONTH, status); // 0-based month + struct RollMonthInfo r = rollMonth(setting.zoneAstroCalc, amount, + day, month, dayOfMonth, isLeapMonth, hasLeapMonthBetweenWinterSolstices, status); if (U_FAILURE(status)) break; - if (hasLeapMonthBetweenWinterSolstices) { // (member variable) - if (get(UCAL_IS_LEAP_MONTH, status) == 1) { - ++m; - } else { - // Check for a prior leap month. (In the - // following, month 0 is the first month of the - // year.) Month 0 is never followed by a leap - // month, and we know month m is not a leap month. - // moon1 will be the start of month 0 if there is - // no leap month between month 0 and month m; - // otherwise it will be the start of month 1. - int moon1 = moon - - (int) (CalendarAstronomer::SYNODIC_MONTH * (m - 0.5)); - moon1 = newMoonNear(moon1, true); - if (isLeapMonthBetween(moon1, moon)) { - ++m; - } - } - if (U_FAILURE(status)) break; - } - - // Now do the standard roll computation on m, with the - // allowed range of 0..n-1, where n is 12 or 13. - int32_t n = hasLeapMonthBetweenWinterSolstices ? 13 : 12; // Months in this year - int32_t newM = (m + amount) % n; - if (newM < 0) { - newM += n; - } - - if (newM != m) { - offsetMonth(moon, dom, newM - m, status); + if (r.newMoon != r.month) { + offsetMonth(r.thisMoon, dayOfMonth, r.newMoon - r.month, status); } } break; @@ -474,26 +511,28 @@ void ChineseCalendar::roll(EDateFields field, int32_t amount, UErrorCode& status // Support methods and constants //------------------------------------------------------------------ +namespace { /** * Convert local days to UTC epoch milliseconds. - * This is not an accurate conversion in that getTimezoneOffset - * takes the milliseconds in GMT (not local time). In theory, more - * accurate algorithm can be implemented but practically we do not need - * to go through that complication as long as the historical timezone - * changes did not happen around the 'tricky' new moon (new moon around - * midnight). - * + * This is not an accurate conversion in that getTimezoneOffset + * takes the milliseconds in GMT (not local time). In theory, more + * accurate algorithm can be implemented but practically we do not need + * to go through that complication as long as the historical timezone + * changes did not happen around the 'tricky' new moon (new moon around + * midnight). + * + * @param timeZone time zone for the Astro calculation. * @param days days after January 1, 1970 0:00 in the astronomical base zone * @return milliseconds after January 1, 1970 0:00 GMT */ -double ChineseCalendar::daysToMillis(double days) const { +double daysToMillis(const TimeZone* timeZone, double days) { double millis = days * (double)kOneDay; - if (fZoneAstroCalc != nullptr) { + if (timeZone != nullptr) { int32_t rawOffset, dstOffset; UErrorCode status = U_ZERO_ERROR; - fZoneAstroCalc->getOffset(millis, false, rawOffset, dstOffset, status); + timeZone->getOffset(millis, false, rawOffset, dstOffset, status); if (U_SUCCESS(status)) { - return millis - (double)(rawOffset + dstOffset); + return millis - (double)(rawOffset + dstOffset); } } return millis - (double)CHINA_OFFSET; @@ -501,16 +540,17 @@ double ChineseCalendar::daysToMillis(double days) const { /** * Convert UTC epoch milliseconds to local days. + * @param timeZone time zone for the Astro calculation. * @param millis milliseconds after January 1, 1970 0:00 GMT * @return days after January 1, 1970 0:00 in the astronomical base zone */ -double ChineseCalendar::millisToDays(double millis) const { - if (fZoneAstroCalc != nullptr) { +double millisToDays(const TimeZone* timeZone, double millis) { + if (timeZone != nullptr) { int32_t rawOffset, dstOffset; UErrorCode status = U_ZERO_ERROR; - fZoneAstroCalc->getOffset(millis, false, rawOffset, dstOffset, status); + timeZone->getOffset(millis, false, rawOffset, dstOffset, status); if (U_SUCCESS(status)) { - return ClockMath::floorDivide(millis + (double)(rawOffset + dstOffset), kOneDay); + return ClockMath::floorDivide(millis + (double)(rawOffset + dstOffset), kOneDay); } } return ClockMath::floorDivide(millis + (double)CHINA_OFFSET, kOneDay); @@ -525,34 +565,35 @@ double ChineseCalendar::millisToDays(double millis) const { * Return the major solar term on or after December 15 of the given * Gregorian year, that is, the winter solstice of the given year. * Computations are relative to Asia/Shanghai time zone. + * @param setting setting (time zone and caches) for the Astro calculation. * @param gyear a Gregorian year * @return days after January 1, 1970 0:00 Asia/Shanghai of the * winter solstice of the given year */ -int32_t ChineseCalendar::winterSolstice(int32_t gyear) const { +int32_t winterSolstice(const icu::ChineseCalendar::Setting& setting, + int32_t gyear) { + const TimeZone* timeZone = setting.zoneAstroCalc; UErrorCode status = U_ZERO_ERROR; - int32_t cacheValue = CalendarCache::get(&gChineseCalendarWinterSolsticeCache, gyear, status); + int32_t cacheValue = CalendarCache::get(setting.winterSolsticeCache, gyear, status); if (cacheValue == 0) { // In books December 15 is used, but it fails for some years // using our algorithms, e.g.: 1298 1391 1492 1553 1560. That // is, winterSolstice(1298) starts search at Dec 14 08:00:00 // PST 1298 with a final result of Dec 14 10:31:59 PST 1299. - double ms = daysToMillis(Grego::fieldsToDay(gyear, UCAL_DECEMBER, 1)); - - umtx_lock(&astroLock); - if(gChineseCalendarAstro == nullptr) { - gChineseCalendarAstro = new CalendarAstronomer(); - ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); - } - gChineseCalendarAstro->setTime(ms); - UDate solarLong = gChineseCalendarAstro->getSunTime(CalendarAstronomer::WINTER_SOLSTICE(), true); - umtx_unlock(&astroLock); + double ms = daysToMillis(timeZone, Grego::fieldsToDay(gyear, UCAL_DECEMBER, 1)); // Winter solstice is 270 degrees solar longitude aka Dongzhi - cacheValue = (int32_t)millisToDays(solarLong); - CalendarCache::put(&gChineseCalendarWinterSolsticeCache, gyear, cacheValue, status); + double days = millisToDays(timeZone, + CalendarAstronomer(ms) + .getSunTime(CalendarAstronomer::WINTER_SOLSTICE(), true)); + if (days < INT32_MIN || days > INT32_MAX) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + cacheValue = (int32_t) days; + CalendarCache::put(setting.winterSolsticeCache, gyear, cacheValue, status); } if(U_FAILURE(status)) { cacheValue = 0; @@ -563,24 +604,18 @@ int32_t ChineseCalendar::winterSolstice(int32_t gyear) const { /** * Return the closest new moon to the given date, searching either * forward or backward in time. + * @param timeZone time zone for the Astro calculation. * @param days days after January 1, 1970 0:00 Asia/Shanghai * @param after if true, search for a new moon on or after the given * date; otherwise, search for a new moon before it * @return days after January 1, 1970 0:00 Asia/Shanghai of the nearest * new moon after or before days */ -int32_t ChineseCalendar::newMoonNear(double days, UBool after) const { - - umtx_lock(&astroLock); - if(gChineseCalendarAstro == nullptr) { - gChineseCalendarAstro = new CalendarAstronomer(); - ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); - } - gChineseCalendarAstro->setTime(daysToMillis(days)); - UDate newMoon = gChineseCalendarAstro->getMoonTime(CalendarAstronomer::NEW_MOON(), after); - umtx_unlock(&astroLock); - - return (int32_t) millisToDays(newMoon); +int32_t newMoonNear(const TimeZone* timeZone, double days, UBool after) { + return (int32_t) millisToDays( + timeZone, + CalendarAstronomer(daysToMillis(timeZone, days)) + .getMoonTime(CalendarAstronomer::NEW_MOON(), after)); } /** @@ -590,7 +625,7 @@ int32_t ChineseCalendar::newMoonNear(double days, UBool after) const { * @param day2 days after January 1, 1970 0:00 Asia/Shanghai * @return the nearest integer number of months between day1 and day2 */ -int32_t ChineseCalendar::synodicMonthsBetween(int32_t day1, int32_t day2) const { +int32_t synodicMonthsBetween(int32_t day1, int32_t day2) { double roundme = ((day2 - day1) / CalendarAstronomer::SYNODIC_MONTH); return (int32_t) (roundme + (roundme >= 0 ? .5 : -.5)); } @@ -599,21 +634,13 @@ int32_t ChineseCalendar::synodicMonthsBetween(int32_t day1, int32_t day2) const * Return the major solar term on or before a given date. This * will be an integer from 1..12, with 1 corresponding to 330 degrees, * 2 to 0 degrees, 3 to 30 degrees,..., and 12 to 300 degrees. + * @param timeZone time zone for the Astro calculation. * @param days days after January 1, 1970 0:00 Asia/Shanghai */ -int32_t ChineseCalendar::majorSolarTerm(int32_t days) const { - - umtx_lock(&astroLock); - if(gChineseCalendarAstro == nullptr) { - gChineseCalendarAstro = new CalendarAstronomer(); - ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); - } - gChineseCalendarAstro->setTime(daysToMillis(days)); - UDate solarLongitude = gChineseCalendarAstro->getSunLongitude(); - umtx_unlock(&astroLock); - +int32_t majorSolarTerm(const TimeZone* timeZone, int32_t days) { // Compute (floor(solarLongitude / (pi/6)) + 2) % 12 - int32_t term = ( ((int32_t)(6 * solarLongitude / CalendarAstronomer::PI)) + 2 ) % 12; + int32_t term = ( ((int32_t)(6 * CalendarAstronomer(daysToMillis(timeZone, days)) + .getSunLongitude() / CalendarAstronomer::PI)) + 2 ) % 12; if (term < 1) { term += 12; } @@ -622,12 +649,13 @@ int32_t ChineseCalendar::majorSolarTerm(int32_t days) const { /** * Return true if the given month lacks a major solar term. + * @param timeZone time zone for the Astro calculation. * @param newMoon days after January 1, 1970 0:00 Asia/Shanghai of a new * moon */ -UBool ChineseCalendar::hasNoMajorSolarTerm(int32_t newMoon) const { - return majorSolarTerm(newMoon) == - majorSolarTerm(newMoonNear(newMoon + SYNODIC_GAP, true)); +UBool hasNoMajorSolarTerm(const TimeZone* timeZone, int32_t newMoon) { + return majorSolarTerm(timeZone, newMoon) == + majorSolarTerm(timeZone, newMoonNear(timeZone, newMoon + SYNODIC_GAP, true)); } @@ -638,12 +666,13 @@ UBool ChineseCalendar::hasNoMajorSolarTerm(int32_t newMoon) const { /** * Return true if there is a leap month on or after month newMoon1 and * at or before month newMoon2. + * @param timeZone time zone for the Astro calculation. * @param newMoon1 days after January 1, 1970 0:00 astronomical base zone * of a new moon * @param newMoon2 days after January 1, 1970 0:00 astronomical base zone * of a new moon */ -UBool ChineseCalendar::isLeapMonthBetween(int32_t newMoon1, int32_t newMoon2) const { +UBool isLeapMonthBetween(const TimeZone* timeZone, int32_t newMoon1, int32_t newMoon2) { #ifdef U_DEBUG_CHNSECAL // This is only needed to debug the timeOfAngle divergence bug. @@ -656,144 +685,201 @@ UBool ChineseCalendar::isLeapMonthBetween(int32_t newMoon1, int32_t newMoon2) co #endif while (newMoon2 >= newMoon1) { - if (hasNoMajorSolarTerm(newMoon2)) { + if (hasNoMajorSolarTerm(timeZone, newMoon2)) { return true; } - newMoon2 = newMoonNear(newMoon2 - SYNODIC_GAP, false); + newMoon2 = newMoonNear(timeZone, newMoon2 - SYNODIC_GAP, false); } return false; } + /** - * Compute fields for the Chinese calendar system. This method can - * either set all relevant fields, as required by - * handleComputeFields(), or it can just set the MONTH and - * IS_LEAP_MONTH fields, as required by - * handleComputeMonthStart(). - * - *

As a side effect, this method sets {@link #hasLeapMonthBetweenWinterSolstices}. + * Compute the information about the year. + * @param setting setting (time zone and caches) for the Astro calculation. + * @param gyear the Gregorian year of the given date * @param days days after January 1, 1970 0:00 astronomical base zone * of the date to compute fields for - * @param gyear the Gregorian year of the given date - * @param gmonth the Gregorian month of the given date - * @param setAllFields if true, set the EXTENDED_YEAR, ERA, YEAR, - * DAY_OF_MONTH, and DAY_OF_YEAR fields. In either case set the MONTH - * and IS_LEAP_MONTH fields. + * @return The MonthInfo result. */ -void ChineseCalendar::computeChineseFields(int32_t days, int32_t gyear, int32_t gmonth, - UBool setAllFields) { +struct MonthInfo computeMonthInfo( + const icu::ChineseCalendar::Setting& setting, + int32_t gyear, int32_t days) { + struct MonthInfo output; // Find the winter solstices before and after the target date. // These define the boundaries of this Chinese year, specifically, // the position of month 11, which always contains the solstice. // We want solsticeBefore <= date < solsticeAfter. int32_t solsticeBefore; - int32_t solsticeAfter = winterSolstice(gyear); + int32_t solsticeAfter = winterSolstice(setting, gyear); if (days < solsticeAfter) { - solsticeBefore = winterSolstice(gyear - 1); + solsticeBefore = winterSolstice(setting, gyear - 1); } else { solsticeBefore = solsticeAfter; - solsticeAfter = winterSolstice(gyear + 1); + solsticeAfter = winterSolstice(setting, gyear + 1); } + const TimeZone* timeZone = setting.zoneAstroCalc; // Find the start of the month after month 11. This will be either // the prior month 12 or leap month 11 (very rare). Also find the // start of the following month 11. - int32_t firstMoon = newMoonNear(solsticeBefore + 1, true); - int32_t lastMoon = newMoonNear(solsticeAfter + 1, false); - int32_t thisMoon = newMoonNear(days + 1, false); // Start of this month - // Note: hasLeapMonthBetweenWinterSolstices is a member variable - hasLeapMonthBetweenWinterSolstices = synodicMonthsBetween(firstMoon, lastMoon) == 12; - - int32_t month = synodicMonthsBetween(firstMoon, thisMoon); - int32_t theNewYear = newYear(gyear); + int32_t firstMoon = newMoonNear(timeZone, solsticeBefore + 1, true); + int32_t lastMoon = newMoonNear(timeZone, solsticeAfter + 1, false); + output.thisMoon = newMoonNear(timeZone, days + 1, false); // Start of this month + output.hasLeapMonthBetweenWinterSolstices = synodicMonthsBetween(firstMoon, lastMoon) == 12; + + output.month = synodicMonthsBetween(firstMoon, output.thisMoon); + int32_t theNewYear = newYear(setting, gyear); if (days < theNewYear) { - theNewYear = newYear(gyear-1); + theNewYear = newYear(setting, gyear-1); } - if (hasLeapMonthBetweenWinterSolstices && isLeapMonthBetween(firstMoon, thisMoon)) { - month--; + if (output.hasLeapMonthBetweenWinterSolstices && + isLeapMonthBetween(timeZone, firstMoon, output.thisMoon)) { + output.month--; } - if (month < 1) { - month += 12; + if (output.month < 1) { + output.month += 12; } - int32_t ordinalMonth = synodicMonthsBetween(theNewYear, thisMoon); - if (ordinalMonth < 0) { - ordinalMonth += 12; + output.ordinalMonth = synodicMonthsBetween(theNewYear, output.thisMoon); + if (output.ordinalMonth < 0) { + output.ordinalMonth += 12; } - UBool isLeapMonth = hasLeapMonthBetweenWinterSolstices && - hasNoMajorSolarTerm(thisMoon) && - !isLeapMonthBetween(firstMoon, newMoonNear(thisMoon - SYNODIC_GAP, false)); - - internalSet(UCAL_MONTH, month-1); // Convert from 1-based to 0-based - internalSet(UCAL_ORDINAL_MONTH, ordinalMonth); // Convert from 1-based to 0-based - internalSet(UCAL_IS_LEAP_MONTH, isLeapMonth?1:0); - - - if (setAllFields) { + output.isLeapMonth = output.hasLeapMonthBetweenWinterSolstices && + hasNoMajorSolarTerm(timeZone, output.thisMoon) && + !isLeapMonthBetween(timeZone, firstMoon, + newMoonNear(timeZone, output.thisMoon - SYNODIC_GAP, false)); + return output; +} - // Extended year and cycle year is based on the epoch year - - int32_t extended_year = gyear - fEpochYear; - int cycle_year = gyear - CHINESE_EPOCH_YEAR; - if (month < 11 || - gmonth >= UCAL_JULY) { - extended_year++; - cycle_year++; - } - int32_t dayOfMonth = days - thisMoon + 1; +} // namespace - internalSet(UCAL_EXTENDED_YEAR, extended_year); +/** + * Override Calendar to compute several fields specific to the Chinese + * calendar system. These are: + * + *

  • ERA + *
  • YEAR + *
  • MONTH + *
  • DAY_OF_MONTH + *
  • DAY_OF_YEAR + *
  • EXTENDED_YEAR
+ * + * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this + * method is called. The getGregorianXxx() methods return Gregorian + * calendar equivalents for the given Julian day. + * + *

Compute the ChineseCalendar-specific field IS_LEAP_MONTH. + * @stable ICU 2.8 + */ +void ChineseCalendar::handleComputeFields(int32_t julianDay, UErrorCode & status) { + if (U_FAILURE(status)) { + return; + } + int32_t days; + if (uprv_add32_overflow(julianDay, -kEpochStartAsJulianDay, &days)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + int32_t gyear = getGregorianYear(); + int32_t gmonth = getGregorianMonth(); - // 0->0,60 1->1,1 60->1,60 61->2,1 etc. - int32_t yearOfCycle; - int32_t cycle = ClockMath::floorDivide(cycle_year - 1, 60, &yearOfCycle); - internalSet(UCAL_ERA, cycle + 1); - internalSet(UCAL_YEAR, yearOfCycle + 1); + const Setting setting = getSetting(status); + if (U_FAILURE(status)) { + return; + } + struct MonthInfo monthInfo = computeMonthInfo(setting, gyear, days); + hasLeapMonthBetweenWinterSolstices = monthInfo.hasLeapMonthBetweenWinterSolstices; + + // Extended year and cycle year is based on the epoch year + int32_t eyear = gyear - setting.epochYear; + int32_t cycle_year = gyear - CHINESE_EPOCH_YEAR; + if (monthInfo.month < 11 || + gmonth >= UCAL_JULY) { + eyear++; + cycle_year++; + } + int32_t dayOfMonth = days - monthInfo.thisMoon + 1; - internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); + // 0->0,60 1->1,1 60->1,60 61->2,1 etc. + int32_t yearOfCycle; + int32_t cycle = ClockMath::floorDivide(cycle_year - 1, 60, &yearOfCycle); - // Days will be before the first new year we compute if this - // date is in month 11, leap 11, 12. There is never a leap 12. - // New year computations are cached so this should be cheap in - // the long run. - int32_t theNewYear = newYear(gyear); - if (days < theNewYear) { - theNewYear = newYear(gyear-1); + // Days will be before the first new year we compute if this + // date is in month 11, leap 11, 12. There is never a leap 12. + // New year computations are cached so this should be cheap in + // the long run. + int32_t theNewYear = newYear(setting, gyear); + if (days < theNewYear) { + theNewYear = newYear(setting, gyear-1); + } + cycle++; + yearOfCycle++; + int32_t dayOfYear = days - theNewYear + 1; + + int32_t minYear = this->handleGetLimit(UCAL_EXTENDED_YEAR, UCAL_LIMIT_MINIMUM); + if (eyear < minYear) { + if (!isLenient()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } - internalSet(UCAL_DAY_OF_YEAR, days - theNewYear + 1); + eyear = minYear; + } + int32_t maxYear = this->handleGetLimit(UCAL_EXTENDED_YEAR, UCAL_LIMIT_MAXIMUM); + if (maxYear < eyear) { + if (!isLenient()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + eyear = maxYear; } -} + internalSet(UCAL_MONTH, monthInfo.month-1); // Convert from 1-based to 0-based + internalSet(UCAL_ORDINAL_MONTH, monthInfo.ordinalMonth); // Convert from 1-based to 0-based + internalSet(UCAL_IS_LEAP_MONTH, monthInfo.isLeapMonth?1:0); + + internalSet(UCAL_EXTENDED_YEAR, eyear); + internalSet(UCAL_ERA, cycle); + internalSet(UCAL_YEAR, yearOfCycle); + internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); + internalSet(UCAL_DAY_OF_YEAR, dayOfYear); +} //------------------------------------------------------------------ // Fields to time //------------------------------------------------------------------ +namespace { + /** * Return the Chinese new year of the given Gregorian year. + * @param setting setting (time zone and caches) for the Astro calculation. * @param gyear a Gregorian year * @return days after January 1, 1970 0:00 astronomical base zone of the * Chinese new year of the given year (this will be a new moon) */ -int32_t ChineseCalendar::newYear(int32_t gyear) const { +int32_t newYear(const icu::ChineseCalendar::Setting& setting, + int32_t gyear) { + const TimeZone* timeZone = setting.zoneAstroCalc; UErrorCode status = U_ZERO_ERROR; - int32_t cacheValue = CalendarCache::get(&gChineseCalendarNewYearCache, gyear, status); + int32_t cacheValue = CalendarCache::get(setting.newYearCache, gyear, status); if (cacheValue == 0) { - int32_t solsticeBefore= winterSolstice(gyear - 1); - int32_t solsticeAfter = winterSolstice(gyear); - int32_t newMoon1 = newMoonNear(solsticeBefore + 1, true); - int32_t newMoon2 = newMoonNear(newMoon1 + SYNODIC_GAP, true); - int32_t newMoon11 = newMoonNear(solsticeAfter + 1, false); - + int32_t solsticeBefore= winterSolstice(setting, gyear - 1); + int32_t solsticeAfter = winterSolstice(setting, gyear); + int32_t newMoon1 = newMoonNear(timeZone, solsticeBefore + 1, true); + int32_t newMoon2 = newMoonNear(timeZone, newMoon1 + SYNODIC_GAP, true); + int32_t newMoon11 = newMoonNear(timeZone, solsticeAfter + 1, false); + if (synodicMonthsBetween(newMoon1, newMoon11) == 12 && - (hasNoMajorSolarTerm(newMoon1) || hasNoMajorSolarTerm(newMoon2))) { - cacheValue = newMoonNear(newMoon2 + SYNODIC_GAP, true); + (hasNoMajorSolarTerm(timeZone, newMoon1) || + hasNoMajorSolarTerm(timeZone, newMoon2))) { + cacheValue = newMoonNear(timeZone, newMoon2 + SYNODIC_GAP, true); } else { cacheValue = newMoon2; } - CalendarCache::put(&gChineseCalendarNewYearCache, gyear, cacheValue, status); + CalendarCache::put(setting.newYearCache, gyear, cacheValue, status); } if(U_FAILURE(status)) { cacheValue = 0; @@ -801,6 +887,8 @@ int32_t ChineseCalendar::newYear(int32_t gyear) const { return cacheValue; } +} // namespace + /** * Adjust this calendar to be delta months before or after a given * start position, pinning the day of month if necessary. The start @@ -808,13 +896,14 @@ int32_t ChineseCalendar::newYear(int32_t gyear) const { * and a day-of-month. Used by add() and roll(). * @param newMoon the local days of the first day of the month of the * start position (days after January 1, 1970 0:00 Asia/Shanghai) - * @param dom the 1-based day-of-month of the start position + * @param dayOfMonth the 1-based day-of-month of the start position * @param delta the number of months to move forward or backward from * the start position * @param status The status. */ -void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, +void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dayOfMonth, int32_t delta, UErrorCode& status) { + const Setting setting = getSetting(status); if (U_FAILURE(status)) { return; } // Move to the middle of the month before our target month. @@ -828,14 +917,14 @@ void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, newMoon = static_cast(value); // Search forward to the target month's new moon - newMoon = newMoonNear(newMoon, true); + newMoon = newMoonNear(setting.zoneAstroCalc, newMoon, true); - // Find the target dom - int32_t jd = newMoon + kEpochStartAsJulianDay - 1 + dom; + // Find the target dayOfMonth + int32_t jd = newMoon + kEpochStartAsJulianDay - 1 + dayOfMonth; - // Pin the dom. In this calendar all months are 29 or 30 days - // so pinning just means handling dom 30. - if (dom > 29) { + // Pin the dayOfMonth. In this calendar all months are 29 or 30 days + // so pinning just means handling dayOfMonth 30. + if (dayOfMonth > 29) { set(UCAL_JULIAN_DAY, jd-1); // TODO Fix this. We really shouldn't ever have to // explicitly call complete(). This is either a bug in @@ -843,7 +932,7 @@ void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, // Calendar.getActualMaximum(). I suspect the last. complete(status); if (U_FAILURE(status)) return; - if (getActualMaximum(UCAL_DAY_OF_MONTH, status) >= dom) { + if (getActualMaximum(UCAL_DAY_OF_MONTH, status) >= dayOfMonth) { if (U_FAILURE(status)) return; set(UCAL_JULIAN_DAY, jd); } @@ -860,7 +949,11 @@ int32_t ChineseCalendar::getRelatedYear(UErrorCode &status) const if (U_FAILURE(status)) { return 0; } - return year + kChineseRelatedYearDiff; + if (uprv_add32_overflow(year, kChineseRelatedYearDiff, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return year; } void ChineseCalendar::setRelatedYear(int32_t year) @@ -869,60 +962,7 @@ void ChineseCalendar::setRelatedYear(int32_t year) set(UCAL_EXTENDED_YEAR, year - kChineseRelatedYearDiff); } -// default century - -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInitOnce {}; - - -UBool ChineseCalendar::haveDefaultCentury() const -{ - return true; -} - -UDate ChineseCalendar::defaultCenturyStart() const -{ - return internalGetDefaultCenturyStart(); -} - -int32_t ChineseCalendar::defaultCenturyStartYear() const -{ - return internalGetDefaultCenturyStartYear(); -} - -static void U_CALLCONV initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - ChineseCalendar calendar(Locale("@calendar=chinese"),status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate -ChineseCalendar::internalGetDefaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInitOnce, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t -ChineseCalendar::internalGetDefaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInitOnce, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(ChineseCalendar, "@calendar=chinese") bool ChineseCalendar::inTemporalLeapYear(UErrorCode &status) const @@ -972,7 +1012,10 @@ ChineseCalendar::setTemporalMonthCode(const char* code, UErrorCode& status ) status = U_ILLEGAL_ARGUMENT_ERROR; } -int32_t ChineseCalendar::internalGetMonth() const { +int32_t ChineseCalendar::internalGetMonth(UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } if (resolveFields(kMonthPrecedence) == UCAL_MONTH) { return internalGet(UCAL_MONTH); } @@ -982,24 +1025,38 @@ int32_t ChineseCalendar::internalGetMonth() const { temp->set(UCAL_DATE, 1); // Calculate the UCAL_MONTH and UCAL_IS_LEAP_MONTH by adding number of // months. - UErrorCode status = U_ZERO_ERROR; temp->roll(UCAL_MONTH, internalGet(UCAL_ORDINAL_MONTH), status); - U_ASSERT(U_SUCCESS(status)); + if (U_FAILURE(status)) { + return 0; + } ChineseCalendar *nonConstThis = (ChineseCalendar*)this; // cast away const nonConstThis->internalSet(UCAL_IS_LEAP_MONTH, temp->get(UCAL_IS_LEAP_MONTH, status)); - U_ASSERT(U_SUCCESS(status)); int32_t month = temp->get(UCAL_MONTH, status); - U_ASSERT(U_SUCCESS(status)); + if (U_FAILURE(status)) { + return 0; + } nonConstThis->internalSet(UCAL_MONTH, month); return month; } -int32_t ChineseCalendar::internalGetMonth(int32_t defaultValue) const { +int32_t ChineseCalendar::internalGetMonth(int32_t defaultValue, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } if (resolveFields(kMonthPrecedence) == UCAL_MONTH) { return internalGet(UCAL_MONTH, defaultValue); } - return internalGetMonth(); + return internalGetMonth(status); +} + +ChineseCalendar::Setting ChineseCalendar::getSetting(UErrorCode&) const { + return { + CHINESE_EPOCH_YEAR, + getAstronomerTimeZone(), + &gWinterSolsticeCache, + &gNewYearCache + }; } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/chnsecal.h b/deps/icu-small/source/i18n/chnsecal.h index e4910f6eb8e2af..41bd3557fcbff1 100644 --- a/deps/icu-small/source/i18n/chnsecal.h +++ b/deps/icu-small/source/i18n/chnsecal.h @@ -27,6 +27,7 @@ U_NAMESPACE_BEGIN +class CalendarCache; /** * ChineseCalendar is a concrete subclass of {@link Calendar} * that implements a traditional Chinese calendar. The traditional Chinese @@ -152,23 +153,6 @@ class U_I18N_API ChineseCalendar : public Calendar { */ virtual void setTemporalMonthCode(const char* code, UErrorCode& status) override; - protected: - - /** - * Constructs a ChineseCalendar based on the current time in the default time zone - * with the given locale, using the specified epoch year and time zone for - * astronomical calculations. - * - * @param aLocale The given locale. - * @param epochYear The epoch year to use for calculation. - * @param zoneAstroCalc The TimeZone to use for astronomical calculations. If null, - * will be set appropriately for Chinese calendar (UTC + 8:00). - * @param success Indicates the status of ChineseCalendar object construction; - * if successful, will not be changed to an error value. - * @internal - */ - ChineseCalendar(const Locale& aLocale, int32_t epochYear, const TimeZone* zoneAstroCalc, UErrorCode &success); - public: /** * Copy Constructor @@ -197,9 +181,6 @@ class U_I18N_API ChineseCalendar : public Calendar { // this value could be false for a date prior to the Winter Solstice of that // year but that year still has a leap month and therefor is a leap year. UBool hasLeapMonthBetweenWinterSolstices; - int32_t fEpochYear; // Start year of this Chinese calendar instance. - const TimeZone* fZoneAstroCalc; // Zone used for the astronomical calculation - // of this Chinese calendar instance. //---------------------------------------------------------------------- // Calendar framework @@ -207,9 +188,9 @@ class U_I18N_API ChineseCalendar : public Calendar { protected: virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; virtual const UFieldResolutionTable* getFieldResolutionTable() const override; @@ -241,19 +222,7 @@ class U_I18N_API ChineseCalendar : public Calendar { static const UFieldResolutionTable CHINESE_DATE_PRECEDENCE[]; - double daysToMillis(double days) const; - double millisToDays(double millis) const; - virtual int32_t winterSolstice(int32_t gyear) const; - virtual int32_t newMoonNear(double days, UBool after) const; - virtual int32_t synodicMonthsBetween(int32_t day1, int32_t day2) const; - virtual int32_t majorSolarTerm(int32_t days) const; - virtual UBool hasNoMajorSolarTerm(int32_t newMoon) const; - virtual UBool isLeapMonthBetween(int32_t newMoon1, int32_t newMoon2) const; - virtual void computeChineseFields(int32_t days, int32_t gyear, - int32_t gmonth, UBool setAllFields); - virtual int32_t newYear(int32_t gyear) const; virtual void offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, UErrorCode& status); - const TimeZone* getChineseCalZoneAstroCalc() const; // UObject stuff public: @@ -285,46 +254,29 @@ class U_I18N_API ChineseCalendar : public Calendar { */ virtual const char * getType() const override; + struct Setting { + int32_t epochYear; + const TimeZone* zoneAstroCalc; + CalendarCache** winterSolsticeCache; + CalendarCache** newYearCache; + }; protected: - virtual int32_t internalGetMonth(int32_t defaultValue) const override; + virtual Setting getSetting(UErrorCode& status) const; + virtual int32_t internalGetMonth(int32_t defaultValue, UErrorCode& status) const override; - virtual int32_t internalGetMonth() const override; + virtual int32_t internalGetMonth(UErrorCode& status) const override; protected: - /** - * Returns true because the Islamic Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY private: // default century stuff. - /** - * Returns the beginning date of the 100-year window that dates - * with 2-digit years are considered to fall within. - */ - UDate internalGetDefaultCenturyStart() const; - - /** - * Returns the first year of the 100-year window that dates with - * 2-digit years are considered to fall within. - */ - int32_t internalGetDefaultCenturyStartYear() const; - ChineseCalendar() = delete; // default constructor not implemented + +#ifdef __CalendarTest__ + friend void CalendarTest::TestChineseCalendarComputeMonthStart(); +#endif }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/coll.cpp b/deps/icu-small/source/i18n/coll.cpp index ced55c8dbf095b..c83b29043612bb 100644 --- a/deps/icu-small/source/i18n/coll.cpp +++ b/deps/icu-small/source/i18n/coll.cpp @@ -261,7 +261,7 @@ static UBool isAvailableLocaleListInitialized(UErrorCode &status) { namespace { -static const struct { +const struct { const char *name; UColAttribute attr; } collAttributes[] = { @@ -274,7 +274,7 @@ static const struct { { "colNumeric", UCOL_NUMERIC_COLLATION } }; -static const struct { +const struct { const char *name; UColAttributeValue value; } collAttributeValues[] = { @@ -292,7 +292,7 @@ static const struct { { "upper", UCOL_UPPER_FIRST } }; -static const char *collReorderCodes[UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST] = { +const char* collReorderCodes[UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST] = { "space", "punct", "symbol", "currency", "digit" }; @@ -431,7 +431,7 @@ Collator* U_EXPORT2 Collator::createInstance(const Locale& desiredLocale, UErrorCode& status) { if (U_FAILURE(status)) - return 0; + return nullptr; if (desiredLocale.isBogus()) { // Locale constructed from malformed locale ID or language tag. status = U_ILLEGAL_ARGUMENT_ERROR; diff --git a/deps/icu-small/source/i18n/collationbuilder.cpp b/deps/icu-small/source/i18n/collationbuilder.cpp index 3da74cc4833c53..b243992cc58b23 100644 --- a/deps/icu-small/source/i18n/collationbuilder.cpp +++ b/deps/icu-small/source/i18n/collationbuilder.cpp @@ -1119,9 +1119,9 @@ CollationBuilder::addWithClosure(const UnicodeString &nfdPrefix, const UnicodeSt // Please let us know if you have a reasonable use case that needed // for a practical Collation rule that needs to increase this limit. // This value is needed for compiling a rule with eight Hangul syllables such as -// "&a=b쫊쫊쫊쫊쫊쫊쫊쫊" without error, which should be more than realistic +// "&a=b쫊쫊쫊쫊쫊쫊쫊" without error, which should be more than realistic // usage. -static constexpr int32_t kClosureLoopLimit = 6560; +static constexpr int32_t kClosureLoopLimit = 3000; uint32_t CollationBuilder::addOnlyClosure(const UnicodeString &nfdPrefix, const UnicodeString &nfdString, diff --git a/deps/icu-small/source/i18n/collationroot.cpp b/deps/icu-small/source/i18n/collationroot.cpp index 99686345f9ba8a..25243b34dfdacb 100644 --- a/deps/icu-small/source/i18n/collationroot.cpp +++ b/deps/icu-small/source/i18n/collationroot.cpp @@ -33,8 +33,8 @@ U_NAMESPACE_BEGIN namespace { -static const CollationCacheEntry *rootSingleton = nullptr; -static UInitOnce initOnce {}; +const CollationCacheEntry *rootSingleton = nullptr; +UInitOnce initOnce{}; } // namespace diff --git a/deps/icu-small/source/i18n/collationruleparser.cpp b/deps/icu-small/source/i18n/collationruleparser.cpp index ba740e8d18825b..def5ea096d478a 100644 --- a/deps/icu-small/source/i18n/collationruleparser.cpp +++ b/deps/icu-small/source/i18n/collationruleparser.cpp @@ -24,7 +24,6 @@ #include "unicode/uloc.h" #include "unicode/unistr.h" #include "unicode/utf16.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "collation.h" @@ -42,7 +41,7 @@ U_NAMESPACE_BEGIN namespace { -static const char16_t BEFORE[] = { 0x5b, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0 }; // "[before" +const char16_t BEFORE[] = { 0x5b, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0 }; // "[before" const int32_t BEFORE_LENGTH = 7; } // namespace @@ -439,7 +438,7 @@ CollationRuleParser::parseString(int32_t i, UnicodeString &raw, UErrorCode &erro namespace { -static const char *const positions[] = { +const char* const positions[] = { "first tertiary ignorable", "last tertiary ignorable", "first secondary ignorable", @@ -606,12 +605,8 @@ CollationRuleParser::parseSetting(UErrorCode &errorCode) { lang.appendInvariantChars(v, errorCode); if(errorCode == U_MEMORY_ALLOCATION_ERROR) { return; } // BCP 47 language tag -> ICU locale ID - CharString localeID; int32_t parsedLength; - { - CharStringByteSink sink(&localeID); - ulocimp_forLanguageTag(lang.data(), -1, sink, &parsedLength, &errorCode); - } + CharString localeID = ulocimp_forLanguageTag(lang.data(), -1, &parsedLength, errorCode); if(U_FAILURE(errorCode) || parsedLength != lang.length()) { errorCode = U_ZERO_ERROR; setParseError("expected language tag in [import langTag]", errorCode); @@ -632,11 +627,7 @@ CollationRuleParser::parseSetting(UErrorCode &errorCode) { uprv_memcpy(baseID, "und", 3); } // @collation=type, or length=0 if not specified - CharString collationType; - { - CharStringByteSink sink(&collationType); - ulocimp_getKeywordValue(localeID.data(), "collation", sink, &errorCode); - } + CharString collationType = ulocimp_getKeywordValue(localeID.data(), "collation", errorCode); if(U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; setParseError("expected language tag in [import langTag]", errorCode); diff --git a/deps/icu-small/source/i18n/coptccal.cpp b/deps/icu-small/source/i18n/coptccal.cpp index a957f8f2c561b4..343bcbc32934e8 100644 --- a/deps/icu-small/source/i18n/coptccal.cpp +++ b/deps/icu-small/source/i18n/coptccal.cpp @@ -11,6 +11,7 @@ #if !UCONFIG_NO_FORMATTING +#include "gregoimp.h" #include "umutex.h" #include "coptccal.h" #include "cecal.h" @@ -57,21 +58,24 @@ CopticCalendar::getType() const //------------------------------------------------------------------------- int32_t -CopticCalendar::handleGetExtendedYear() +CopticCalendar::handleGetExtendedYear(UErrorCode& status) { - int32_t eyear; + if (U_FAILURE(status)) { + return 0; + } if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - eyear = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 - } else { - // The year defaults to the epoch start, the era to CE - int32_t era = internalGet(UCAL_ERA, CE); - if (era == BCE) { - eyear = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year - } else { - eyear = internalGet(UCAL_YEAR, 1); // Default to year 1 - } + return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 + } + // The year defaults to the epoch start, the era to CE + int32_t era = internalGet(UCAL_ERA, CE); + if (era == BCE) { + return 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year + } + if (era == CE){ + return internalGet(UCAL_YEAR, 1); // Default to year 1 } - return eyear; + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } void @@ -114,45 +118,7 @@ void CopticCalendar::setRelatedYear(int32_t year) set(UCAL_EXTENDED_YEAR, year - kCopticRelatedYearDiff); } -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - - -static void U_CALLCONV initializeSystemDefaultCentury() { - UErrorCode status = U_ZERO_ERROR; - CopticCalendar calendar(Locale("@calendar=coptic"), status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate -CopticCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t -CopticCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} - +IMPL_SYSTEM_DEFAULT_CENTURY(CopticCalendar, "@calendar=coptic") int32_t CopticCalendar::getJDEpochOffset() const @@ -161,21 +127,6 @@ CopticCalendar::getJDEpochOffset() const } -#if 0 -// We do not want to introduce this API in ICU4C. -// It was accidentally introduced in ICU4J as a public API. - -//------------------------------------------------------------------------- -// Calendar system Conversion methods... -//------------------------------------------------------------------------- - -int32_t -CopticCalendar::copticToJD(int32_t year, int32_t month, int32_t day) -{ - return CECalendar::ceToJD(year, month, day, COPTIC_JD_EPOCH_OFFSET); -} -#endif - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/coptccal.h b/deps/icu-small/source/i18n/coptccal.h index 396127e8adb5ff..587bf37d0d1474 100644 --- a/deps/icu-small/source/i18n/coptccal.h +++ b/deps/icu-small/source/i18n/coptccal.h @@ -177,7 +177,7 @@ class CopticCalendar : public CECalendar { * Return the extended year defined by the current fields. * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Compute fields from the JD @@ -185,18 +185,7 @@ class CopticCalendar : public CECalendar { */ virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY /** * Return the date offset from Julian @@ -204,7 +193,7 @@ class CopticCalendar : public CECalendar { */ virtual int32_t getJDEpochOffset() const override; - + virtual bool isEra0CountingBackward() const override { return true; } public: /** * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual diff --git a/deps/icu-small/source/i18n/cpdtrans.cpp b/deps/icu-small/source/i18n/cpdtrans.cpp index 9b103646891f99..c419153e43c75f 100644 --- a/deps/icu-small/source/i18n/cpdtrans.cpp +++ b/deps/icu-small/source/i18n/cpdtrans.cpp @@ -53,7 +53,7 @@ CompoundTransliterator::CompoundTransliterator( int32_t transliteratorCount, UnicodeFilter* adoptedFilter) : Transliterator(joinIDs(transliterators, transliteratorCount), adoptedFilter), - trans(0), count(0), numAnonymousRBTs(0) { + trans(nullptr), count(0), numAnonymousRBTs(0) { setTransliterators(transliterators, transliteratorCount); } @@ -70,7 +70,7 @@ CompoundTransliterator::CompoundTransliterator(const UnicodeString& id, UParseError& /*parseError*/, UErrorCode& status) : Transliterator(id, adoptedFilter), - trans(0), numAnonymousRBTs(0) { + trans(nullptr), numAnonymousRBTs(0) { // TODO add code for parseError...currently unused, but // later may be used by parsing code... init(id, direction, true, status); @@ -79,8 +79,8 @@ CompoundTransliterator::CompoundTransliterator(const UnicodeString& id, CompoundTransliterator::CompoundTransliterator(const UnicodeString& id, UParseError& /*parseError*/, UErrorCode& status) : - Transliterator(id, 0), // set filter to 0 here! - trans(0), numAnonymousRBTs(0) { + Transliterator(id, nullptr), // set filter to 0 here! + trans(nullptr), numAnonymousRBTs(0) { // TODO add code for parseError...currently unused, but // later may be used by parsing code... init(id, UTRANS_FORWARD, true, status); @@ -97,7 +97,7 @@ CompoundTransliterator::CompoundTransliterator(const UnicodeString& newID, UParseError& /*parseError*/, UErrorCode& status) : Transliterator(newID, adoptedFilter), - trans(0), numAnonymousRBTs(anonymousRBTs) + trans(nullptr), numAnonymousRBTs(anonymousRBTs) { init(list, UTRANS_FORWARD, false, status); } @@ -111,7 +111,7 @@ CompoundTransliterator::CompoundTransliterator(UVector& list, UParseError& /*parseError*/, UErrorCode& status) : Transliterator(UnicodeString(), nullptr), - trans(0), numAnonymousRBTs(0) + trans(nullptr), numAnonymousRBTs(0) { // TODO add code for parseError...currently unused, but // later may be used by parsing code... @@ -124,7 +124,7 @@ CompoundTransliterator::CompoundTransliterator(UVector& list, UParseError& /*parseError*/, UErrorCode& status) : Transliterator(UnicodeString(), nullptr), - trans(0), numAnonymousRBTs(anonymousRBTs) + trans(nullptr), numAnonymousRBTs(anonymousRBTs) { init(list, UTRANS_FORWARD, false, status); } @@ -198,13 +198,13 @@ void CompoundTransliterator::init(UVector& list, count = list.size(); trans = (Transliterator **)uprv_malloc(count * sizeof(Transliterator *)); /* test for nullptr */ - if (trans == 0) { + if (trans == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } } - if (U_FAILURE(status) || trans == 0) { + if (U_FAILURE(status) || trans == nullptr) { // assert(trans == 0); return; } @@ -254,7 +254,7 @@ UnicodeString CompoundTransliterator::joinIDs(Transliterator* const transliterat * Copy constructor. */ CompoundTransliterator::CompoundTransliterator(const CompoundTransliterator& t) : - Transliterator(t), trans(0), count(0), numAnonymousRBTs(-1) { + Transliterator(t), trans(nullptr), count(0), numAnonymousRBTs(-1) { *this = t; } @@ -266,13 +266,13 @@ CompoundTransliterator::~CompoundTransliterator() { } void CompoundTransliterator::freeTransliterators() { - if (trans != 0) { + if (trans != nullptr) { for (int32_t i=0; i count) { diff --git a/deps/icu-small/source/i18n/cpdtrans.h b/deps/icu-small/source/i18n/cpdtrans.h index a27c617c95b83c..b01c2df6ac6d3a 100644 --- a/deps/icu-small/source/i18n/cpdtrans.h +++ b/deps/icu-small/source/i18n/cpdtrans.h @@ -63,7 +63,7 @@ class U_I18N_API CompoundTransliterator : public Transliterator { */ CompoundTransliterator(Transliterator* const transliterators[], int32_t transliteratorCount, - UnicodeFilter* adoptedFilter = 0); + UnicodeFilter* adoptedFilter = nullptr); /** * Constructs a new compound transliterator. diff --git a/deps/icu-small/source/i18n/csdetect.cpp b/deps/icu-small/source/i18n/csdetect.cpp index 16004f9f5d58fb..158014351072b0 100644 --- a/deps/icu-small/source/i18n/csdetect.cpp +++ b/deps/icu-small/source/i18n/csdetect.cpp @@ -443,20 +443,20 @@ UEnumeration * CharsetDetector::getAllDetectableCharsets(UErrorCode &status) setRecognizers(status); if(U_FAILURE(status)) { - return 0; + return nullptr; } UEnumeration *en = NEW_ARRAY(UEnumeration, 1); if (en == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } memcpy(en, &gCSDetEnumeration, sizeof(UEnumeration)); en->context = (void*)NEW_ARRAY(Context, 1); if (en->context == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; DELETE_ARRAY(en); - return 0; + return nullptr; } uprv_memset(en->context, 0, sizeof(Context)); ((Context*)en->context)->all = true; @@ -466,20 +466,20 @@ UEnumeration * CharsetDetector::getAllDetectableCharsets(UErrorCode &status) UEnumeration * CharsetDetector::getDetectableCharsets(UErrorCode &status) const { if(U_FAILURE(status)) { - return 0; + return nullptr; } UEnumeration *en = NEW_ARRAY(UEnumeration, 1); if (en == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } memcpy(en, &gCSDetEnumeration, sizeof(UEnumeration)); en->context = (void*)NEW_ARRAY(Context, 1); if (en->context == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; DELETE_ARRAY(en); - return 0; + return nullptr; } uprv_memset(en->context, 0, sizeof(Context)); ((Context*)en->context)->all = false; diff --git a/deps/icu-small/source/i18n/csrmbcs.cpp b/deps/icu-small/source/i18n/csrmbcs.cpp index ec346b5fb3f4c4..a6bd1d3a1e3763 100644 --- a/deps/icu-small/source/i18n/csrmbcs.cpp +++ b/deps/icu-small/source/i18n/csrmbcs.cpp @@ -162,7 +162,7 @@ int32_t CharsetRecog_mbcs::match_mbcs(InputText *det, const uint16_t commonChars if (iter.charValue > 0xFF) { doubleByteCharCount++; - if (commonChars != 0) { + if (commonChars != nullptr) { if (binarySearch(commonChars, commonCharsLen, static_cast(iter.charValue)) >= 0){ commonCharCount += 1; } @@ -205,7 +205,7 @@ int32_t CharsetRecog_mbcs::match_mbcs(InputText *det, const uint16_t commonChars return confidence; } - if (commonChars == 0) { + if (commonChars == nullptr) { // We have no statistics on frequently occurring characters. // Assess confidence purely on having a reasonable number of // multi-byte characters (the more the better) diff --git a/deps/icu-small/source/i18n/dangical.cpp b/deps/icu-small/source/i18n/dangical.cpp index 2b340ee4b4545c..e1cf629537175b 100644 --- a/deps/icu-small/source/i18n/dangical.cpp +++ b/deps/icu-small/source/i18n/dangical.cpp @@ -15,6 +15,7 @@ #if !UCONFIG_NO_FORMATTING +#include "astro.h" // CalendarCache #include "gregoimp.h" // Math #include "uassert.h" #include "ucln_in.h" @@ -23,8 +24,13 @@ #include "unicode/tzrule.h" // --- The cache -- -static icu::TimeZone *gDangiCalendarZoneAstroCalc = nullptr; -static icu::UInitOnce gDangiCalendarInitOnce {}; +// Lazy Creation & Access synchronized by class CalendarCache with a mutex. +static icu::CalendarCache *gWinterSolsticeCache = nullptr; +static icu::CalendarCache *gNewYearCache = nullptr; + +// gAstronomerTimeZone +static icu::TimeZone *gAstronomerTimeZone = nullptr; +static icu::UInitOnce gAstronomerTimeZoneInitOnce {}; /** * The start year of the Korean traditional calendar (Dan-gi) is the inaugural @@ -34,11 +40,20 @@ static const int32_t DANGI_EPOCH_YEAR = -2332; // Gregorian year U_CDECL_BEGIN static UBool calendar_dangi_cleanup() { - if (gDangiCalendarZoneAstroCalc) { - delete gDangiCalendarZoneAstroCalc; - gDangiCalendarZoneAstroCalc = nullptr; + if (gWinterSolsticeCache) { + delete gWinterSolsticeCache; + gWinterSolsticeCache = nullptr; + } + if (gNewYearCache) { + delete gNewYearCache; + gNewYearCache = nullptr; + } + + if (gAstronomerTimeZone) { + delete gAstronomerTimeZone; + gAstronomerTimeZone = nullptr; } - gDangiCalendarInitOnce.reset(); + gAstronomerTimeZoneInitOnce.reset(); return true; } U_CDECL_END @@ -51,8 +66,10 @@ U_NAMESPACE_BEGIN // Constructors... //------------------------------------------------------------------------- +const TimeZone* getAstronomerTimeZone(UErrorCode &status); + DangiCalendar::DangiCalendar(const Locale& aLocale, UErrorCode& success) -: ChineseCalendar(aLocale, DANGI_EPOCH_YEAR, getDangiCalZoneAstroCalc(success), success) +: ChineseCalendar(aLocale, success) { } @@ -103,8 +120,8 @@ const char *DangiCalendar::getType() const { * 1898-1911: GMT+8 * 1912- : GMT+9 */ -static void U_CALLCONV initDangiCalZoneAstroCalc(UErrorCode &status) { - U_ASSERT(gDangiCalendarZoneAstroCalc == nullptr); +static void U_CALLCONV initAstronomerTimeZone(UErrorCode &status) { + U_ASSERT(gAstronomerTimeZone == nullptr); const UDate millis1897[] = { (UDate)((1897 - 1970) * 365 * kOneDay) }; // some days of error is not a problem here const UDate millis1898[] = { (UDate)((1898 - 1970) * 365 * kOneDay) }; // some days of error is not a problem here const UDate millis1912[] = { (UDate)((1912 - 1970) * 365 * kOneDay) }; // this doesn't create an issue for 1911/12/20 @@ -120,25 +137,25 @@ static void U_CALLCONV initDangiCalZoneAstroCalc(UErrorCode &status) { LocalPointer ruleFrom1912(new TimeArrayTimeZoneRule( UnicodeString(u"Korean 1912-"), 9*kOneHour, 0, millis1912, 1, DateTimeRule::STANDARD_TIME), status); - LocalPointer dangiCalZoneAstroCalc(new RuleBasedTimeZone( + LocalPointer zone(new RuleBasedTimeZone( UnicodeString(u"KOREA_ZONE"), initialTimeZone.orphan()), status); // adopts initialTimeZone if (U_FAILURE(status)) { return; } - dangiCalZoneAstroCalc->addTransitionRule(rule1897.orphan(), status); // adopts rule1897 - dangiCalZoneAstroCalc->addTransitionRule(rule1898to1911.orphan(), status); - dangiCalZoneAstroCalc->addTransitionRule(ruleFrom1912.orphan(), status); - dangiCalZoneAstroCalc->complete(status); + zone->addTransitionRule(rule1897.orphan(), status); // adopts rule1897 + zone->addTransitionRule(rule1898to1911.orphan(), status); + zone->addTransitionRule(ruleFrom1912.orphan(), status); + zone->complete(status); if (U_SUCCESS(status)) { - gDangiCalendarZoneAstroCalc = dangiCalZoneAstroCalc.orphan(); + gAstronomerTimeZone = zone.orphan(); } ucln_i18n_registerCleanup(UCLN_I18N_DANGI_CALENDAR, calendar_dangi_cleanup); } -const TimeZone* DangiCalendar::getDangiCalZoneAstroCalc(UErrorCode &status) const { - umtx_initOnce(gDangiCalendarInitOnce, &initDangiCalZoneAstroCalc, status); - return gDangiCalendarZoneAstroCalc; +const TimeZone* getAstronomerTimeZone(UErrorCode &status) { + umtx_initOnce(gAstronomerTimeZoneInitOnce, &initAstronomerTimeZone, status); + return gAstronomerTimeZone; } constexpr uint32_t kDangiRelatedYearDiff = -2333; @@ -149,7 +166,11 @@ int32_t DangiCalendar::getRelatedYear(UErrorCode &status) const if (U_FAILURE(status)) { return 0; } - return year + kDangiRelatedYearDiff; + if (uprv_add32_overflow(year, kDangiRelatedYearDiff, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return year; } void DangiCalendar::setRelatedYear(int32_t year) @@ -158,6 +179,12 @@ void DangiCalendar::setRelatedYear(int32_t year) set(UCAL_EXTENDED_YEAR, year - kDangiRelatedYearDiff); } +ChineseCalendar::Setting DangiCalendar::getSetting(UErrorCode& status) const { + return { DANGI_EPOCH_YEAR, + getAstronomerTimeZone(status), + &gWinterSolsticeCache, &gNewYearCache + }; +} UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DangiCalendar) diff --git a/deps/icu-small/source/i18n/dangical.h b/deps/icu-small/source/i18n/dangical.h index 3e5b0bb859b2a1..bc96be2a31e2c8 100644 --- a/deps/icu-small/source/i18n/dangical.h +++ b/deps/icu-small/source/i18n/dangical.h @@ -88,8 +88,6 @@ class DangiCalendar : public ChineseCalendar { private: - const TimeZone* getDangiCalZoneAstroCalc(UErrorCode &status) const; - // UObject stuff public: /** @@ -120,6 +118,8 @@ class DangiCalendar : public ChineseCalendar { */ const char * getType() const override; + protected: + virtual Setting getSetting(UErrorCode& status) const override; private: diff --git a/deps/icu-small/source/i18n/datefmt.cpp b/deps/icu-small/source/i18n/datefmt.cpp index 029634e3dcbb75..c62201988f64fa 100644 --- a/deps/icu-small/source/i18n/datefmt.cpp +++ b/deps/icu-small/source/i18n/datefmt.cpp @@ -28,6 +28,7 @@ #include "unicode/smpdtfmt.h" #include "unicode/dtptngen.h" #include "unicode/udisplaycontext.h" +#include "unicode/gregocal.h" #include "reldtfmt.h" #include "sharedobject.h" #include "unifiedcache.h" @@ -121,8 +122,8 @@ DateFmtBestPatternKey::~DateFmtBestPatternKey() { } DateFormat::DateFormat() -: fCalendar(0), - fNumberFormat(0), +: fCalendar(nullptr), + fNumberFormat(nullptr), fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE) { } @@ -131,8 +132,8 @@ DateFormat::DateFormat() DateFormat::DateFormat(const DateFormat& other) : Format(other), - fCalendar(0), - fNumberFormat(0), + fCalendar(nullptr), + fNumberFormat(nullptr), fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE) { *this = other; @@ -277,15 +278,25 @@ DateFormat::format(Calendar& /* unused cal */, UnicodeString& DateFormat::format(UDate date, UnicodeString& appendTo, FieldPosition& fieldPosition) const { if (fCalendar != nullptr) { - // Use a clone of our calendar instance - Calendar* calClone = fCalendar->clone(); - if (calClone != nullptr) { - UErrorCode ec = U_ZERO_ERROR; - calClone->setTime(date, ec); + UErrorCode ec = U_ZERO_ERROR; + const auto* calType = fCalendar->getType(); + // Avoid a heap allocation and corresponding free for the common case + if (uprv_strcmp(calType, "gregorian") == 0) { + GregorianCalendar cal(*static_cast(fCalendar)); + cal.setTime(date, ec); if (U_SUCCESS(ec)) { - format(*calClone, appendTo, fieldPosition); + format(cal, appendTo, fieldPosition); + } + } else { + // Use a clone of our calendar instance + Calendar *calClone = fCalendar->clone(); + if (calClone != nullptr) { + calClone->setTime(date, ec); + if (U_SUCCESS(ec)) { + format(*calClone, appendTo, fieldPosition); + } + delete calClone; } - delete calClone; } } return appendTo; @@ -297,13 +308,24 @@ UnicodeString& DateFormat::format(UDate date, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { if (fCalendar != nullptr) { - Calendar* calClone = fCalendar->clone(); - if (calClone != nullptr) { - calClone->setTime(date, status); - if (U_SUCCESS(status)) { - format(*calClone, appendTo, posIter, status); + UErrorCode ec = U_ZERO_ERROR; + const auto* calType = fCalendar->getType(); + // Avoid a heap allocation and corresponding free for the common case + if (uprv_strcmp(calType, "gregorian") == 0) { + GregorianCalendar cal(*static_cast(fCalendar)); + cal.setTime(date, ec); + if (U_SUCCESS(ec)) { + format(cal, appendTo, posIter, status); + } + } else { + Calendar* calClone = fCalendar->clone(); + if (calClone != nullptr) { + calClone->setTime(date, status); + if (U_SUCCESS(status)) { + format(*calClone, appendTo, posIter, status); + } + delete calClone; } - delete calClone; } } return appendTo; @@ -430,13 +452,13 @@ DateFormat::getBestPattern( UErrorCode &status) { UnifiedCache *cache = UnifiedCache::getInstance(status); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } DateFmtBestPatternKey key(locale, skeleton, status); const DateFmtBestPattern *patternPtr = nullptr; cache->get(key, patternPtr, status); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } UnicodeString result(patternPtr->fPattern); patternPtr->removeRef(); @@ -539,7 +561,7 @@ DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale) // This should never really happen, because the preceding constructor // should always succeed. If the resource data is unavailable, a last // resort object should be returned. - return 0; + return nullptr; } //---------------------------------------------------------------------- diff --git a/deps/icu-small/source/i18n/dayperiodrules.cpp b/deps/icu-small/source/i18n/dayperiodrules.cpp index 294390cce2bcb4..ea5e51eb9d519c 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.cpp +++ b/deps/icu-small/source/i18n/dayperiodrules.cpp @@ -14,7 +14,6 @@ #include "dayperiodrules.h" #include "unicode/ures.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cstring.h" #include "ucln_in.h" @@ -361,9 +360,7 @@ const DayPeriodRules *DayPeriodRules::getInstance(const Locale &locale, UErrorCo while (*name != '\0') { ruleSetNum = uhash_geti(data->localeToRuleSetNumMap, name); if (ruleSetNum == 0) { - CharString parent; - CharStringByteSink sink(&parent); - ulocimp_getParent(name, sink, &errorCode); + CharString parent = ulocimp_getParent(name, errorCode); if (parent.isEmpty()) { // Saves a lookup in the hash table. break; diff --git a/deps/icu-small/source/i18n/decNumber.cpp b/deps/icu-small/source/i18n/decNumber.cpp index 42da36dc4be532..e21ebfb04f8da7 100644 --- a/deps/icu-small/source/i18n/decNumber.cpp +++ b/deps/icu-small/source/i18n/decNumber.cpp @@ -3795,7 +3795,6 @@ static void decToString(const decNumber *dn, char *string, Flag eng) { } /* cut */ } *c='\0'; /* terminate the string (all paths) */ - return; } /* decToString */ /* ------------------------------------------------------------------ */ @@ -6712,7 +6711,6 @@ static void decReverse(Unit *ulo, Unit *uhi) { *ulo=*uhi; *uhi=temp; } - return; } /* decReverse */ /* ------------------------------------------------------------------ */ @@ -7079,7 +7077,6 @@ static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu, } /* not unit boundary */ if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */ - return; } /* decSetCoeff */ /* ------------------------------------------------------------------ */ @@ -7378,7 +7375,6 @@ static void decFinalize(decNumber *dn, decContext *set, Int *residue, } dn->exponent-=shift; /* adjust the exponent to match */ *status|=DEC_Clamped; /* and record the dirty deed */ - return; } /* decFinalize */ /* ------------------------------------------------------------------ */ @@ -7795,7 +7791,6 @@ static void decStatus(decNumber *dn, uInt status, decContext *set) { } } uprv_decContextSetStatus(set, status); /* [may not return] */ - return; } /* decStatus */ /* ------------------------------------------------------------------ */ diff --git a/deps/icu-small/source/i18n/decimfmt.cpp b/deps/icu-small/source/i18n/decimfmt.cpp index 75906991d72b9f..36c44afe2cc112 100644 --- a/deps/icu-small/source/i18n/decimfmt.cpp +++ b/deps/icu-small/source/i18n/decimfmt.cpp @@ -498,7 +498,7 @@ DecimalFormat* DecimalFormat::clone() const { } bool DecimalFormat::operator==(const Format& other) const { - auto* otherDF = dynamic_cast(&other); + const auto* otherDF = dynamic_cast(&other); if (otherDF == nullptr) { return false; } diff --git a/deps/icu-small/source/i18n/displayoptions.cpp b/deps/icu-small/source/i18n/displayoptions.cpp index bb49e6033f3c9f..8c9dd1c478ac03 100644 --- a/deps/icu-small/source/i18n/displayoptions.cpp +++ b/deps/icu-small/source/i18n/displayoptions.cpp @@ -11,7 +11,7 @@ U_NAMESPACE_BEGIN -DisplayOptions::Builder DisplayOptions::builder() { return DisplayOptions::Builder(); } +DisplayOptions::Builder DisplayOptions::builder() { return {}; } DisplayOptions::Builder DisplayOptions::copyToBuilder() const { return Builder(*this); } diff --git a/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp b/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp index 3bc35c8aaf81dc..ad6ea927309903 100644 --- a/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp +++ b/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp @@ -47,9 +47,7 @@ // ICU PATCH: Wrap in ICU namespace U_NAMESPACE_BEGIN -namespace double_conversion { - -namespace PowersOfTenCache { +namespace double_conversion::PowersOfTenCache { struct CachedPower { uint64_t significand; @@ -184,9 +182,7 @@ void GetCachedPowerForDecimalExponent(int requested_exponent, DOUBLE_CONVERSION_ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance); } -} // namespace PowersOfTenCache - -} // namespace double_conversion +} // namespace double_conversion::PowersOfTenCache // ICU PATCH: Close ICU namespace U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/double-conversion-cached-powers.h b/deps/icu-small/source/i18n/double-conversion-cached-powers.h index ade27baef8b0c7..78e70378d9ae2b 100644 --- a/deps/icu-small/source/i18n/double-conversion-cached-powers.h +++ b/deps/icu-small/source/i18n/double-conversion-cached-powers.h @@ -44,9 +44,7 @@ // ICU PATCH: Wrap in ICU namespace U_NAMESPACE_BEGIN -namespace double_conversion { - -namespace PowersOfTenCache { +namespace double_conversion::PowersOfTenCache { // Not all powers of ten are cached. The decimal exponent of two neighboring // cached numbers will differ by kDecimalExponentDistance. @@ -71,9 +69,7 @@ namespace PowersOfTenCache { DiyFp* power, int* found_exponent); -} // namespace PowersOfTenCache - -} // namespace double_conversion +} // namespace double_conversion::PowersOfTenCache // ICU PATCH: Close ICU namespace U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index 943f6e21d2ede6..5d770eada4812c 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -86,6 +86,33 @@ static const char16_t gPatternChars[] = { 0 }; +/** + * Map of each ASCII character to its corresponding index in the table above if + * it is a pattern character and -1 otherwise. + */ +static const int8_t gLookupPatternChars[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + // ! " # $ % & ' ( ) * + , - . / + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +#if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR + // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, +#else + // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +#endif + // @ A B C D E F G H I J K L M N O + -1, 22, 36, -1, 10, 9, 11, 0, 5, -1, -1, 16, 26, 2, -1, 31, + // P Q R S T U V W X Y Z [ \ ] ^ _ + -1, 27, -1, 8, -1, 30, 29, 13, 32, 18, 23, -1, -1, -1, -1, -1, + // ` a b c d e f g h i j k l m n o + -1, 14, 35, 25, 3, 19, -1, 21, 15, -1, -1, 4, -1, 6, -1, -1, + // p q r s t u v w x y z { | } ~ + -1, 28, 34, 7, -1, 20, 24, 12, 33, 1, 17, -1, -1, -1, -1, -1 +}; + //------------------------------------------------------ // Strings of last resort. These are only used if we have no resource // files. They aren't designed for actual use, just for backup. @@ -891,9 +918,7 @@ DateFormatSymbols::setYearNames(const UnicodeString* yearNames, int32_t count, DtContextType context, DtWidthType width) { if (context == FORMAT && width == ABBREVIATED) { - if (fShortYearNames) { - delete[] fShortYearNames; - } + delete[] fShortYearNames; fShortYearNames = newUnicodeStringArray(count); uprv_arrayCopy(yearNames, fShortYearNames, count); fShortYearNamesCount = count; @@ -913,9 +938,7 @@ DateFormatSymbols::setZodiacNames(const UnicodeString* zodiacNames, int32_t coun DtContextType context, DtWidthType width) { if (context == FORMAT && width == ABBREVIATED) { - if (fShortZodiacNames) { - delete[] fShortZodiacNames; - } + delete[] fShortZodiacNames; fShortZodiacNames = newUnicodeStringArray(count); uprv_arrayCopy(zodiacNames, fShortZodiacNames, count); fShortZodiacNamesCount = count; @@ -928,8 +951,7 @@ void DateFormatSymbols::setEras(const UnicodeString* erasArray, int32_t count) { // delete the old list if we own it - if (fEras) - delete[] fEras; + delete[] fEras; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -942,8 +964,7 @@ void DateFormatSymbols::setEraNames(const UnicodeString* eraNamesArray, int32_t count) { // delete the old list if we own it - if (fEraNames) - delete[] fEraNames; + delete[] fEraNames; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -956,8 +977,7 @@ void DateFormatSymbols::setNarrowEras(const UnicodeString* narrowErasArray, int32_t count) { // delete the old list if we own it - if (fNarrowEras) - delete[] fNarrowEras; + delete[] fNarrowEras; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -970,8 +990,7 @@ void DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count) { // delete the old list if we own it - if (fMonths) - delete[] fMonths; + delete[] fMonths; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -984,8 +1003,7 @@ void DateFormatSymbols::setShortMonths(const UnicodeString* shortMonthsArray, int32_t count) { // delete the old list if we own it - if (fShortMonths) - delete[] fShortMonths; + delete[] fShortMonths; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -1005,22 +1023,19 @@ DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count, Dt case FORMAT : switch (width) { case WIDE : - if (fMonths) - delete[] fMonths; + delete[] fMonths; fMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fMonths,count); fMonthsCount = count; break; case ABBREVIATED : - if (fShortMonths) - delete[] fShortMonths; + delete[] fShortMonths; fShortMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fShortMonths,count); fShortMonthsCount = count; break; case NARROW : - if (fNarrowMonths) - delete[] fNarrowMonths; + delete[] fNarrowMonths; fNarrowMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fNarrowMonths,count); fNarrowMonthsCount = count; @@ -1032,22 +1047,19 @@ DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count, Dt case STANDALONE : switch (width) { case WIDE : - if (fStandaloneMonths) - delete[] fStandaloneMonths; + delete[] fStandaloneMonths; fStandaloneMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fStandaloneMonths,count); fStandaloneMonthsCount = count; break; case ABBREVIATED : - if (fStandaloneShortMonths) - delete[] fStandaloneShortMonths; + delete[] fStandaloneShortMonths; fStandaloneShortMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fStandaloneShortMonths,count); fStandaloneShortMonthsCount = count; break; case NARROW : - if (fStandaloneNarrowMonths) - delete[] fStandaloneNarrowMonths; + delete[] fStandaloneNarrowMonths; fStandaloneNarrowMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fStandaloneNarrowMonths,count); fStandaloneNarrowMonthsCount = count; @@ -1064,8 +1076,7 @@ DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count, Dt void DateFormatSymbols::setWeekdays(const UnicodeString* weekdaysArray, int32_t count) { // delete the old list if we own it - if (fWeekdays) - delete[] fWeekdays; + delete[] fWeekdays; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -1078,8 +1089,7 @@ void DateFormatSymbols::setShortWeekdays(const UnicodeString* shortWeekdaysArray, int32_t count) { // delete the old list if we own it - if (fShortWeekdays) - delete[] fShortWeekdays; + delete[] fShortWeekdays; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -1099,29 +1109,25 @@ DateFormatSymbols::setWeekdays(const UnicodeString* weekdaysArray, int32_t count case FORMAT : switch (width) { case WIDE : - if (fWeekdays) - delete[] fWeekdays; + delete[] fWeekdays; fWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fWeekdays, count); fWeekdaysCount = count; break; case ABBREVIATED : - if (fShortWeekdays) - delete[] fShortWeekdays; + delete[] fShortWeekdays; fShortWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fShortWeekdays, count); fShortWeekdaysCount = count; break; case SHORT : - if (fShorterWeekdays) - delete[] fShorterWeekdays; + delete[] fShorterWeekdays; fShorterWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fShorterWeekdays, count); fShorterWeekdaysCount = count; break; case NARROW : - if (fNarrowWeekdays) - delete[] fNarrowWeekdays; + delete[] fNarrowWeekdays; fNarrowWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fNarrowWeekdays, count); fNarrowWeekdaysCount = count; @@ -1133,29 +1139,25 @@ DateFormatSymbols::setWeekdays(const UnicodeString* weekdaysArray, int32_t count case STANDALONE : switch (width) { case WIDE : - if (fStandaloneWeekdays) - delete[] fStandaloneWeekdays; + delete[] fStandaloneWeekdays; fStandaloneWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fStandaloneWeekdays, count); fStandaloneWeekdaysCount = count; break; case ABBREVIATED : - if (fStandaloneShortWeekdays) - delete[] fStandaloneShortWeekdays; + delete[] fStandaloneShortWeekdays; fStandaloneShortWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fStandaloneShortWeekdays, count); fStandaloneShortWeekdaysCount = count; break; case SHORT : - if (fStandaloneShorterWeekdays) - delete[] fStandaloneShorterWeekdays; + delete[] fStandaloneShorterWeekdays; fStandaloneShorterWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fStandaloneShorterWeekdays, count); fStandaloneShorterWeekdaysCount = count; break; case NARROW : - if (fStandaloneNarrowWeekdays) - delete[] fStandaloneNarrowWeekdays; + delete[] fStandaloneNarrowWeekdays; fStandaloneNarrowWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fStandaloneNarrowWeekdays, count); fStandaloneNarrowWeekdaysCount = count; @@ -1180,22 +1182,19 @@ DateFormatSymbols::setQuarters(const UnicodeString* quartersArray, int32_t count case FORMAT : switch (width) { case WIDE : - if (fQuarters) - delete[] fQuarters; + delete[] fQuarters; fQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fQuarters,count); fQuartersCount = count; break; case ABBREVIATED : - if (fShortQuarters) - delete[] fShortQuarters; + delete[] fShortQuarters; fShortQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fShortQuarters,count); fShortQuartersCount = count; break; case NARROW : - if (fNarrowQuarters) - delete[] fNarrowQuarters; + delete[] fNarrowQuarters; fNarrowQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fNarrowQuarters,count); fNarrowQuartersCount = count; @@ -1207,22 +1206,19 @@ DateFormatSymbols::setQuarters(const UnicodeString* quartersArray, int32_t count case STANDALONE : switch (width) { case WIDE : - if (fStandaloneQuarters) - delete[] fStandaloneQuarters; + delete[] fStandaloneQuarters; fStandaloneQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fStandaloneQuarters,count); fStandaloneQuartersCount = count; break; case ABBREVIATED : - if (fStandaloneShortQuarters) - delete[] fStandaloneShortQuarters; + delete[] fStandaloneShortQuarters; fStandaloneShortQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fStandaloneShortQuarters,count); fStandaloneShortQuartersCount = count; break; case NARROW : - if (fStandaloneNarrowQuarters) - delete[] fStandaloneNarrowQuarters; + delete[] fStandaloneNarrowQuarters; fStandaloneNarrowQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fStandaloneNarrowQuarters,count); fStandaloneNarrowQuartersCount = count; @@ -1240,7 +1236,7 @@ void DateFormatSymbols::setAmPmStrings(const UnicodeString* amPmsArray, int32_t count) { // delete the old list if we own it - if (fAmPms) delete[] fAmPms; + delete[] fAmPms; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -1326,7 +1322,7 @@ DateFormatSymbols::initZoneStringsArray() { UDate now = Calendar::getNow(); UnicodeString tzDispName; - while ((tzid = tzids->snext(status)) != 0) { + while ((tzid = tzids->snext(status)) != nullptr) { if (U_FAILURE(status)) { break; } @@ -1356,12 +1352,8 @@ DateFormatSymbols::initZoneStringsArray() { } } - if (tzNames) { - delete tzNames; - } - if (tzids) { - delete tzids; - } + delete tzNames; + delete tzids; fLocaleZoneStrings = zarray; fZoneStringsRowCount = rows; @@ -1391,12 +1383,11 @@ DateFormatSymbols::getPatternUChars() UDateFormatField U_EXPORT2 DateFormatSymbols::getPatternCharIndex(char16_t c) { - const char16_t *p = u_strchr(gPatternChars, c); - if (p == nullptr) { + if (c >= UPRV_LENGTHOF(gLookupPatternChars)) { return UDAT_FIELD_COUNT; - } else { - return static_cast(p - gPatternChars); } + const auto idx = gLookupPatternChars[c]; + return idx == -1 ? UDAT_FIELD_COUNT : static_cast(idx); } static const uint64_t kNumericFieldsAlways = @@ -1463,35 +1454,35 @@ DateFormatSymbols::setLocalPatternChars(const UnicodeString& newLocalPatternChar namespace { // Constants declarations -static const char16_t kCalendarAliasPrefixUChar[] = { +const char16_t kCalendarAliasPrefixUChar[] = { SOLIDUS, CAP_L, CAP_O, CAP_C, CAP_A, CAP_L, CAP_E, SOLIDUS, LOW_C, LOW_A, LOW_L, LOW_E, LOW_N, LOW_D, LOW_A, LOW_R, SOLIDUS }; -static const char16_t kGregorianTagUChar[] = { +const char16_t kGregorianTagUChar[] = { LOW_G, LOW_R, LOW_E, LOW_G, LOW_O, LOW_R, LOW_I, LOW_A, LOW_N }; -static const char16_t kVariantTagUChar[] = { +const char16_t kVariantTagUChar[] = { PERCENT, LOW_V, LOW_A, LOW_R, LOW_I, LOW_A, LOW_N, LOW_T }; -static const char16_t kLeapTagUChar[] = { +const char16_t kLeapTagUChar[] = { LOW_L, LOW_E, LOW_A, LOW_P }; -static const char16_t kCyclicNameSetsTagUChar[] = { +const char16_t kCyclicNameSetsTagUChar[] = { LOW_C, LOW_Y, LOW_C, LOW_L, LOW_I, LOW_C, CAP_N, LOW_A, LOW_M, LOW_E, CAP_S, LOW_E, LOW_T, LOW_S }; -static const char16_t kYearsTagUChar[] = { +const char16_t kYearsTagUChar[] = { SOLIDUS, LOW_Y, LOW_E, LOW_A, LOW_R, LOW_S }; -static const char16_t kZodiacsUChar[] = { +const char16_t kZodiacsUChar[] = { SOLIDUS, LOW_Z, LOW_O, LOW_D, LOW_I, LOW_A, LOW_C, LOW_S }; -static const char16_t kDayPartsTagUChar[] = { +const char16_t kDayPartsTagUChar[] = { SOLIDUS, LOW_D, LOW_A, LOW_Y, CAP_P, LOW_A, LOW_R, LOW_T, LOW_S }; -static const char16_t kFormatTagUChar[] = { +const char16_t kFormatTagUChar[] = { SOLIDUS, LOW_F, LOW_O, LOW_R, LOW_M, LOW_A, LOW_T }; -static const char16_t kAbbrTagUChar[] = { +const char16_t kAbbrTagUChar[] = { SOLIDUS, LOW_A, LOW_B, LOW_B, LOW_R, LOW_E, LOW_V, LOW_I, LOW_A, LOW_T, LOW_E, LOW_D }; @@ -2111,8 +2102,8 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // Create a CalendarDataSink to process this data and the resource bundles CalendarDataSink calendarSink(status); - UResourceBundle *rb = ures_open(nullptr, locale.getBaseName(), &status); - UResourceBundle *cb = ures_getByKey(rb, gCalendarTag, nullptr, &status); + LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getBaseName(), &status)); + LocalUResourceBundlePointer cb(ures_getByKey(rb.getAlias(), gCalendarTag, nullptr, &status)); if (U_FAILURE(status)) return; @@ -2126,9 +2117,8 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // Enumerate this calendar type. If the calendar is not found fallback to gregorian UErrorCode oldStatus = status; - UResourceBundle *ctb = ures_getByKeyWithFallback(cb, calendarTypeCArray, nullptr, &status); + LocalUResourceBundlePointer ctb(ures_getByKeyWithFallback(cb.getAlias(), calendarTypeCArray, nullptr, &status)); if (status == U_MISSING_RESOURCE_ERROR) { - ures_close(ctb); if (uprv_strcmp(calendarTypeCArray, gGregorianTag) != 0) { calendarType.setTo(false, kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)); calendarSink.visitAllResources(); @@ -2139,8 +2129,7 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError } calendarSink.preEnumerate(calendarType); - ures_getAllItemsWithFallback(ctb, "", calendarSink, status); - ures_close(ctb); + ures_getAllItemsWithFallback(ctb.getAlias(), "", calendarSink, status); if (U_FAILURE(status)) break; // Stop loading when gregorian was loaded @@ -2211,15 +2200,16 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // Load context transforms and capitalization tempStatus = U_ZERO_ERROR; - UResourceBundle *localeBundle = ures_open(nullptr, locale.getName(), &tempStatus); + LocalUResourceBundlePointer localeBundle(ures_open(nullptr, locale.getName(), &tempStatus)); if (U_SUCCESS(tempStatus)) { - UResourceBundle *contextTransforms = ures_getByKeyWithFallback(localeBundle, gContextTransformsTag, nullptr, &tempStatus); + LocalUResourceBundlePointer contextTransforms(ures_getByKeyWithFallback(localeBundle.getAlias(), gContextTransformsTag, nullptr, &tempStatus)); if (U_SUCCESS(tempStatus)) { - UResourceBundle *contextTransformUsage; - while ( (contextTransformUsage = ures_getNextResource(contextTransforms, nullptr, &tempStatus)) != nullptr ) { - const int32_t * intVector = ures_getIntVector(contextTransformUsage, &len, &status); + for (LocalUResourceBundlePointer contextTransformUsage; + contextTransformUsage.adoptInstead(ures_getNextResource(contextTransforms.getAlias(), nullptr, &tempStatus)), + contextTransformUsage.isValid();) { + const int32_t * intVector = ures_getIntVector(contextTransformUsage.getAlias(), &len, &status); if (U_SUCCESS(tempStatus) && intVector != nullptr && len >= 2) { - const char* usageType = ures_getKey(contextTransformUsage); + const char* usageType = ures_getKey(contextTransformUsage.getAlias()); if (usageType != nullptr) { const ContextUsageTypeNameToEnumValue * typeMapPtr = contextUsageTypeMap; int32_t compResult = 0; @@ -2234,9 +2224,7 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError } } tempStatus = U_ZERO_ERROR; - ures_close(contextTransformUsage); } - ures_close(contextTransforms); } tempStatus = U_ZERO_ERROR; @@ -2247,7 +2235,7 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // do nothing unless U_SUCCESS(tempStatus), so it's only necessary // to check for errors once after all calls are made. const LocalUResourceBundlePointer numberElementsData(ures_getByKeyWithFallback( - localeBundle, gNumberElementsTag, nullptr, &tempStatus)); + localeBundle.getAlias(), gNumberElementsTag, nullptr, &tempStatus)); const LocalUResourceBundlePointer nsNameData(ures_getByKeyWithFallback( numberElementsData.getAlias(), numberingSystem->getName(), nullptr, &tempStatus)); const LocalUResourceBundlePointer symbolsData(ures_getByKeyWithFallback( @@ -2259,7 +2247,6 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError } } - ures_close(localeBundle); } if (fTimeSeparator.isBogus()) { @@ -2314,8 +2301,8 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // if we make it to here, the resource data is cool, and we can get everything out // of it that we need except for the time-zone and localized-pattern data, which // are stored in a separate file - locBased.setLocaleIDs(ures_getLocaleByType(cb, ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(cb, ULOC_ACTUAL_LOCALE, &status)); + locBased.setLocaleIDs(ures_getLocaleByType(cb.getAlias(), ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(cb.getAlias(), ULOC_ACTUAL_LOCALE, &status)); // Load eras initField(&fEras, fErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesAbbrTag, status), status); @@ -2537,10 +2524,6 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError fLocalPatternChars.setTo(true, gPatternChars, PATTERN_CHARS_LEN); } } - - // Close resources - ures_close(cb); - ures_close(rb); } Locale diff --git a/deps/icu-small/source/i18n/dtitvfmt.cpp b/deps/icu-small/source/i18n/dtitvfmt.cpp index 608701466819f4..a8aefe064faaed 100644 --- a/deps/icu-small/source/i18n/dtitvfmt.cpp +++ b/deps/icu-small/source/i18n/dtitvfmt.cpp @@ -706,7 +706,7 @@ DateIntervalFormat::create(const Locale& locale, } else if ( U_FAILURE(status) ) { // safe to delete f, although nothing actually is saved delete f; - f = 0; + f = nullptr; } return f; } @@ -1477,7 +1477,7 @@ DateIntervalFormat::setIntervalPattern(UCalendarDateFields field, // look for the best match skeleton, for example: "yMMM" const UnicodeString* tmpBest = fInfo->getBestSkeleton( *extendedBestSkeleton, differenceInfo); - if ( tmpBest != 0 && differenceInfo != -1 ) { + if (tmpBest != nullptr && differenceInfo != -1) { fInfo->getIntervalPattern(*tmpBest, field, pattern, status); bestSkeleton = tmpBest; } diff --git a/deps/icu-small/source/i18n/dtitvinf.cpp b/deps/icu-small/source/i18n/dtitvinf.cpp index c4b6bbcf401a9a..8ebb2f70d88d6b 100644 --- a/deps/icu-small/source/i18n/dtitvinf.cpp +++ b/deps/icu-small/source/i18n/dtitvinf.cpp @@ -23,7 +23,6 @@ #include #endif -#include "bytesinkutil.h" #include "cmemory.h" #include "cstring.h" #include "unicode/msgfmt.h" @@ -405,11 +404,7 @@ DateIntervalInfo::initializeData(const Locale& locale, UErrorCode& status) "calendar", "calendar", locName, nullptr, false, &status); localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY-1] = 0; // ensure null termination // now get the calendar key value from that locale - CharString calendarType; - { - CharStringByteSink sink(&calendarType); - ulocimp_getKeywordValue(localeWithCalendarKey, "calendar", sink, &status); - } + CharString calendarType = ulocimp_getKeywordValue(localeWithCalendarKey, "calendar", status); if (U_SUCCESS(status)) { calendarTypeToUse = calendarType.data(); } diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index aa23b7cd4a6148..4fe00a23e19e68 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -29,7 +29,6 @@ #include "unicode/ustring.h" #include "unicode/rep.h" #include "unicode/region.h" -#include "bytesinkutil.h" #include "cpputils.h" #include "mutex.h" #include "umutex.h" @@ -464,15 +463,12 @@ DateTimePatternGenerator::operator!=(const DateTimePatternGenerator& other) cons } DateTimePatternGenerator::~DateTimePatternGenerator() { - if (fAvailableFormatKeyHash!=nullptr) { - delete fAvailableFormatKeyHash; - } - - if (fp != nullptr) delete fp; - if (dtMatcher != nullptr) delete dtMatcher; - if (distanceInfo != nullptr) delete distanceInfo; - if (patternMap != nullptr) delete patternMap; - if (skipMatcher != nullptr) delete skipMatcher; + delete fAvailableFormatKeyHash; + delete fp; + delete dtMatcher; + delete distanceInfo; + delete patternMap; + delete skipMatcher; } namespace { @@ -511,6 +507,11 @@ enum AllowedHourFormat{ void DateTimePatternGenerator::initData(const Locale& locale, UErrorCode &status, UBool skipStdPatterns) { //const char *baseLangName = locale.getBaseName(); // unused + if (U_FAILURE(status)) { return; } + if (locale.isBogus()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } skipMatcher = nullptr; fAvailableFormatKeyHash=nullptr; @@ -658,10 +659,9 @@ void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErro if (U_FAILURE(status)) { return; } const char *language = locale.getLanguage(); - char baseCountry[8]; - ulocimp_getRegionForSupplementalData(locale.getName(), false, baseCountry, 8, &status); - const char* country = baseCountry; - + CharString baseCountry = ulocimp_getRegionForSupplementalData(locale.getName(), false, status); + const char* country = baseCountry.data(); + Locale maxLocale; // must be here for correct lifetime if (*language == '\0' || *country == '\0') { maxLocale = locale; @@ -905,15 +905,7 @@ DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString& &localStatus); localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY-1] = 0; // ensure null termination // now get the calendar key value from that locale - destination.clear(); - { - CharStringByteSink sink(&destination); - ulocimp_getKeywordValue( - localeWithCalendarKey, - "calendar", - sink, - &localStatus); - } + destination = ulocimp_getKeywordValue(localeWithCalendarKey, "calendar", localStatus); // If the input locale was invalid, don't fail with missing resource error, instead // continue with default of Gregorian. if (U_FAILURE(localStatus) && localStatus != U_MISSING_RESOURCE_ERROR) { @@ -1157,11 +1149,11 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UErro UnicodeString DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDateTimePatternMatchOptions options, UErrorCode& status) { if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } if (U_FAILURE(internalErrorCode)) { status = internalErrorCode; - return UnicodeString(); + return {}; } const UnicodeString *bestPattern = nullptr; UnicodeString dtFormat; @@ -1174,7 +1166,7 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate // Replace hour metacharacters 'j', 'C' and 'J', set flags as necessary UnicodeString patternFormMapped = mapSkeletonMetacharacters(patternForm, &flags, status); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } resultPattern.remove(); @@ -1182,7 +1174,7 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate const PtnSkeleton* specifiedSkeleton = nullptr; bestPattern=getBestRaw(*dtMatcher, -1, distanceInfo, status, &specifiedSkeleton); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } if ( distanceInfo->missingFieldMask==0 && distanceInfo->extraFieldMask==0 ) { @@ -1194,7 +1186,7 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate UnicodeString datePattern=getBestAppending(neededFields & dateMask, flags, status, options); UnicodeString timePattern=getBestAppending(neededFields & timeMask, flags, status, options); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } if (datePattern.length()==0) { if (timePattern.length()==0) { @@ -1270,7 +1262,7 @@ DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& pattern bestAllowed = (AllowedHourFormat)fAllowedHourFormats[0]; } else { status = U_INVALID_FORMAT_ERROR; - return UnicodeString(); + return {}; } if (bestAllowed == ALLOWED_HOUR_FORMAT_H || bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_Hb) { hourChar = CAP_H; @@ -1321,11 +1313,11 @@ DateTimePatternGenerator::replaceFieldTypes(const UnicodeString& pattern, UDateTimePatternMatchOptions options, UErrorCode& status) { if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } if (U_FAILURE(internalErrorCode)) { status = internalErrorCode; - return UnicodeString(); + return {}; } dtMatcher->set(skeleton, fp); UnicodeString result = adjustFieldTypes(pattern, nullptr, kDTPGNoFlags, options); @@ -1778,7 +1770,7 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, UnicodeString DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, UErrorCode &status, UDateTimePatternMatchOptions options) { if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } UnicodeString resultPattern, tempPattern; const UnicodeString* tempPatternPtr; @@ -1788,7 +1780,7 @@ DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, const PtnSkeleton* specifiedSkeleton=nullptr; tempPatternPtr = getBestRaw(*dtMatcher, missingFields, distanceInfo, status, &specifiedSkeleton); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } tempPattern = *tempPatternPtr; resultPattern = adjustFieldTypes(tempPattern, specifiedSkeleton, flags, options); @@ -1808,7 +1800,7 @@ DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, int32_t startingMask = distanceInfo->missingFieldMask; tempPatternPtr = getBestRaw(*dtMatcher, distanceInfo->missingFieldMask, distanceInfo, status, &specifiedSkeleton); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } tempPattern = *tempPatternPtr; tempPattern = adjustFieldTypes(tempPattern, specifiedSkeleton, flags, options); diff --git a/deps/icu-small/source/i18n/dtptngen_impl.h b/deps/icu-small/source/i18n/dtptngen_impl.h index 74fe925b2f6cca..b6eb5f63734ed1 100644 --- a/deps/icu-small/source/i18n/dtptngen_impl.h +++ b/deps/icu-small/source/i18n/dtptngen_impl.h @@ -250,7 +250,7 @@ class PatternMap : public UMemory { virtual ~PatternMap(); void add(const UnicodeString& basePattern, const PtnSkeleton& skeleton, const UnicodeString& value, UBool skeletonWasSpecified, UErrorCode& status); const UnicodeString* getPatternFromBasePattern(const UnicodeString& basePattern, UBool& skeletonWasSpecified) const; - const UnicodeString* getPatternFromSkeleton(const PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr = 0) const; + const UnicodeString* getPatternFromSkeleton(const PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr = nullptr) const; void copyFrom(const PatternMap& other, UErrorCode& status); PtnElem* getHeader(char16_t baseChar) const; UBool equals(const PatternMap& other) const; diff --git a/deps/icu-small/source/i18n/esctrn.cpp b/deps/icu-small/source/i18n/esctrn.cpp index 24fa6f58e45f39..60f8731101d8fa 100644 --- a/deps/icu-small/source/i18n/esctrn.cpp +++ b/deps/icu-small/source/i18n/esctrn.cpp @@ -111,7 +111,7 @@ EscapeTransliterator::EscapeTransliterator(const EscapeTransliterator& o) : radix(o.radix), minDigits(o.minDigits), grokSupplementals(o.grokSupplementals) { - supplementalHandler = (o.supplementalHandler != 0) ? + supplementalHandler = o.supplementalHandler != nullptr ? new EscapeTransliterator(*o.supplementalHandler) : nullptr; } diff --git a/deps/icu-small/source/i18n/ethpccal.cpp b/deps/icu-small/source/i18n/ethpccal.cpp index be4010843a5642..41b70767044d36 100644 --- a/deps/icu-small/source/i18n/ethpccal.cpp +++ b/deps/icu-small/source/i18n/ethpccal.cpp @@ -11,6 +11,7 @@ #if !UCONFIG_NO_FORMATTING +#include "gregoimp.h" #include "umutex.h" #include "ethpccal.h" #include "cecal.h" @@ -56,8 +57,11 @@ EthiopicCalendar::getType() const //------------------------------------------------------------------------- int32_t -EthiopicCalendar::handleGetExtendedYear() +EthiopicCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // Ethiopic calendar uses EXTENDED_YEAR aligned to // Amelete Hihret year always. if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { @@ -67,7 +71,12 @@ EthiopicCalendar::handleGetExtendedYear() if (internalGet(UCAL_ERA, AMETE_MIHRET) == AMETE_MIHRET) { return internalGet(UCAL_YEAR, 1); // Default to year 1 } - return internalGet(UCAL_YEAR, 1) - AMETE_MIHRET_DELTA; + int32_t year = internalGet(UCAL_YEAR, 1); + if (uprv_add32_overflow(year, -AMETE_MIHRET_DELTA, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return year; } void @@ -102,46 +111,7 @@ void EthiopicCalendar::setRelatedYear(int32_t year) set(UCAL_EXTENDED_YEAR, year - kEthiopicRelatedYearDiff); } -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - -static void U_CALLCONV initializeSystemDefaultCentury() -{ - UErrorCode status = U_ZERO_ERROR; - EthiopicCalendar calendar(Locale("@calendar=ethiopic"), status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate -EthiopicCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t -EthiopicCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} - +IMPL_SYSTEM_DEFAULT_CENTURY(EthiopicCalendar, "@calendar=ethiopic") int32_t EthiopicCalendar::getJDEpochOffset() const @@ -150,21 +120,6 @@ EthiopicCalendar::getJDEpochOffset() const } -#if 0 -// We do not want to introduce this API in ICU4C. -// It was accidentally introduced in ICU4J as a public API. - -//------------------------------------------------------------------------- -// Calendar system Conversion methods... -//------------------------------------------------------------------------- - -int32_t -EthiopicCalendar::ethiopicToJD(int32_t year, int32_t month, int32_t date) -{ - return ceToJD(year, month, date, JD_EPOCH_OFFSET_AMETE_MIHRET); -} -#endif - //------------------------------------------------------------------------- // Constructors... //------------------------------------------------------------------------- @@ -196,15 +151,23 @@ EthiopicAmeteAlemCalendar::getType() const } int32_t -EthiopicAmeteAlemCalendar::handleGetExtendedYear() +EthiopicAmeteAlemCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // Ethiopic calendar uses EXTENDED_YEAR aligned to // Amelete Hihret year always. if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } - return internalGet(UCAL_YEAR, 1 + AMETE_MIHRET_DELTA) - - AMETE_MIHRET_DELTA; // Default to year 1 of Amelete Mihret + // Default to year 1 of Amelete Mihret + int32_t year = internalGet(UCAL_YEAR, 1 + AMETE_MIHRET_DELTA); + if (uprv_add32_overflow(year, -AMETE_MIHRET_DELTA, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return year; } void diff --git a/deps/icu-small/source/i18n/ethpccal.h b/deps/icu-small/source/i18n/ethpccal.h index 19d9e0efb7e0a5..36a3561186cb77 100644 --- a/deps/icu-small/source/i18n/ethpccal.h +++ b/deps/icu-small/source/i18n/ethpccal.h @@ -169,7 +169,7 @@ class EthiopicCalendar : public CECalendar { * 1 AMETE_MIHRET 1 * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Compute fields from the JD @@ -177,18 +177,7 @@ class EthiopicCalendar : public CECalendar { */ virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY /** * Return the date offset from Julian @@ -341,7 +330,7 @@ class EthiopicAmeteAlemCalendar : public EthiopicCalendar { * 1 AMETE_ALEM 5501 * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Compute fields from the JD diff --git a/deps/icu-small/source/i18n/fmtable.cpp b/deps/icu-small/source/i18n/fmtable.cpp index 65dafc95aa256a..01d7bad1ba6f0c 100644 --- a/deps/icu-small/source/i18n/fmtable.cpp +++ b/deps/icu-small/source/i18n/fmtable.cpp @@ -775,9 +775,7 @@ Formattable::populateDecimalQuantity(number::impl::DecimalQuantity& output, UErr // --------------------------------------- void Formattable::adoptDecimalQuantity(DecimalQuantity *dq) { - if (fDecimalQuantity != nullptr) { - delete fDecimalQuantity; - } + delete fDecimalQuantity; fDecimalQuantity = dq; if (dq == nullptr) { // allow adoptDigitList(nullptr) to clear return; diff --git a/deps/icu-small/source/i18n/formatted_string_builder.cpp b/deps/icu-small/source/i18n/formatted_string_builder.cpp index 8dbf954af9ffa8..6481f73dcf6538 100644 --- a/deps/icu-small/source/i18n/formatted_string_builder.cpp +++ b/deps/icu-small/source/i18n/formatted_string_builder.cpp @@ -72,8 +72,8 @@ FormattedStringBuilder &FormattedStringBuilder::operator=(const FormattedStringB if (capacity > DEFAULT_CAPACITY) { // FIXME: uprv_malloc // C++ note: malloc appears in two places: here and in prepareForInsertHelper. - auto newChars = static_cast (uprv_malloc(sizeof(char16_t) * capacity)); - auto newFields = static_cast(uprv_malloc(sizeof(Field) * capacity)); + auto* newChars = static_cast(uprv_malloc(sizeof(char16_t) * capacity)); + auto* newFields = static_cast(uprv_malloc(sizeof(Field) * capacity)); if (newChars == nullptr || newFields == nullptr) { // UErrorCode is not available; fail silently. uprv_free(newChars); @@ -153,13 +153,15 @@ FormattedStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field if (U_FAILURE(status)) { return count; } + auto* charPtr = getCharPtr(); + auto* fieldPtr = getFieldPtr(); if (count == 1) { - getCharPtr()[position] = (char16_t) codePoint; - getFieldPtr()[position] = field; + charPtr[position] = (char16_t) codePoint; + fieldPtr[position] = field; } else { - getCharPtr()[position] = U16_LEAD(codePoint); - getCharPtr()[position + 1] = U16_TRAIL(codePoint); - getFieldPtr()[position] = getFieldPtr()[position + 1] = field; + charPtr[position] = U16_LEAD(codePoint); + charPtr[position + 1] = U16_TRAIL(codePoint); + fieldPtr[position] = fieldPtr[position + 1] = field; } return count; } @@ -306,8 +308,10 @@ int32_t FormattedStringBuilder::prepareForInsertHelper(int32_t index, int32_t co newZero = (newCapacity - newLength) / 2; // C++ note: malloc appears in two places: here and in the assignment operator. - auto newChars = static_cast (uprv_malloc(sizeof(char16_t) * static_cast(newCapacity))); - auto newFields = static_cast(uprv_malloc(sizeof(Field) * static_cast(newCapacity))); + auto* newChars = + static_cast(uprv_malloc(sizeof(char16_t) * static_cast(newCapacity))); + auto* newFields = + static_cast(uprv_malloc(sizeof(Field) * static_cast(newCapacity))); if (newChars == nullptr || newFields == nullptr) { uprv_free(newChars); uprv_free(newFields); @@ -378,7 +382,7 @@ UnicodeString FormattedStringBuilder::toUnicodeString() const { return UnicodeString(getCharPtr() + fZero, fLength); } -const UnicodeString FormattedStringBuilder::toTempUnicodeString() const { +UnicodeString FormattedStringBuilder::toTempUnicodeString() const { // Readonly-alias constructor: return UnicodeString(false, getCharPtr() + fZero, fLength); } diff --git a/deps/icu-small/source/i18n/formatted_string_builder.h b/deps/icu-small/source/i18n/formatted_string_builder.h index 32e0900ae23ac8..2ea7ac4f1b0ad1 100644 --- a/deps/icu-small/source/i18n/formatted_string_builder.h +++ b/deps/icu-small/source/i18n/formatted_string_builder.h @@ -171,7 +171,7 @@ class U_I18N_API FormattedStringBuilder : public UMemory { * Gets an "unsafe" UnicodeString that is valid only as long as the FormattedStringBuilder is alive and * unchanged. Slightly faster than toUnicodeString(). */ - const UnicodeString toTempUnicodeString() const; + UnicodeString toTempUnicodeString() const; UnicodeString toDebugString() const; @@ -219,8 +219,8 @@ class U_I18N_API FormattedStringBuilder : public UMemory { static_assert( // std::is_pod<> is deprecated. - std::is_standard_layout::value && - std::is_trivial::value, + std::is_standard_layout_v && + std::is_trivial_v, "Field should be a POD type for efficient initialization"); constexpr FormattedStringBuilder::Field::Field(uint8_t category, uint8_t field) diff --git a/deps/icu-small/source/i18n/gender.cpp b/deps/icu-small/source/i18n/gender.cpp index d023b50218a548..ab76dab12173bb 100644 --- a/deps/icu-small/source/i18n/gender.cpp +++ b/deps/icu-small/source/i18n/gender.cpp @@ -25,7 +25,6 @@ #include "unicode/ugender.h" #include "unicode/ures.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -156,11 +155,9 @@ const GenderInfo* GenderInfo::loadInstance(const Locale& locale, UErrorCode& sta CharString parentLocaleName(curLocaleName, key_status); while (s == nullptr) { { - CharString tmp; - CharStringByteSink sink(&tmp); - ulocimp_getParent(parentLocaleName.data(), sink, &status); - if (tmp.isEmpty()) break; - parentLocaleName = std::move(tmp); + CharString tmp = ulocimp_getParent(parentLocaleName.data(), status); + if (tmp.isEmpty()) break; + parentLocaleName = std::move(tmp); } key_status = U_ZERO_ERROR; resLen = 0; diff --git a/deps/icu-small/source/i18n/gregocal.cpp b/deps/icu-small/source/i18n/gregocal.cpp index ec14abbbf10c81..dfd64faa50e7c0 100644 --- a/deps/icu-small/source/i18n/gregocal.cpp +++ b/deps/icu-small/source/i18n/gregocal.cpp @@ -351,27 +351,27 @@ GregorianCalendar::setGregorianChange(UDate date, UErrorCode& status) // values. GregorianCalendar *cal = new GregorianCalendar(getTimeZone(), status); /* test for nullptr */ - if (cal == 0) { + if (cal == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } - if(U_FAILURE(status)) + if(U_FAILURE(status)) { return; + } cal->setTime(date, status); fGregorianCutoverYear = cal->get(UCAL_YEAR, status); - if (cal->get(UCAL_ERA, status) == BC) + if (cal->get(UCAL_ERA, status) == BC) { fGregorianCutoverYear = 1 - fGregorianCutoverYear; + } fCutoverJulianDay = (int32_t)cutoverDay; delete cal; } - void GregorianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { int32_t eyear, month, dayOfMonth, dayOfYear, unusedRemainder; - - if(U_FAILURE(status)) { - return; + if(U_FAILURE(status)) { + return; } #if defined (U_DEBUG_CAL) @@ -379,7 +379,6 @@ void GregorianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& statu __FILE__, __LINE__, julianDay, getGregorianDayOfYear(), fCutoverJulianDay); #endif - if (julianDay >= fCutoverJulianDay) { month = getGregorianMonth(); dayOfMonth = getGregorianDayOfMonth(); @@ -472,17 +471,20 @@ GregorianCalendar::isLeapYear(int32_t year) const // ------------------------------------- -int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField) +int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField, UErrorCode& status) { fInvertGregorian = false; - int32_t jd = Calendar::handleComputeJulianDay(bestField); + int32_t jd = Calendar::handleComputeJulianDay(bestField, status); + if (U_FAILURE(status)) { + return 0; + } if((bestField == UCAL_WEEK_OF_YEAR) && // if we are doing WOY calculations, we are counting relative to Jan 1 *julian* (internalGet(UCAL_EXTENDED_YEAR)==fGregorianCutoverYear) && jd >= fCutoverJulianDay) { fInvertGregorian = true; // So that the Julian Jan 1 will be used in handleComputeMonthStart - return Calendar::handleComputeJulianDay(bestField); + return Calendar::handleComputeJulianDay(bestField, status); } @@ -495,7 +497,10 @@ int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField) __FILE__, __LINE__, jd); #endif fInvertGregorian = true; - jd = Calendar::handleComputeJulianDay(bestField); + jd = Calendar::handleComputeJulianDay(bestField, status); + if (U_FAILURE(status)) { + return 0; + } #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: fIsGregorian %s, fInvertGregorian %s - ", __FILE__, __LINE__,fIsGregorian?"T":"F", fInvertGregorian?"T":"F"); @@ -530,21 +535,29 @@ int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField) return jd; } -int32_t GregorianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, +int64_t GregorianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, - UBool /* useMonth */) const + UBool /* useMonth */, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } GregorianCalendar *nonConstThis = (GregorianCalendar*)this; // cast away const // If the month is out of range, adjust it into range, and // modify the extended year value accordingly. if (month < 0 || month > 11) { - eyear += ClockMath::floorDivide(month, 12, &month); + if (uprv_add32_overflow(ClockMath::floorDivide(month, 12, &month), + eyear, &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } UBool isLeap = eyear%4 == 0; int64_t y = (int64_t)eyear-1; - int64_t julianDay = 365*y + ClockMath::floorDivide(y, (int64_t)4) + (kJan1_1JulianDay - 3); + int64_t julianDay = 365LL * y + + ClockMath::floorDivideInt64(y, 4LL) + kJan1_1JulianDay - 3LL; nonConstThis->fIsGregorian = (eyear >= fGregorianCutoverYear); #if defined (U_DEBUG_CAL) @@ -574,10 +587,10 @@ int32_t GregorianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, julianDay += isLeap?kLeapNumDays[month]:kNumDays[month]; } - return static_cast(julianDay); + return julianDay; } -int32_t GregorianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const +int32_t GregorianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& /* status */) const { // If the month is out of range, adjust it into range, and // modify the extended year value accordingly. @@ -594,10 +607,10 @@ int32_t GregorianCalendar::handleGetYearLength(int32_t eyear) const { int32_t -GregorianCalendar::monthLength(int32_t month) const +GregorianCalendar::monthLength(int32_t month, UErrorCode& status) const { int32_t year = internalGet(UCAL_EXTENDED_YEAR); - return handleGetMonthLength(year, month); + return handleGetMonthLength(year, month, status); } // ------------------------------------- @@ -634,10 +647,12 @@ GregorianCalendar::validateFields() const // specially. if (isSet(UCAL_DATE)) { int32_t date = internalGet(UCAL_DATE); + UErrorCode internalStatus = U_ZERO_ERROR; if (date < getMinimum(UCAL_DATE) || - date > monthLength(internalGetMonth())) { + date > monthLength(internalGetMonth(internalStatus), internalStatus) || + U_FAILURE(internalStatus)) { return false; - } + } } if (isSet(UCAL_DAY_OF_YEAR)) { @@ -760,7 +775,7 @@ double GregorianCalendar::computeJulianDayOfYear(UBool isGregorian, // ------------------------------------- -double +double GregorianCalendar::millisToJulianDay(UDate millis) { return (double)kEpochStartAsJulianDay + ClockMath::floorDivide(millis, (double)kOneDay); @@ -777,9 +792,9 @@ GregorianCalendar::julianDayToMillis(double julian) // ------------------------------------- int32_t -GregorianCalendar::aggregateStamp(int32_t stamp_a, int32_t stamp_b) +GregorianCalendar::aggregateStamp(int32_t stamp_a, int32_t stamp_b) { - return (((stamp_a != kUnset && stamp_b != kUnset) + return (((stamp_a != kUnset && stamp_b != kUnset) ? uprv_max(stamp_a, stamp_b) : (int32_t)kUnset)); } @@ -791,9 +806,9 @@ GregorianCalendar::aggregateStamp(int32_t stamp_a, int32_t stamp_b) * Note: This will be made public later. [LIU] */ -void +void GregorianCalendar::roll(EDateFields field, int32_t amount, UErrorCode& status) { - roll((UCalendarDateFields) field, amount, status); + roll((UCalendarDateFields) field, amount, status); } void @@ -814,7 +829,10 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s case UCAL_DAY_OF_MONTH: case UCAL_WEEK_OF_MONTH: { - int32_t max = monthLength(internalGetMonth()); + int32_t max = monthLength(internalGetMonth(status), status); + if (U_FAILURE(status)) { + return; + } UDate t = internalGetTime(); // We subtract 1 from the DAY_OF_MONTH to make it zero-based, and an // additional 10 if we are after the cutover. Thus the monthStart @@ -825,7 +843,7 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s if ((cMonthStart < fGregorianCutover) && (cMonthStart + (cMonthLen=(max-10))*kOneDay >= fGregorianCutover)) { inCutoverMonth = true; - } + } } break; default: @@ -847,7 +865,11 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s // may be one year before or after the calendar year. int32_t isoYear = get(UCAL_YEAR_WOY, status); int32_t isoDoy = internalGet(UCAL_DAY_OF_YEAR); - if (internalGetMonth() == UCAL_JANUARY) { + int32_t month = internalGetMonth(status); + if (U_FAILURE(status)) { + return; + } + if (month == UCAL_JANUARY) { if (woy >= 52) { isoDoy += handleGetYearLength(isoYear); } @@ -856,7 +878,10 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s isoDoy -= handleGetYearLength(isoYear - 1); } } - woy += amount; + if (uprv_add32_overflow(woy, amount, &woy)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } // Do fast checks to avoid unnecessary computation: if (woy < 1 || woy > 52) { // Determine the last week of the ISO year. @@ -882,7 +907,8 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s if( !inCutoverMonth ) { Calendar::roll(field, amount, status); return; - } else { + } + { // [j81] 1582 special case for DOM // The default computation works except when the current month // contains the Gregorian cutover. We handle this special case @@ -905,7 +931,8 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s if( !inCutoverMonth ) { Calendar::roll(field, amount, status); return; - } else { + } + { #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: roll WOM %d ??????????????????? \n", __FILE__, __LINE__,amount); @@ -1151,7 +1178,10 @@ int32_t GregorianCalendar::getActualMaximum(UCalendarDateFields field, UErrorCod } -int32_t GregorianCalendar::handleGetExtendedYear() { +int32_t GregorianCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // the year to return int32_t year = kEpochYear; @@ -1177,14 +1207,21 @@ int32_t GregorianCalendar::handleGetExtendedYear() { int32_t era = internalGet(UCAL_ERA, AD); if (era == BC) { year = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year - } else { + } else if (era == AD) { year = internalGet(UCAL_YEAR, kEpochYear); + } else { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } } break; case UCAL_YEAR_WOY: - year = handleGetExtendedYearFromWeekFields(internalGet(UCAL_YEAR_WOY), internalGet(UCAL_WEEK_OF_YEAR)); + year = handleGetExtendedYearFromWeekFields( + internalGet(UCAL_YEAR_WOY), internalGet(UCAL_WEEK_OF_YEAR), status); + if (U_FAILURE(status)) { + return 0; + } #if defined (U_DEBUG_CAL) // if(internalGet(UCAL_YEAR_WOY) != year) { fprintf(stderr, "%s:%d: hGEYFWF[%d,%d] -> %d\n", @@ -1199,14 +1236,17 @@ int32_t GregorianCalendar::handleGetExtendedYear() { return year; } -int32_t GregorianCalendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy) +int32_t GregorianCalendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // convert year to extended form int32_t era = internalGet(UCAL_ERA, AD); if(era == BC) { yearWoy = 1 - yearWoy; } - return Calendar::handleGetExtendedYearFromWeekFields(yearWoy, woy); + return Calendar::handleGetExtendedYearFromWeekFields(yearWoy, woy, status); } @@ -1228,51 +1268,7 @@ GregorianCalendar::getType() const { return "gregorian"; } -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - - -UBool GregorianCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV -initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - GregorianCalendar calendar(status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate GregorianCalendar::defaultCenturyStart() const { - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t GregorianCalendar::defaultCenturyStartYear() const { - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(GregorianCalendar, "@calendar=gregory") U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/gregoimp.cpp b/deps/icu-small/source/i18n/gregoimp.cpp index 31b5aeed8354fc..57499bd308579f 100644 --- a/deps/icu-small/source/i18n/gregoimp.cpp +++ b/deps/icu-small/source/i18n/gregoimp.cpp @@ -27,12 +27,21 @@ int32_t ClockMath::floorDivide(int32_t numerator, int32_t denominator) { numerator / denominator : ((numerator + 1) / denominator) - 1; } -int64_t ClockMath::floorDivide(int64_t numerator, int64_t denominator) { +int64_t ClockMath::floorDivideInt64(int64_t numerator, int64_t denominator) { return (numerator >= 0) ? numerator / denominator : ((numerator + 1) / denominator) - 1; } -int32_t ClockMath::floorDivide(double numerator, int32_t denominator, +int32_t ClockMath::floorDivide(int32_t numerator, int32_t denominator, + int32_t* remainder) { + int64_t quotient = floorDivide(numerator, denominator); + if (remainder != nullptr) { + *remainder = numerator - (quotient * denominator); + } + return quotient; +} + +double ClockMath::floorDivide(double numerator, int32_t denominator, int32_t* remainder) { // For an integer n and representable ⌊x/n⌋, ⌊RN(x/n)⌋=⌊x/n⌋, where RN is // rounding to nearest. @@ -44,7 +53,7 @@ int32_t ClockMath::floorDivide(double numerator, int32_t denominator, // n+⌈x⌉ = ⌊x+n⌋ + 1. Rewriting it as ⌊x⌋+n makes the addition exact. *remainder = (int32_t) (uprv_floor(numerator) - (quotient * denominator)); } - return (int32_t) quotient; + return quotient; } double ClockMath::floorDivide(double dividend, double divisor, @@ -95,18 +104,20 @@ const int8_t Grego::MONTH_LENGTH[24] = {31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31}; -double Grego::fieldsToDay(int32_t year, int32_t month, int32_t dom) { +int64_t Grego::fieldsToDay(int32_t year, int32_t month, int32_t dom) { - int32_t y = year - 1; + int64_t y = year - 1; - double julian = 365 * y + ClockMath::floorDivide(y, 4) + (JULIAN_1_CE - 3) + // Julian cal - ClockMath::floorDivide(y, 400) - ClockMath::floorDivide(y, 100) + 2 + // => Gregorian cal + int64_t julian = 365LL * y + + ClockMath::floorDivideInt64(y, 4LL) + (JULIAN_1_CE - 3) + // Julian cal + ClockMath::floorDivideInt64(y, 400LL) - + ClockMath::floorDivideInt64(y, 100LL) + 2 + // => Gregorian cal DAYS_BEFORE[month + (isLeapYear(year) ? 12 : 0)] + dom; // => month/dom return julian - JULIAN_1970_CE; // JD => epoch day } -void Grego::dayToFields(double day, int32_t& year, int32_t& month, +void Grego::dayToFields(int32_t day, int32_t& year, int32_t& month, int32_t& dom, int32_t& dow, int32_t& doy) { // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar) @@ -130,7 +141,7 @@ void Grego::dayToFields(double day, int32_t& year, int32_t& month, UBool isLeap = isLeapYear(year); // Gregorian day zero is a Monday. - dow = (int32_t) uprv_fmod(day + 1, 7); + dow = (day + 1) % 7; dow += (dow < 0) ? (UCAL_SUNDAY + 7) : UCAL_SUNDAY; // Common Julian/Gregorian calculation @@ -152,7 +163,7 @@ void Grego::timeToFields(UDate time, int32_t& year, int32_t& month, dayToFields(day, year, month, dom, dow, doy); } -int32_t Grego::dayOfWeek(double day) { +int32_t Grego::dayOfWeek(int32_t day) { int32_t dow; ClockMath::floorDivide(day + int{UCAL_THURSDAY}, 7, &dow); return (dow == 0) ? UCAL_SATURDAY : dow; diff --git a/deps/icu-small/source/i18n/gregoimp.h b/deps/icu-small/source/i18n/gregoimp.h index d65d6a4f88e928..cd7694040d66c4 100644 --- a/deps/icu-small/source/i18n/gregoimp.h +++ b/deps/icu-small/source/i18n/gregoimp.h @@ -14,6 +14,7 @@ #ifndef GREGOIMP_H #define GREGOIMP_H #include "unicode/utypes.h" +#include "unicode/calendar.h" #if !UCONFIG_NO_FORMATTING #include "unicode/ures.h" @@ -49,7 +50,7 @@ class ClockMath { * @param denominator a divisor which must be != 0 * @return the floor of the quotient */ - static int64_t floorDivide(int64_t numerator, int64_t denominator); + static int64_t floorDivideInt64(int64_t numerator, int64_t denominator); /** * Divide two numbers, returning the floor of the quotient. @@ -77,7 +78,25 @@ class ClockMath { * |denominator|). * @return the floor of the quotient */ - static int32_t floorDivide(double numerator, int32_t denominator, + static int32_t floorDivide(int32_t numerator, int32_t denominator, + int32_t* remainder); + + /** + * Divide two numbers, returning the floor of the quotient and + * the modulus remainder. Unlike the built-in division, this is + * mathematically well-behaved. E.g., -1/4 => 0 and + * -1%4 => -1, but floorDivide(-1,4) => + * -1 with remainder => 3. NOTE: If numerator is + * too large, the returned quotient may overflow. + * @param numerator the numerator + * @param denominator a divisor which must be != 0 + * @param remainder output parameter to receive the + * remainder. Unlike numerator % denominator, this + * will always be non-negative, in the half-open range [0, + * |denominator|). + * @return the floor of the quotient + */ + static double floorDivide(double numerator, int32_t denominator, int32_t* remainder); /** @@ -178,31 +197,31 @@ class Grego { * @param dom 1-based day of month * @return the day number, with day 0 == Jan 1 1970 */ - static double fieldsToDay(int32_t year, int32_t month, int32_t dom); + static int64_t fieldsToDay(int32_t year, int32_t month, int32_t dom); /** * Convert a 1970-epoch day number to proleptic Gregorian year, * month, day-of-month, and day-of-week. - * @param day 1970-epoch day (integral value) + * @param day 1970-epoch day * @param year output parameter to receive year * @param month output parameter to receive month (0-based, 0==Jan) * @param dom output parameter to receive day-of-month (1-based) * @param dow output parameter to receive day-of-week (1-based, 1==Sun) * @param doy output parameter to receive day-of-year (1-based) */ - static void dayToFields(double day, int32_t& year, int32_t& month, + static void dayToFields(int32_t day, int32_t& year, int32_t& month, int32_t& dom, int32_t& dow, int32_t& doy); /** * Convert a 1970-epoch day number to proleptic Gregorian year, * month, day-of-month, and day-of-week. - * @param day 1970-epoch day (integral value) + * @param day 1970-epoch day * @param year output parameter to receive year * @param month output parameter to receive month (0-based, 0==Jan) * @param dom output parameter to receive day-of-month (1-based) * @param dow output parameter to receive day-of-week (1-based, 1==Sun) */ - static inline void dayToFields(double day, int32_t& year, int32_t& month, + static inline void dayToFields(int32_t day, int32_t& year, int32_t& month, int32_t& dom, int32_t& dow); /** @@ -221,10 +240,10 @@ class Grego { /** * Return the day of week on the 1970-epoch day - * @param day the 1970-epoch day (integral value) + * @param day the 1970-epoch day * @return the day of week */ - static int32_t dayOfWeek(double day); + static int32_t dayOfWeek(int32_t day); /** * Returns the ordinal number for the specified day of week within the month. @@ -283,7 +302,7 @@ Grego::previousMonthLength(int y, int m) { return (m > 0) ? monthLength(y, m-1) : 31; } -inline void Grego::dayToFields(double day, int32_t& year, int32_t& month, +inline void Grego::dayToFields(int32_t day, int32_t& year, int32_t& month, int32_t& dom, int32_t& dow) { int32_t doy_unused; dayToFields(day,year,month,dom,dow,doy_unused); @@ -291,7 +310,7 @@ inline void Grego::dayToFields(double day, int32_t& year, int32_t& month, inline double Grego::julianDayToMillis(int32_t julian) { - return (julian - kEpochStartAsJulianDay) * kOneDay; + return (static_cast(julian) - kEpochStartAsJulianDay) * kOneDay; } inline int32_t Grego::millisToJulianDay(double millis) { @@ -300,10 +319,50 @@ inline int32_t Grego::millisToJulianDay(double millis) { inline int32_t Grego::gregorianShift(int32_t eyear) { int64_t y = (int64_t)eyear-1; - int32_t gregShift = static_cast(ClockMath::floorDivide(y, (int64_t)400) - ClockMath::floorDivide(y, (int64_t)100) + 2); - return gregShift; + int64_t gregShift = ClockMath::floorDivideInt64(y, 400LL) - ClockMath::floorDivideInt64(y, 100LL) + 2; + return static_cast(gregShift); } +#define IMPL_SYSTEM_DEFAULT_CENTURY(T, U) \ + /** \ + * The system maintains a static default century start date and Year. They \ + * are initialized the first time they are used. Once the system default \ + * century date and year are set, they do not change \ + */ \ + namespace { \ + static UDate gSystemDefaultCenturyStart = DBL_MIN; \ + static int32_t gSystemDefaultCenturyStartYear = -1; \ + static icu::UInitOnce gSystemDefaultCenturyInit {}; \ + static void U_CALLCONV \ + initializeSystemDefaultCentury() { \ + UErrorCode status = U_ZERO_ERROR; \ + T calendar(U, status); \ + /* initialize systemDefaultCentury and systemDefaultCenturyYear based */ \ + /* on the current time. They'll be set to 80 years before */ \ + /* the current time. */ \ + if (U_FAILURE(status)) { \ + return; \ + } \ + calendar.setTime(Calendar::getNow(), status); \ + calendar.add(UCAL_YEAR, -80, status); \ + gSystemDefaultCenturyStart = calendar.getTime(status); \ + gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); \ + /* We have no recourse upon failure unless we want to propagate the */ \ + /* failure out. */ \ + } \ + } /* namespace */ \ + UDate T::defaultCenturyStart() const { \ + /* lazy-evaluate systemDefaultCenturyStart */ \ + umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); \ + return gSystemDefaultCenturyStart; \ + } \ + int32_t T::defaultCenturyStartYear() const { \ + /* lazy-evaluate systemDefaultCenturyStart */ \ + umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); \ + return gSystemDefaultCenturyStartYear; \ + } \ + UBool T::haveDefaultCentury() const { return true; } + U_NAMESPACE_END #endif // !UCONFIG_NO_FORMATTING diff --git a/deps/icu-small/source/i18n/hebrwcal.cpp b/deps/icu-small/source/i18n/hebrwcal.cpp index 6451c89c599aef..d74ab2d3e7de26 100644 --- a/deps/icu-small/source/i18n/hebrwcal.cpp +++ b/deps/icu-small/source/i18n/hebrwcal.cpp @@ -136,6 +136,10 @@ static const int16_t LEAP_MONTH_START[][3] = { { 383, 384, 385 }, // Elul }; +// There are 235 months in 19 years cycle. +static const int32_t MONTHS_IN_CYCLE = 235; +static const int32_t YEARS_IN_CYCLE = 19; + static icu::CalendarCache *gCache = nullptr; U_CDECL_BEGIN @@ -227,12 +231,23 @@ void HebrewCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& // ADAR_1 -- then we have to bump to ADAR_2 aka ADAR. But // if amount is -2 and we land in ADAR_1, then we have to // bump the other way -- down to SHEVAT. - Alan 11/00 - int32_t month = get(UCAL_MONTH, status); + int64_t month = get(UCAL_MONTH, status); int32_t year = get(UCAL_YEAR, status); UBool acrossAdar1; if (amount > 0) { acrossAdar1 = (month < ADAR_1); // started before ADAR_1? month += amount; + // We know there are total 235 months in every 19 years. To speed + // up the iteration, we first fast forward in the multiple of 235 + // months for 19 years before the iteration which check the leap year. + if (month >= MONTHS_IN_CYCLE) { + if (uprv_add32_overflow(year, (month / MONTHS_IN_CYCLE) * YEARS_IN_CYCLE, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + month %= MONTHS_IN_CYCLE; + } + for (;;) { if (acrossAdar1 && month>=ADAR_1 && !isLeapYear(year)) { ++month; @@ -247,6 +262,16 @@ void HebrewCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& } else { acrossAdar1 = (month > ADAR_1); // started after ADAR_1? month += amount; + // We know there are total 235 months in every 19 years. To speed + // up the iteration, we first fast forward in the multiple of 235 + // months for 19 years before the iteration which check the leap year. + if (month <= -MONTHS_IN_CYCLE) { + if (uprv_add32_overflow(year, (month / MONTHS_IN_CYCLE) * YEARS_IN_CYCLE, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + month %= MONTHS_IN_CYCLE; + } for (;;) { if (acrossAdar1 && month<=ADAR_1 && !isLeapYear(year)) { --month; @@ -394,14 +419,18 @@ static const int32_t BAHARAD = 11*HOUR_PARTS + 204; int32_t HebrewCalendar::startOfYear(int32_t year, UErrorCode &status) { ucln_i18n_registerCleanup(UCLN_I18N_HEBREW_CALENDAR, calendar_hebrew_cleanup); - int32_t day = CalendarCache::get(&gCache, year, status); + int64_t day = CalendarCache::get(&gCache, year, status); + if(U_FAILURE(status)) { + return 0; + } if (day == 0) { // # of months before year - int32_t months = (int32_t)ClockMath::floorDivide((235 * (int64_t)year - 234), (int64_t)19); + int64_t months = ClockMath::floorDivideInt64( + (235LL * (int64_t)year - 234LL), 19LL); - int64_t frac = (int64_t)months * MONTH_FRACT + BAHARAD; // Fractional part of day # - day = months * 29 + (int32_t)(frac / DAY_PARTS); // Whole # part of calculation + int64_t frac = months * MONTH_FRACT + BAHARAD; // Fractional part of day # + day = months * 29LL + frac / DAY_PARTS; // Whole # part of calculation frac = frac % DAY_PARTS; // Time of day int32_t wd = (day % 7); // Day of week (0 == Monday) @@ -423,8 +452,14 @@ int32_t HebrewCalendar::startOfYear(int32_t year, UErrorCode &status) // Prevents 382-day years. day += 1; } - CalendarCache::put(&gCache, year, day, status); + if (day > INT32_MAX || day < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + CalendarCache::put(&gCache, year, static_cast(day), status); } + // Out of range value is alread rejected before putting into cache. + U_ASSERT(INT32_MIN <= day && day <= INT32_MAX); return day; } @@ -478,7 +513,7 @@ int32_t HebrewCalendar::yearType(int32_t year) const */ UBool HebrewCalendar::isLeapYear(int32_t year) { //return (year * 12 + 17) % 19 >= 12; - int32_t x = (year*12 + 17) % 19; + int64_t x = (year*12LL + 17) % YEARS_IN_CYCLE; return x >= ((x < 0) ? -7 : 12); } @@ -501,7 +536,10 @@ int32_t HebrewCalendar::handleGetLimit(UCalendarDateFields field, ELimitType lim * Returns the length of the given month in the given year * @internal */ -int32_t HebrewCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { +int32_t HebrewCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const { + if(U_FAILURE(status)) { + return 0; + } // Resolve out-of-range months. This is necessary in order to // obtain the correct year. We correct to // a 12- or 13-month year (add/subtract 12 or 13, depending @@ -539,7 +577,10 @@ int32_t HebrewCalendar::handleGetYearLength(int32_t eyear) const { void HebrewCalendar::validateField(UCalendarDateFields field, UErrorCode &status) { if ((field == UCAL_MONTH || field == UCAL_ORDINAL_MONTH) - && !isLeapYear(handleGetExtendedYear()) && internalGetMonth() == ADAR_1) { + && !isLeapYear(handleGetExtendedYear(status)) && internalGetMonth(status) == ADAR_1) { + if (U_FAILURE(status)) { + return; + } status = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -571,16 +612,25 @@ void HebrewCalendar::validateField(UCalendarDateFields field, UErrorCode &status * @internal */ void HebrewCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } int32_t d = julianDay - 347997; double m = ClockMath::floorDivide((d * (double)DAY_PARTS), (double) MONTH_PARTS); // Months (approx) int32_t year = (int32_t)(ClockMath::floorDivide((19. * m + 234.), 235.) + 1.); // Years (approx) int32_t ys = startOfYear(year, status); // 1st day of year + if (U_FAILURE(status)) { + return; + } int32_t dayOfYear = (d - ys); // Because of the postponement rules, it's possible to guess wrong. Fix it. while (dayOfYear < 1) { year--; ys = startOfYear(year, status); + if (U_FAILURE(status)) { + return; + } dayOfYear = (d - ys); } @@ -610,6 +660,23 @@ void HebrewCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) int dayOfMonth = dayOfYear - (isLeap ? LEAP_MONTH_START[month][type] : MONTH_START[month][type]); internalSet(UCAL_ERA, 0); + // Check out of bound year + int32_t min_year = handleGetLimit(UCAL_EXTENDED_YEAR, UCAL_LIMIT_MINIMUM); + if (year < min_year) { + if (!isLenient()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + year = min_year; + } + int32_t max_year = handleGetLimit(UCAL_EXTENDED_YEAR, UCAL_LIMIT_MAXIMUM); + if (max_year < year) { + if (!isLenient()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + year = max_year; + } internalSet(UCAL_YEAR, year); internalSet(UCAL_EXTENDED_YEAR, year); int32_t ordinal_month = month; @@ -619,7 +686,7 @@ void HebrewCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) internalSet(UCAL_ORDINAL_MONTH, ordinal_month); internalSet(UCAL_MONTH, month); internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); - internalSet(UCAL_DAY_OF_YEAR, dayOfYear); + internalSet(UCAL_DAY_OF_YEAR, dayOfYear); } //------------------------------------------------------------------------- @@ -629,37 +696,58 @@ void HebrewCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) /** * @internal */ -int32_t HebrewCalendar::handleGetExtendedYear() { - int32_t year; +int32_t HebrewCalendar::handleGetExtendedYear(UErrorCode& status ) { + if (U_FAILURE(status)) { + return 0; + } if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 - } else { - year = internalGet(UCAL_YEAR, 1); // Default to year 1 + return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } - return year; + return internalGet(UCAL_YEAR, 1); // Default to year 1 } /** * Return JD of start of given month/year. * @internal */ -int32_t HebrewCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /*useMonth*/) const { - UErrorCode status = U_ZERO_ERROR; +int64_t HebrewCalendar::handleComputeMonthStart( + int32_t eyear, int32_t month, UBool /*useMonth*/, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } // Resolve out-of-range months. This is necessary in order to // obtain the correct year. We correct to // a 12- or 13-month year (add/subtract 12 or 13, depending // on the year) but since we _always_ number from 0..12, and // the leap year determines whether or not month 5 (Adar 1) // is present, we allow 0..12 in any given year. + + // The month could be in large value, we first roll 235 months to 19 years + // before the while loop. + if (month <= -MONTHS_IN_CYCLE || month >= MONTHS_IN_CYCLE) { + if (uprv_add32_overflow(eyear, (month / MONTHS_IN_CYCLE) * YEARS_IN_CYCLE, &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + month %= MONTHS_IN_CYCLE; + } while (month < 0) { - month += monthsInYear(--eyear); + if (uprv_add32_overflow(eyear, -1, &eyear) || + uprv_add32_overflow(month, monthsInYear(eyear), &month)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } // Careful: allow 0..12 in all years while (month > 12) { - month -= monthsInYear(eyear++); + if (uprv_add32_overflow(month, -monthsInYear(eyear), &month) || + uprv_add32_overflow(eyear, 1, &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } - int32_t day = startOfYear(eyear, status); + int64_t day = startOfYear(eyear, status); if(U_FAILURE(status)) { return 0; @@ -673,7 +761,7 @@ int32_t HebrewCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UB } } - return (int) (day + 347997); + return day + 347997LL; } constexpr uint32_t kHebrewRelatedYearDiff = -3760; @@ -693,55 +781,16 @@ void HebrewCalendar::setRelatedYear(int32_t year) set(UCAL_EXTENDED_YEAR, year - kHebrewRelatedYearDiff); } -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - -UBool HebrewCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - HebrewCalendar calendar(Locale("@calendar=hebrew"),status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - - -UDate HebrewCalendar::defaultCenturyStart() const { - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t HebrewCalendar::defaultCenturyStartYear() const { - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(HebrewCalendar, "@calendar=hebrew") bool HebrewCalendar::inTemporalLeapYear(UErrorCode& status) const { - if (U_FAILURE(status)) return false; + if (U_FAILURE(status)) { + return false; + } int32_t eyear = get(UCAL_EXTENDED_YEAR, status); - if (U_FAILURE(status)) return false; + if (U_FAILURE(status)) { + return false; + } return isLeapYear(eyear); } @@ -752,13 +801,17 @@ static const char * const gTemporalMonthCodesForHebrew[] = { const char* HebrewCalendar::getTemporalMonthCode(UErrorCode& status) const { int32_t month = get(UCAL_MONTH, status); - if (U_FAILURE(status)) return nullptr; + if (U_FAILURE(status)) { + return nullptr; + } return gTemporalMonthCodesForHebrew[month]; } void HebrewCalendar::setTemporalMonthCode(const char* code, UErrorCode& status ) { - if (U_FAILURE(status)) return; + if (U_FAILURE(status)) { + return; + } int32_t len = static_cast(uprv_strlen(code)); if (len == 3 || len == 4) { for (int m = 0; gTemporalMonthCodesForHebrew[m] != nullptr; m++) { @@ -771,15 +824,26 @@ void HebrewCalendar::setTemporalMonthCode(const char* code, UErrorCode& status ) status = U_ILLEGAL_ARGUMENT_ERROR; } -int32_t HebrewCalendar::internalGetMonth() const { +int32_t HebrewCalendar::internalGetMonth(UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } if (resolveFields(kMonthPrecedence) == UCAL_ORDINAL_MONTH) { int32_t ordinalMonth = internalGet(UCAL_ORDINAL_MONTH); HebrewCalendar *nonConstThis = (HebrewCalendar*)this; // cast away const - int32_t year = nonConstThis->handleGetExtendedYear(); - return ordinalMonth + (((!isLeapYear(year)) && (ordinalMonth > ADAR_1)) ? 1: 0); + int32_t year = nonConstThis->handleGetExtendedYear(status); + if (U_FAILURE(status)) { + return 0; + } + if (isLeapYear(year) || ordinalMonth <= ADAR_1) { + return ordinalMonth; + } + if (!uprv_add32_overflow(ordinalMonth, 1, &ordinalMonth)) { + return ordinalMonth; + } } - return Calendar::internalGetMonth(); + return Calendar::internalGetMonth(status); } UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HebrewCalendar) diff --git a/deps/icu-small/source/i18n/hebrwcal.h b/deps/icu-small/source/i18n/hebrwcal.h index 829a642211a84d..342fdb0efa766c 100644 --- a/deps/icu-small/source/i18n/hebrwcal.h +++ b/deps/icu-small/source/i18n/hebrwcal.h @@ -319,7 +319,7 @@ class U_I18N_API HebrewCalendar : public Calendar { * implementation than the default implementation in Calendar. * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given extended year of this @@ -350,10 +350,11 @@ class U_I18N_API HebrewCalendar : public Calendar { * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such * as UCAL_ERA) specific to the calendar system, depending on which set of * fields is newer. + * @param status * @return the extended year * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Return the Julian day number of day before the first day of the * given month in the given extended year. Subclasses should override @@ -367,8 +368,8 @@ class U_I18N_API HebrewCalendar : public Calendar { * day of the given month and year * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, - UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, + UBool useMonth, UErrorCode& status) const override; /** @@ -380,24 +381,7 @@ class U_I18N_API HebrewCalendar : public Calendar { virtual void validateField(UCalendarDateFields field, UErrorCode &status) override; protected: - /** - * Returns true because the Hebrew Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY public: /** @@ -442,7 +426,7 @@ class U_I18N_API HebrewCalendar : public Calendar { virtual void setTemporalMonthCode(const char* code, UErrorCode& status ) override; protected: - virtual int32_t internalGetMonth() const override; + virtual int32_t internalGetMonth(UErrorCode& status) const override; private: // Calendar-specific implementation /** diff --git a/deps/icu-small/source/i18n/indiancal.cpp b/deps/icu-small/source/i18n/indiancal.cpp index 29c2749f48cd44..1cca8e5f841264 100644 --- a/deps/icu-small/source/i18n/indiancal.cpp +++ b/deps/icu-small/source/i18n/indiancal.cpp @@ -108,7 +108,7 @@ static UBool isGregorianLeap(int32_t year) * @param eyear The year in Saka Era * @param month The month(0-based) in Indian calendar */ -int32_t IndianCalendar::handleGetMonthLength(int32_t eyear, int32_t month) const { +int32_t IndianCalendar::handleGetMonthLength(int32_t eyear, int32_t month, UErrorCode& /* status */) const { if (month < 0 || month > 11) { eyear += ClockMath::floorDivide(month, 12, &month); } @@ -203,14 +203,20 @@ static double IndianToJD(int32_t year, int32_t month, int32_t date) { * @param eyear The year in Indian Calendar measured from Saka Era (78 AD). * @param month The month in Indian calendar */ -int32_t IndianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /* useMonth */ ) const { +int64_t IndianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /* useMonth */, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } //month is 0 based; converting it to 1-based int32_t imonth; // If the month is out of range, adjust it into range, and adjust the extended year accordingly if (month < 0 || month > 11) { - eyear += (int32_t)ClockMath::floorDivide(month, 12, &month); + if (uprv_add32_overflow(eyear, ClockMath::floorDivide(month, 12, &month), &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } if(month == 12){ @@ -219,16 +225,19 @@ int32_t IndianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UB imonth = month + 1; } - double jd = IndianToJD(eyear ,imonth, 1); + int64_t jd = IndianToJD(eyear ,imonth, 1); - return (int32_t)jd; + return jd; } //------------------------------------------------------------------------- // Functions for converting from milliseconds to field values //------------------------------------------------------------------------- -int32_t IndianCalendar::handleGetExtendedYear() { +int32_t IndianCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } int32_t year; if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { @@ -307,7 +316,11 @@ int32_t IndianCalendar::getRelatedYear(UErrorCode &status) const if (U_FAILURE(status)) { return 0; } - return year + kIndianRelatedYearDiff; + if (uprv_add32_overflow(year, kIndianRelatedYearDiff, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return year; } void IndianCalendar::setRelatedYear(int32_t year) @@ -316,60 +329,7 @@ void IndianCalendar::setRelatedYear(int32_t year) set(UCAL_EXTENDED_YEAR, year - kIndianRelatedYearDiff); } -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - - -UBool IndianCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV -initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - - IndianCalendar calendar ( Locale ( "@calendar=Indian" ), status); - if ( U_SUCCESS ( status ) ) { - calendar.setTime ( Calendar::getNow(), status ); - calendar.add ( UCAL_YEAR, -80, status ); - - UDate newStart = calendar.getTime ( status ); - int32_t newYear = calendar.get ( UCAL_YEAR, status ); - - gSystemDefaultCenturyStart = newStart; - gSystemDefaultCenturyStartYear = newYear; - } - // We have no recourse upon failure. -} - - -UDate -IndianCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t -IndianCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} - +IMPL_SYSTEM_DEFAULT_CENTURY(IndianCalendar, "@calendar=indian") UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndianCalendar) diff --git a/deps/icu-small/source/i18n/indiancal.h b/deps/icu-small/source/i18n/indiancal.h index 5ef9113a85a4a4..2062bcec9103a4 100644 --- a/deps/icu-small/source/i18n/indiancal.h +++ b/deps/icu-small/source/i18n/indiancal.h @@ -209,7 +209,7 @@ class U_I18N_API IndianCalendar : public Calendar { * @param year The month(0-based) in Indian year * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Indian year @@ -225,7 +225,7 @@ class U_I18N_API IndianCalendar : public Calendar { /** * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; //------------------------------------------------------------------------- // Functions for converting from milliseconds to field values @@ -234,7 +234,7 @@ class U_I18N_API IndianCalendar : public Calendar { /** * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Override Calendar to compute several fields specific to the Indian @@ -304,24 +304,8 @@ class U_I18N_API IndianCalendar : public Calendar { // Default century. protected: - /** - * Returns true because the Indian Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/inputext.cpp b/deps/icu-small/source/i18n/inputext.cpp index bce9862c0fe5c0..0351518b704e08 100644 --- a/deps/icu-small/source/i18n/inputext.cpp +++ b/deps/icu-small/source/i18n/inputext.cpp @@ -30,8 +30,8 @@ InputText::InputText(UErrorCode &status) // removed if appropriate. fByteStats(NEW_ARRAY(int16_t, 256)), // byte frequency statistics for the input text. // Value is percent, not absolute. - fDeclaredEncoding(0), - fRawInput(0), + fDeclaredEncoding(nullptr), + fRawInput(nullptr), fRawLength(0) { if (fInputBytes == nullptr || fByteStats == nullptr) { diff --git a/deps/icu-small/source/i18n/islamcal.cpp b/deps/icu-small/source/i18n/islamcal.cpp index c21530a736eb58..d299358a5f1ca8 100644 --- a/deps/icu-small/source/i18n/islamcal.cpp +++ b/deps/icu-small/source/i18n/islamcal.cpp @@ -55,7 +55,6 @@ static void debug_islamcal_msg(const char *pat, ...) // --- The cache -- // cache of months static icu::CalendarCache *gMonthCache = nullptr; -static icu::CalendarAstronomer *gIslamicCalendarAstro = nullptr; U_CDECL_BEGIN static UBool calendar_islamic_cleanup() { @@ -63,10 +62,6 @@ static UBool calendar_islamic_cleanup() { delete gMonthCache; gMonthCache = nullptr; } - if (gIslamicCalendarAstro) { - delete gIslamicCalendarAstro; - gIslamicCalendarAstro = nullptr; - } return true; } U_CDECL_END @@ -192,15 +187,6 @@ static const int UMALQURA_MONTHLENGTH[] = { 0x06AA, 0x0AD6, 0x055D, 0x029D }; -int32_t getUmalqura_MonthLength(int32_t y, int32_t m) { - int32_t mask = (int32_t) (0x01 << (11 - m)); // set mask for bit corresponding to month - if((UMALQURA_MONTHLENGTH[y] & mask) == 0 ) - return 29; - else - return 30; - -} - //------------------------------------------------------------------------- // Constructors... //------------------------------------------------------------------------- @@ -273,6 +259,8 @@ int32_t IslamicCalendar::handleGetLimit(UCalendarDateFields field, ELimitType li // Assorted calculation utilities // +namespace { + // we could compress this down more if we need to static const int8_t umAlQuraYrStartEstimateFix[] = { 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, // 1300.. @@ -311,16 +299,19 @@ static const int8_t umAlQuraYrStartEstimateFix[] = { /** * Determine whether a year is a leap year in the Islamic civil calendar */ -UBool IslamicCalendar::civilLeapYear(int32_t year) -{ +inline bool civilLeapYear(int32_t year) { return (14 + 11 * year) % 30 < 11; } +int32_t trueMonthStart(int32_t month); + +} // namespace + /** * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ -int32_t IslamicCalendar::yearStart(int32_t year) const{ +int64_t IslamicCalendar::yearStart(int32_t year) const{ return trueMonthStart(12*(year-1)); } @@ -331,10 +322,33 @@ int32_t IslamicCalendar::yearStart(int32_t year) const{ * @param year The hijri year * @param month The hijri month, 0-based (assumed to be in range 0..11) */ -int32_t IslamicCalendar::monthStart(int32_t year, int32_t month) const { - return trueMonthStart(12*(year-1) + month); +int64_t IslamicCalendar::monthStart(int32_t year, int32_t month, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } + int32_t temp; + if (uprv_add32_overflow(year, -1, &temp) || + uprv_mul32_overflow(temp, 12, &temp) || + uprv_add32_overflow(temp, month, &month)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + return trueMonthStart(month); } +namespace { +/** + * Return the "age" of the moon at the given time; this is the difference + * in ecliptic latitude between the moon and the sun. This method simply + * calls CalendarAstronomer.moonAge, converts to degrees, + * and adjusts the resultto be in the range [-180, 180]. + * + * @param time The time at which the moon's age is desired, + * in millis since 1/1/1970. + */ +double moonAge(UDate time); + /** * Find the day number on which a particular month of the true/lunar * Islamic calendar starts. @@ -343,82 +357,46 @@ int32_t IslamicCalendar::monthStart(int32_t year, int32_t month) const { * * @return The day number on which the given month starts. */ -int32_t IslamicCalendar::trueMonthStart(int32_t month) const -{ +int32_t trueMonthStart(int32_t month) { + ucln_i18n_registerCleanup(UCLN_I18N_ISLAMIC_CALENDAR, calendar_islamic_cleanup); UErrorCode status = U_ZERO_ERROR; - int32_t start = CalendarCache::get(&gMonthCache, month, status); + int64_t start = CalendarCache::get(&gMonthCache, month, status); - if (start==0) { + if (U_SUCCESS(status) && start==0) { // Make a guess at when the month started, using the average length UDate origin = HIJRA_MILLIS + uprv_floor(month * CalendarAstronomer::SYNODIC_MONTH) * kOneDay; // moonAge will fail due to memory allocation error - double age = moonAge(origin, status); - if (U_FAILURE(status)) { - goto trueMonthStartEnd; - } + double age = moonAge(origin); if (age >= 0) { // The month has already started do { origin -= kOneDay; - age = moonAge(origin, status); - if (U_FAILURE(status)) { - goto trueMonthStartEnd; - } + age = moonAge(origin); } while (age >= 0); } else { // Preceding month has not ended yet. do { origin += kOneDay; - age = moonAge(origin, status); - if (U_FAILURE(status)) { - goto trueMonthStartEnd; - } + age = moonAge(origin); } while (age < 0); } - start = (int32_t)(ClockMath::floorDivide( - (int64_t)((int64_t)origin - HIJRA_MILLIS), (int64_t)kOneDay) + 1); + start = ClockMath::floorDivideInt64( + (int64_t)((int64_t)origin - HIJRA_MILLIS), (int64_t)kOneDay) + 1; CalendarCache::put(&gMonthCache, month, start, status); } -trueMonthStartEnd : if(U_FAILURE(status)) { start = 0; } return start; } -/** -* Return the "age" of the moon at the given time; this is the difference -* in ecliptic latitude between the moon and the sun. This method simply -* calls CalendarAstronomer.moonAge, converts to degrees, -* and adjusts the result to be in the range [-180, 180]. -* -* @param time The time at which the moon's age is desired, -* in millis since 1/1/1970. -*/ -double IslamicCalendar::moonAge(UDate time, UErrorCode &status) -{ - double age = 0; - - static UMutex astroLock; // pod bay door lock - umtx_lock(&astroLock); - if(gIslamicCalendarAstro == nullptr) { - gIslamicCalendarAstro = new CalendarAstronomer(); - if (gIslamicCalendarAstro == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return age; - } - ucln_i18n_registerCleanup(UCLN_I18N_ISLAMIC_CALENDAR, calendar_islamic_cleanup); - } - gIslamicCalendarAstro->setTime(time); - age = gIslamicCalendarAstro->getMoonAge(); - umtx_unlock(&astroLock); - +double moonAge(UDate time) { // Convert to degrees and normalize... - age = age * 180 / CalendarAstronomer::PI; + double age = CalendarAstronomer(time).getMoonAge() * 180 / CalendarAstronomer::PI; if (age > 180) { age = age - 360; } @@ -426,6 +404,7 @@ double IslamicCalendar::moonAge(UDate time, UErrorCode &status) return age; } +} // namespace //---------------------------------------------------------------------- // Calendar framework //---------------------------------------------------------------------- @@ -437,7 +416,8 @@ double IslamicCalendar::moonAge(UDate time, UErrorCode &status) * @param year The hijri month, 0-based * @draft ICU 2.4 */ -int32_t IslamicCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { +int32_t IslamicCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, + UErrorCode& /* status */) const { month = 12*(extendedYear-1) + month; return trueMonthStart(month+1) - trueMonthStart(month) ; } @@ -463,18 +443,30 @@ int32_t IslamicCalendar::handleGetYearLength(int32_t extendedYear) const { /** * @draft ICU 2.4 */ -int32_t IslamicCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /* useMonth */) const { +int64_t IslamicCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, + UBool /* useMonth */, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } // This may be called by Calendar::handleComputeJulianDay with months out of the range // 0..11. Need to handle that here since monthStart requires months in the range 0.11. if (month > 11) { eyear += (month / 12); + if (uprv_add32_overflow(eyear, (month / 12), &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } month %= 12; } else if (month < 0) { month++; - eyear += (month / 12) - 1; + if (uprv_add32_overflow(eyear, (month / 12) - 1, &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } month = (month % 12) + 11; } - return monthStart(eyear, month) + getEpoc() - 1; + return monthStart(eyear, month, status) + getEpoc() - 1; } //------------------------------------------------------------------------- @@ -484,14 +476,11 @@ int32_t IslamicCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, U /** * @draft ICU 2.4 */ -int32_t IslamicCalendar::handleGetExtendedYear() { - int32_t year; +int32_t IslamicCalendar::handleGetExtendedYear(UErrorCode& /* status */) { if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 - } else { - year = internalGet(UCAL_YEAR, 1); // Default to year 1 + return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } - return year; + return internalGet(UCAL_YEAR, 1); // Default to year 1 } /** @@ -519,11 +508,7 @@ void IslamicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) int32_t startDate = (int32_t)uprv_floor(month * CalendarAstronomer::SYNODIC_MONTH); - double age = moonAge(internalGetTime(), status); - if (U_FAILURE(status)) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } + double age = moonAge(internalGetTime()); if ( days - startDate >= 25 && age > 0) { // If we're near the end of the month, assume next month and search backwards month++; @@ -538,10 +523,24 @@ void IslamicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) int32_t year = month >= 0 ? ((month / 12) + 1) : ((month + 1 ) / 12); month = ((month % 12) + 12 ) % 12; - int32_t dayOfMonth = (days - monthStart(year, month)) + 1; + int64_t dayOfMonth = (days - monthStart(year, month, status)) + 1; + if (U_FAILURE(status)) { + return; + } + if (dayOfMonth > INT32_MAX || dayOfMonth < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } // Now figure out the day of the year. - int32_t dayOfYear = (days - monthStart(year, 0)) + 1; + int64_t dayOfYear = (days - monthStart(year, 0, status)) + 1; + if (U_FAILURE(status)) { + return; + } + if (dayOfYear > INT32_MAX || dayOfYear < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } internalSet(UCAL_ERA, 0); internalSet(UCAL_YEAR, year); @@ -582,7 +581,8 @@ int32_t IslamicCalendar::getRelatedYear(UErrorCode &status) const return gregoYearFromIslamicStart(year); } -static int32_t firstIslamicStartYearFromGrego(int32_t year) { +void IslamicCalendar::setRelatedYear(int32_t year) +{ // ad hoc conversion, improve under #10752 // rough est for now, ok for grego 1846-2138, // otherwise occasionally wrong (for 3% of years) @@ -596,69 +596,20 @@ static int32_t firstIslamicStartYearFromGrego(int32_t year) { offset = -(year - 1976) % 65; shift = 2*cycle + ((offset <= 32)? 1: 0); } - return year - 579 + shift; -} - -void IslamicCalendar::setRelatedYear(int32_t year) -{ - set(UCAL_EXTENDED_YEAR, firstIslamicStartYearFromGrego(year)); -} - -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - - -UBool IslamicCalendar::haveDefaultCentury() const -{ - return true; + year = year - 579 + shift; + set(UCAL_EXTENDED_YEAR, year); } -UDate IslamicCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t IslamicCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(IslamicCalendar, "@calendar=islamic-civil") bool IslamicCalendar::inTemporalLeapYear(UErrorCode &status) const { int32_t days = getActualMaximum(UCAL_DAY_OF_YEAR, status); - if (U_FAILURE(status)) return false; - return days == 355; -} - - -U_CFUNC void U_CALLCONV -IslamicCalendar::initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - IslamicCalendar calendar(Locale("@calendar=islamic-civil"),status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); + if (U_FAILURE(status)) { + return false; } - // We have no recourse upon failure unless we want to propagate the failure - // out. + return days == 355; } /***************************************************************************** @@ -685,10 +636,8 @@ IslamicCivilCalendar* IslamicCivilCalendar::clone() const { * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ -int32_t IslamicCivilCalendar::yearStart(int32_t year) const{ - return static_cast( - (year-1)*354 + ClockMath::floorDivide((3+11*static_cast(year)), - static_cast(30))); +int64_t IslamicCivilCalendar::yearStart(int32_t year) const{ + return 354LL * (year-1LL) + ClockMath::floorDivideInt64(3 + 11LL * year, 30LL); } /** @@ -698,13 +647,12 @@ int32_t IslamicCivilCalendar::yearStart(int32_t year) const{ * @param year The hijri year * @param month The hijri month, 0-based (assumed to be in range 0..11) */ -int32_t IslamicCivilCalendar::monthStart(int32_t year, int32_t month) const { +int64_t IslamicCivilCalendar::monthStart(int32_t year, int32_t month, UErrorCode& /*status*/) const { // This does not handle months out of the range 0..11 - return static_cast( - uprv_ceil(29.5*month) + (year-1)*354 + - static_cast(ClockMath::floorDivide( - 3+11*static_cast(year), - static_cast(30)))); + return static_cast( + uprv_ceil(29.5*month) + 354LL*(year-1LL) + + ClockMath::floorDivideInt64( + 11LL*static_cast(year) + 3LL, 30LL)); } /** @@ -714,7 +662,8 @@ int32_t IslamicCivilCalendar::monthStart(int32_t year, int32_t month) const { * @param year The hijri month, 0-based * @draft ICU 2.4 */ -int32_t IslamicCivilCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { +int32_t IslamicCivilCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, + UErrorCode& /* status */) const { int32_t length = 29 + (month+1) % 2; if (month == DHU_AL_HIJJAH && civilLeapYear(extendedYear)) { length++; @@ -751,17 +700,30 @@ void IslamicCivilCalendar::handleComputeFields(int32_t julianDay, UErrorCode &st int32_t days = julianDay - getEpoc(); // Use the civil calendar approximation, which is just arithmetic - int32_t year = static_cast( - ClockMath::floorDivide(30 * static_cast(days) + 10646, - static_cast(10631))); + int64_t year = + ClockMath::floorDivideInt64(30LL * days + 10646LL, 10631LL); int32_t month = static_cast( uprv_ceil((days - 29 - yearStart(year)) / 29.5 )); month = month<11?month:11; - int32_t dayOfMonth = (days - monthStart(year, month)) + 1; + int64_t dayOfMonth = (days - monthStart(year, month, status)) + 1; + if (U_FAILURE(status)) { + return; + } + if (dayOfMonth > INT32_MAX || dayOfMonth < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } // Now figure out the day of the year. - int32_t dayOfYear = (days - monthStart(year, 0)) + 1; + int64_t dayOfYear = (days - monthStart(year, 0, status)) + 1; + if (U_FAILURE(status)) { + return; + } + if (dayOfYear > INT32_MAX || dayOfYear < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } internalSet(UCAL_ERA, 0); internalSet(UCAL_YEAR, year); @@ -799,7 +761,7 @@ int32_t IslamicTBLACalendar::getEpoc() const { * IslamicUmalquraCalendar *****************************************************************************/ IslamicUmalquraCalendar::IslamicUmalquraCalendar(const Locale& aLocale, UErrorCode& success) - : IslamicCalendar(aLocale, success) + : IslamicCivilCalendar(aLocale, success) { } @@ -819,15 +781,13 @@ IslamicUmalquraCalendar* IslamicUmalquraCalendar::clone() const { * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ -int32_t IslamicUmalquraCalendar::yearStart(int32_t year) const { +int64_t IslamicUmalquraCalendar::yearStart(int32_t year) const { if (year < UMALQURA_YEAR_START || year > UMALQURA_YEAR_END) { - return static_cast( - (year-1)*354 + ClockMath::floorDivide((3+11*static_cast(year)), - static_cast(30))); + return IslamicCivilCalendar::yearStart(year); } year -= UMALQURA_YEAR_START; // rounded least-squares fit of the dates previously calculated from UMALQURA_MONTHLENGTH iteration - int32_t yrStartLinearEstimate = static_cast( + int64_t yrStartLinearEstimate = static_cast( (354.36720 * (double)year) + 460322.05 + 0.5); // need a slight correction to some return yrStartLinearEstimate + umAlQuraYrStartEstimateFix[year]; @@ -840,10 +800,16 @@ int32_t IslamicUmalquraCalendar::yearStart(int32_t year) const { * @param year The hijri year * @param month The hijri month, 0-based (assumed to be in range 0..11) */ -int32_t IslamicUmalquraCalendar::monthStart(int32_t year, int32_t month) const { - int32_t ms = yearStart(year); +int64_t IslamicUmalquraCalendar::monthStart(int32_t year, int32_t month, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } + int64_t ms = yearStart(year); for(int i=0; i< month; i++){ - ms+= handleGetMonthLength(year, i); + ms+= handleGetMonthLength(year, i, status); + if (U_FAILURE(status)) { + return 0; + } } return ms; } @@ -854,16 +820,18 @@ int32_t IslamicUmalquraCalendar::monthStart(int32_t year, int32_t month) const { * @param year The hijri year * @param year The hijri month, 0-based */ -int32_t IslamicUmalquraCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { - int32_t length = 0; +int32_t IslamicUmalquraCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, + UErrorCode& status) const { if (extendedYearUMALQURA_YEAR_END) { - length = 29 + (month+1) % 2; - if (month == DHU_AL_HIJJAH && civilLeapYear(extendedYear)) { - length++; - } - return length; + return IslamicCivilCalendar::handleGetMonthLength(extendedYear, month, status); } - return getUmalqura_MonthLength(extendedYear - UMALQURA_YEAR_START, month); + int32_t length = 29; + int32_t mask = (int32_t) (0x01 << (11 - month)); // set mask for bit corresponding to month + int32_t index = extendedYear - UMALQURA_YEAR_START; + if ((UMALQURA_MONTHLENGTH[index] & mask) != 0) { + length++; + } + return length; } /** @@ -872,13 +840,15 @@ int32_t IslamicUmalquraCalendar::handleGetMonthLength(int32_t extendedYear, int3 */ int32_t IslamicUmalquraCalendar::handleGetYearLength(int32_t extendedYear) const { if (extendedYearUMALQURA_YEAR_END) { - return 354 + (civilLeapYear(extendedYear) ? 1 : 0); + return IslamicCivilCalendar::handleGetYearLength(extendedYear); } - int len = 0; + int length = 0; + UErrorCode internalStatus = U_ZERO_ERROR; for(int i=0; i<12; i++) { - len += handleGetMonthLength(extendedYear, i); + length += handleGetMonthLength(extendedYear, i, internalStatus); } - return len; + U_ASSERT(U_SUCCESS(internalStatus)); + return length; } /** @@ -899,45 +869,58 @@ int32_t IslamicUmalquraCalendar::handleGetYearLength(int32_t extendedYear) const */ void IslamicUmalquraCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) { if (U_FAILURE(status)) return; - int32_t year, month, dayOfMonth, dayOfYear; + int64_t year; + int32_t month; int32_t days = julianDay - getEpoc(); - int32_t umalquraStartdays = yearStart(UMALQURA_YEAR_START) ; - if (days < umalquraStartdays) { - //Use Civil calculation - year = (int32_t)ClockMath::floorDivide( - (30 * (int64_t)days + 10646) , (int64_t)10631.0 ); - month = (int32_t)uprv_ceil((days - 29 - yearStart(year)) / 29.5 ); - month = month < 11 ? month : 11; - } else { - int y =UMALQURA_YEAR_START-1, m =0; - long d = 1; - while (d > 0) { - y++; - d = days - yearStart(y) +1; - if (d == handleGetYearLength(y)) { - m=11; - break; - } - if (d < handleGetYearLength(y)){ - int monthLen = handleGetMonthLength(y, m); - m=0; - while(d > monthLen){ - d -= monthLen; - m++; - monthLen = handleGetMonthLength(y, m); + static int64_t kUmalquraStart = yearStart(UMALQURA_YEAR_START); + if (days < kUmalquraStart) { + IslamicCivilCalendar::handleComputeFields(julianDay, status); + return; + } + // Estimate a value y which is closer to but not greater than the year. + // It is the inverse function of the logic inside + // IslamicUmalquraCalendar::yearStart(). + year = ((double(days) - (460322.05 + 0.5)) / 354.36720) + UMALQURA_YEAR_START - 1; + month = 0; + int32_t d = 1; + // need a slight correction to some + while (d > 0) { + d = days - yearStart(++year) + 1; + int32_t yearLength = handleGetYearLength(year); + if (d == yearLength) { + month = 11; + break; + } + if (d < yearLength){ + int32_t monthLen = handleGetMonthLength(year, month, status); + for (month = 0; + d > monthLen; + monthLen = handleGetMonthLength(year, ++month, status)) { + if (U_FAILURE(status)) { + return; } - break; + d -= monthLen; } + break; } - year = y; - month = m; } - dayOfMonth = (days - monthStart(year, month)) + 1; - - // Now figure out the day of the year. - dayOfYear = (days - monthStart(year, 0)) + 1; + int32_t dayOfMonth = monthStart(year, month, status); + int32_t dayOfYear = monthStart(year, 0, status); + if (U_FAILURE(status)) { + return; + } + if (uprv_mul32_overflow(dayOfMonth, -1, &dayOfMonth) || + uprv_add32_overflow(dayOfMonth, days, &dayOfMonth) || + uprv_add32_overflow(dayOfMonth, 1, &dayOfMonth) || + // Now figure out the day of the year. + uprv_mul32_overflow(dayOfYear, -1, &dayOfYear) || + uprv_add32_overflow(dayOfYear, days, &dayOfYear) || + uprv_add32_overflow(dayOfYear, 1, &dayOfYear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } internalSet(UCAL_ERA, 0); internalSet(UCAL_YEAR, year); diff --git a/deps/icu-small/source/i18n/islamcal.h b/deps/icu-small/source/i18n/islamcal.h index 8469269bccc473..1fb9ecd506cb55 100644 --- a/deps/icu-small/source/i18n/islamcal.h +++ b/deps/icu-small/source/i18n/islamcal.h @@ -197,16 +197,11 @@ class U_I18N_API IslamicCalendar : public Calendar { virtual IslamicCalendar* clone() const override; protected: - /** - * Determine whether a year is a leap year in the Islamic civil calendar - */ - static UBool civilLeapYear(int32_t year); - /** * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ - virtual int32_t yearStart(int32_t year) const; + virtual int64_t yearStart(int32_t year) const; /** * Return the day # on which the given month starts. Days are counted @@ -215,29 +210,8 @@ class U_I18N_API IslamicCalendar : public Calendar { * @param year The hijri year * @param year The hijri month, 0-based */ - virtual int32_t monthStart(int32_t year, int32_t month) const; - - /** - * Find the day number on which a particular month of the true/lunar - * Islamic calendar starts. - * - * @param month The month in question, origin 0 from the Hijri epoch - * - * @return The day number on which the given month starts. - */ - int32_t trueMonthStart(int32_t month) const; + virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const; - private: - /** - * Return the "age" of the moon at the given time; this is the difference - * in ecliptic latitude between the moon and the sun. This method simply - * calls CalendarAstronomer.moonAge, converts to degrees, - * and adjusts the resultto be in the range [-180, 180]. - * - * @param time The time at which the moon's age is desired, - * in millis since 1/1/1970. - */ - static double moonAge(UDate time, UErrorCode &status); //---------------------------------------------------------------------- // Calendar framework @@ -255,7 +229,7 @@ class U_I18N_API IslamicCalendar : public Calendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Islamic year @@ -271,7 +245,7 @@ class U_I18N_API IslamicCalendar : public Calendar { /** * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; //------------------------------------------------------------------------- // Functions for converting from milliseconds to field values @@ -280,7 +254,7 @@ class U_I18N_API IslamicCalendar : public Calendar { /** * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Override Calendar to compute several fields specific to the Islamic @@ -364,32 +338,8 @@ class U_I18N_API IslamicCalendar : public Calendar { // Default century. protected: - /** - * Returns true because the Islamic Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; - - private: - /** - * Initializes the 100-year window that dates with 2-digit years - * are considered to fall within so that its start date is 80 years - * before the current time. - */ - static void U_CALLCONV initializeSystemDefaultCentury(); + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY }; /* @@ -463,7 +413,7 @@ class U_I18N_API IslamicCivilCalendar : public IslamicCalendar { * from the Hijri epoch, origin 0. * @internal */ - virtual int32_t yearStart(int32_t year) const override; + virtual int64_t yearStart(int32_t year) const override; /** * Return the day # on which the given month starts. Days are counted @@ -473,7 +423,7 @@ class U_I18N_API IslamicCivilCalendar : public IslamicCalendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t monthStart(int32_t year, int32_t month) const override; + virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const override; /** * Return the length (in days) of the given month. @@ -482,7 +432,7 @@ class U_I18N_API IslamicCivilCalendar : public IslamicCalendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Islamic year @@ -584,7 +534,7 @@ class U_I18N_API IslamicTBLACalendar : public IslamicCivilCalendar { * IslamicUmalquraCalendar * This calendar is referred as "Islamic calendar, Umm al-Qura" in CLDR. */ -class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { +class U_I18N_API IslamicUmalquraCalendar : public IslamicCivilCalendar { public: /** * Constructs an IslamicUmalquraCalendar based on the current time in the default time zone @@ -646,7 +596,7 @@ class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { * from the Hijri epoch, origin 0. * @internal */ - virtual int32_t yearStart(int32_t year) const override; + virtual int64_t yearStart(int32_t year) const override; /** * Return the day # on which the given month starts. Days are counted @@ -656,7 +606,7 @@ class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t monthStart(int32_t year, int32_t month) const override; + virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const override; /** * Return the length (in days) of the given month. @@ -665,7 +615,7 @@ class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Islamic year diff --git a/deps/icu-small/source/i18n/iso8601cal.cpp b/deps/icu-small/source/i18n/iso8601cal.cpp index c3288bc6b5d64e..6bb7579e72da33 100644 --- a/deps/icu-small/source/i18n/iso8601cal.cpp +++ b/deps/icu-small/source/i18n/iso8601cal.cpp @@ -14,11 +14,12 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ISO8601Calendar) ISO8601Calendar::ISO8601Calendar(const Locale& aLocale, UErrorCode& success) : GregorianCalendar(aLocale, success) { - UErrorCode fwStatus = U_ZERO_ERROR; - int32_t fwLength = aLocale.getKeywordValue("fw", nullptr, 0, fwStatus); - // Do not set first day of week for iso8601 to Monday if we have fw keyword + UErrorCode tempStatus = U_ZERO_ERROR; + int32_t length = aLocale.getKeywordValue("fw", nullptr, 0, tempStatus) + + aLocale.getKeywordValue("rg", nullptr, 0, tempStatus); + // Do not set first day of week for iso8601 to Monday if we have fw or rg keywords // and let the value set by the Calendar constructor to take care of it. - if (U_SUCCESS(fwStatus) && fwLength == 0) { + if (U_SUCCESS(tempStatus) && length == 0) { setFirstDayOfWeek(UCAL_MONDAY); } setMinimalDaysInFirstWeek(4); diff --git a/deps/icu-small/source/i18n/iso8601cal.h b/deps/icu-small/source/i18n/iso8601cal.h index 688fac3588b783..957f12e4f230e7 100644 --- a/deps/icu-small/source/i18n/iso8601cal.h +++ b/deps/icu-small/source/i18n/iso8601cal.h @@ -90,6 +90,8 @@ class ISO8601Calendar : public GregorianCalendar { */ virtual const char * getType() const override; + protected: + virtual bool isEra0CountingBackward() const override { return false; } private: diff --git a/deps/icu-small/source/i18n/japancal.cpp b/deps/icu-small/source/i18n/japancal.cpp index fc18d6c0eb11d9..7e69b97a3af4ea 100644 --- a/deps/icu-small/source/i18n/japancal.cpp +++ b/deps/icu-small/source/i18n/japancal.cpp @@ -146,8 +146,11 @@ const char *JapaneseCalendar::getType() const return "japanese"; } -int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear) +int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } int32_t era = internalGetEra(); // TODO do we assume we can trust 'era'? What if it is denormalized? @@ -155,9 +158,10 @@ int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear) // Find out if we are at the edge of an era int32_t eraStart[3] = { 0,0,0 }; - UErrorCode status = U_ZERO_ERROR; gJapaneseEraRules->getStartDate(era, eraStart, status); - U_ASSERT(U_SUCCESS(status)); + if (U_FAILURE(status)) { + return 0; + } if(eyear == eraStart[0]) { // Yes, we're in the first year of this era. return eraStart[1] // month @@ -176,12 +180,9 @@ int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t eyear, int32_t month) UErrorCode status = U_ZERO_ERROR; gJapaneseEraRules->getStartDate(era, eraStart, status); U_ASSERT(U_SUCCESS(status)); - if(eyear == eraStart[0]) { - if(month == eraStart[1] - 1) { - return eraStart[2]; - } + if (eyear == eraStart[0] && (month == eraStart[1] - 1)) { + return eraStart[2]; } - return day; } @@ -191,24 +192,29 @@ int32_t JapaneseCalendar::internalGetEra() const return internalGet(UCAL_ERA, gCurrentEra); } -int32_t JapaneseCalendar::handleGetExtendedYear() +int32_t JapaneseCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // EXTENDED_YEAR in JapaneseCalendar is a Gregorian year // The default value of EXTENDED_YEAR is 1970 (Showa 45) - int32_t year; if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR && newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); - } else { - UErrorCode status = U_ZERO_ERROR; - int32_t eraStartYear = gJapaneseEraRules->getStartYear(internalGet(UCAL_ERA, gCurrentEra), status); - U_ASSERT(U_SUCCESS(status)); - - // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc - year = internalGet(UCAL_YEAR, 1) // pin to minimum of year 1 (first year) - + eraStartYear // add gregorian starting year - - 1; // Subtract one because year starts at 1 + return internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); + } + int32_t eraStartYear = gJapaneseEraRules->getStartYear(internalGet(UCAL_ERA, gCurrentEra), status); + if (U_FAILURE(status)) { + return 0; + } + + // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc + int32_t year = internalGet(UCAL_YEAR, 1); // pin to minimum of year 1 (first year) + // add gregorian starting year, subtract one because year starts at 1 + if (uprv_add32_overflow(year, eraStartYear - 1, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } return year; } @@ -219,7 +225,7 @@ void JapaneseCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status //Calendar::timeToFields(theTime, quick, status); GregorianCalendar::handleComputeFields(julianDay, status); int32_t year = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year - int32_t eraIdx = gJapaneseEraRules->getEraIndex(year, internalGetMonth() + 1, internalGet(UCAL_DAY_OF_MONTH), status); + int32_t eraIdx = gJapaneseEraRules->getEraIndex(year, internalGetMonth(status) + 1, internalGet(UCAL_DAY_OF_MONTH), status); internalSet(UCAL_ERA, eraIdx); internalSet(UCAL_YEAR, year - gJapaneseEraRules->getStartYear(eraIdx, status) + 1); @@ -277,31 +283,30 @@ int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType l } int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const { - if (field == UCAL_YEAR) { - int32_t era = get(UCAL_ERA, status); - if (U_FAILURE(status)) { - return 0; // error case... any value - } - if (era == gJapaneseEraRules->getNumberOfEras() - 1) { // max known era, not gCurrentEra - // TODO: Investigate what value should be used here - revisit after 4.0. - return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); - } else { - int32_t nextEraStart[3] = { 0,0,0 }; - gJapaneseEraRules->getStartDate(era + 1, nextEraStart, status); - int32_t nextEraYear = nextEraStart[0]; - int32_t nextEraMonth = nextEraStart[1]; // 1-base - int32_t nextEraDate = nextEraStart[2]; - - int32_t eraStartYear = gJapaneseEraRules->getStartYear(era, status); - int32_t maxYear = nextEraYear - eraStartYear + 1; // 1-base - if (nextEraMonth == 1 && nextEraDate == 1) { - // Subtract 1, because the next era starts at Jan 1 - maxYear--; - } - return maxYear; - } + if (field != UCAL_YEAR) { + return GregorianCalendar::getActualMaximum(field, status); + } + int32_t era = get(UCAL_ERA, status); + if (U_FAILURE(status)) { + return 0; // error case... any value + } + if (era == gJapaneseEraRules->getNumberOfEras() - 1) { // max known era, not gCurrentEra + // TODO: Investigate what value should be used here - revisit after 4.0. + return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); + } + int32_t nextEraStart[3] = { 0,0,0 }; + gJapaneseEraRules->getStartDate(era + 1, nextEraStart, status); + int32_t nextEraYear = nextEraStart[0]; + int32_t nextEraMonth = nextEraStart[1]; // 1-base + int32_t nextEraDate = nextEraStart[2]; + + int32_t eraStartYear = gJapaneseEraRules->getStartYear(era, status); + int32_t maxYear = nextEraYear - eraStartYear + 1; // 1-base + if (nextEraMonth == 1 && nextEraDate == 1) { + // Subtract 1, because the next era starts at Jan 1 + maxYear--; } - return GregorianCalendar::getActualMaximum(field, status); + return maxYear; } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/japancal.h b/deps/icu-small/source/i18n/japancal.h index 3ae4900a2cdd96..bd2a2ca0755063 100644 --- a/deps/icu-small/source/i18n/japancal.h +++ b/deps/icu-small/source/i18n/japancal.h @@ -123,7 +123,7 @@ class JapaneseCalendar : public GregorianCalendar { * Japanese calendar case, this is equal to the equivalent extended Gregorian year. * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Return the maximum value that this field could have, given the current date. @@ -166,22 +166,7 @@ class JapaneseCalendar : public GregorianCalendar { */ virtual const char * getType() const override; - /** - * @return false - no default century in Japanese - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Not used - no default century. - * @internal - */ - virtual UDate defaultCenturyStart() const override; - /** - * Not used - no default century. - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY private: JapaneseCalendar(); // default constructor not implemented @@ -212,7 +197,7 @@ class JapaneseCalendar : public GregorianCalendar { * @param eyear the extended year * @internal */ - virtual int32_t getDefaultMonthInYear(int32_t eyear) override; + virtual int32_t getDefaultMonthInYear(int32_t eyear, UErrorCode& status) override; /*** * Called by computeJulianDay. Returns the default day (1-based) for the month, @@ -223,6 +208,8 @@ class JapaneseCalendar : public GregorianCalendar { * @internal */ virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month) override; + + virtual bool isEra0CountingBackward() const override { return false; } }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/listformatter.cpp b/deps/icu-small/source/i18n/listformatter.cpp index 3405b5de383349..06bea83b6ebeeb 100644 --- a/deps/icu-small/source/i18n/listformatter.cpp +++ b/deps/icu-small/source/i18n/listformatter.cpp @@ -121,16 +121,16 @@ class ContextualHandler : public PatternHandler { ContextualHandler::~ContextualHandler() { } -static const char16_t *spanishY = u"{0} y {1}"; -static const char16_t *spanishE = u"{0} e {1}"; -static const char16_t *spanishO = u"{0} o {1}"; -static const char16_t *spanishU = u"{0} u {1}"; -static const char16_t *hebrewVav = u"{0} \u05D5{1}"; -static const char16_t *hebrewVavDash = u"{0} \u05D5-{1}"; +const char16_t* spanishY = u"{0} y {1}"; +const char16_t* spanishE = u"{0} e {1}"; +const char16_t* spanishO = u"{0} o {1}"; +const char16_t* spanishU = u"{0} u {1}"; +const char16_t* hebrewVav = u"{0} \u05D5{1}"; +const char16_t* hebrewVavDash = u"{0} \u05D5-{1}"; // Condiction to change to e. // Starts with "hi" or "i" but not with "hie" nor "hia" -static bool shouldChangeToE(const UnicodeString& text) { +bool shouldChangeToE(const UnicodeString& text) { int32_t len = text.length(); if (len == 0) { return false; } // Case insensitive match hi but not hie nor hia. @@ -147,7 +147,7 @@ static bool shouldChangeToE(const UnicodeString& text) { // Condiction to change to u. // Starts with "o", "ho", and "8". Also "11" by itself. // re: ^((o|ho|8).*|11)$ -static bool shouldChangeToU(const UnicodeString& text) { +bool shouldChangeToU(const UnicodeString& text) { int32_t len = text.length(); if (len == 0) { return false; } // Case insensitive match o.* and 8.* @@ -164,7 +164,7 @@ static bool shouldChangeToU(const UnicodeString& text) { // Condiction to change to VAV follow by a dash. // Starts with non Hebrew letter. -static bool shouldChangeToVavDash(const UnicodeString& text) { +bool shouldChangeToVavDash(const UnicodeString& text) { if (text.isEmpty()) { return false; } UErrorCode status = U_ZERO_ERROR; return uscript_getScript(text.char32At(0), &status) != USCRIPT_HEBREW; diff --git a/deps/icu-small/source/i18n/measfmt.cpp b/deps/icu-small/source/i18n/measfmt.cpp index da4e69b49b7dfc..ee4bcb9e5be0d7 100644 --- a/deps/icu-small/source/i18n/measfmt.cpp +++ b/deps/icu-small/source/i18n/measfmt.cpp @@ -489,7 +489,6 @@ void MeasureFormat::parseObject( const UnicodeString & /*source*/, Formattable & /*result*/, ParsePosition& /*pos*/) const { - return; } UnicodeString &MeasureFormat::formatMeasurePerUnit( @@ -501,14 +500,14 @@ UnicodeString &MeasureFormat::formatMeasurePerUnit( if (U_FAILURE(status)) { return appendTo; } - auto* df = dynamic_cast(&getNumberFormatInternal()); + const auto* df = dynamic_cast(&getNumberFormatInternal()); if (df == nullptr) { // Don't know how to handle other types of NumberFormat status = U_UNSUPPORTED_ERROR; return appendTo; } UFormattedNumberData result; - if (auto* lnf = df->toNumberFormatter(status)) { + if (const auto* lnf = df->toNumberFormatter(status)) { result.quantity.setToDouble(measure.getNumber().getDouble(status)); lnf->unit(measure.getUnit()) .perUnit(perUnit) @@ -691,7 +690,7 @@ UnicodeString &MeasureFormat::formatMeasure( pos, status); } - auto* df = dynamic_cast(&nf); + const auto* df = dynamic_cast(&nf); if (df == nullptr) { // Handle other types of NumberFormat using the ICU 63 code, modified to // get the unitPattern from LongNameHandler and handle fallback to OTHER. @@ -708,7 +707,7 @@ UnicodeString &MeasureFormat::formatMeasure( return QuantityFormatter::format(formatter, formattedNumber, appendTo, pos, status); } UFormattedNumberData result; - if (auto* lnf = df->toNumberFormatter(status)) { + if (const auto* lnf = df->toNumberFormatter(status)) { result.quantity.setToDouble(amtNumber.getDouble(status)); lnf->unit(amtUnit) .unitWidth(getUnitWidth(fWidth)) @@ -761,7 +760,7 @@ UnicodeString &MeasureFormat::formatNumeric( return appendTo; } number::LocalizedNumberFormatter numberFormatter2; - if (auto* lnf = numberFormatter->toNumberFormatter(status)) { + if (const auto* lnf = numberFormatter->toNumberFormatter(status)) { numberFormatter2 = lnf->integerWidth(number::IntegerWidth::zeroFillTo(2)); } else { return appendTo; diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index abb21997705a11..a70d486539ff7d 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -2169,9 +2169,7 @@ MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) { if (this == &other) { return *this; } - if (fImpl != nullptr) { - delete fImpl; - } + delete fImpl; if (other.fImpl) { ErrorCode localStatus; fImpl = new MeasureUnitImpl(other.fImpl->copy(localStatus)); @@ -2192,9 +2190,7 @@ MeasureUnit &MeasureUnit::operator=(MeasureUnit &&other) noexcept { if (this == &other) { return *this; } - if (fImpl != nullptr) { - delete fImpl; - } + delete fImpl; fImpl = other.fImpl; other.fImpl = nullptr; fTypeId = other.fTypeId; diff --git a/deps/icu-small/source/i18n/measunit_extra.cpp b/deps/icu-small/source/i18n/measunit_extra.cpp index 295d6a8ce85545..a6348422738bfa 100644 --- a/deps/icu-small/source/i18n/measunit_extra.cpp +++ b/deps/icu-small/source/i18n/measunit_extra.cpp @@ -102,6 +102,8 @@ const struct UnitPrefixStrings { UMeasurePrefix value; } gUnitPrefixStrings[] = { // SI prefixes + { "quetta", UMEASURE_PREFIX_QUETTA }, + { "ronna", UMEASURE_PREFIX_RONNA }, { "yotta", UMEASURE_PREFIX_YOTTA }, { "zetta", UMEASURE_PREFIX_ZETTA }, { "exa", UMEASURE_PREFIX_EXA }, @@ -122,6 +124,8 @@ const struct UnitPrefixStrings { { "atto", UMEASURE_PREFIX_ATTO }, { "zepto", UMEASURE_PREFIX_ZEPTO }, { "yocto", UMEASURE_PREFIX_YOCTO }, + { "ronto", UMEASURE_PREFIX_RONTO }, + { "quecto", UMEASURE_PREFIX_QUECTO }, // Binary prefixes { "yobi", UMEASURE_PREFIX_YOBI }, { "zebi", UMEASURE_PREFIX_ZEBI }, @@ -542,13 +546,13 @@ class Parser { */ static Parser from(StringPiece source, UErrorCode& status) { if (U_FAILURE(status)) { - return Parser(); + return {}; } umtx_initOnce(gUnitExtrasInitOnce, &initUnitExtras, status); if (U_FAILURE(status)) { - return Parser(); + return {}; } - return Parser(source); + return {source}; } MeasureUnitImpl parse(UErrorCode& status) { @@ -659,7 +663,7 @@ class Parser { } else { fIndex = previ; } - return Token(match); + return {match}; } /** @@ -797,8 +801,8 @@ class Parser { // Sorting function wrapping SingleUnitImpl::compareTo for use with uprv_sortArray. int32_t U_CALLCONV compareSingleUnits(const void* /*context*/, const void* left, const void* right) { - auto realLeft = static_cast(left); - auto realRight = static_cast(right); + const auto* realLeft = static_cast(left); + const auto* realRight = static_cast(right); return (*realLeft)->compareTo(**realRight); } diff --git a/deps/icu-small/source/i18n/measunit_impl.h b/deps/icu-small/source/i18n/measunit_impl.h index c60ff2fc33bdc9..5ee5c7bb95d9be 100644 --- a/deps/icu-small/source/i18n/measunit_impl.h +++ b/deps/icu-small/source/i18n/measunit_impl.h @@ -14,11 +14,9 @@ U_NAMESPACE_BEGIN -namespace number { -namespace impl { +namespace number::impl { class LongNameHandler; } -} // namespace number static const char16_t kDefaultCurrency[] = u"XXX"; static const char kDefaultCurrency8[] = "XXX"; diff --git a/deps/icu-small/source/i18n/measure.cpp b/deps/icu-small/source/i18n/measure.cpp index cdbd995034aacf..3280bcda467ee0 100644 --- a/deps/icu-small/source/i18n/measure.cpp +++ b/deps/icu-small/source/i18n/measure.cpp @@ -29,7 +29,7 @@ Measure::Measure(const Formattable& _number, MeasureUnit* adoptedUnit, UErrorCode& ec) : number(_number), unit(adoptedUnit) { if (U_SUCCESS(ec) && - (!number.isNumeric() || adoptedUnit == 0)) { + (!number.isNumeric() || adoptedUnit == nullptr)) { ec = U_ILLEGAL_ARGUMENT_ERROR; } } diff --git a/deps/icu-small/source/i18n/messageformat2.cpp b/deps/icu-small/source/i18n/messageformat2.cpp new file mode 100644 index 00000000000000..c5ae9f1c60859a --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2.cpp @@ -0,0 +1,893 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_arguments.h" +#include "unicode/messageformat2_data_model.h" +#include "unicode/messageformat2_formattable.h" +#include "unicode/messageformat2.h" +#include "unicode/unistr.h" +#include "messageformat2_allocation.h" +#include "messageformat2_evaluation.h" +#include "messageformat2_macros.h" + + +U_NAMESPACE_BEGIN + +namespace message2 { + +using namespace data_model; + +// ------------------------------------------------------ +// Formatting + +// The result of formatting a literal is just itself. +static Formattable evalLiteral(const Literal& lit) { + return Formattable(lit.unquoted()); +} + +// Assumes that `var` is a message argument; returns the argument's value. +[[nodiscard]] FormattedPlaceholder MessageFormatter::evalArgument(const VariableName& var, MessageContext& context, UErrorCode& errorCode) const { + if (U_SUCCESS(errorCode)) { + // The fallback for a variable name is itself. + UnicodeString str(DOLLAR); + str += var; + const Formattable* val = context.getGlobal(var, errorCode); + if (U_SUCCESS(errorCode)) { + return (FormattedPlaceholder(*val, str)); + } + } + return {}; +} + +// Returns the contents of the literal +[[nodiscard]] FormattedPlaceholder MessageFormatter::formatLiteral(const Literal& lit) const { + // The fallback for a literal is itself. + return FormattedPlaceholder(evalLiteral(lit), lit.quoted()); +} + +[[nodiscard]] FormattedPlaceholder MessageFormatter::formatOperand(const Environment& env, + const Operand& rand, + MessageContext& context, + UErrorCode &status) const { + if (U_FAILURE(status)) { + return {}; + } + + if (rand.isNull()) { + return FormattedPlaceholder(); + } + if (rand.isVariable()) { + // Check if it's local or global + // Note: there is no name shadowing; this is enforced by the parser + const VariableName& var = rand.asVariable(); + // TODO: Currently, this code implements lazy evaluation of locals. + // That is, the environment binds names to a closure, not a resolved value. + // Eager vs. lazy evaluation is an open issue: + // see https://github.com/unicode-org/message-format-wg/issues/299 + + // Look up the variable in the environment + if (env.has(var)) { + // `var` is a local -- look it up + const Closure& rhs = env.lookup(var); + // Format the expression using the environment from the closure + return formatExpression(rhs.getEnv(), rhs.getExpr(), context, status); + } + // Variable wasn't found in locals -- check if it's global + FormattedPlaceholder result = evalArgument(var, context, status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + status = U_ZERO_ERROR; + // Unbound variable -- set a resolution error + context.getErrors().setUnresolvedVariable(var, status); + // Use fallback per + // https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#fallback-resolution + UnicodeString str(DOLLAR); + str += var; + return FormattedPlaceholder(str); + } + return result; + } else { + U_ASSERT(rand.isLiteral()); + return formatLiteral(rand.asLiteral()); + } +} + +// Resolves a function's options +FunctionOptions MessageFormatter::resolveOptions(const Environment& env, const OptionMap& options, MessageContext& context, UErrorCode& status) const { + LocalPointer optionsVector(createUVector(status)); + if (U_FAILURE(status)) { + return {}; + } + LocalPointer resolvedOpt; + for (int i = 0; i < options.size(); i++) { + const Option& opt = options.getOption(i, status); + if (U_FAILURE(status)) { + return {}; + } + const UnicodeString& k = opt.getName(); + const Operand& v = opt.getValue(); + + // Options are fully evaluated before calling the function + // Format the operand + FormattedPlaceholder rhsVal = formatOperand(env, v, context, status); + if (U_FAILURE(status)) { + return {}; + } + if (!rhsVal.isFallback()) { + resolvedOpt.adoptInstead(create(ResolvedFunctionOption(k, rhsVal.asFormattable()), status)); + if (U_FAILURE(status)) { + return {}; + } + optionsVector->adoptElement(resolvedOpt.orphan(), status); + } + } + + return FunctionOptions(std::move(*optionsVector), status); +} + +// Overload that dispatches on argument type. Syntax doesn't provide for options in this case. +[[nodiscard]] FormattedPlaceholder MessageFormatter::evalFormatterCall(FormattedPlaceholder&& argument, + MessageContext& context, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return {}; + } + + // These cases should have been checked for already + U_ASSERT(!argument.isFallback() && !argument.isNullOperand()); + + const Formattable& toFormat = argument.asFormattable(); + switch (toFormat.getType()) { + case UFMT_OBJECT: { + const FormattableObject* obj = toFormat.getObject(status); + U_ASSERT(U_SUCCESS(status)); + U_ASSERT(obj != nullptr); + const UnicodeString& type = obj->tag(); + FunctionName functionName; + if (!getDefaultFormatterNameByType(type, functionName)) { + // No formatter for this type -- follow default behavior + break; + } + return evalFormatterCall(functionName, + std::move(argument), + FunctionOptions(), + context, + status); + } + default: { + // TODO: The array case isn't handled yet; not sure whether it's desirable + // to have a default list formatter + break; + } + } + // No formatter for this type, or it's a primitive type (which will be formatted later) + // -- just return the argument itself + return std::move(argument); +} + +// Overload that dispatches on function name +[[nodiscard]] FormattedPlaceholder MessageFormatter::evalFormatterCall(const FunctionName& functionName, + FormattedPlaceholder&& argument, + FunctionOptions&& options, + MessageContext& context, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return {}; + } + + DynamicErrors& errs = context.getErrors(); + + UnicodeString fallback(COLON); + fallback += functionName; + if (!argument.isNullOperand()) { + fallback = argument.fallback; + } + + if (isFormatter(functionName)) { + LocalPointer formatterImpl(getFormatter(functionName, status)); + if (U_FAILURE(status)) { + if (status == U_MF_FORMATTING_ERROR) { + errs.setFormattingError(functionName, status); + status = U_ZERO_ERROR; + return {}; + } + if (status == U_MF_UNKNOWN_FUNCTION_ERROR) { + errs.setUnknownFunction(functionName, status); + status = U_ZERO_ERROR; + return {}; + } + // Other errors are non-recoverable + return {}; + } + U_ASSERT(formatterImpl != nullptr); + + UErrorCode savedStatus = status; + FormattedPlaceholder result = formatterImpl->format(std::move(argument), std::move(options), status); + // Update errors + if (savedStatus != status) { + if (U_FAILURE(status)) { + if (status == U_MF_OPERAND_MISMATCH_ERROR) { + status = U_ZERO_ERROR; + errs.setOperandMismatchError(functionName, status); + } else { + status = U_ZERO_ERROR; + // Convey any error generated by the formatter + // as a formatting error, except for operand mismatch errors + errs.setFormattingError(functionName, status); + } + return FormattedPlaceholder(fallback); + } else { + // Ignore warnings + status = savedStatus; + } + } + // Ignore the output if any errors occurred + if (errs.hasFormattingError()) { + return FormattedPlaceholder(fallback); + } + return result; + } + // No formatter with this name -- set error + if (isSelector(functionName)) { + errs.setFormattingError(functionName, status); + } else { + errs.setUnknownFunction(functionName, status); + } + return FormattedPlaceholder(fallback); +} + +// Per https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#fallback-resolution +static UnicodeString reservedFallback (const Expression& e) { + UErrorCode localErrorCode = U_ZERO_ERROR; + const Operator* rator = e.getOperator(localErrorCode); + U_ASSERT(U_SUCCESS(localErrorCode)); + const Reserved& r = rator->asReserved(); + + // An empty Reserved isn't representable in the syntax + U_ASSERT(r.numParts() > 0); + + const UnicodeString& contents = r.getPart(0).unquoted(); + // Parts should never be empty + U_ASSERT(contents.length() > 0); + + // Return first character of string + return UnicodeString(contents, 0, 1); +} + +// Formats an expression using `globalEnv` for the values of variables +[[nodiscard]] FormattedPlaceholder MessageFormatter::formatExpression(const Environment& globalEnv, + const Expression& expr, + MessageContext& context, + UErrorCode &status) const { + if (U_FAILURE(status)) { + return {}; + } + + // Formatting error + if (expr.isReserved()) { + context.getErrors().setReservedError(status); + return FormattedPlaceholder(reservedFallback(expr)); + } + + const Operand& rand = expr.getOperand(); + // Format the operand (formatOperand handles the case of a null operand) + FormattedPlaceholder randVal = formatOperand(globalEnv, rand, context, status); + + // Don't call the function on error values + if (randVal.isFallback()) { + return randVal; + } + + if (!expr.isFunctionCall()) { + // Dispatch based on type of `randVal` + return evalFormatterCall(std::move(randVal), + context, + status); + } else { + const Operator* rator = expr.getOperator(status); + U_ASSERT(U_SUCCESS(status)); + const FunctionName& functionName = rator->getFunctionName(); + const OptionMap& options = rator->getOptionsInternal(); + // Resolve the options + FunctionOptions resolvedOptions = resolveOptions(globalEnv, options, context, status); + + // Call the formatter function + // The fallback for a nullary function call is the function name + UnicodeString fallback; + if (rand.isNull()) { + fallback = UnicodeString(COLON); + fallback += functionName; + } else { + fallback = randVal.fallback; + } + return evalFormatterCall(functionName, + std::move(randVal), + std::move(resolvedOptions), + context, + status); + } +} + +// Formats each text and expression part of a pattern, appending the results to `result` +void MessageFormatter::formatPattern(MessageContext& context, const Environment& globalEnv, const Pattern& pat, UErrorCode &status, UnicodeString& result) const { + CHECK_ERROR(status); + + for (int32_t i = 0; i < pat.numParts(); i++) { + const PatternPart& part = pat.getPart(i); + if (part.isText()) { + result += part.asText(); + } else if (part.isMarkup()) { + // Markup is ignored + } else { + // Format the expression + FormattedPlaceholder partVal = formatExpression(globalEnv, part.contents(), context, status); + // Force full evaluation, e.g. applying default formatters to + // unformatted input (or formatting numbers as strings) + UnicodeString partResult = partVal.formatToString(locale, status); + result += partResult; + // Handle formatting errors. `formatToString()` can't take a context and thus can't + // register an error directly + if (status == U_MF_FORMATTING_ERROR) { + status = U_ZERO_ERROR; + // TODO: The name of the formatter that failed is unavailable. + // Not ideal, but it's hard for `formatToString()` + // to pass along more detailed diagnostics + context.getErrors().setFormattingError(status); + } + } + } +} + +// ------------------------------------------------------ +// Selection + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-selectors +// `res` is a vector of ResolvedSelectors +void MessageFormatter::resolveSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UVector& res) const { + CHECK_ERROR(status); + U_ASSERT(!dataModel.hasPattern()); + + const Expression* selectors = dataModel.getSelectorsInternal(); + // 1. Let res be a new empty list of resolved values that support selection. + // (Implicit, since `res` is an out-parameter) + // 2. For each expression exp of the message's selectors + for (int32_t i = 0; i < dataModel.numSelectors(); i++) { + // 2i. Let rv be the resolved value of exp. + ResolvedSelector rv = formatSelectorExpression(env, selectors[i], context, status); + if (rv.hasSelector()) { + // 2ii. If selection is supported for rv: + // (True if this code has been reached) + } else { + // 2iii. Else: + // Let nomatch be a resolved value for which selection always fails. + // Append nomatch as the last element of the list res. + // Emit a Selection Error. + // (Note: in this case, rv, being a fallback, serves as `nomatch`) + #if U_DEBUG + const DynamicErrors& err = context.getErrors(); + U_ASSERT(err.hasError()); + U_ASSERT(rv.argument().isFallback()); + #endif + } + // 2ii(a). Append rv as the last element of the list res. + // (Also fulfills 2iii) + LocalPointer v(create(std::move(rv), status)); + CHECK_ERROR(status); + res.adoptElement(v.orphan(), status); + } +} + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-preferences +// `keys` and `matches` are vectors of strings +void MessageFormatter::matchSelectorKeys(const UVector& keys, + MessageContext& context, + ResolvedSelector&& rv, + UVector& keysOut, + UErrorCode& status) const { + CHECK_ERROR(status); + + if (!rv.hasSelector()) { + // Return an empty list of matches + return; + } + + auto selectorImpl = rv.getSelector(); + U_ASSERT(selectorImpl != nullptr); + UErrorCode savedStatus = status; + + // Convert `keys` to an array + int32_t keysLen = keys.size(); + UnicodeString* keysArr = new UnicodeString[keysLen]; + if (keysArr == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + for (int32_t i = 0; i < keysLen; i++) { + const UnicodeString* k = static_cast(keys[i]); + U_ASSERT(k != nullptr); + keysArr[i] = *k; + } + LocalArray adoptedKeys(keysArr); + + // Create an array to hold the output + UnicodeString* prefsArr = new UnicodeString[keysLen]; + if (prefsArr == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + LocalArray adoptedPrefs(prefsArr); + int32_t prefsLen = 0; + + // Call the selector + selectorImpl->selectKey(rv.takeArgument(), rv.takeOptions(), + adoptedKeys.getAlias(), keysLen, adoptedPrefs.getAlias(), prefsLen, + status); + + // Update errors + if (savedStatus != status) { + if (U_FAILURE(status)) { + status = U_ZERO_ERROR; + context.getErrors().setSelectorError(rv.getSelectorName(), status); + } else { + // Ignore warnings + status = savedStatus; + } + } + + CHECK_ERROR(status); + + // Copy the resulting keys (if there was no error) + keysOut.removeAllElements(); + for (int32_t i = 0; i < prefsLen; i++) { + UnicodeString* k = message2::create(std::move(prefsArr[i]), status); + if (k == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + keysOut.adoptElement(k, status); + CHECK_ERROR(status); + } +} + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-preferences +// `res` is a vector of FormattedPlaceholders; +// `pref` is a vector of vectors of strings +void MessageFormatter::resolvePreferences(MessageContext& context, UVector& res, UVector& pref, UErrorCode &status) const { + CHECK_ERROR(status); + + // 1. Let pref be a new empty list of lists of strings. + // (Implicit, since `pref` is an out-parameter) + UnicodeString ks; + LocalPointer ksP; + int32_t numVariants = dataModel.numVariants(); + const Variant* variants = dataModel.getVariantsInternal(); + // 2. For each index i in res + for (int32_t i = 0; i < (int32_t) res.size(); i++) { + // 2i. Let keys be a new empty list of strings. + LocalPointer keys(createUVector(status)); + CHECK_ERROR(status); + // 2ii. For each variant `var` of the message + for (int32_t variantNum = 0; variantNum < numVariants; variantNum++) { + const SelectorKeys& selectorKeys = variants[variantNum].getKeys(); + + // Note: Here, `var` names the key list of `var`, + // not a Variant itself + const Key* var = selectorKeys.getKeysInternal(); + // 2ii(a). Let `key` be the `var` key at position i. + U_ASSERT(i < selectorKeys.len); // established by semantic check in formatSelectors() + const Key& key = var[i]; + // 2ii(b). If `key` is not the catch-all key '*' + if (!key.isWildcard()) { + // 2ii(b)(a) Assert that key is a literal. + // (Not needed) + // 2ii(b)(b) Let `ks` be the resolved value of `key`. + ks = key.asLiteral().unquoted(); + // 2ii(b)(c) Append `ks` as the last element of the list `keys`. + ksP.adoptInstead(create(std::move(ks), status)); + CHECK_ERROR(status); + keys->adoptElement(ksP.orphan(), status); + } + } + // 2iii. Let `rv` be the resolved value at index `i` of `res`. + U_ASSERT(i < res.size()); + ResolvedSelector rv = std::move(*(static_cast(res[i]))); + // 2iv. Let matches be the result of calling the method MatchSelectorKeys(rv, keys) + LocalPointer matches(createUVector(status)); + matchSelectorKeys(*keys, context, std::move(rv), *matches, status); + // 2v. Append `matches` as the last element of the list `pref` + pref.adoptElement(matches.orphan(), status); + } +} + +// `v` is assumed to be a vector of strings +static int32_t vectorFind(const UVector& v, const UnicodeString& k) { + for (int32_t i = 0; i < v.size(); i++) { + if (*static_cast(v[i]) == k) { + return i; + } + } + return -1; +} + +static UBool vectorContains(const UVector& v, const UnicodeString& k) { + return (vectorFind(v, k) != -1); +} + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#filter-variants +// `pref` is a vector of vectors of strings. `vars` is a vector of PrioritizedVariants +void MessageFormatter::filterVariants(const UVector& pref, UVector& vars, UErrorCode& status) const { + const Variant* variants = dataModel.getVariantsInternal(); + + // 1. Let `vars` be a new empty list of variants. + // (Not needed since `vars` is an out-parameter) + // 2. For each variant `var` of the message: + for (int32_t j = 0; j < dataModel.numVariants(); j++) { + const SelectorKeys& selectorKeys = variants[j].getKeys(); + const Pattern& p = variants[j].getPattern(); + + // Note: Here, `var` names the key list of `var`, + // not a Variant itself + const Key* var = selectorKeys.getKeysInternal(); + // 2i. For each index `i` in `pref`: + bool noMatch = false; + for (int32_t i = 0; i < (int32_t) pref.size(); i++) { + // 2i(a). Let `key` be the `var` key at position `i`. + U_ASSERT(i < selectorKeys.len); + const Key& key = var[i]; + // 2i(b). If key is the catch-all key '*': + if (key.isWildcard()) { + // 2i(b)(a). Continue the inner loop on pref. + continue; + } + // 2i(c). Assert that `key` is a literal. + // (Not needed) + // 2i(d). Let `ks` be the resolved value of `key`. + UnicodeString ks = key.asLiteral().unquoted(); + // 2i(e). Let `matches` be the list of strings at index `i` of `pref`. + const UVector& matches = *(static_cast(pref[i])); // `matches` is a vector of strings + // 2i(f). If `matches` includes `ks` + if (vectorContains(matches, ks)) { + // 2i(f)(a). Continue the inner loop on `pref`. + continue; + } + // 2i(g). Else: + // 2i(g)(a). Continue the outer loop on message variants. + noMatch = true; + break; + } + if (!noMatch) { + // Append `var` as the last element of the list `vars`. + PrioritizedVariant* tuple = create(PrioritizedVariant(-1, selectorKeys, p), status); + CHECK_ERROR(status); + vars.adoptElement(tuple, status); + } + } +} + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#sort-variants +// Leaves the preferred variant as element 0 in `sortable` +// Note: this sorts in-place, so `sortable` is just `vars` +// `pref` is a vector of vectors of strings; `vars` is a vector of PrioritizedVariants +void MessageFormatter::sortVariants(const UVector& pref, UVector& vars, UErrorCode& status) const { + CHECK_ERROR(status); + +// Note: steps 1 and 2 are omitted since we use `vars` as `sortable` (we sort in-place) + // 1. Let `sortable` be a new empty list of (integer, variant) tuples. + // (Not needed since `sortable` is an out-parameter) + // 2. For each variant `var` of `vars` + // 2i. Let tuple be a new tuple (-1, var). + // 2ii. Append `tuple` as the last element of the list `sortable`. + + // 3. Let `len` be the integer count of items in `pref`. + int32_t len = pref.size(); + // 4. Let `i` be `len` - 1. + int32_t i = len - 1; + // 5. While i >= 0: + while (i >= 0) { + // 5i. Let `matches` be the list of strings at index `i` of `pref`. + U_ASSERT(pref[i] != nullptr); + const UVector& matches = *(static_cast(pref[i])); // `matches` is a vector of strings + // 5ii. Let `minpref` be the integer count of items in `matches`. + int32_t minpref = matches.size(); + // 5iii. For each tuple `tuple` of `sortable`: + for (int32_t j = 0; j < vars.size(); j++) { + U_ASSERT(vars[j] != nullptr); + PrioritizedVariant& tuple = *(static_cast(vars[j])); + // 5iii(a). Let matchpref be an integer with the value minpref. + int32_t matchpref = minpref; + // 5iii(b). Let `key` be the tuple variant key at position `i`. + const Key* tupleVariantKeys = tuple.keys.getKeysInternal(); + U_ASSERT(i < tuple.keys.len); // Given by earlier semantic checking + const Key& key = tupleVariantKeys[i]; + // 5iii(c) If `key` is not the catch-all key '*': + if (!key.isWildcard()) { + // 5iii(c)(a). Assert that `key` is a literal. + // (Not needed) + // 5iii(c)(b). Let `ks` be the resolved value of `key`. + UnicodeString ks = key.asLiteral().unquoted(); + // 5iii(c)(c) Let matchpref be the integer position of ks in `matches`. + matchpref = vectorFind(matches, ks); + U_ASSERT(matchpref >= 0); + } + // 5iii(d) Set the `tuple` integer value as matchpref. + tuple.priority = matchpref; + } + // 5iv. Set `sortable` to be the result of calling the method SortVariants(`sortable`) + vars.sort(comparePrioritizedVariants, status); + CHECK_ERROR(status); + // 5v. Set `i` to be `i` - 1. + i--; + } + // The caller is responsible for steps 6 and 7 + // 6. Let `var` be the `variant` element of the first element of `sortable`. + // 7. Select the pattern of `var` +} + + +// Evaluate the operand +ResolvedSelector MessageFormatter::resolveVariables(const Environment& env, const Operand& rand, MessageContext& context, UErrorCode &status) const { + if (U_FAILURE(status)) { + return {}; + } + + if (rand.isNull()) { + return ResolvedSelector(FormattedPlaceholder()); + } + + if (rand.isLiteral()) { + return ResolvedSelector(formatLiteral(rand.asLiteral())); + } + + // Must be variable + const VariableName& var = rand.asVariable(); + // Resolve the variable + if (env.has(var)) { + const Closure& referent = env.lookup(var); + // Resolve the referent + return resolveVariables(referent.getEnv(), referent.getExpr(), context, status); + } + // Either this is a global var or an unbound var -- + // either way, it can't be bound to a function call. + // Check globals + FormattedPlaceholder val = evalArgument(var, context, status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + status = U_ZERO_ERROR; + // Unresolved variable -- could be a previous warning. Nothing to resolve + U_ASSERT(context.getErrors().hasUnresolvedVariableError()); + return ResolvedSelector(FormattedPlaceholder(var)); + } + // Pass through other errors + return ResolvedSelector(std::move(val)); +} + +// Evaluate the expression except for not performing the top-level function call +// (which is expected to be a selector, but may not be, in error cases) +ResolvedSelector MessageFormatter::resolveVariables(const Environment& env, + const Expression& expr, + MessageContext& context, + UErrorCode &status) const { + if (U_FAILURE(status)) { + return {}; + } + + // A `reserved` is an error + if (expr.isReserved()) { + context.getErrors().setReservedError(status); + return ResolvedSelector(FormattedPlaceholder(reservedFallback(expr))); + } + + // Function call -- resolve the operand and options + if (expr.isFunctionCall()) { + const Operator* rator = expr.getOperator(status); + U_ASSERT(U_SUCCESS(status)); + // Already checked that rator is non-reserved + const FunctionName& selectorName = rator->getFunctionName(); + if (isSelector(selectorName)) { + auto selector = getSelector(context, selectorName, status); + if (U_SUCCESS(status)) { + FunctionOptions resolvedOptions = resolveOptions(env, rator->getOptionsInternal(), context, status); + // Operand may be the null argument, but resolveVariables() handles that + FormattedPlaceholder argument = formatOperand(env, expr.getOperand(), context, status); + return ResolvedSelector(selectorName, selector, std::move(resolvedOptions), std::move(argument)); + } + } else if (isFormatter(selectorName)) { + context.getErrors().setSelectorError(selectorName, status); + } else { + context.getErrors().setUnknownFunction(selectorName, status); + } + // Non-selector used as selector; an error would have been recorded earlier + UnicodeString fallback(COLON); + fallback += selectorName; + if (!expr.getOperand().isNull()) { + fallback = formatOperand(env, expr.getOperand(), context, status).fallback; + } + return ResolvedSelector(FormattedPlaceholder(fallback)); + } else { + // Might be a variable reference, so expand one more level of variable + return resolveVariables(env, expr.getOperand(), context, status); + } +} + +ResolvedSelector MessageFormatter::formatSelectorExpression(const Environment& globalEnv, const Expression& expr, MessageContext& context, UErrorCode &status) const { + if (U_FAILURE(status)) { + return {}; + } + + // Resolve expression to determine if it's a function call + ResolvedSelector exprResult = resolveVariables(globalEnv, expr, context, status); + + DynamicErrors& err = context.getErrors(); + + // If there is a selector, then `resolveVariables()` recorded it in the context + if (exprResult.hasSelector()) { + // Check if there was an error + if (exprResult.argument().isFallback()) { + // Use a null expression if it's a syntax or data model warning; + // create a valid (non-fallback) formatted placeholder from the + // fallback string otherwise + if (err.hasSyntaxError() || err.hasDataModelError()) { + return ResolvedSelector(FormattedPlaceholder()); // Null operand + } else { + return ResolvedSelector(exprResult.takeArgument()); + } + } + return exprResult; + } + + // No selector was found; error should already have been set + U_ASSERT(err.hasMissingSelectorAnnotationError() || err.hasUnknownFunctionError() || err.hasSelectorError()); + return ResolvedSelector(FormattedPlaceholder(exprResult.argument().fallback)); +} + +void MessageFormatter::formatSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UnicodeString& result) const { + CHECK_ERROR(status); + + // See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection + + // Resolve Selectors + // res is a vector of FormattedPlaceholders + LocalPointer res(createUVector(status)); + CHECK_ERROR(status); + resolveSelectors(context, env, status, *res); + + // Resolve Preferences + // pref is a vector of vectors of strings + LocalPointer pref(createUVector(status)); + CHECK_ERROR(status); + resolvePreferences(context, *res, *pref, status); + + // Filter Variants + // vars is a vector of PrioritizedVariants + LocalPointer vars(createUVector(status)); + CHECK_ERROR(status); + filterVariants(*pref, *vars, status); + + // Sort Variants and select the final pattern + // Note: `sortable` in the spec is just `vars` here, + // which is sorted in-place + sortVariants(*pref, *vars, status); + + CHECK_ERROR(status); + + // 6. Let `var` be the `variant` element of the first element of `sortable`. + U_ASSERT(vars->size() > 0); // This should have been checked earlier (having 0 variants would be a data model error) + const PrioritizedVariant& var = *(static_cast(vars->elementAt(0))); + // 7. Select the pattern of `var` + const Pattern& pat = var.pat; + + // Format the pattern + formatPattern(context, env, pat, status, result); +} + +// Note: this is non-const due to the function registry being non-const, which is in turn +// due to the values (`FormatterFactory` objects in the map) having mutable state. +// In other words, formatting a message can mutate the underlying `MessageFormatter` by changing +// state within the factory objects that represent custom formatters. +UnicodeString MessageFormatter::formatToString(const MessageArguments& arguments, UErrorCode &status) { + EMPTY_ON_ERROR(status); + + // Create a new environment that will store closures for all local variables + Environment* env = Environment::create(status); + // Create a new context with the given arguments and the `errors` structure + MessageContext context(arguments, *errors, status); + + // Check for unresolved variable errors + checkDeclarations(context, env, status); + LocalPointer globalEnv(env); + + UnicodeString result; + if (dataModel.hasPattern()) { + formatPattern(context, *globalEnv, dataModel.getPattern(), status, result); + } else { + // Check for errors/warnings -- if so, then the result of pattern selection is the fallback value + // See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection + const DynamicErrors& err = context.getErrors(); + if (err.hasSyntaxError() || err.hasDataModelError()) { + result += REPLACEMENT; + } else { + formatSelectors(context, *globalEnv, status, result); + } + } + // Update status according to all errors seen while formatting + context.checkErrors(status); + return result; +} + +// ---------------------------------------- +// Checking for resolution errors + +void MessageFormatter::check(MessageContext& context, const Environment& localEnv, const OptionMap& options, UErrorCode& status) const { + // Check the RHS of each option + for (int32_t i = 0; i < options.size(); i++) { + const Option& opt = options.getOption(i, status); + CHECK_ERROR(status); + check(context, localEnv, opt.getValue(), status); + } +} + +void MessageFormatter::check(MessageContext& context, const Environment& localEnv, const Operand& rand, UErrorCode& status) const { + // Nothing to check for literals + if (rand.isLiteral() || rand.isNull()) { + return; + } + + // Check that variable is in scope + const VariableName& var = rand.asVariable(); + // Check local scope + if (localEnv.has(var)) { + return; + } + // Check global scope + context.getGlobal(var, status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + status = U_ZERO_ERROR; + context.getErrors().setUnresolvedVariable(var, status); + } + // Either `var` is a global, or some other error occurred. + // Nothing more to do either way + return; +} + +void MessageFormatter::check(MessageContext& context, const Environment& localEnv, const Expression& expr, UErrorCode& status) const { + // Check for unresolved variable errors + if (expr.isFunctionCall()) { + const Operator* rator = expr.getOperator(status); + U_ASSERT(U_SUCCESS(status)); + const Operand& rand = expr.getOperand(); + check(context, localEnv, rand, status); + check(context, localEnv, rator->getOptionsInternal(), status); + } +} + +// Check for resolution errors +void MessageFormatter::checkDeclarations(MessageContext& context, Environment*& env, UErrorCode &status) const { + CHECK_ERROR(status); + + const Binding* decls = getDataModel().getLocalVariablesInternal(); + U_ASSERT(env != nullptr && decls != nullptr); + + for (int32_t i = 0; i < getDataModel().bindingsLen; i++) { + const Binding& decl = decls[i]; + const Expression& rhs = decl.getValue(); + check(context, *env, rhs, status); + + // Add a closure to the global environment, + // memoizing the value of localEnv up to this point + + // Add the LHS to the environment for checking the next declaration + env = Environment::create(decl.getVariable(), Closure(rhs, *env), env, status); + CHECK_ERROR(status); + } +} +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/messageformat2_allocation.h b/deps/icu-small/source/i18n/messageformat2_allocation.h new file mode 100644 index 00000000000000..7be27e222520d6 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_allocation.h @@ -0,0 +1,147 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT2_UTILS_H +#define MESSAGEFORMAT2_UTILS_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/unistr.h" +#include "uvector.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + + // Helpers + + template + static T* copyArray(const T* source, int32_t len, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + U_ASSERT(source != nullptr); + U_ASSERT(len >= 0); + T* dest = new T[len]; + if (dest == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } else { + for (int32_t i = 0; i < len; i++) { + dest[i] = source[i]; + } + } + return dest; + } + + template + static T* copyVectorToArray(const UVector& source, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + int32_t len = source.size(); + T* dest = new T[len]; + if (dest == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } else { + for (int32_t i = 0; i < len; i++) { + dest[i] = *(static_cast(source.elementAt(i))); + } + } + return dest; + } + + template + static T* moveVectorToArray(UVector& source, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + int32_t len = source.size(); + T* dest = new T[len]; + if (dest == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } else { + for (int32_t i = 0; i < len; i++) { + dest[i] = std::move(*static_cast(source.elementAt(i))); + } + source.removeAllElements(); + } + return dest; + } + + inline UVector* createUVectorNoAdopt(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + LocalPointer result(new UVector(status)); + if (U_FAILURE(status)) { + return nullptr; + } + return result.orphan(); + } + + inline UVector* createUVector(UErrorCode& status) { + UVector* result = createUVectorNoAdopt(status); + if (U_FAILURE(status)) { + return nullptr; + } + result->setDeleter(uprv_deleteUObject); + return result; + } + + static UBool stringsEqual(const UElement s1, const UElement s2) { + return (*static_cast(s1.pointer) == *static_cast(s2.pointer)); + } + + inline UVector* createStringUVector(UErrorCode& status) { + UVector* v = createUVector(status); + if (U_FAILURE(status)) { + return nullptr; + } + v->setComparer(stringsEqual); + return v; + } + + inline UVector* createStringVectorNoAdopt(UErrorCode& status) { + UVector* v = createUVectorNoAdopt(status); + if (U_FAILURE(status)) { + return nullptr; + } + v->setComparer(stringsEqual); + return v; + } + + template + inline T* create(T&& node, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + T* result = new T(std::move(node)); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return result; + } + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_UTILS_H + +#endif // U_HIDE_DEPRECATED_API +// eof diff --git a/deps/icu-small/source/i18n/messageformat2_arguments.cpp b/deps/icu-small/source/i18n/messageformat2_arguments.cpp new file mode 100644 index 00000000000000..ded3f4dda160c3 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_arguments.cpp @@ -0,0 +1,59 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_arguments.h" +#include "unicode/messageformat2_data_model_names.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +namespace message2 { + + using namespace data_model; + + // ------------------------------------------------------ + // MessageArguments + + using Arguments = MessageArguments; + + const Formattable* Arguments::getArgument(const VariableName& arg, UErrorCode& errorCode) const { + if (U_SUCCESS(errorCode)) { + U_ASSERT(argsLen == 0 || arguments.isValid()); + for (int32_t i = 0; i < argsLen; i++) { + if (argumentNames[i] == arg) { + return &arguments[i]; + } + } + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return nullptr; + } + + MessageArguments::~MessageArguments() {} + + // Message arguments + // ----------------- + + MessageArguments& MessageArguments::operator=(MessageArguments&& other) noexcept { + U_ASSERT(other.arguments.isValid() || other.argsLen == 0); + argsLen = other.argsLen; + if (argsLen != 0) { + argumentNames.adoptInstead(other.argumentNames.orphan()); + arguments.adoptInstead(other.arguments.orphan()); + } + return *this; + } + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/messageformat2_checker.cpp b/deps/icu-small/source/i18n/messageformat2_checker.cpp new file mode 100644 index 00000000000000..192167583fffdb --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_checker.cpp @@ -0,0 +1,299 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "messageformat2_allocation.h" +#include "messageformat2_checker.h" +#include "messageformat2_macros.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +namespace message2 { + +/* +Checks data model errors +(see https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#error-handling ) + +The following are checked here: +Variant Key Mismatch +Missing Fallback Variant (called NonexhaustivePattern here) +Missing Selector Annotation +Duplicate Declaration + - Most duplicate declaration errors are checked by the parser, + but the checker checks for declarations of input variables + that were previously implicitly declared +(Duplicate option names and duplicate declarations are checked by the parser) +*/ + +// Type environments +// ----------------- + +TypeEnvironment::TypeEnvironment(UErrorCode& status) { + CHECK_ERROR(status); + + UVector* temp; + temp = createStringVectorNoAdopt(status); + CHECK_ERROR(status); + annotated.adoptInstead(temp); + temp = createStringVectorNoAdopt(status); + CHECK_ERROR(status); + unannotated.adoptInstead(temp); + temp = createStringVectorNoAdopt(status); + CHECK_ERROR(status); + freeVars.adoptInstead(temp); +} + + static bool has(const UVector& v, const VariableName& var) { + return v.contains(const_cast(static_cast(&var))); + } + +// Returns true if `var` was either previously used (implicit declaration), +// or is in scope by an explicit declaration +bool TypeEnvironment::known(const VariableName& var) const { + return has(*annotated, var) || has(*unannotated, var) || has(*freeVars, var); +} + +TypeEnvironment::Type TypeEnvironment::get(const VariableName& var) const { + U_ASSERT(annotated.isValid()); + if (has(*annotated, var)) { + return Annotated; + } + U_ASSERT(unannotated.isValid()); + if (has(*unannotated, var)) { + return Unannotated; + } + U_ASSERT(freeVars.isValid()); + if (has(*freeVars, var)) { + return FreeVariable; + } + // This case is a "free variable without an implicit declaration", + // i.e. one used only in a selector expression and not in a declaration RHS + return Unannotated; +} + +void TypeEnvironment::extend(const VariableName& var, TypeEnvironment::Type t, UErrorCode& status) { + if (t == Unannotated) { + U_ASSERT(unannotated.isValid()); + // See comment below + unannotated->addElement(const_cast(static_cast(&var)), status); + return; + } + + if (t == FreeVariable) { + U_ASSERT(freeVars.isValid()); + // See comment below + freeVars->addElement(const_cast(static_cast(&var)), status); + return; + } + + U_ASSERT(annotated.isValid()); + // This is safe because elements of `annotated` are never written + // and the lifetime of `var` is guaranteed to include the lifetime of + // `annotated` + annotated->addElement(const_cast(static_cast(&var)), status); +} + +TypeEnvironment::~TypeEnvironment() {} + +// --------------------- + +static bool areDefaultKeys(const Key* keys, int32_t len) { + U_ASSERT(len > 0); + for (int32_t i = 0; i < len; i++) { + if (!keys[i].isWildcard()) { + return false; + } + } + return true; +} + +void Checker::addFreeVars(TypeEnvironment& t, const Operand& rand, UErrorCode& status) { + CHECK_ERROR(status); + + if (rand.isVariable()) { + const VariableName& v = rand.asVariable(); + if (!t.known(v)) { + t.extend(v, TypeEnvironment::Type::FreeVariable, status); + } + } +} + +void Checker::addFreeVars(TypeEnvironment& t, const OptionMap& opts, UErrorCode& status) { + for (int32_t i = 0; i < opts.size(); i++) { + const Option& o = opts.getOption(i, status); + CHECK_ERROR(status); + addFreeVars(t, o.getValue(), status); + } +} + +void Checker::addFreeVars(TypeEnvironment& t, const Operator& rator, UErrorCode& status) { + CHECK_ERROR(status); + + if (!rator.isReserved()) { + addFreeVars(t, rator.getOptionsInternal(), status); + } +} + +void Checker::addFreeVars(TypeEnvironment& t, const Expression& rhs, UErrorCode& status) { + CHECK_ERROR(status); + + if (rhs.isFunctionCall()) { + const Operator* rator = rhs.getOperator(status); + U_ASSERT(U_SUCCESS(status)); + addFreeVars(t, *rator, status); + } + addFreeVars(t, rhs.getOperand(), status); +} + +void Checker::checkVariants(UErrorCode& status) { + CHECK_ERROR(status); + + U_ASSERT(!dataModel.hasPattern()); + + // Check that each variant has a key list with size + // equal to the number of selectors + const Variant* variants = dataModel.getVariantsInternal(); + + // Check that one variant includes only wildcards + bool defaultExists = false; + + for (int32_t i = 0; i < dataModel.numVariants(); i++) { + const SelectorKeys& k = variants[i].getKeys(); + const Key* keys = k.getKeysInternal(); + int32_t len = k.len; + if (len != dataModel.numSelectors()) { + // Variant key mismatch + errors.addError(StaticErrorType::VariantKeyMismatchError, status); + return; + } + defaultExists |= areDefaultKeys(keys, len); + } + if (!defaultExists) { + errors.addError(StaticErrorType::NonexhaustivePattern, status); + return; + } +} + +void Checker::requireAnnotated(const TypeEnvironment& t, const Expression& selectorExpr, UErrorCode& status) { + CHECK_ERROR(status); + + if (selectorExpr.isFunctionCall()) { + return; // No error + } + if (!selectorExpr.isReserved()) { + const Operand& rand = selectorExpr.getOperand(); + if (rand.isVariable()) { + if (t.get(rand.asVariable()) == TypeEnvironment::Type::Annotated) { + return; // No error + } + } + } + // If this code is reached, an error was detected + errors.addError(StaticErrorType::MissingSelectorAnnotation, status); +} + +void Checker::checkSelectors(const TypeEnvironment& t, UErrorCode& status) { + U_ASSERT(!dataModel.hasPattern()); + + // Check each selector; if it's not annotated, emit a + // "missing selector annotation" error + const Expression* selectors = dataModel.getSelectorsInternal(); + for (int32_t i = 0; i < dataModel.numSelectors(); i++) { + requireAnnotated(t, selectors[i], status); + } +} + +TypeEnvironment::Type typeOf(TypeEnvironment& t, const Expression& expr) { + if (expr.isFunctionCall()) { + return TypeEnvironment::Type::Annotated; + } + if (expr.isReserved()) { + return TypeEnvironment::Type::Unannotated; + } + const Operand& rand = expr.getOperand(); + U_ASSERT(!rand.isNull()); + if (rand.isLiteral()) { + return TypeEnvironment::Type::Unannotated; + } + U_ASSERT(rand.isVariable()); + return t.get(rand.asVariable()); +} + +void Checker::checkDeclarations(TypeEnvironment& t, UErrorCode& status) { + CHECK_ERROR(status); + + // For each declaration, extend the type environment with its type + // Only a very simple type system is necessary: variables + // have the type "annotated", "unannotated", or "free". + // For "missing selector annotation" checking, free variables + // (message arguments) are treated as unannotated. + // Free variables are also used for checking duplicate declarations. + const Binding* env = dataModel.getLocalVariablesInternal(); + for (int32_t i = 0; i < dataModel.bindingsLen; i++) { + const Binding& b = env[i]; + const VariableName& lhs = b.getVariable(); + const Expression& rhs = b.getValue(); + + // First, add free variables from the RHS of b + // This must be done first so we can catch: + // .local $foo = {$foo} + // (where the RHS is the first use of $foo) + if (b.isLocal()) { + addFreeVars(t, rhs, status); + + // Next, check if the LHS equals any free variables + // whose implicit declarations are in scope + if (t.known(lhs) && t.get(lhs) == TypeEnvironment::Type::FreeVariable) { + errors.addError(StaticErrorType::DuplicateDeclarationError, status); + } + } else { + // Input declaration; if b has no annotation, there's nothing to check + if (!b.isLocal() && b.hasAnnotation()) { + const OptionMap& opts = b.getOptionsInternal(); + // For .input declarations, we just need to add any variables + // referenced in the options + addFreeVars(t, opts, status); + } + // Next, check if the LHS equals any free variables + // whose implicit declarations are in scope + if (t.known(lhs) && t.get(lhs) == TypeEnvironment::Type::FreeVariable) { + errors.addError(StaticErrorType::DuplicateDeclarationError, status); + } + } + // Next, extend the type environment with a binding from lhs to its type + t.extend(lhs, typeOf(t, rhs), status); + } + + // Check for unsupported statements + if (dataModel.unsupportedStatementsLen > 0) { + errors.addError(StaticErrorType::UnsupportedStatementError, status); + } +} + +void Checker::check(UErrorCode& status) { + CHECK_ERROR(status); + + TypeEnvironment typeEnv(status); + checkDeclarations(typeEnv, status); + // Pattern message + if (dataModel.hasPattern()) { + return; + } else { + // Selectors message + checkSelectors(typeEnv, status); + checkVariants(status); + } +} + +} // namespace message2 +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/messageformat2_checker.h b/deps/icu-small/source/i18n/messageformat2_checker.h new file mode 100644 index 00000000000000..4bb0498efb9940 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_checker.h @@ -0,0 +1,97 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT_CHECKER_H +#define MESSAGEFORMAT_CHECKER_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_data_model.h" +#include "messageformat2_errors.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + + using namespace data_model; + + // Used for checking missing selector annotation errors + // and duplicate declaration errors (specifically for + // implicit declarations) + class TypeEnvironment : public UMemory { + public: + // MessageFormat has a simple type system; + // variables are in-scope and annotated; in-scope and unannotated; + // or free (a free variable has no explicit declaration in the scope + // of its use.) + enum Type { + Annotated, + Unannotated, + FreeVariable + }; + void extend(const VariableName&, Type, UErrorCode& status); + Type get(const VariableName&) const; + bool known(const VariableName&) const; + TypeEnvironment(UErrorCode& status); + + virtual ~TypeEnvironment(); + + private: + // Stores variables known to be annotated. + LocalPointer annotated; // Vector of `VariableName`s + // Stores variables that are in-scope but unannotated. + LocalPointer unannotated; // Vector of `VariableName`s + // Stores free variables that are used in the RHS of a declaration + LocalPointer freeVars; // Vector of `VariableNames`; tracks free variables + // This can't just be "variables that don't appear in + // `annotated` or `unannotated`", as a use introduces + // an explicit declaration + }; // class TypeEnvironment + + // Checks a data model for semantic errors + // (Errors are defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md ) + class Checker { + public: + void check(UErrorCode&); + Checker(const MFDataModel& m, StaticErrors& e) : dataModel(m), errors(e) {} + private: + + void requireAnnotated(const TypeEnvironment&, const Expression&, UErrorCode&); + void addFreeVars(TypeEnvironment& t, const Operand&, UErrorCode&); + void addFreeVars(TypeEnvironment& t, const Operator&, UErrorCode&); + void addFreeVars(TypeEnvironment& t, const OptionMap&, UErrorCode&); + void addFreeVars(TypeEnvironment& t, const Expression&, UErrorCode&); + void checkDeclarations(TypeEnvironment&, UErrorCode&); + void checkSelectors(const TypeEnvironment&, UErrorCode&); + void checkVariants(UErrorCode&); + void check(const OptionMap&); + void check(const Operand&); + void check(const Expression&); + void check(const Pattern&); + const MFDataModel& dataModel; + StaticErrors& errors; + }; // class Checker + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT_CHECKER_H + +#endif // U_HIDE_DEPRECATED_API +// eof + diff --git a/deps/icu-small/source/i18n/messageformat2_data_model.cpp b/deps/icu-small/source/i18n/messageformat2_data_model.cpp new file mode 100644 index 00000000000000..8255de01af062e --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_data_model.cpp @@ -0,0 +1,1152 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_data_model.h" +#include "messageformat2_allocation.h" +#include "messageformat2_macros.h" +#include "uvector.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + +// Implementation + +//------------------ SelectorKeys + +const Key* SelectorKeys::getKeysInternal() const { + return keys.getAlias(); +} + +// Lexically order key lists +bool SelectorKeys::operator<(const SelectorKeys& other) const { + // Handle key lists of different sizes first -- + // this case does have to be handled (even though it would + // reflect a data model error) because of the need to produce + // partial output + if (len < other.len) { + return true; + } + if (len > other.len) { + return false; + } + + for (int32_t i = 0; i < len; i++) { + if (keys[i] < other.keys[i]) { + return true; + } + if (!(keys[i] == other.keys[i])) { + return false; + } + } + // If we've reached here, all keys must be equal + return false; +} + +SelectorKeys::Builder::Builder(UErrorCode& status) { + keys = createUVector(status); +} + +SelectorKeys::Builder& SelectorKeys::Builder::add(Key&& key, UErrorCode& status) noexcept { + U_ASSERT(keys != nullptr); + if (U_SUCCESS(status)) { + Key* k = create(std::move(key), status); + keys->adoptElement(k, status); + } + return *this; +} + +SelectorKeys SelectorKeys::Builder::build(UErrorCode& status) const { + if (U_FAILURE(status)) { + return {}; + } + U_ASSERT(keys != nullptr); + return SelectorKeys(*keys, status); +} + +SelectorKeys::Builder::~Builder() { + if (keys != nullptr) { + delete keys; + } +} + +SelectorKeys::SelectorKeys(const UVector& ks, UErrorCode& status) : len(ks.size()) { + Key* result = copyVectorToArray(ks, status); + if (U_FAILURE(status)) { + return; + } + keys.adoptInstead(result); +} + +SelectorKeys& SelectorKeys::operator=(SelectorKeys other) noexcept { + swap(*this, other); + return *this; +} + +SelectorKeys::SelectorKeys(const SelectorKeys& other) : len(other.len) { + UErrorCode localErrorCode = U_ZERO_ERROR; + if (len != 0) { + keys.adoptInstead(copyArray(other.keys.getAlias(), len, localErrorCode)); + } + if (U_FAILURE(localErrorCode)) { + len = 0; + } +} + +SelectorKeys::~SelectorKeys() { + len = 0; +} + +//------------------ Literal + +bool Literal::operator<(const Literal& other) const { + // Ignore quoting for the purposes of ordering + return contents < other.contents; +} + +bool Literal::operator==(const Literal& other) const { + // Ignore quoting for the purposes of ordering + return contents == other.contents; +} + +UnicodeString Literal::quoted() const { + UnicodeString result(PIPE); + result += unquoted(); + result += PIPE; + return result; +} + +const UnicodeString& Literal::unquoted() const { return contents; } + +Literal& Literal::operator=(Literal other) noexcept { + swap(*this, other); + + return *this; +} + +Literal::~Literal() { + thisIsQuoted = false; +} + +//------------------ Operand + +Operand::Operand(const Operand& other) : contents(other.contents) {} + +Operand& Operand::operator=(Operand other) noexcept { + swap(*this, other); + + return *this; +} + +UBool Operand::isVariable() const { + return (contents.has_value() && std::holds_alternative(*contents)); +} +UBool Operand::isLiteral() const { + return (contents.has_value() && std::holds_alternative(*contents)); +} +UBool Operand::isNull() const { return !contents.has_value(); } + +const Literal& Operand::asLiteral() const { + U_ASSERT(isLiteral()); + return *(std::get_if(&(*contents))); +} + +const VariableName& Operand::asVariable() const { + U_ASSERT(isVariable()); + return *(std::get_if(&(*contents))); +} + +Operand::~Operand() {} + +//---------------- Key + +Key& Key::operator=(Key other) noexcept { + swap(*this, other); + return *this; +} + +bool Key::operator<(const Key& other) const { + // Arbitrarily treat * as greater than all concrete keys + if (isWildcard()) { + return false; + } + if (other.isWildcard()) { + return true; + } + return (asLiteral() < other.asLiteral()); +} + +bool Key::operator==(const Key& other) const { + if (isWildcard()) { + return other.isWildcard(); + } + return (asLiteral() == other.asLiteral()); +} + +const Literal& Key::asLiteral() const { + U_ASSERT(!isWildcard()); + return *contents; +} + +Key::~Key() {} + +// ------------ Reserved + +// Copy constructor +Reserved::Reserved(const Reserved& other) : len(other.len) { + U_ASSERT(!other.bogus); + + UErrorCode localErrorCode = U_ZERO_ERROR; + if (len == 0) { + parts.adoptInstead(nullptr); + } else { + parts.adoptInstead(copyArray(other.parts.getAlias(), len, localErrorCode)); + } + if (U_FAILURE(localErrorCode)) { + bogus = true; + } +} + +Reserved& Reserved::operator=(Reserved other) noexcept { + swap(*this, other); + return *this; +} + +Reserved::Reserved(const UVector& ps, UErrorCode& status) noexcept : len(ps.size()) { + if (U_FAILURE(status)) { + return; + } + parts = LocalArray(copyVectorToArray(ps, status)); +} + +int32_t Reserved::numParts() const { + U_ASSERT(!bogus); + return len; +} + +const Literal& Reserved::getPart(int32_t i) const { + U_ASSERT(!bogus); + U_ASSERT(i < numParts()); + return parts[i]; +} + +Reserved::Builder::Builder(UErrorCode& status) { + parts = createUVector(status); +} + +Reserved Reserved::Builder::build(UErrorCode& status) const noexcept { + if (U_FAILURE(status)) { + return {}; + } + U_ASSERT(parts != nullptr); + return Reserved(*parts, status); +} + +Reserved::Builder& Reserved::Builder::add(Literal&& part, UErrorCode& status) noexcept { + U_ASSERT(parts != nullptr); + if (U_SUCCESS(status)) { + Literal* l = create(std::move(part), status); + parts->adoptElement(l, status); + } + return *this; +} + +Reserved::Builder::~Builder() { + if (parts != nullptr) { + delete parts; + } +} + +Reserved::~Reserved() { + len = 0; +} + +//------------------------ Operator + +OptionMap::OptionMap(const UVector& opts, UErrorCode& status) : len(opts.size()) { + Option* result = copyVectorToArray

- *

Sample code

- * \snippet samples/dtitvfmtsample/dtitvfmtsample.cpp dtitvfmtPreDefined1 - * \snippet samples/dtitvfmtsample/dtitvfmtsample.cpp dtitvfmtPreDefined - *

*/ static DateIntervalFormat* U_EXPORT2 createInstance( @@ -410,11 +405,6 @@ class U_I18N_API DateIntervalFormat : public Format { * @param status output param set to success/failure code on exit * @return a date time interval formatter which the caller owns. * @stable ICU 4.0 - *

- *

Sample code

- * \snippet samples/dtitvfmtsample/dtitvfmtsample.cpp dtitvfmtPreDefined1 - * \snippet samples/dtitvfmtsample/dtitvfmtsample.cpp dtitvfmtCustomized - *

*/ static DateIntervalFormat* U_EXPORT2 createInstance( const UnicodeString& skeleton, @@ -604,8 +594,7 @@ class U_I18N_API DateIntervalFormat : public Format { * this date interval formatter. * @stable ICU 4.0 */ - const DateIntervalInfo* getDateIntervalInfo(void) const; - + const DateIntervalInfo* getDateIntervalInfo() const; /** * Set the date time interval patterns. @@ -628,14 +617,14 @@ class U_I18N_API DateIntervalFormat : public Format { * @return the date formatter associated with this date interval formatter. * @stable ICU 4.0 */ - const DateFormat* getDateFormat(void) const; + const DateFormat* getDateFormat() const; /** * Returns a reference to the TimeZone used by this DateIntervalFormat's calendar. * @return the time zone associated with the calendar of DateIntervalFormat. * @stable ICU 4.8 */ - virtual const TimeZone& getTimeZone(void) const; + virtual const TimeZone& getTimeZone() const; /** * Sets the time zone for the calendar used by this DateIntervalFormat object. The @@ -689,7 +678,7 @@ class U_I18N_API DateIntervalFormat : public Format { * @return The class ID for all objects of this class. * @stable ICU 4.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -702,7 +691,7 @@ class U_I18N_API DateIntervalFormat : public Format { * other classes have different class IDs. * @stable ICU 4.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; protected: diff --git a/deps/icu-small/source/i18n/unicode/dtptngen.h b/deps/icu-small/source/i18n/unicode/dtptngen.h index 8c374a3094376c..3d09178b2281f3 100644 --- a/deps/icu-small/source/i18n/unicode/dtptngen.h +++ b/deps/icu-small/source/i18n/unicode/dtptngen.h @@ -211,11 +211,6 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return conflicting status. The value could be UDATPG_NO_CONFLICT, * UDATPG_BASE_CONFLICT or UDATPG_CONFLICT. * @stable ICU 3.8 - *

- *

Sample code

- * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp addPatternExample - *

*/ UDateTimePatternConflict addPattern(const UnicodeString& pattern, UBool override, @@ -388,11 +383,6 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return bestPattern * The best pattern found from the given skeleton. * @stable ICU 3.8 - *

- *

Sample code

- * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample - *

*/ UnicodeString getBestPattern(const UnicodeString& skeleton, UErrorCode& status); @@ -436,11 +426,6 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * which must not indicate a failure before the function call. * @return pattern adjusted to match the skeleton fields widths and subtypes. * @stable ICU 3.8 - *

- *

Sample code

- * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp replaceFieldTypesExample - *

*/ UnicodeString replaceFieldTypes(const UnicodeString& pattern, const UnicodeString& skeleton, @@ -571,7 +556,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); private: /** @@ -645,7 +630,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { UnicodeString& getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width); void getAppendName(UDateTimePatternField field, UnicodeString& value); UnicodeString mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status); - const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, UErrorCode& status, const PtnSkeleton** specifiedSkeletonPtr = 0); + const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, UErrorCode& status, const PtnSkeleton** specifiedSkeletonPtr = nullptr); UnicodeString adjustFieldTypes(const UnicodeString& pattern, const PtnSkeleton* specifiedSkeleton, int32_t flags, UDateTimePatternMatchOptions options = UDATPG_MATCH_NO_OPTIONS); UnicodeString getBestAppending(int32_t missingFields, int32_t flags, UErrorCode& status, UDateTimePatternMatchOptions options = UDATPG_MATCH_NO_OPTIONS); int32_t getTopBitNumber(int32_t foundMask) const; diff --git a/deps/icu-small/source/i18n/unicode/dtrule.h b/deps/icu-small/source/i18n/unicode/dtrule.h index 19e94bc981c817..6e10bfcb04c303 100644 --- a/deps/icu-small/source/i18n/unicode/dtrule.h +++ b/deps/icu-small/source/i18n/unicode/dtrule.h @@ -160,7 +160,7 @@ class U_I18N_API DateTimeRule : public UObject { * @return The date rule type. * @stable ICU 3.8 */ - DateRuleType getDateRuleType(void) const; + DateRuleType getDateRuleType() const; /** * Gets the time rule type @@ -168,14 +168,14 @@ class U_I18N_API DateTimeRule : public UObject { * or UTC_TIME. * @stable ICU 3.8 */ - TimeRuleType getTimeRuleType(void) const; + TimeRuleType getTimeRuleType() const; /** * Gets the rule month. * @return The rule month. * @stable ICU 3.8 */ - int32_t getRuleMonth(void) const; + int32_t getRuleMonth() const; /** * Gets the rule day of month. When the date rule type @@ -183,7 +183,7 @@ class U_I18N_API DateTimeRule : public UObject { * @return The rule day of month * @stable ICU 3.8 */ - int32_t getRuleDayOfMonth(void) const; + int32_t getRuleDayOfMonth() const; /** * Gets the rule day of week. When the date rule type @@ -191,7 +191,7 @@ class U_I18N_API DateTimeRule : public UObject { * @return The rule day of week. * @stable ICU 3.8 */ - int32_t getRuleDayOfWeek(void) const; + int32_t getRuleDayOfWeek() const; /** * Gets the ordinal number of the occurrence of the day of week @@ -200,16 +200,16 @@ class U_I18N_API DateTimeRule : public UObject { * @return The rule day of week ordinal number in the month. * @stable ICU 3.8 */ - int32_t getRuleWeekInMonth(void) const; + int32_t getRuleWeekInMonth() const; /** * Gets the rule time in the rule day. * @return The time in the rule day in milliseconds. * @stable ICU 3.8 */ - int32_t getRuleMillisInDay(void) const; + int32_t getRuleMillisInDay() const; -private: + private: int32_t fMonth; int32_t fDayOfMonth; int32_t fDayOfWeek; @@ -230,7 +230,7 @@ class U_I18N_API DateTimeRule : public UObject { * @return The class ID for all objects of this class. * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -243,7 +243,7 @@ class U_I18N_API DateTimeRule : public UObject { * other classes have different class IDs. * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/fieldpos.h b/deps/icu-small/source/i18n/unicode/fieldpos.h index 0c092a00522935..23c6a1884e2baa 100644 --- a/deps/icu-small/source/i18n/unicode/fieldpos.h +++ b/deps/icu-small/source/i18n/unicode/fieldpos.h @@ -192,14 +192,14 @@ class U_I18N_API FieldPosition : public UObject { * @return the field identifier. * @stable ICU 2.0 */ - int32_t getField(void) const { return fField; } + int32_t getField() const { return fField; } /** * Retrieve the index of the first character in the requested field. * @return the index of the first character in the requested field. * @stable ICU 2.0 */ - int32_t getBeginIndex(void) const { return fBeginIndex; } + int32_t getBeginIndex() const { return fBeginIndex; } /** * Retrieve the index of the character following the last character in the @@ -208,8 +208,8 @@ class U_I18N_API FieldPosition : public UObject { * requested field. * @stable ICU 2.0 */ - int32_t getEndIndex(void) const { return fEndIndex; } - + int32_t getEndIndex() const { return fEndIndex; } + /** * Set the field. * @param f the new value of the field. diff --git a/deps/icu-small/source/i18n/unicode/fmtable.h b/deps/icu-small/source/i18n/unicode/fmtable.h index 6bda3576042143..d251d35ba88c36 100644 --- a/deps/icu-small/source/i18n/unicode/fmtable.h +++ b/deps/icu-small/source/i18n/unicode/fmtable.h @@ -35,11 +35,10 @@ U_NAMESPACE_BEGIN class CharString; -namespace number { -namespace impl { + +namespace number::impl { class DecimalQuantity; } -} /** * Formattable objects can be passed to the Format class or @@ -274,7 +273,7 @@ class U_I18N_API Formattable : public UObject { * @return the data type of this Formattable object. * @stable ICU 2.0 */ - Type getType(void) const; + Type getType() const; /** * Returns true if the data type of this Formattable object @@ -290,7 +289,7 @@ class U_I18N_API Formattable : public UObject { * @return the double value of this object. * @stable ICU 2.0 */ - double getDouble(void) const { return fValue.fDouble; } + double getDouble() const { return fValue.fDouble; } /** * Gets the double value of this object. If this object is of type @@ -312,7 +311,7 @@ class U_I18N_API Formattable : public UObject { * @return the long value of this object. * @stable ICU 2.0 */ - int32_t getLong(void) const { return (int32_t)fValue.fInt64; } + int32_t getLong() const { return (int32_t)fValue.fInt64; } /** * Gets the long value of this object. If the magnitude is too @@ -338,7 +337,7 @@ class U_I18N_API Formattable : public UObject { * @return the int64 value of this object. * @stable ICU 2.8 */ - int64_t getInt64(void) const { return fValue.fInt64; } + int64_t getInt64() const { return fValue.fInt64; } /** * Gets the int64 value of this object. If this object is of a numeric @@ -403,7 +402,7 @@ class U_I18N_API Formattable : public UObject { * @return a const reference to the string value of this object. * @stable ICU 2.0 */ - inline const UnicodeString& getString(void) const; + inline const UnicodeString& getString() const; /** * Gets a const reference to the string value of this object. If @@ -421,7 +420,7 @@ class U_I18N_API Formattable : public UObject { * @return a reference to the string value of this object. * @stable ICU 2.0 */ - inline UnicodeString& getString(void); + inline UnicodeString& getString(); /** * Gets a reference to the string value of this object. If the @@ -680,7 +679,7 @@ class U_I18N_API Formattable : public UObject { * Cleans up the memory for unwanted values. For example, the adopted * string or array objects. */ - void dispose(void); + void dispose(); /** * Common initialization, for use by constructors. @@ -719,11 +718,11 @@ inline UDate Formattable::getDate(UErrorCode& status) const { return fValue.fDate; } -inline const UnicodeString& Formattable::getString(void) const { +inline const UnicodeString& Formattable::getString() const { return *fValue.fString; } -inline UnicodeString& Formattable::getString(void) { +inline UnicodeString& Formattable::getString() { return *fValue.fString; } diff --git a/deps/icu-small/source/i18n/unicode/formattednumber.h b/deps/icu-small/source/i18n/unicode/formattednumber.h index 83178ea40efe85..6b212d7c8257e2 100644 --- a/deps/icu-small/source/i18n/unicode/formattednumber.h +++ b/deps/icu-small/source/i18n/unicode/formattednumber.h @@ -25,6 +25,7 @@ U_NAMESPACE_BEGIN class FieldPositionIteratorHandler; +class SimpleDateFormat; namespace number { // icu::number @@ -190,6 +191,9 @@ class U_I18N_API FormattedNumber : public UMemory, public FormattedValue { // To give C API access to internals friend struct impl::UFormattedNumberImpl; + + // To give access to the data pointer for non-heap allocation + friend class icu::SimpleDateFormat; }; template diff --git a/deps/icu-small/source/i18n/unicode/fpositer.h b/deps/icu-small/source/i18n/unicode/fpositer.h index 0e38d0b78b3a48..cae0dafd29d9de 100644 --- a/deps/icu-small/source/i18n/unicode/fpositer.h +++ b/deps/icu-small/source/i18n/unicode/fpositer.h @@ -67,7 +67,7 @@ class U_I18N_API FieldPositionIterator : public UObject { * Constructs a new, empty iterator. * @stable ICU 4.4 */ - FieldPositionIterator(void); + FieldPositionIterator(); /** * Copy constructor. If the copy failed for some reason, the new iterator will diff --git a/deps/icu-small/source/i18n/unicode/gregocal.h b/deps/icu-small/source/i18n/unicode/gregocal.h index ab5a9c15716bc2..5112548522d557 100644 --- a/deps/icu-small/source/i18n/unicode/gregocal.h +++ b/deps/icu-small/source/i18n/unicode/gregocal.h @@ -324,7 +324,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * @return The Gregorian cutover time for this calendar. * @stable ICU 2.0 */ - UDate getGregorianChange(void) const; + UDate getGregorianChange() const; /** * Return true if the given year is a leap year. Determination of whether a year is @@ -435,7 +435,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * same class ID. Objects of other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; /** * Return the class ID for this class. This is useful only for comparing to a return @@ -448,7 +448,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns the calendar type name string for this Calendar object. @@ -483,22 +483,24 @@ class U_I18N_API GregorianCalendar: public Calendar { * @param useMonth if false, compute the day before the first day of * the given year, otherwise, compute the day before the first day of * the given month + * @param status Fill-in parameter which receives the status of this operation. * @return the Julian day number of the day before the first * day of the given month and year * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, - UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, + UBool useMonth, UErrorCode& status) const override; /** * Subclasses may override this. This method calls * handleGetMonthLength() to obtain the calendar-specific month * length. * @param bestField which field to use to calculate the date + * @param status Fill-in parameter which receives the status of this operation. * @return julian day specified by calendar fields. * @internal */ - virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField) override; + virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField, UErrorCode& status) override; /** * Return the number of days in the given month of the given extended @@ -507,7 +509,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * implementation than the default implementation in Calendar. * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given extended year of this @@ -521,10 +523,11 @@ class U_I18N_API GregorianCalendar: public Calendar { /** * return the length of the given month. * @param month the given month. + * @param status Fill-in parameter which receives the status of this operation. * @return the length of the given month. * @internal */ - virtual int32_t monthLength(int32_t month) const; + virtual int32_t monthLength(int32_t month, UErrorCode& status) const; /** * return the length of the month according to the given year. @@ -541,7 +544,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * @return the length of the year field * @internal */ - int32_t yearLength(void) const; + int32_t yearLength() const; #endif /* U_HIDE_INTERNAL_API */ @@ -582,10 +585,11 @@ class U_I18N_API GregorianCalendar: public Calendar { * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such * as UCAL_ERA) specific to the calendar system, depending on which set of * fields is newer. + * @param status * @return the extended year * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Subclasses may override this to convert from week fields @@ -595,7 +599,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * @return the extended year, UCAL_EXTENDED_YEAR * @internal */ - virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy) override; + virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy, UErrorCode& status) override; /** @@ -615,6 +619,15 @@ class U_I18N_API GregorianCalendar: public Calendar { */ virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; +#ifndef U_HIDE_INTERNAL_API + /** + * The year in this calendar is counting from 1 backward if the era is 0. + * @return The year in era 0 of this calendar is counting backward from 1. + * @internal + */ + virtual bool isEra0CountingBackward() const override { return true; } +#endif // U_HIDE_INTERNAL_API + private: /** * Compute the julian day number of the given year. @@ -630,7 +643,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * Validates the values of the set time fields. True if they're all valid. * @return True if the set time fields are all valid. */ - UBool validateFields(void) const; + UBool validateFields() const; /** * Validates the value of the given time field. True if it's valid. @@ -709,23 +722,8 @@ class U_I18N_API GregorianCalendar: public Calendar { public: // internal implementation - /** - * @return true if this calendar has the notion of a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * @return the start of the default century - * @internal - */ - virtual UDate defaultCenturyStart() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY - /** - * @return the beginning year of the default century - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/measfmt.h b/deps/icu-small/source/i18n/unicode/measfmt.h index 59bf546a905294..c9894f0b5916e1 100644 --- a/deps/icu-small/source/i18n/unicode/measfmt.h +++ b/deps/icu-small/source/i18n/unicode/measfmt.h @@ -273,7 +273,7 @@ class U_I18N_API MeasureFormat : public Format { * @return The class ID for all objects of this class. * @stable ICU 53 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -286,7 +286,7 @@ class U_I18N_API MeasureFormat : public Format { * other classes have different class IDs. * @stable ICU 53 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; protected: /** diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h index 8f358357826808..9ce9b1a65d05a3 100644 --- a/deps/icu-small/source/i18n/unicode/measunit.h +++ b/deps/icu-small/source/i18n/unicode/measunit.h @@ -33,11 +33,9 @@ U_NAMESPACE_BEGIN class StringEnumeration; class MeasureUnitImpl; -namespace number { -namespace impl { +namespace number::impl { class LongNameHandler; -} -} // namespace number +} // namespace number::impl /** * Enumeration for unit complexity. There are three levels: @@ -107,13 +105,34 @@ typedef enum UMeasurePrefix { */ UMEASURE_PREFIX_YOTTA = UMEASURE_PREFIX_ONE + 24, +#ifndef U_HIDE_DRAFT_API + /** + * SI prefix: ronna, 10^27. + * + * @draft ICU 75 + */ + UMEASURE_PREFIX_RONNA = UMEASURE_PREFIX_ONE + 27, + + /** + * SI prefix: quetta, 10^30. + * + * @draft ICU 75 + */ + UMEASURE_PREFIX_QUETTA = UMEASURE_PREFIX_ONE + 30, +#endif /* U_HIDE_DRAFT_API */ + #ifndef U_HIDE_INTERNAL_API /** * ICU use only. * Used to determine the set of base-10 SI prefixes. * @internal */ +#ifndef U_HIDE_DRAFT_API + UMEASURE_PREFIX_INTERNAL_MAX_SI = UMEASURE_PREFIX_QUETTA, +#else /* U_HIDE_DRAFT_API */ UMEASURE_PREFIX_INTERNAL_MAX_SI = UMEASURE_PREFIX_YOTTA, +#endif /* U_HIDE_DRAFT_API */ + #endif /* U_HIDE_INTERNAL_API */ /** @@ -249,13 +268,34 @@ typedef enum UMeasurePrefix { */ UMEASURE_PREFIX_YOCTO = UMEASURE_PREFIX_ONE + -24, +#ifndef U_HIDE_DRAFT_API + /** + * SI prefix: ronto, 10^-27. + * + * @draft ICU 75 + */ + UMEASURE_PREFIX_RONTO = UMEASURE_PREFIX_ONE + -27, + + /** + * SI prefix: quecto, 10^-30. + * + * @draft ICU 75 + */ + UMEASURE_PREFIX_QUECTO = UMEASURE_PREFIX_ONE + -30, +#endif /* U_HIDE_DRAFT_API */ + #ifndef U_HIDE_INTERNAL_API /** * ICU use only. * Used to determine the set of base-10 SI prefixes. * @internal */ +#ifndef U_HIDE_DRAFT_API + UMEASURE_PREFIX_INTERNAL_MIN_SI = UMEASURE_PREFIX_QUECTO, +#else /* U_HIDE_DRAFT_API */ UMEASURE_PREFIX_INTERNAL_MIN_SI = UMEASURE_PREFIX_YOCTO, +#endif /* U_HIDE_DRAFT_API */ + #endif // U_HIDE_INTERNAL_API // Cannot conditionalize the following with #ifndef U_HIDE_INTERNAL_API, @@ -648,7 +688,7 @@ class U_I18N_API MeasureUnit: public UObject { * @return The class ID for all objects of this class. * @stable ICU 53 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -661,7 +701,7 @@ class U_I18N_API MeasureUnit: public UObject { * other classes have different class IDs. * @stable ICU 53 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; #ifndef U_HIDE_INTERNAL_API /** @@ -3026,23 +3066,21 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getPoundPerSquareInch(); -#ifndef U_HIDE_DRAFT_API /** * Returns by pointer, unit of speed: beaufort. * Caller owns returned value and must free it. * Also see {@link #getBeaufort()}. * @param status ICU error code. - * @draft ICU 73 + * @stable ICU 73 */ static MeasureUnit *createBeaufort(UErrorCode &status); /** * Returns by value, unit of speed: beaufort. * Also see {@link #createBeaufort()}. - * @draft ICU 73 + * @stable ICU 73 */ static MeasureUnit getBeaufort(); -#endif /* U_HIDE_DRAFT_API */ /** * Returns by pointer, unit of speed: kilometer-per-hour. diff --git a/deps/icu-small/source/i18n/unicode/measure.h b/deps/icu-small/source/i18n/unicode/measure.h index fbef17c8f03884..86d7b512117595 100644 --- a/deps/icu-small/source/i18n/unicode/measure.h +++ b/deps/icu-small/source/i18n/unicode/measure.h @@ -124,7 +124,7 @@ class U_I18N_API Measure: public UObject { * @return The class ID for all objects of this class. * @stable ICU 53 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -137,7 +137,7 @@ class U_I18N_API Measure: public UObject { * other classes have different class IDs. * @stable ICU 53 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; protected: /** diff --git a/deps/icu-small/source/i18n/unicode/messageformat2.h b/deps/icu-small/source/i18n/unicode/messageformat2.h new file mode 100644 index 00000000000000..d23ac8409d8171 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2.h @@ -0,0 +1,399 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT2_H +#define MESSAGEFORMAT2_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +/** + * \file + * \brief C++ API: Formats messages using the draft MessageFormat 2.0. + */ + +#include "unicode/messageformat2_arguments.h" +#include "unicode/messageformat2_data_model.h" +#include "unicode/messageformat2_function_registry.h" +#include "unicode/unistr.h" + +#ifndef U_HIDE_DEPRECATED_API + +U_NAMESPACE_BEGIN + +namespace message2 { + + class Environment; + class MessageContext; + class ResolvedSelector; + class StaticErrors; + + /** + *

MessageFormatter is a Technical Preview API implementing MessageFormat 2.0. + * + *

See the + * description of the syntax with examples and use cases and the corresponding + * ABNF grammar.

+ * + * The MessageFormatter class is mutable and movable. It is not copyable. + * (It is mutable because if it has a custom function registry, the registry may include + * `FormatterFactory` objects implementing custom formatters, which are allowed to contain + * mutable state.) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API MessageFormatter : public UObject { + // Note: This class does not currently inherit from the existing + // `Format` class. + public: + /** + * Move assignment operator: + * The source MessageFormatter will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MessageFormatter& operator=(MessageFormatter&&) noexcept; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~MessageFormatter(); + + /** + * Formats the message to a string, using the data model that was previously set or parsed, + * and the given `arguments` object. + * + * @param arguments Reference to message arguments + * @param status Input/output error code used to indicate syntax errors, data model + * errors, resolution errors, formatting errors, selection errors, as well + * as other errors (such as memory allocation failures). Partial output + * is still provided in the presence of most error types. + * @return The string result of formatting the message with the given arguments. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UnicodeString formatToString(const MessageArguments& arguments, UErrorCode &status); + + /** + * Not yet implemented; formats the message to a `FormattedMessage` object, + * using the data model that was previously set or parsed, + * and the given `arguments` object. + * + * @param arguments Reference to message arguments + * @param status Input/output error code used to indicate syntax errors, data model + * errors, resolution errors, formatting errors, selection errors, as well + * as other errors (such as memory allocation failures). Partial output + * is still provided in the presence of most error types. + * @return The `FormattedMessage` representing the formatted message. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FormattedMessage format(const MessageArguments& arguments, UErrorCode &status) const { + (void) arguments; + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return FormattedMessage(status); + } + + /** + * Accesses the locale that this `MessageFormatter` object was created with. + * + * @return A reference to the locale. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const Locale& getLocale() const { return locale; } + + /** + * Serializes the data model as a string in MessageFormat 2.0 syntax. + * + * @return result A string representation of the data model. + * The string is a valid MessageFormat 2.0 message. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UnicodeString getPattern() const; + + /** + * Accesses the data model referred to by this + * `MessageFormatter` object. + * + * @return A reference to the data model. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const MFDataModel& getDataModel() const; + + /** + * The mutable Builder class allows each part of the MessageFormatter to be initialized + * separately; calling its `build()` method yields an immutable MessageFormatter. + * + * Not copyable or movable. + */ + class U_I18N_API Builder : public UObject { + private: + friend class MessageFormatter; + + // The pattern to be parsed to generate the formatted message + UnicodeString pattern; + bool hasPattern = false; + bool hasDataModel = false; + // The data model to be used to generate the formatted message + // Initialized either by `setDataModel()`, or by the parser + // through a call to `setPattern()` + MFDataModel dataModel; + // Normalized representation of the pattern; + // ignored if `setPattern()` wasn't called + UnicodeString normalizedInput; + // Errors (internal representation of parse errors) + // Ignored if `setPattern()` wasn't called + StaticErrors* errors; + Locale locale; + // Not owned + const MFFunctionRegistry* customMFFunctionRegistry; + + public: + /** + * Sets the locale to use for formatting. + * + * @param locale The desired locale. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setLocale(const Locale& locale); + /** + * Sets the pattern (contents of the message) and parses it + * into a data model. If a data model was + * previously set, it is removed. + * + * @param pattern A string in MessageFormat 2.0 syntax. + * @param parseError Struct to receive information on the position + * of an error within the pattern. + * @param status Input/output error code. If the + * pattern cannot be parsed, set to failure code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status); + /** + * Sets a custom function registry. + * + * @param functionRegistry Reference to the function registry to use. + * `functionRegistry` is not copied, + * and the caller must ensure its lifetime contains + * the lifetime of the `MessageFormatter` object built by this + * builder. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setFunctionRegistry(const MFFunctionRegistry& functionRegistry); + /** + * Sets a data model. If a pattern was previously set, it is removed. + * + * @param dataModel Data model to format. Passed by move. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setDataModel(MFDataModel&& dataModel); + /** + * Constructs a new immutable MessageFormatter using the pattern or data model + * that was previously set, and the locale (if it was previously set) + * or default locale (otherwise). + * + * The builder object (`this`) can still be used after calling `build()`. + * + * @param status Input/output error code. If neither the pattern + * nor the data model is set, set to failure code. + * @return The new MessageFormatter object + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MessageFormatter build(UErrorCode& status) const; + /** + * Default constructor. + * Returns a Builder with the default locale and with no + * data model or pattern set. Either `setPattern()` + * or `setDataModel()` has to be called before calling `build()`. + * + * @param status Input/output error code. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + }; // class MessageFormatter::Builder + + // TODO: Shouldn't be public; only used for testing + /** + * Returns a string consisting of the input with optional spaces removed. + * + * @return A normalized string representation of the input + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const UnicodeString& getNormalizedPattern() const { return normalizedInput; } + + private: + friend class Builder; + friend class MessageContext; + + MessageFormatter(const MessageFormatter::Builder& builder, UErrorCode &status); + + MessageFormatter() = delete; // default constructor not implemented + + // Do not define default assignment operator + const MessageFormatter &operator=(const MessageFormatter &) = delete; + + ResolvedSelector resolveVariables(const Environment& env, const data_model::Operand&, MessageContext&, UErrorCode &) const; + ResolvedSelector resolveVariables(const Environment& env, const data_model::Expression&, MessageContext&, UErrorCode &) const; + + // Selection methods + + // Takes a vector of FormattedPlaceholders + void resolveSelectors(MessageContext&, const Environment& env, UErrorCode&, UVector&) const; + // Takes a vector of vectors of strings (input) and a vector of PrioritizedVariants (output) + void filterVariants(const UVector&, UVector&, UErrorCode&) const; + // Takes a vector of vectors of strings (input) and a vector of PrioritizedVariants (input/output) + void sortVariants(const UVector&, UVector&, UErrorCode&) const; + // Takes a vector of strings (input) and a vector of strings (output) + void matchSelectorKeys(const UVector&, MessageContext&, ResolvedSelector&& rv, UVector&, UErrorCode&) const; + // Takes a vector of FormattedPlaceholders (input), + // and a vector of vectors of strings (output) + void resolvePreferences(MessageContext&, UVector&, UVector&, UErrorCode&) const; + + // Formatting methods + [[nodiscard]] FormattedPlaceholder formatLiteral(const data_model::Literal&) const; + void formatPattern(MessageContext&, const Environment&, const data_model::Pattern&, UErrorCode&, UnicodeString&) const; + // Formats a call to a formatting function + // Dispatches on argument type + [[nodiscard]] FormattedPlaceholder evalFormatterCall(FormattedPlaceholder&& argument, + MessageContext& context, + UErrorCode& status) const; + // Dispatches on function name + [[nodiscard]] FormattedPlaceholder evalFormatterCall(const FunctionName& functionName, + FormattedPlaceholder&& argument, + FunctionOptions&& options, + MessageContext& context, + UErrorCode& status) const; + // Formats an expression that appears as a selector + ResolvedSelector formatSelectorExpression(const Environment& env, const data_model::Expression&, MessageContext&, UErrorCode&) const; + // Formats an expression that appears in a pattern or as the definition of a local variable + [[nodiscard]] FormattedPlaceholder formatExpression(const Environment&, const data_model::Expression&, MessageContext&, UErrorCode&) const; + [[nodiscard]] FunctionOptions resolveOptions(const Environment& env, const OptionMap&, MessageContext&, UErrorCode&) const; + [[nodiscard]] FormattedPlaceholder formatOperand(const Environment&, const data_model::Operand&, MessageContext&, UErrorCode&) const; + [[nodiscard]] FormattedPlaceholder evalArgument(const data_model::VariableName&, MessageContext&, UErrorCode&) const; + void formatSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UnicodeString& result) const; + + // Function registry methods + bool hasCustomMFFunctionRegistry() const { + return (customMFFunctionRegistry != nullptr); + } + + // Precondition: custom function registry exists + // Note: this is non-const because the values in the MFFunctionRegistry are mutable + // (a FormatterFactory can have mutable state) + const MFFunctionRegistry& getCustomMFFunctionRegistry() const; + + bool isCustomFormatter(const FunctionName&) const; + FormatterFactory* lookupFormatterFactory(const FunctionName&, UErrorCode& status) const; + bool isBuiltInSelector(const FunctionName&) const; + bool isBuiltInFormatter(const FunctionName&) const; + bool isCustomSelector(const FunctionName&) const; + const SelectorFactory* lookupSelectorFactory(MessageContext&, const FunctionName&, UErrorCode&) const; + bool isSelector(const FunctionName& fn) const { return isBuiltInSelector(fn) || isCustomSelector(fn); } + bool isFormatter(const FunctionName& fn) const { return isBuiltInFormatter(fn) || isCustomFormatter(fn); } + const Formatter* lookupFormatter(const FunctionName&, UErrorCode&) const; + + Selector* getSelector(MessageContext&, const FunctionName&, UErrorCode&) const; + Formatter* getFormatter(const FunctionName&, UErrorCode&) const; + bool getDefaultFormatterNameByType(const UnicodeString&, FunctionName&) const; + + // Checking for resolution errors + void checkDeclarations(MessageContext&, Environment*&, UErrorCode&) const; + void check(MessageContext&, const Environment&, const data_model::Expression&, UErrorCode&) const; + void check(MessageContext&, const Environment&, const data_model::Operand&, UErrorCode&) const; + void check(MessageContext&, const Environment&, const OptionMap&, UErrorCode&) const; + + void initErrors(UErrorCode&); + void clearErrors() const; + void cleanup() noexcept; + + // The locale this MessageFormatter was created with + /* const */ Locale locale; + + // Registry for built-in functions + MFFunctionRegistry standardMFFunctionRegistry; + // Registry for custom functions; may be null if no custom registry supplied + // Note: this is *not* owned by the MessageFormatter object + // The reason for this choice is to have a non-destructive MessageFormatter::Builder, + // while also not requiring the function registry to be deeply-copyable. Making the + // function registry copyable would impose a requirement on any implementations + // of the FormatterFactory and SelectorFactory interfaces to implement a custom + // clone() method, which is necessary to avoid sharing between copies of the + // function registry (and thus double-frees) + // Not deeply immutable (the values in the function registry are mutable, + // as a FormatterFactory can have mutable state + const MFFunctionRegistry* customMFFunctionRegistry; + + // Data model, representing the parsed message + MFDataModel dataModel; + + // Normalized version of the input string (optional whitespace removed) + UnicodeString normalizedInput; + + // Errors -- only used while parsing and checking for data model errors; then + // the MessageContext keeps track of errors + // Must be a raw pointer to avoid including the internal header file + // defining StaticErrors + // Owned by `this` + StaticErrors* errors; + + }; // class MessageFormatter + +} // namespace message2 + +U_NAMESPACE_END + +#endif // U_HIDE_DEPRECATED_API + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_H + +// eof diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_arguments.h b/deps/icu-small/source/i18n/unicode/messageformat2_arguments.h new file mode 100644 index 00000000000000..f79865a43ff6e7 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2_arguments.h @@ -0,0 +1,138 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT2_ARGUMENTS_H +#define MESSAGEFORMAT2_ARGUMENTS_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +/** + * \file + * \brief C++ API: Formats messages using the draft MessageFormat 2.0. + */ + +#include "unicode/messageformat2_data_model_names.h" +#include "unicode/messageformat2_formattable.h" +#include "unicode/unistr.h" + +#ifndef U_HIDE_DEPRECATED_API + +#include + +U_NAMESPACE_BEGIN + +/// @cond DOXYGEN_IGNORE +// Export an explicit template instantiation of the LocalPointer that is used as a +// data member of various MessageFormatDataModel classes. +// (When building DLLs for Windows this is required.) +// (See measunit_impl.h, datefmt.h, collationiterator.h, erarules.h and others +// for similar examples.) +#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalArray; +template class U_I18N_API LocalArray; +#endif +/// @endcond + +namespace message2 { + + class MessageContext; + + // Arguments + // ---------- + + /** + * + * The `MessageArguments` class represents the named arguments to a message. + * It is immutable and movable. It is not copyable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API MessageArguments : public UObject { + public: + /** + * Message arguments constructor, which takes a map and returns a container + * of arguments that can be passed to a `MessageFormatter`. + * + * @param args A reference to a map from strings (argument names) to `message2::Formattable` + * objects (argument values). The keys and values of the map are copied into the result. + * @param status Input/output error code. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MessageArguments(const std::map& args, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + argumentNames = LocalArray(new UnicodeString[argsLen = (int32_t) args.size()]); + arguments = LocalArray(new Formattable[argsLen]); + if (!argumentNames.isValid() || !arguments.isValid()) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + int32_t i = 0; + for (auto iter = args.begin(); iter != args.end(); ++iter) { + argumentNames[i] = iter->first; + arguments[i] = iter->second; + i++; + } + } + /** + * Move operator: + * The source MessageArguments will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MessageArguments& operator=(MessageArguments&&) noexcept; + /** + * Default constructor. + * Returns an empty arguments mapping. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MessageArguments() = default; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~MessageArguments(); + private: + friend class MessageContext; + + const Formattable* getArgument(const data_model::VariableName&, UErrorCode&) const; + + // Avoids using Hashtable so that code constructing a Hashtable + // doesn't have to appear in this header file + LocalArray argumentNames; + LocalArray arguments; + int32_t argsLen = 0; + }; // class MessageArguments + +} // namespace message2 + +U_NAMESPACE_END + +#endif // U_HIDE_DEPRECATED_API + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_ARGUMENTS_H + +// eof diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h b/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h new file mode 100644 index 00000000000000..942a03f7359176 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h @@ -0,0 +1,3090 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT_DATA_MODEL_H +#define MESSAGEFORMAT_DATA_MODEL_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/localpointer.h" +#include "unicode/messageformat2_data_model_names.h" + +#ifndef U_HIDE_DEPRECATED_API + +#include +#include +#include +#include +#include +#include + +U_NAMESPACE_BEGIN + +class UVector; + +// Helpers + +// Note: this _must_ be declared `inline` or else gcc will generate code +// for its instantiations, which needs to be avoided because it returns +// a std::vector +template +static inline std::vector toStdVector(const T* arr, int32_t len) { + std::vector result; + for (int32_t i = 0; i < len; i++) { + result.push_back(arr[i]); + } + return result; +} + +#if defined(U_REAL_MSVC) +#pragma warning(push) +// Ignore warning 4251 as these templates are instantiated later in this file, +// after the classes used to instantiate them have been defined. +#pragma warning(disable: 4251) +#endif + +namespace message2 { + class Checker; + class MFDataModel; + class MessageFormatter; + class Parser; + class Serializer; + + + namespace data_model { + class Binding; + class Literal; + class Operator; + + /** + * The `Reserved` class represents a `reserved` annotation, as in the `reserved` nonterminal + * in the MessageFormat 2 grammar or the `Reserved` interface + * defined in + * https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#expressions + * + * `Reserved` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Reserved : public UMemory { + public: + /** + * A `Reserved` is a sequence of literals. + * + * @return The number of literals. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + int32_t numParts() const; + /** + * Indexes into the sequence. + * Precondition: i < numParts() + * + * @param i Index of the part being accessed. + * @return A reference to he i'th literal in the sequence + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const Literal& getPart(int32_t i) const; + + /** + * The mutable `Reserved::Builder` class allows the reserved sequence to be + * constructed one part at a time. + * + * Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UMemory { + private: + UVector* parts; // Not a LocalPointer for the same reason as in `SelectorKeys::Builder` + + public: + /** + * Adds a single literal to the reserved sequence. + * + * @param part The literal to be added. Passed by move. + * @param status Input/output error code + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& add(Literal&& part, UErrorCode& status) noexcept; + /** + * Constructs a new immutable `Reserved` using the list of parts + * set with previous `add()` calls. + * + * The builder object (`this`) can still be used after calling `build()`. + * + * param status Input/output error code + * @return The new Reserved object + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Reserved build(UErrorCode& status) const noexcept; + /** + * Default constructor. + * Returns a builder with an empty Reserved sequence. + * + * param status Input/output error code + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; + Builder(Builder&&) = delete; + Builder& operator=(Builder&&) = delete; + }; // class Reserved::Builder + /** + * Non-member swap function. + * @param r1 will get r2's contents + * @param r2 will get r1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Reserved& r1, Reserved& r2) noexcept { + using std::swap; + + swap(r1.bogus, r2.bogus); + swap(r1.parts, r2.parts); + swap(r1.len, r2.len); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Reserved(const Reserved& other); + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Reserved& operator=(Reserved) noexcept; + /** + * Default constructor. + * Puts the Reserved into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Reserved() { parts = LocalArray(); } + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Reserved(); + private: + friend class Builder; + friend class Operator; + + // True if a copy failed; this has to be distinguished + // from a valid `Reserved` with empty parts + bool bogus = false; + + // Possibly-empty list of parts + // `literal` reserved as a quoted literal; `reserved-char` / `reserved-escape` + // strings represented as unquoted literals + /* const */ LocalArray parts; + int32_t len = 0; + + Reserved(const UVector& parts, UErrorCode& status) noexcept; + // Helper + static void initLiterals(Reserved&, const Reserved&); + }; + + /** + * The `Literal` class corresponds to the `literal` nonterminal in the MessageFormat 2 grammar, + * https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf and the + * `Literal` interface defined in + * // https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#expressions + * + * `Literal` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Literal : public UObject { + public: + /** + * Returns the quoted representation of this literal (enclosed in '|' characters) + * + * @return A string representation of the literal enclosed in quote characters. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UnicodeString quoted() const; + /** + * Returns the parsed string contents of this literal. + * + * @return A string representation of this literal. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const UnicodeString& unquoted() const; + /** + * Determines if this literal appeared as a quoted literal in the message. + * + * @return true if and only if this literal appeared as a quoted literal in the + * message. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isQuoted() const { return thisIsQuoted; } + /** + * Literal constructor. + * + * @param q True if and only if this literal was parsed with the `quoted` nonterminal + * (appeared enclosed in '|' characters in the message text). + * @param s The string contents of this literal; escape sequences are assumed to have + * been interpreted already. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Literal(UBool q, const UnicodeString& s) : thisIsQuoted(q), contents(s) {} + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Literal(const Literal& other) : thisIsQuoted(other.thisIsQuoted), contents(other.contents) {} + /** + * Non-member swap function. + * @param l1 will get l2's contents + * @param l2 will get l1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Literal& l1, Literal& l2) noexcept { + using std::swap; + + swap(l1.thisIsQuoted, l2.thisIsQuoted); + swap(l1.contents, l2.contents); + } + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Literal& operator=(Literal) noexcept; + /** + * Default constructor. + * Puts the Literal into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Literal() = default; + /** + * Less than operator. Compares `this.stringContents()` with + * `other.stringContents()`. This method is used in representing + * the mapping from key lists to patterns in a message with variants, + * and is not expected to be useful otherwise. + * + * @param other The Literal to compare to this one. + * @return true if the parsed string corresponding to this `Literal` + * is less than the parsed string corresponding to the other `Literal` + * (according to `UnicodeString`'s less-than operator). + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool operator<(const Literal& other) const; + /** + * Equality operator. Compares `this.stringContents()` with + * `other.stringContents()`. This method is used in representing + * the mapping from key lists to patterns in a message with variants, + * and is not expected to be useful otherwise. + * + * @param other The Literal to compare to this one. + * @return true if the parsed string corresponding to this `Literal` + * equals the parsed string corresponding to the other `Literal` + * (according to `UnicodeString`'s equality operator). + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool operator==(const Literal& other) const; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Literal(); + + private: + friend class Reserved::Builder; + + /* const */ bool thisIsQuoted = false; + /* const */ UnicodeString contents; + }; + } // namespace data_model +} // namespace message2 + +/// @cond DOXYGEN_IGNORE +// Export an explicit template instantiation of the LocalPointer that is used as a +// data member of various MFDataModel classes. +// (When building DLLs for Windows this is required.) +// (See measunit_impl.h, datefmt.h, collationiterator.h, erarules.h and others +// for similar examples.) +#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalArray; +#endif +#if defined(U_REAL_MSVC) +#pragma warning(pop) +#endif +/// @endcond + +U_NAMESPACE_END + +/// @cond DOXYGEN_IGNORE +// Export an explicit template instantiation of the std::variants and std::optionals +// that are used as a data member of various MFDataModel classes. +// (When building DLLs for Windows this is required.) +// (See measunit_impl.h, datefmt.h, collationiterator.h, erarules.h and others +// for similar examples.) +#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +#if defined(U_REAL_MSVC) && defined(_MSVC_STL_VERSION) +struct U_I18N_API std::_Nontrivial_dummy_type; +template class U_I18N_API std::_Variant_storage_; +#endif +template class U_I18N_API std::variant; +template class U_I18N_API std::optional>; +template class U_I18N_API std::optional; +#endif +/// @endcond + +U_NAMESPACE_BEGIN + +namespace message2 { + namespace data_model { + + /** + * The `Operand` class corresponds to the `operand` nonterminal in the MessageFormat 2 grammar, + * https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf . + * It represents a `Literal | VariableRef` -- see the `operand?` field of the `FunctionRef` + * interface defined at: + * https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#expressions + * with the difference that it can also represent a null operand (the absent operand in an + * `annotation` with no operand). + * + * `Operand` is immutable and is copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Operand : public UObject { + public: + /** + * Determines if this operand represents a variable. + * + * @return True if and only if the operand is a variable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isVariable() const; + /** + * Determines if this operand represents a literal. + * + * @return True if and only if the operand is a literal. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isLiteral() const; + /** + * Determines if this operand is the null operand. + * + * @return True if and only if the operand is the null operand. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual UBool isNull() const; + /** + * Returns a reference to this operand's variable name. + * Precondition: isVariable() + * + * @return A reference to the name of the variable + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const UnicodeString& asVariable() const; + /** + * Returns a reference to this operand's literal contents. + * Precondition: isLiteral() + * + * @return A reference to the literal + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const Literal& asLiteral() const; + /** + * Default constructor. + * Creates a null Operand. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Operand() : contents(std::nullopt) {} + /** + * Variable operand constructor. + * + * @param v The variable name; an operand corresponding + * to a reference to `v` is returned. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + explicit Operand(const UnicodeString& v) : contents(VariableName(v)) {} + /** + * Literal operand constructor. + * + * @param l The literal to use for this operand; an operand + * corresponding to `l` is returned. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + explicit Operand(const Literal& l) : contents(l) {} + /** + * Non-member swap function. + * @param o1 will get o2's contents + * @param o2 will get o1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Operand& o1, Operand& o2) noexcept { + using std::swap; + (void) o1; + (void) o2; + swap(o1.contents, o2.contents); + } + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual Operand& operator=(Operand) noexcept; + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Operand(const Operand&); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Operand(); + private: + std::optional> contents; + }; // class Operand + + /** + * The `Key` class corresponds to the `key` nonterminal in the MessageFormat 2 grammar, + * https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf . + * It also corresponds to + * the `Literal | CatchallKey` that is the + * element type of the `keys` array in the `Variant` interface + * defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#messages + * + * A key is either a literal or the wildcard symbol (represented in messages as '*') + * + * `Key` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Key : public UObject { + public: + /** + * Determines if this is a wildcard key + * + * @return True if and only if this is the wildcard key + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isWildcard() const { return !contents.has_value(); } + /** + * Returns the contents of this key as a literal. + * Precondition: !isWildcard() + * + * @return The literal contents of the key + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const Literal& asLiteral() const; + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Key(const Key& other) : contents(other.contents) {} + /** + * Wildcard constructor; constructs a Key representing the + * catchall or wildcard key, '*'. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Key() : contents(std::nullopt) {} + /** + * Literal key constructor. + * + * @param lit A Literal to use for this key. The result matches the + * literal `lit`. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + explicit Key(const Literal& lit) : contents(lit) {} + /** + * Non-member swap function. + * @param k1 will get k2's contents + * @param k2 will get k1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Key& k1, Key& k2) noexcept { + using std::swap; + + swap(k1.contents, k2.contents); + } + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Key& operator=(Key) noexcept; + /** + * Less than operator. Compares the literal of `this` with the literal of `other`. + * This method is used in representing the mapping from key lists to patterns + * in a message with variants, and is not expected to be useful otherwise. + * + * @param other The Key to compare to this one. + * @return true if the two `Key`s are not wildcards and if `this.asLiteral()` + * < `other.asLiteral()`. + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool operator<(const Key& other) const; + /** + * Equality operator. Compares the literal of `this` with the literal of `other`. + * This method is used in representing the mapping from key lists to patterns + * in a message with variants, and is not expected to be useful otherwise. + * + * @param other The Key to compare to this one. + * @return true if either both `Key`s are wildcards, or `this.asLiteral()` + * == `other.asLiteral()`. + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool operator==(const Key& other) const; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Key(); + private: + /* const */ std::optional contents; + }; // class Key + } // namespace data_model +} // namespace message2 + +/// @cond DOXYGEN_IGNORE +// Export an explicit template instantiation of the LocalPointer that is used as a +// data member of various MFDataModel classes. +// (When building DLLs for Windows this is required.) +// (See measunit_impl.h, datefmt.h, collationiterator.h, erarules.h and others +// for similar examples.) +#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalArray; +#endif +/// @endcond + +namespace message2 { + namespace data_model { + /** + * The `SelectorKeys` class represents the key list for a single variant. + * It corresponds to the `keys` array in the `Variant` interface + * defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#messages + * + * `SelectorKeys` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API SelectorKeys : public UObject { + public: + /** + * Returns the underlying list of keys. + * + * @return The list of keys for this variant. + * Returns an empty list if allocating this `SelectorKeys` + * object previously failed. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + std::vector getKeys() const { + return toStdVector(keys.getAlias(), len); + } + /** + * The mutable `SelectorKeys::Builder` class allows the key list to be constructed + * one key at a time. + * + * Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UMemory { + private: + friend class SelectorKeys; + UVector* keys; // This is a raw pointer and not a LocalPointer to avoid undefined behavior warnings, + // since UVector is forward-declared + // The vector owns its elements + public: + /** + * Adds a single key to the list. + * + * @param key The key to be added. Passed by move + * @param status Input/output error code + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& add(Key&& key, UErrorCode& status) noexcept; + /** + * Constructs a new immutable `SelectorKeys` using the list of keys + * set with previous `add()` calls. + * + * The builder object (`this`) can still be used after calling `build()`. + * + * @param status Input/output error code + * @return The new SelectorKeys object + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + SelectorKeys build(UErrorCode& status) const; + /** + * Default constructor. + * Returns a Builder with an empty list of keys. + * + * @param status Input/output error code + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; + Builder(Builder&&) = delete; + Builder& operator=(Builder&&) = delete; + }; // class SelectorKeys::Builder + /** + * Less than operator. Compares the two key lists lexicographically. + * This method makes it possible for a `SelectorKeys` to be used as a map + * key, which allows variants to be represented as a map. It is not expected + * to be useful otherwise. + * + * @param other The SelectorKeys to compare to this one. + * @return true if `this` is less than `other`, comparing the two key lists + * lexicographically. + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool operator<(const SelectorKeys& other) const; + /** + * Default constructor. + * Puts the SelectorKeys into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + SelectorKeys() : len(0) {} + /** + * Non-member swap function. + * @param s1 will get s2's contents + * @param s2 will get s1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(SelectorKeys& s1, SelectorKeys& s2) noexcept { + using std::swap; + + swap(s1.len, s2.len); + swap(s1.keys, s2.keys); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + SelectorKeys(const SelectorKeys& other); + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + SelectorKeys& operator=(SelectorKeys other) noexcept; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~SelectorKeys(); + private: + friend class Builder; + friend class message2::Checker; + friend class message2::MessageFormatter; + friend class message2::Serializer; + + /* const */ LocalArray keys; + /* const */ int32_t len; + + const Key* getKeysInternal() const; + SelectorKeys(const UVector& ks, UErrorCode& status); + }; // class SelectorKeys + + + } // namespace data_model + + + namespace data_model { + class Operator; + + /** + * An `Option` pairs an option name with an Operand. + * + * `Option` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Option : public UObject { + public: + /** + * Accesses the right-hand side of the option. + * + * @return A reference to the operand. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const Operand& getValue() const { return rand; } + /** + * Accesses the left-hand side of the option. + * + * @return A reference to the option name. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const UnicodeString& getName() const { return name; } + /** + * Constructor. Returns an `Option` representing the + * named option "name=rand". + * + * @param n The name of the option. + * @param r The value of the option. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Option(const UnicodeString& n, Operand&& r) : name(n), rand(std::move(r)) {} + /** + * Default constructor. + * Returns an Option in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Option() {} + /** + * Non-member swap function. + * @param o1 will get o2's contents + * @param o2 will get o1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Option& o1, Option& o2) noexcept { + using std::swap; + + swap(o1.name, o2.name); + swap(o1.rand, o2.rand); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Option(const Option& other); + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Option& operator=(Option other) noexcept; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Option(); + private: + /* const */ UnicodeString name; + /* const */ Operand rand; + }; // class Option + } // namespace data_model +} // namespace message2 + + /// @cond DOXYGEN_IGNORE +// Export an explicit template instantiation of the LocalPointer that is used as a +// data member of various MFDataModel classes. +// (When building DLLs for Windows this is required.) +// (See measunit_impl.h, datefmt.h, collationiterator.h, erarules.h and others +// for similar examples.) +#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalArray; +#endif +/// @endcond + +namespace message2 { + namespace data_model { + // Internal only + #ifndef U_IN_DOXYGEN + // Options + // This is a wrapper class around a vector of options that provides lookup operations + class U_I18N_API OptionMap : public UObject { + public: + int32_t size() const; + // Needs to take an error code b/c an earlier copy might have failed + const Option& getOption(int32_t, UErrorCode&) const; + friend inline void swap(OptionMap& m1, OptionMap& m2) noexcept { + using std::swap; + + swap(m1.bogus, m2.bogus); + swap(m1.options, m2.options); + swap(m1.len, m2.len); + } + OptionMap() : len(0) {} + OptionMap(const OptionMap&); + OptionMap& operator=(OptionMap); + std::vector