diff --git a/.github/README.md b/.github/HOWTO.md similarity index 100% rename from .github/README.md rename to .github/HOWTO.md diff --git a/.github/adaboost.json b/.github/adaboost.json index 639fd6a99da..33913ba8659 100644 --- a/.github/adaboost.json +++ b/.github/adaboost.json @@ -1,6 +1,6 @@ // © 2022 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml +// Generated using tools/cldr/cldr-to-icu/ // // Include Japanese adaboost model. { diff --git a/.github/lstm_for_th_my.json b/.github/lstm_for_th_my.json index b4aeb24d0ed..6c7e3e743da 100644 --- a/.github/lstm_for_th_my.json +++ b/.github/lstm_for_th_my.json @@ -1,6 +1,6 @@ // © 2021 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml +// Generated using tools/cldr/cldr-to-icu/ // // Include Burmese and Thai lstm models. { diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 06f5daf5109..931c20e9848 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,25 +1,25 @@ TODO: Please describe your changes here. -TODO: Delete the following lines but _keep and fill out_ (!) the checklist below. +TODO: Please read the following on ICU Contributing, and then delete these instructions. -Thank you for your pull request!\ -General info on contributing: Please see https://github.com/unicode-org/icu/blob/main/CONTRIBUTING.md +Thank you for your pull request! -Contributors license agreement (CLA): -- You will be automatically asked to sign the CLA before the PR is accepted. -- To sign the CLA: https://cla-assistant.io/unicode-org/icu +* For general info on contributing: https://github.com/unicode-org/icu/blob/main/CONTRIBUTING.md +* Associating PRs with Jira issues + - We require each pull request to be associated with a [Jira issue](https://icu.unicode.org/bugs). + - Reuse existing issues for minor changes: + * ICU 77 docs minor fixes: ICU-22921 — User Guide & API docs typos etc., and version updates (e.g., dependabot for User Guide) + * ICU 77 code warnings/version updates: ICU-22920 — Fix compiler warnings. Update versions of code-related dependencies (e.g., dependabot). +* Contributors license agreement (CLA): + - You will be automatically asked to sign the CLA before the PR is accepted. + - To sign the CLA: https://cla-assistant.io/unicode-org/icu + - For terms of use and license, see https://www.unicode.org/terms_of_use.html -For terms of use and license, see https://www.unicode.org/terms_of_use.html - -TODO: End of lines to delete. +TODO: Fill out the checklist below. #### Checklist -- [ ] Required: Issue filed: https://unicode-org.atlassian.net/browse/ICU-NNNNN - - For minor changes you can use one of the following per-release tickets: - - ICU 77 code warnings/version updates: ICU-22920 — Fix compiler warnings. Update versions of code-related dependencies (e.g., dependabot). - - ICU 77 docs minor fixes: ICU-22921 — User Guide & API docs typos etc., and version updates (e.g., dependabot for User Guide) +- [ ] Required: Issue filed: ICU-NNNNN - [ ] Required: The PR title must be prefixed with a JIRA Issue number. Example: "ICU-1234 Fix xyz" -- [ ] Required: The PR description must include the link to the Jira Issue, for example by completing the URL in the first checklist item - [ ] Required: Each commit message must be prefixed with a JIRA Issue number. Example: "ICU-1234 Fix xyz" - [ ] Issue accepted (done by Technical Committee after discussion) - [ ] Tests included, if applicable diff --git a/.github/workflows/cache_retain.yml b/.github/workflows/cache_retain.yml index 853d42ba8ba..7d679bbd032 100644 --- a/.github/workflows/cache_retain.yml +++ b/.github/workflows/cache_retain.yml @@ -35,7 +35,11 @@ permissions: jobs: retain-maven-cache: name: Run all tests with Maven - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS + # Only run this on the upstream repo. Otherwise, running in a personal fork will cause + # Github to disable the personal fork copy of the workflow + # (Github complains about running a scheduled workflow on a repo with > 60 days of inactivity) + if: github.ref == 'refs/heads/main' && github.repository == 'unicode-org/unicodetools' steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 37ac83bf5b5..1e34fc4f989 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -26,7 +26,7 @@ on: permissions: {} jobs: Fuzzing: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS permissions: security-events: write strategy: diff --git a/.github/workflows/icu4c.yml b/.github/workflows/icu4c.yml index a4c8ff409ea..0dcb475952a 100644 --- a/.github/workflows/icu4c.yml +++ b/.github/workflows/icu4c.yml @@ -42,7 +42,7 @@ jobs: # ICU4C docs build using doxygen.. icu4c-docs-build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -65,7 +65,7 @@ jobs: # # Invokes test/hdrtst to check public headers compliance. gcc-debug-build-and-test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -85,7 +85,7 @@ jobs: #gcc 11 with c++ 20 gcc11-cpp20: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install GCC-11 @@ -110,7 +110,7 @@ jobs: # (FORCE guards make this tool pass but won't compile to working code. # See the testtagsguards.sh script for details.) clang-release-build-and-test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -158,7 +158,7 @@ jobs: build_option: [ --enable-static, --enable-static --disable-shared ] # --disable-shared has a build problem. - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -174,7 +174,7 @@ jobs: # Out of source build with gcc 10, c++14, and extra warnings; executes icuinfo. gcc-10-stdlib17: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -195,7 +195,7 @@ jobs: # Clang Linux with address sanitizer. clang-asan: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -209,7 +209,7 @@ jobs: LDFLAGS: -fsanitize=address # Clang Linux with leak sanitizer. clang-lsan: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -224,7 +224,7 @@ jobs: ASAN_OPTIONS: detect_leaks=1 # Clang Linux with undefined-behavior sanitizer. clang-ubsan: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -239,7 +239,7 @@ jobs: LDFLAGS: -fsanitize=undefined -fsanitize=alignment -fno-sanitize-recover=undefined,alignment # Control Flow Integrity. clang-cfi: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -258,7 +258,7 @@ jobs: # Clang Linux with thread sanitizer. clang-tsan: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -280,7 +280,7 @@ jobs: # this check became flaky. The build apparently was not done copying one or another .ucm file before # calling makeconv for it, although the Makefile has appropriate dependencies. clang-datafilter: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Extract ICU version @@ -302,7 +302,7 @@ jobs: # Clang Linux with CPP 17 clang-cpp17: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Build ICU4C with CPP 17 @@ -313,7 +313,7 @@ jobs: # Clang Linux with LANG: en_US@calendar=gregorian;hours=h12 clang-lang-with-extn-tags: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Linux Clang - LANG has extension tags @@ -324,7 +324,7 @@ jobs: # Clang Linux 18 with CPP20 and treat warnings as errors clang18-cpp20-warning-as-errors: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS strategy: fail-fast: false matrix: @@ -349,7 +349,7 @@ jobs: # MacOS with clang macos-clang: - runs-on: macos-latest + runs-on: macos-14 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ICU4C with clang on MacOS @@ -362,7 +362,7 @@ jobs: # Windows MSVC builds windows-msvc: - runs-on: windows-2022 + runs-on: windows-2022 # Updated in BRS strategy: fail-fast: false matrix: @@ -383,10 +383,10 @@ jobs: uses: microsoft/setup-msbuild@v2 - name: Build Solution x64 if: contains(matrix.test_flags, 'arm Release') - run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 /p:SkipUWP=true - name: Build Solution run: | - msbuild icu4c/source/allinone/allinone.sln ${{ matrix.build_flags }} + msbuild icu4c/source/allinone/allinone.sln ${{ matrix.build_flags }} /p:SkipUWP=true - name: Run ${{ matrix.test_flags }} Tests (icucheck.bat) if: contains(matrix.test_flags, 'arm Release') == false run: | @@ -394,7 +394,7 @@ jobs: # Windows data filter build windows-msvc-datafilter: - runs-on: windows-latest + runs-on: windows-2022 # Updated in BRS timeout-minutes: 30 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -410,7 +410,7 @@ jobs: # Windows MSVC distribution release windows-msvc-dist-release: - runs-on: windows-latest + runs-on: windows-2022 # Updated in BRS permissions: contents: write # So that we can upload to release timeout-minutes: 30 @@ -433,9 +433,9 @@ jobs: uses: microsoft/setup-msbuild@v2 - name: Build Solution x64 if: contains(matrix.win_ver, 'ARM64') - run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 /p:SkipUWP=true - name: Build Solution - run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=${{ matrix.plat }} + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=Release /p:Platform=${{ matrix.plat }} /p:SkipUWP=true - name: Run Tests (icucheck.bat) if: contains(matrix.win_ver, 'ARM64') == false run: icu4c/source/allinone/icucheck.bat ${{ matrix.arch }} Release @@ -482,7 +482,7 @@ jobs: # Window MSYS2 tests windows-msys2-gcc-x86_64: - runs-on: windows-latest + runs-on: windows-2022 # Updated in BRS timeout-minutes: 45 defaults: run: @@ -519,7 +519,7 @@ jobs: # Run ICU4C tests with stubdata. run-with-stubdata: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -562,7 +562,7 @@ jobs: # Test U_CHARSET_IS_UTF8 u-charset-is-utf8-test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: | @@ -572,7 +572,7 @@ jobs: # Test U_OVERRIDE_CXX_ALLOCATION-is-0-test u-override-cxx-allocation-is-0-test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: | @@ -583,7 +583,7 @@ jobs: # Test LSTM lstm-test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: | @@ -594,7 +594,7 @@ jobs: # Test adaboost adaboost-test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: | @@ -605,7 +605,7 @@ jobs: # Build and run testmap testmap: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: | @@ -618,28 +618,28 @@ jobs: # Copyright scan copyright-scan: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: perl tools/scripts/cpysearch/cpyscan.pl # Check compilation of internal headers. internal-header-compilation: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: cd icu4c/source; test/hdrtst/testinternalheaders.sh # Check source files for valid UTF-8 and for absence of BOM. valid-UTF-8-and-no-BOM-check: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - run: tools/scripts/icu-file-utf8-check.py # Run unit tests with UCONFIG_NO_XXX variations. uconfig-unit-tests: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS strategy: # "fail-fast: false" lets other jobs keep running even if the test breaks in some other uconfig. fail-fast: false @@ -686,7 +686,7 @@ jobs: # Run header tests with UCONFIG_NO_XXX variations. uconfig-header-tests: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS strategy: # "fail-fast: false" lets other jobs keep running even if the test breaks in some other uconfig. fail-fast: false @@ -737,7 +737,7 @@ jobs: # Build Unicode update tools unicode-update-tools: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: bazelbuild/setup-bazelisk@b39c379c82683a5f25d34f0d062761f62693e0b2 # v3.0.0 @@ -776,7 +776,7 @@ jobs: # Build and run ICU4C samples icu4c-test-samples: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -801,7 +801,7 @@ jobs: # https://unicode-org.github.io/icu/processes/release/tasks/integration.html#verify-that-icu4c-tests-pass-without-collation-rule-strings icu4c-without-collation-rule-strings: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install hjson dependency @@ -841,7 +841,7 @@ jobs: # https://unicode-org.github.io/icu/processes/release/tasks/healthy-code.html#test-uconfig_no_conversion icu4c-uconfig-no-conversion: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Set UCONFIG_NO_CONVERSION and configure ICU4C @@ -861,7 +861,7 @@ jobs: # Workflow for ICU Export Data for ICU4X icu4c-icuexportdata: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS permissions: contents: write # So that we can upload to release timeout-minutes: 30 diff --git a/.github/workflows/icu4j.yml b/.github/workflows/icu4j.yml index 538725ba717..8086dc8bff6 100644 --- a/.github/workflows/icu4j.yml +++ b/.github/workflows/icu4j.yml @@ -44,7 +44,7 @@ jobs: # This job is created according to the cache strategy of reuse from a single job: # https://github.com/actions/cache/blob/main/caching-strategies.md#make-cache-read-only--reuse-cache-from-centralized-job icu4j-mvn-init-cache: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@v4 @@ -76,7 +76,7 @@ jobs: fail-fast: false matrix: java-version: [ '8', '11', '17', '21' ] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@v4 @@ -109,7 +109,7 @@ jobs: lstm-icu4j-build-and-test: if: false # TODO(ICU-22505) needs: icu4j-mvn-init-cache - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@v4 @@ -150,7 +150,7 @@ jobs: adaboost-icu4j-build-and-test: if: false # Temporary disable, until we disable the .jar creation from C and distribute the individual files needs: icu4j-mvn-init-cache - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@v4 diff --git a/.github/workflows/icu_common.yml b/.github/workflows/icu_common.yml index 2b9c1d86c5c..e8b548fbe7e 100644 --- a/.github/workflows/icu_common.yml +++ b/.github/workflows/icu_common.yml @@ -33,14 +33,14 @@ jobs: # Copyright scan copyright-scan: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@v4 - run: perl tools/scripts/cpysearch/cpyscan.pl # Check source files for valid UTF-8 and for absence of BOM. valid-UTF-8-and-no-BOM-check: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@v4 - run: tools/scripts/icu-file-utf8-check.py @@ -50,7 +50,7 @@ jobs: # This job is created according to the cache strategy of reuse from a single job: # https://github.com/actions/cache/blob/main/caching-strategies.md#make-cache-read-only--reuse-cache-from-centralized-job icu4j-mvn-init-cache: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@v4 @@ -77,7 +77,7 @@ jobs: # Verify icu4c release tools buildability. icu4c-release-tools: needs: icu4j-mvn-init-cache - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@v4 - name: Restore read-only cache of local Maven repository diff --git a/.github/workflows/icu_docs.yml b/.github/workflows/icu_docs.yml index 239ee4afb8d..51b2e4765f7 100644 --- a/.github/workflows/icu_docs.yml +++ b/.github/workflows/icu_docs.yml @@ -37,7 +37,7 @@ jobs: # Keep in sync with deploy workflow in `jekyll-gh-pages.yml` test-docs-build: name: Test build of User Guide docs - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/icu_envtest.yml b/.github/workflows/icu_envtest.yml index b88aac33bb0..d52d359d40c 100644 --- a/.github/workflows/icu_envtest.yml +++ b/.github/workflows/icu_envtest.yml @@ -25,7 +25,7 @@ jobs: #================================================================= # locale env tests. env-test-locale: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS strategy: # "fail-fast: false" let other jobs keep running even if the test break in some locales. fail-fast: false @@ -82,7 +82,7 @@ jobs: #================================================================= # tz env tests. env-test-tz: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS strategy: # "fail-fast: false" let other jobs keep running even if the test break in some timezones. fail-fast: false diff --git a/.github/workflows/icu_exhaustive_tests.yml b/.github/workflows/icu_exhaustive_tests.yml index 88f25ed9c8d..e83e79d092c 100644 --- a/.github/workflows/icu_exhaustive_tests.yml +++ b/.github/workflows/icu_exhaustive_tests.yml @@ -38,7 +38,7 @@ concurrency: jobs: # Runs exhaustive tests for ICU4J on Linux icu4j-linux: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS timeout-minutes: 180 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -55,7 +55,7 @@ jobs: icu4c-linux-clang: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS timeout-minutes: 120 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 diff --git a/.github/workflows/icu_merge_ci.yml b/.github/workflows/icu_merge_ci.yml index 76a94b99479..51d264e7ac8 100644 --- a/.github/workflows/icu_merge_ci.yml +++ b/.github/workflows/icu_merge_ci.yml @@ -36,7 +36,7 @@ jobs: # This job is created according to the cache strategy of reuse from a single job: # https://github.com/actions/cache/blob/main/caching-strategies.md#make-cache-read-only--reuse-cache-from-centralized-job icu4j-mvn-init-cache: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -62,7 +62,7 @@ jobs: # Test ICU4J with little-endian ICU4C data only icu4j-little-endian-data-test: needs: icu4j-mvn-init-cache - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -97,7 +97,7 @@ jobs: icu4c-store-perf-libs: # Run performance tests only on the main branch of the ICU repository. if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -138,7 +138,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Create directory for lib files @@ -212,7 +212,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Create directory for lib files @@ -277,7 +277,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Create directory for lib files @@ -326,7 +326,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -388,7 +388,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -452,7 +452,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -521,7 +521,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -660,7 +660,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -743,7 +743,7 @@ jobs: contents: write deployments: write - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout and setup uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -807,7 +807,7 @@ jobs: if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main' name: Copy perf data to remote repo for visualization needs: [icu4c-performance-tests, icu4c-performance-tests-with-files, icu4c-strsrchperf, icu4j-unicodesetperf, icu4j-ucharacterperf, icu4j-decimalformatperf, icu4j-normperf, icu4j-converterperf, icu4j-dateformatperf] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -827,7 +827,7 @@ jobs: # Build ICU and tests sample on some windows configurations icu4c-windows-msvc-postmerge: - runs-on: windows-2022 + runs-on: windows-2022 # Updated in BRS timeout-minutes: 30 strategy: matrix: @@ -843,16 +843,16 @@ jobs: - name: Set up MSBuild uses: microsoft/setup-msbuild@v2 - name: Build Solution - run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }} + run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }} /p:SkipUWP=true - name: Run Tests (icucheck.bat) run: icu4c/source/allinone/icucheck.bat ${{ matrix.arch }} ${{ matrix.config }} - name: Build Sample Solution - run: msbuild icu4c/source/samples/all/all.sln /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.arch }} + run: msbuild icu4c/source/samples/all/all.sln /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.arch }} /p:SkipUWP=true - name: Test Samples (samplecheck.bat) run: icu4c/source/samples/all/samplecheck.bat ${{ matrix.arch }} ${{ matrix.config }} icu4c-windows-cygwin-gcc: - runs-on: windows-latest + runs-on: windows-2022 # Updated in BRS timeout-minutes: 50 env: ICU_CI_CACHE: c:\icu-ci-cache diff --git a/.github/workflows/icu_valgrind.yml b/.github/workflows/icu_valgrind.yml index 1f406e8fe23..c0a70e26310 100644 --- a/.github/workflows/icu_valgrind.yml +++ b/.github/workflows/icu_valgrind.yml @@ -34,7 +34,7 @@ permissions: jobs: clang-valgrind-test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Install valgrind run: | @@ -72,7 +72,7 @@ jobs: --show-reachable=yes ./icuinfo; clang-valgrind-intltest: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS strategy: # "fail-fast: false" lets other jobs keep running even if the test breaks in some other test. fail-fast: false diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml index d1cb05b7978..691950f0fbe 100644 --- a/.github/workflows/jekyll-gh-pages.yml +++ b/.github/workflows/jekyll-gh-pages.yml @@ -34,7 +34,7 @@ jobs: # Build job # Keep in sync with docs test workflow in `icu_docs.yml` build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -71,7 +71,7 @@ jobs: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS needs: build steps: - name: Deploy to GitHub Pages diff --git a/.github/workflows/maven.yaml b/.github/workflows/maven.yaml index 131e9881fec..8f1b1c116aa 100644 --- a/.github/workflows/maven.yaml +++ b/.github/workflows/maven.yaml @@ -14,7 +14,7 @@ permissions: jobs: publish: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS permissions: packages: write outputs: diff --git a/.github/workflows/release-check-sign.yml b/.github/workflows/release-check-sign.yml index 96464ace309..6ed0da2eddd 100644 --- a/.github/workflows/release-check-sign.yml +++ b/.github/workflows/release-check-sign.yml @@ -13,7 +13,7 @@ env: jobs: sign_and_checksums: if: ${{ inputs.gitReleaseTag && startsWith(inputs.gitReleaseTag, 'release-') }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS environment: release-env permissions: diff --git a/.github/workflows/release-icu4c-fedora.yml b/.github/workflows/release-icu4c-fedora.yml index b8757fa1fb1..b64729377ba 100644 --- a/.github/workflows/release-icu4c-fedora.yml +++ b/.github/workflows/release-icu4c-fedora.yml @@ -16,7 +16,7 @@ env: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS environment: release-env container: diff --git a/.github/workflows/release-icu4c-ubuntu.yml b/.github/workflows/release-icu4c-ubuntu.yml index c53ee7cbe28..c0418d47827 100644 --- a/.github/workflows/release-icu4c-ubuntu.yml +++ b/.github/workflows/release-icu4c-ubuntu.yml @@ -16,7 +16,7 @@ env: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS environment: release-env permissions: diff --git a/.github/workflows/release-icu4j-maven.yml b/.github/workflows/release-icu4j-maven.yml index c7f918be0cc..33c6fa40e1d 100644 --- a/.github/workflows/release-icu4j-maven.yml +++ b/.github/workflows/release-icu4j-maven.yml @@ -39,7 +39,7 @@ env: jobs: publish: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS environment: release-env permissions: diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 380efec2f68..16f648c9ad8 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -20,7 +20,7 @@ permissions: read-all jobs: analysis: name: Scorecard analysis - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS permissions: # Needed to upload the results to code-scanning dashboard. security-events: write diff --git a/.github/workflows/wait-for-checks.yml b/.github/workflows/wait-for-checks.yml index 56eac3b305f..667defbbf6b 100644 --- a/.github/workflows/wait-for-checks.yml +++ b/.github/workflows/wait-for-checks.yml @@ -15,7 +15,7 @@ on: jobs: enforce-all-checks: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS permissions: checks: read steps: diff --git a/KEYS b/KEYS index fedeaa2b620..9523c0beaf6 100644 --- a/KEYS +++ b/KEYS @@ -1312,3 +1312,36 @@ buAuLkKKI35T4Lz2U41GMVIMZ7drlhbfDGugk1qT1cXJPZbPnHt+uFNUY0pTJaf3 WapxBp2/lKhgsIE= =ZWln -----END PGP PUBLIC KEY BLOCK----- +pub ed25519 2024-08-19 [SC] [expires: 2027-08-19] + E52F07877A5805F9AF4AB0ACD46C5610D06E7001 +uid [ultimate] ICU Release Robot +sig 3 D46C5610D06E7001 2024-08-19 ICU Release Robot +sig 3 9B432B27D1BA20D7 2024-10-01 Fredrik Roubert +sub cv25519 2024-08-19 [E] [expires: 2027-08-19] +sig D46C5610D06E7001 2024-08-19 ICU Release Robot + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZsO4fRYJKwYBBAHaRw8BAQdAcxaiyqFbaECpSz7mhsXzopzN9Cxwv80WlWGN +gM3qpOi0KUlDVSBSZWxlYXNlIFJvYm90IDxpY3Utcm9ib3RAdW5pY29kZS5vcmc+ +iJkEExYKAEEWIQTlLweHelgF+a9KsKzUbFYQ0G5wAQUCZsO4fQIbAwUJBaOagAUL +CQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRDUbFYQ0G5wAQOWAQDs628TYI+F +oTaJ1jzqC3ObL6we4tmrW7yHL1KFR5xrhwD/ZioLjdrIUQZhcjV9rNt7mYZm/Ttl +hn06bx06eyjf0QyJAjMEEwEIAB0WIQT/qRKaGA12W3pb6hybQysn0bog1wUCZvwt +VgAKCRCbQysn0bog11wED/0dUw/riFIixjNRAoi+beQ1f42dG/60xm7qquZ4kE3n +KysN773YgE1Gl8wPsFBbAAznO++fJ2ONjTks4QNOV0MB5Rgv+LwK+5oOKDRA9LxE +QRCRYtFpErbCirIn/EGVJJCCbF+SoUY8rJL+PTfzHGDkJGK0lQIA49rdWjV9PW06 +4FRufzNrg4jNMCsJ5i67mjSb267C7I2mcfM3xX2nqZdOFW+wdctm9fvAWpIMQEQ5 +6J0wIQxwtF3GulKqr/7EV0LSB0Is0E4BBjwROMFiSa53Va/lcfZaQ7nJ8flsAfkO +gGmvGjM5VH1kO2hnhm5ps5x/fIqSbw7X2nYsUXjbL6YKHbUsbV1ybpS5XCnMcTyx +t5zmWkfZNLZk4+Qh/td6MyW7OmycY2GazRpMA28pX6gQYFBcSoXHNFqIyXU7wFJp +BmDqe8gbi7FIlewwS+XP5dWfNvP5EqfztO7p8hxB2O1ZIYxMKerr0Q6rvY9/fEL5 +fd7OMdK5OkQWASF7NjDFG9I50N4W/1+1jUHytp6bBtjjdnebp4a8gidP88HeGidk +2ONV9Yf0hOZUpRfMEFxpLxd9Ker928iZpopXOZ7AipFcXghWrReyTMljqXYvzNtd +qRdH3WmnNx4zw2K/JgAtOw9Domc09UzEFFHgAscUVXvsoVX4g8soZnBWomtlCfU0 +/bg4BGbDuH0SCisGAQQBl1UBBQEBB0Djm2qMxtO+jO+uhT5nScClgbSvdmWAjbt9 +RIQh60+4QgMBCAeIfgQYFgoAJhYhBOUvB4d6WAX5r0qwrNRsVhDQbnABBQJmw7h9 +AhsMBQkFo5qAAAoJENRsVhDQbnABkbUA/ib52SlXmDcBPsvCz+VQOsqt1OvmeioS +NSbBQ0KK5M66AQCs7zuWUQQhptmeB2l7sP528nsFv4FJfZ/McqauwTq7Bg== +=BHrV +-----END PGP PUBLIC KEY BLOCK----- diff --git a/docs/download/76.md b/docs/download/76.md index ed0c3d32501..93067029f8d 100644 --- a/docs/download/76.md +++ b/docs/download/76.md @@ -49,7 +49,7 @@ Please use the [icu-support mailing list](https://icu.unicode.org/contacts) and/ The initial release has library version number 76.1. -* Release date: _planned for_ 2024-10-24 +* Release date: 2024-10-24 * [List of tickets fixed in ICU 76](https://unicode-org.atlassian.net/issues/?jql=project%20%3D%20ICU%20AND%20status%20%3D%20Done%20AND%20resolution%20in%20%28Fixed%2C%20%22Fixed%20by%20Other%20Ticket%22%29%20AND%20fixVersion%20%3D%2076.1%20ORDER%20BY%20component%20ASC%2C%20created%20DESC) If there are maintenance releases, they will be 76.2, 76.3, etc. (During ICU 76 development, the library version number was 76.0.x.) @@ -100,6 +100,7 @@ Note: There may be additional commits on the [maint/maint-76](https://github.com traditional vs. simplified forms of radicals are now distinguished on a lower level than the number of residual strokes. In alphabetic indexes for radical-stroke sort orders, only the traditional forms of radicals are now available as index characters. +* Updated IBM EBCDIC code page 1388 (Simplified Chinese) mapping data to ibm-cp1388_P100-2024 ([ICU-22596](https://unicode-org.atlassian.net/browse/ICU-22596)) * Time zone data (tzdata) version 2024b (2024-sep). Note that pre-1970 data for a number of time zones has been removed, as has been the case in the upstream [tzdata](https://www.iana.org/time-zones) release since 2021b. * The Asia/Almaty time zone has become an alias following IANA TZ database changes. * CLDR added support for deprecated timezone codes by remapping: @@ -145,7 +146,9 @@ Note: There may be additional commits on the [maint/maint-76](https://github.com ## Known Issues -* None yet +* One late CLDR 46 bug fix was accidentally omitted from ICU 46: + [CLDR-18002](https://unicode-org.atlassian.net/browse/CLDR-18002) Fix likely subtag inconsistency + ([CLDR PR #4105](https://github.com/unicode-org/cldr/pull/4105)) ## Migration Issues @@ -242,17 +245,16 @@ ICU4J should work on Android API level 21 and later but may require “[library ## Download -Source and binary downloads are available on the git/GitHub tag page: https://github.com/unicode-org/icu/releases/tag/release-76-rc +Source and binary downloads are available on the git/GitHub tag page: See the [Source Code Setup](../devsetup/source/) page for how to download the ICU file tree directly from GitHub. ICU locale data was generated from CLDR data equivalent to: -* https://github.com/unicode-org/cldr/releases/tag/release-46-beta3 -* https://github.com/unicode-org/cldr-staging/releases/tag/release-46-beta3 +* +* [Maven dependency](https://central.sonatype.com/artifact/com.ibm.icu/icu4j): -TODO ``` com.ibm.icu diff --git a/docs/download/index.md b/docs/download/index.md index 59efe442bc7..452d568d9d1 100644 --- a/docs/download/index.md +++ b/docs/download/index.md @@ -14,29 +14,24 @@ License & terms of use: http://www.unicode.org/copyright.html If you want to use ICU (as opposed to developing it), it is recommended that you download an official packaged version of the ICU source code. These versions are tested more thoroughly than day-to-day development builds of the system, and they are packaged in zip and tar files for convenient download. Here are several recent releases of ICU that are available: -## Release Candidate -***2024-09-30: ICU 76 release candidate is now available.*** +## Latest Release + +***2024-10-24: ICU 76 is now available.*** It updates to [Unicode 16](https://www.unicode.org/versions/Unicode16.0.0/) ([blog](https://blog.unicode.org/2024/09/announcing-unicode-standard-version-160.html)), including new characters and scripts, emoji, collation & IDNA changes, and corresponding APIs and implementations. It also updates to [CLDR 46](https://cldr.unicode.org/downloads/cldr-46) ([beta blog](https://blog.unicode.org/2024/09/unicode-cldr-46-beta-available-for.html)) locale data with new locales, significant updates to existing locales, and various additions and corrections. For example, the CLDR and Unicode default sort orders are now very nearly the same. Most of the java.time (Temporal) types can now be formatted directly. There are some new APIs to make ICU easier to use with modern C++ and Java patterns. The Java and C++ technology preview implementations of the CLDR MessageFormat 2.0 specification have been updated to match recent changes. See [ICU 76](76.md). -Please test this release candidate on your platforms and report bugs and regressions by Monday, 2024-oct-21, via the [icu-support](https://icu.unicode.org/contacts) mailing list, and/or please [find/submit error reports](https://icu.unicode.org/bugs). - -Please do not use this release candidate in production. - -## Latest Release - -***2024-04-17: ICU 75 is now available.*** It updates to [CLDR 45](https://cldr.unicode.org/index/downloads/cldr-45) ([beta blog](https://blog.unicode.org/2024/04/unicode-cldr-v45-beta-available-for.html)) locale data with new locales and various additions and corrections. C++ code now requires C++17 and is being made more robust. The CLDR MessageFormat 2.0 specification is now in [technology preview](https://github.com/unicode-org/message-format-wg?tab=readme-ov-file#messageformat-2-technical-preview), together with a corresponding update of the ICU4J (Java) tech preview and a new ICU4C (C++) tech preview. See [Downloading ICU > ICU 75](https://icu.unicode.org/download/75). - ## Previous Releases +- 2024-04-17: **ICU 75** updates to [CLDR 45](https://cldr.unicode.org/index/downloads/cldr-45) ([beta blog](https://blog.unicode.org/2024/04/unicode-cldr-v45-beta-available-for.html)) locale data with new locales and various additions and corrections. C++ code now requires C++17 and is being made more robust. The CLDR MessageFormat 2.0 specification is now in [technology preview](https://github.com/unicode-org/message-format-wg?tab=readme-ov-file#messageformat-2-technical-preview), together with a corresponding update of the ICU4J (Java) tech preview and a new ICU4C (C++) tech preview. See [Downloading ICU > ICU 75](https://icu.unicode.org/download/75). + - 2023-12-13: **ICU 74.2** released with date/time formatting bug fixes. See [Downloading ICU > ICU 74](https://icu.unicode.org/download/74). -- 2023-10-31: **ICU 74** is now available. It updates to [Unicode 15.1](http://blog.unicode.org/2023/09/announcing-unicode-standard-version-151.html), including new characters, emoji, security mechanisms, and corresponding APIs and implementations. It also updates to [CLDR 44](https://cldr.unicode.org/index/downloads/cldr-44) ([blog](https://blog.unicode.org/2023/10/unicode-cldr-v44-available.html)) locale data with new locales and various additions and corrections. See [Downloading ICU > ICU 74](https://icu.unicode.org/download/74). +- 2023-10-31: **ICU 74** updates to [Unicode 15.1](http://blog.unicode.org/2023/09/announcing-unicode-standard-version-151.html), including new characters, emoji, security mechanisms, and corresponding APIs and implementations. It also updates to [CLDR 44](https://cldr.unicode.org/index/downloads/cldr-44) ([blog](https://blog.unicode.org/2023/10/unicode-cldr-v44-available.html)) locale data with new locales and various additions and corrections. See [Downloading ICU > ICU 74](https://icu.unicode.org/download/74). -- 2023-06-15: **ICU 73.2** is now available. Maintenance release with changes for GB18030 compliance, English AM/PM spaces, word segmentation around @ sign, etc. See [Downloading ICU > ICU 73](https://icu.unicode.org/download/73). +- 2023-06-15: **ICU 73.2**: Maintenance release with changes for GB18030 compliance, English AM/PM spaces, word segmentation around @ sign, etc. See [Downloading ICU > ICU 73](https://icu.unicode.org/download/73). -- 2023-04-13: **ICU 73** is now available. It updates to [CLDR 43](https://blog.unicode.org/2023/04/the-unicode-cldr-v43-released.html) locale data with various additions and corrections. +- 2023-04-13: **ICU 73** updates to [CLDR 43](https://blog.unicode.org/2023/04/the-unicode-cldr-v43-released.html) locale data with various additions and corrections. ICU 73 improves Japanese and Korean short-text line breaking, reduces C++ memory use in date formatting, and promotes the Java person name formatter from tech preview to draft. For details, see [Downloading ICU > ICU 73](https://icu.unicode.org/download/73). diff --git a/docs/processes/cldr-icu.md b/docs/processes/cldr-icu.md index b179262bcf8..0f9031d9f8d 100644 --- a/docs/processes/cldr-icu.md +++ b/docs/processes/cldr-icu.md @@ -27,8 +27,8 @@ All Rights Reserved. # Intro and setup These instructions describe how to regenerate ICU4C locale and linguistic data from CLDR, -and then how to convert that ICU4 data for ICU4J (data jars and maven resources). -They apply to CLDR 44 / ICU 74 and later. +and then how to convert that ICU4C data for ICU4J (data jars and maven resources). +They apply to CLDR 47 / ICU 77 and later. To use these instructions just for generating ICU4J data from ICU4C, you only need to use steps 1, 8, and 12 in the Process section. @@ -37,22 +37,26 @@ The full process requires local copies of * CLDR (the source of most of the data, and some Java tools) * The complete ICU source tree, including: - * tools: includes the LdmlConverter build tool and associated config files - * icu4c: the target for converted CLDR data, and source for ICU4J data; includes tests for the converted data - * icu4j: the target for updated data jars; includes tests for the converted data + * `tools`: includes the `LdmlConverter` build tool and associated config files + * `icu4c`: the target for converted CLDR data, and source for ICU4J data; includes tests for the converted data + * `icu4j`: the target for updated data jars; includes tests for the converted data For an official CLDR data integration into ICU, these should be clean, freshly checked-out. For released CLDR sources, an alternative to checking out sources -for a given version is downloading the zipped sources for the common (core.zip) -and tools (tools.zip) directory subtrees from the Data column in +for a given version is downloading the zipped sources for the common (`core.zip`) +and tools (`tools.zip`) directory subtrees from the Data column in [CLDR Releases/Downloads](https://cldr.unicode.org/index/downloads) -Besides a standard JDK, the process also requires [ant](https://ant.apache.org) and +Besides a standard JDK 11+, the process also requires [ant](https://ant.apache.org) and [maven](https://maven.apache.org) plus the xml-apis.jar from the [Apache xalan package](https://xalan.apache.org/xalan-j/downloads.html) _(Is this -latter requirement still true?)_. You will also need to have performed the +latter requirement still true?)_. + +If you do CLDR development you can configure maven as documented at [CLDR Maven setup](http://cldr.unicode.org/development/maven) (non-Eclipse version). +But for the CLDR to ICU data conversion, or for regular ICU development this is not needed. + Notes: * Enough things can (and will) fail in this process that it is best to @@ -65,12 +69,12 @@ Notes: files are used in addition to the CLDR files as inputs to the CLDR data build process for ICU): * The primary file to edit for adding/removing locales and/or collation and - rbnf data is
- `$TOOLS_ROOT/cldr/cldr-to-icu/build-icu-data.xml`. + `rbnf` data is \ + `$ICU_DIR/tools/cldr/cldr-to-icu/config.xml`. * There are some files in `icu4c/source/data/xml/` that may need editing for - certain additions. This is especially true for brkitr additions; however there - are rbnf files there that add some rules. The collation files there mainly - hook up the UCA collation rules in `icu4c/data/unidata/UCARules.txt` to the + certain additions. This is especially true for `brkitr` additions; however there + are `rbnf` files there that add some rules. The collation files there mainly + hook up the UCA collation rules in `icu4c/source/data/unidata/UCARules.txt` to the collation data. To process these files, certain CLDR dtds are copied over to ICU. @@ -88,14 +92,14 @@ considerations: # CLDR prerequisites for BRS integrations The following tasks should be done in the CLDR repo before beginning a CLDR-ICU -integration that ss part of the BRS process; handle each of these using a separate +integration that is part of the BRS process; handle each of these using a separate ticket and a separate PR: 1. Generate updated CLDR test data (which is copied to ICU), using the process in [Generating CLDR testData](https://docs.google.com/document/d/1-RC99npKcSSwUoYGkSzxaKOe76gYRkWhGdFzCdIBCu4/edit#heading=h.2rum9c6hrr4w) -2. Run CLDRModify with no options with no options and then with -fP. The webpage - for CLDRModify is currently being converted to markdown, a reference to it will +2. Run `CLDRModify` with no options with no options and then with `-fP`. The web page + for `CLDRModify` is currently being converted to markdown, a reference to it will be added when that process is complete. # Environment variables @@ -120,61 +124,61 @@ There are several environment variables that need to be defined. * `CLDR_TMP_DIR`: Parent of temporary CLDR production data. Defaults to `$CLDR_DIR/../cldr-aux` (sibling to `CLDR_DIR`). - - > **NOTE:** As of CLDR 36 and 37, the GenerateProductionData tool no longer + + > **NOTE:** As of CLDR 36 and 37, the `GenerateProductionData` tool no longer generates data by default into `$CLDR_TMP_DIR/production`; instead it generates data into `$CLDR_DIR/../cldr-staging/production` (though there is a command-line option to override this). However the rest of the build still assumes that the generated data is in `$CLDR_TMP_DIR/production`. So `CLDR_TMP_DIR` must be defined to be `CLDR_DIR/../cldr-staging`. - + 3. ICU-related variables - * `ICU4C_DIR`: Path to root of ICU4C sources, below which is the source dir. + * `ICU_DIR`: Path to root of ICU directory, below which are (e.g.) the + `icu4c`, `icu4j`, and `tools` directories. - * `ICU4J_ROOT`: Path to root of ICU4J sources, below which is the main dir. + * `ICU4C_DIR`: Path to root of ICU4C sources, below which is the `source` dir. + + * `ICU4J_ROOT`: Path to root of ICU4J sources, below which is the `main` dir. - * `TOOLS_ROOT`: Path to root of ICU tools directory, below which are (e.g.) the - cldr and unicodetools dirs. - # Process - + ## 1 Environment variables 1a. Java, ant, and maven variables, adjust for your system -``` +```sh export JAVA_HOME=/usr/libexec/java_home export ANT_OPTS="-Xmx8192m" export MAVEN_ARGS="--no-transfer-progress" ``` 1b. CLDR variables, adjust for your setup; with cygwin it might be e.g. -``` +```sh CLDR_DIR=`cygpath -wp /build/cldr` ``` Note that for cldr-staging we do not use personal forks, we commit directly. -``` +```sh export CLDR_DIR=$HOME/cldr-myfork export CLDR_TMP_DIR=$HOME/cldr-staging export CLDR_DATA_DIR=$HOME/cldr-staging/production ``` 1c. ICU variables -``` +```sh export ICU4C_DIR=$HOME/icu-myfork/icu4c export ICU4J_ROOT=$HOME/icu-myfork/icu4j export TOOLS_ROOT=$HOME/icu-myfork/tools ``` 1d. Directory for logs/notes (create if does not exist) -``` +```sh export NOTES=...(some directory)... mkdir -p $NOTES ``` 1e. The name of the icu data directory for Java (for example `icudt74b`) -``` +```sh export ICU_DATA_VER=icudt(version)b ``` @@ -182,10 +186,10 @@ export ICU_DATA_VER=icudt(version)b 2a. Configure ICU4C, build and test without new data first, to verify that there are no pre-existing errors, and to build some tools needed for later -steps. Here `` is the runConfigureICU code for the platform you +steps. Here `` is the `runConfigureICU` code for the platform you are building on, e.g. Linux, macOS, Cygwin. (optionally build with debug enabled) -``` +```sh cd $ICU4C_DIR/source ./runConfigureICU [--enable-debug] make clean @@ -195,7 +199,7 @@ make check 2>&1 | tee $NOTES/icu4c-oldData-makeCheck.txt 2b. Now with ICU4J, build and test without new data first, to verify that there are no pre-existing errors (or at least to have the pre-existing errors as a base for comparison): -``` +```sh cd $ICU4J_ROOT mvn clean mvn verify 2>&1 | tee $NOTES/icu4j-oldData-mvnCheck.txt @@ -210,31 +214,33 @@ cp -p $CLDR_DIR/common/dtd/ldmlICU.dtd $ICU4C_DIR/source/data/dtd/cldr/common/dt ``` 3b. Update the cldr-icu tooling to use the latest tagged version of ICU -``` -open $TOOLS_ROOT/cldr/cldr-to-icu/pom.xml +```sh +open $ICU_DIR/tools/cldr/cldr-to-icu/pom.xml ``` (search for `icu4j-for-cldr` and update to the latest tagged version per instructions) 3c. Update the build for any new icu version, added locales, etc. +```sh +# ICU version +open $ICU_DIR/tools/cldr/cldr-to-icu/pom.xml +# Locales and other configuration changes +open $ICU_DIR/tools/cldr/cldr-to-icu/config.xml ``` -open $TOOLS_ROOT/cldr/cldr-to-icu/build-icu-data.xml -``` -(update icuVersion, icuDataVersion if necessary; update lists of locales to include if necessary) +(update `icuVersion`, `icuDataVersion` if necessary; update lists of locales to include if necessary) 3d. If there are new data types or variants in CLDR, you may need to update the -files that specify mapping of CLDR data to ICU rseources: -``` -open $TOOLS_ROOT/cldr/cldr-to-icu/src/main/resources/ldml2icu_locale.txt -open $TOOLS_ROOT/cldr/cldr-to-icu/src/main/resources/ldml2icu_supplemental.txt +files that specify mapping of CLDR data to ICU resources: +```sh +open $ICU_DIR/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_locale.txt +open $ICU_DIR/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_supplemental.txt ``` ## 4 Build and install CLDR jar -See `$TOOLS_ROOT/cldr/lib/README.txt` for more information on the CLDR -jar and the `install-cldr-jars.sh` script. -``` -cd $TOOLS_ROOT/cldr -ant install-cldr-libs +See `$ICU_DIR/tools/cldr/cldr-to-icu/README.md` for more information on the CLDR jar. +```sh +cd "$CLDR_DIR" +mvn clean install -pl :cldr-all,:cldr-code -DskipTests -DskipITs ``` ## 5 Generate CLDR production data and convert for ICU @@ -247,14 +253,15 @@ This process uses ant with ICU4C's `data/build.xml` (usually `$CLDR_TMP_DIR/production`), required if any CLDR data has changed. * Running `ant setup` is not required, but it will print useful errors to debug issues with your path when it fails. -``` + +```sh cd $ICU4C_DIR/source/data ant cleanprod ant setup ant proddata 2>&1 | tee $NOTES/cldr-newData-proddataLog.txt ``` -> Note, for CLDR development, at this point tests are sometimes run on the +> Note, for CLDR development, at this point tests are sometimes run on the production data, see [BRS: Run tests on production data](https://cldr.unicode.org/development/cldr-big-red-switch/brs-run-tests-on-production-data) @@ -262,26 +269,27 @@ ant proddata 2>&1 | tee $NOTES/cldr-newData-proddataLog.txt These include .txt files and .py files. These new files will replace whatever was already present in the ICU4C sources. This process uses the `LdmlConverter` in -`$TOOLS_ROOT/cldr/cldr-to-icu/`; see `$TOOLS_ROOT/cldr/cldr-to-icu/README.txt`. +`$ICU_DIR/tools/cldr/cldr-to-icu/`; see `$ICU_DIR/tools/cldr/cldr-to-icu/README.md`. * This process will take several minutes, during most of which there will be no log output (so do not assume nothing is happening). Keep a log so you can investigate anything that looks suspicious. -* Note that `ant clean` should _not_ be run before this. The `build-icu-data.xml` process +* The conversion tool will automatically run its own "clean" step to delete files it cannot determine to be ones that it would generate, except for pasts listed in `` elements such as `coll/de__PHONEBOOK.txt`, `coll/de_.txt`, etc. -* Before running ant to regenerate the data, make any necessary changes to the - build-icu-data.xml file, such as adding new locales etc. -``` -cd $TOOLS_ROOT/cldr/cldr-to-icu -ant -f build-icu-data.xml -DcldrDataDir="$CLDR_TMP_DIR/production" | tee $NOTES/cldr-newData-builddataLog.txt +* Before running the tool to regenerate the data, make any necessary changes to the + `config.xml` file, such as adding new locales etc. + +```sh +cd $ICU_DIR/tools/cldr/cldr-to-icu +java -jar target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar --cldrDataDir="$CLDR_TMP_DIR/production" | tee $NOTES/cldr-newData-builddataLog.txt ``` 5c. Update the CLDR testData files needed by ICU4C/J tests, ensuring they are representative of the newest CLDR data. -``` -cd $TOOLS_ROOT/cldr +```sh +cd $ICU_DIR/tools/cldr ant copy-cldr-testdata ``` @@ -289,7 +297,7 @@ ant copy-cldr-testdata (This step has been subsumed into 5c above) 5e. For now, manually re-add the `lstm` entries in `data/brkitr/root.txt` -``` +```sh open $ICU4C_DIR/source/data/brkitr/root.txt ``` Paste the following block after the dictionaries block and before the final closing '}': @@ -302,20 +310,20 @@ Paste the following block after the dictionaries block and before the final clos 5f. Update hard-coded lists in ICU -ICU4 has some hard-coded lists of locale-related codes that may need updating. Ideally these should +ICU has some hard-coded lists of locale-related codes that may need updating. Ideally these should be replaced by data converted from CLDR ([ICU-22839](https://unicode-org.atlassian.net/browse/ICU-22839)). In the meantime these need to be updated manually. | code type | icu4c/source library file(s) | icu4c/source test file(s) | | -------------------------------------------------------------------------------------------- | ------------------------------------------- | ------------------------------------------- | -| language
(at least all language codes in ICU locales or CLDR attributeValueValidity.xml) | common/uloc.cpp: LANGUAGES[], LANGUAGES_3[] | test/testdata/structLocale.txt: Languages | -| region
(at least all region codes in ICU locales or CLDR attributeValueValidity.xml) | common/uloc.cpp: COUNTRIES[], COUNTRIES_3[] | test/testdata/structLocale.txt: Countries | -| currency (see note below)
(at least everything in CLDR supplementalData.xml currencyData) | common/ucurr.cpp: gCurrencyList[]] | test/testdata/structLocale.txt: Currencies,CurrencyPlurals
test/cintltst/currtest.c:TestEnumList() | -| timezone | (not currently aware of hard-coded list) | test/testdata/structLocale.txt: zoneStrings | +| language
(at least all language codes in ICU locales or CLDR `attributeValueValidity.xml`) | `common/uloc.cpp`: `LANGUAGES[], LANGUAGES_3[]` | `test/testdata/structLocale.txt`: Languages | +| region
(at least all region codes in ICU locales or CLDR `attributeValueValidity.xml`) | `common/uloc.cpp`: `COUNTRIES[], COUNTRIES_3[]` | `test/testdata/structLocale.txt`: Countries | +| currency (see note below)
(at least everything in CLDR `supplementalData.xml` `currencyData`) | `common/ucurr.cpp`: `gCurrencyList[]]` | `test/testdata/structLocale.txt`: `Currencies`,`CurrencyPlurals`
`test/cintltst/currtest.c`:`TestEnumList()` | +| timezone | (not currently aware of hard-coded list) | `test/testdata/structLocale.txt`: `zoneStrings` | Note: currency code lists are also in other code lists along with measurement units, but these are re-generated using the procedure in -[Updating MeasureUnit with new CLDR data](https://unicode-org.github.io/icu/processes/release/tasks/updating-measure-unit.html) +[Updating `MeasureUnit` with new CLDR data](https://unicode-org.github.io/icu/processes/release/tasks/updating-measure-unit.html) (also mentioned in step 14 below). ## 6 Check the results @@ -323,7 +331,7 @@ but these are re-generated using the procedure in Check which data files have modifications, which have been added or removed (if there are no changes, you may not need to proceed further). Make sure the list seems reasonable. You may want to save logs, and possibly examine them... -``` +```sh cd $ICU4C_DIR/.. git status git status > $NOTES/gitStatusDelta-data.txt @@ -332,7 +340,7 @@ open $NOTES/gitDiffDelta-data.txt ``` 6a. You may also want to check which files were modified in CLDR production data: -``` +```sh cd $CLDR_TMP_DIR git status git status > $NOTES/gitStatusDelta-staging.txt @@ -342,25 +350,25 @@ git diff > $NOTES/gitDiffDelta-staging.txt ## 7 Fix data generation errors Look for evident errors in the list of file changes, or in the file diffs. -Fixing them may entail modifying CLDR source data or `TOOLS_ROOT` config files or +Fixing them may entail modifying CLDR source data or `$ICU_DIR/tools/cldr/cldr-to-icu` config files or tooling. ## 8 Rebuild ICU4C with new data, run tests 8a. Re-run configure and make clean, necessary to handle any files added or deleted: -``` +```sh cd $ICU4C_DIR/source ./runConfigureICU [--enable-debug] make clean ``` 8b. Do the rebuild, keeping a log as before: -``` +```sh make check 2>&1 | tee $NOTES/icu4c-newData-makeCheck.txt ``` To re-run a specific test if necessary when fixing bugs; for example: -``` +```sh cd test/intltest DYLD_LIBRARY_PATH=../../lib:../../stubdata:../../tools/ctestfw:$DYLD_LIBRARY_PATH ./intltest -e -G format/NumberTest/NumberPermutationTest cd ../.. @@ -380,7 +388,8 @@ ticket under which you are performing the integration, if you have one), fix the and regenerate from step 4. If the data is OK , other sources of failure can include: -* Problems with the CLDR-ICU conversion process (pehaps some locale data is not getting + +* Problems with the CLDR-ICU conversion process (perhaps some locale data is not getting converted properly; go back to step 3, adjust and repeat from there. * Problems with ICU library code that may not be using new resources properly. Fix and repeat from step 8. @@ -390,9 +399,9 @@ If the data is OK , other sources of failure can include: you will need to update `icu4c/test/testdata/structLocale.txt` (otherwise `/tsutil/cldrtest/TestLocaleStructure` may fail). -## 10 Running ICU4C tests in exhaustive mode. +## 10 Running ICU4C tests in exhaustive mode -Exhautive tests should always be run for a CLDR-ICU integration PR before it is merged. +Exhaustive tests should always be run for a CLDR-ICU integration PR before it is merged. Once you have a PR, you can do this for both C and J as part of the pre-merge CI tests by manually running a workflow (the exhaustive tests are not run automatically on every PR). See [Continuous Integration / Exhaustive Tests](../userguide/dev/ci.md#exhaustive-tests). @@ -400,7 +409,7 @@ See [Continuous Integration / Exhaustive Tests](../userguide/dev/ci.md#exhaustiv The following instructions run the ICU4C exhaustive tests locally (which you may want to do before even committing changes, or which may be necessary to diagnose failures in the CI tests): -``` +```sh cd $ICU4C_DIR/source export INTLTEST_OPTS="-e" export CINTLTST_OPTS="-e" @@ -415,13 +424,13 @@ appropriate, and repeating from step 4 or 8 as appropriate. ## 12 Transfer the ICU4C data to ICU4J 12a. You need to reconfigure ICU4C to include the unicore data. -``` +```sh cd $ICU4C_DIR/source ICU_DATA_BUILDTOOL_OPTS=--include_uni_core_data ./runConfigureICU ``` 12b. Rebuild the data with the new config setting, then create the ICU4J data jar. -``` +```sh cd $ICU4C_DIR/source/data make clean make -j -l2.5 @@ -429,13 +438,13 @@ make icu4j-data-install ``` 12c. Create the test data jar -``` +```sh cd $ICU4C_DIR/source/test/testdata make icu4j-data-install ``` 12d. Update the extracted {main, test} data files in the Maven build -``` +```sh cd $ICU4J_ROOT ./extract-data-files.sh ``` @@ -443,7 +452,7 @@ cd $ICU4J_ROOT ## 13 Rebuild ICU4J with new data, run tests 13a. Run the tests using the maven build -``` +```sh cd $ICU4J_ROOT mvn clean mvn install 2>&1 | tee $NOTES/icu4j-newData-mvnCheck.txt @@ -451,26 +460,29 @@ mvn install 2>&1 | tee $NOTES/icu4j-newData-mvnCheck.txt It is possible to re-run a specific test class or method if necessary when fixing bugs. -For example (using artifactId, full class name, test all methods): -``` +For example (using `artifactId`, full class name, test all methods): +```sh mvn install -pl :core -Dtest=com.ibm.icu.dev.test.util.LocaleBuilderTest ``` or (example of using module path, class name, one method): -``` +```sh mvn install -pl main/common_tests -Dtest=MeasureUnitTest#TestGreek ``` -13b. Optionally run the tests in exhautive mode +13b. Optionally run the tests in exhaustive mode -Optionally run before committing changes, or run to diagnose failures from -running exhastive CI tests in the PR using `/azp run CI-Exhaustive`: -``` +Optionally run exhaustive tests locally before committing changes: +```sh cd $ICU4J_ROOT mvn install -DICU.exhaustive=10 2>&1 | tee $NOTES/icu4j-newData-mvnCheckEx.txt ``` +Exhaustive tests in CI can be triggered by running the "Exhaustive Tests for ICU" +action from the GitHub web UI. +See [Continuous Integration / Exhaustive Tests](../userguide/dev/ci.md#exhaustive-tests). + Running a specific test is the same as above: -``` +```sh mvn install --pl :core -DICU.exhaustive=10 -Dtest=ExhaustiveNumberTest ``` @@ -482,7 +494,7 @@ step 4, as appropriate, until there are no more failures in ICU4C or ICU4J. Note that certain data changes and related test failures may require the rebuilding of other kinds of data and/or code. For example: -### Updating MeasureUnit code and tests +### Updating `MeasureUnit` code and tests If you see a failure such as ``` @@ -490,7 +502,7 @@ MeasureUnitTest testCLDRUnitAvailability Failure (MeasureUnitTest.java:3410) : U ``` then you will need to update the C and J library and test code for new measurement units, see the procedure at -[Updating MeasureUnit with new CLDR data](https://unicode-org.github.io/icu/processes/release/tasks/updating-measure-unit.html) +[Updating `MeasureUnit` with new CLDR data](https://unicode-org.github.io/icu/processes/release/tasks/updating-measure-unit.html) ### Updating plurals test data @@ -503,12 +515,12 @@ To address these requires updating the LOCALE_SNAPSHOT data in ``` $ICU4J_ROOT/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java ``` -by modifying the TestLocales() test there to run `generateLOCALE_SNAPSHOT()` and +by modifying the `TestLocales()` test there to run `generateLOCALE_SNAPSHOT()` and then copying in the updated data. ## 15 Check the ICU file changes and commit -``` +```sh cd $ICU4C_DIR/source make clean cd $ICU4J_ROOT @@ -528,13 +540,13 @@ git push origin ICU-nnnnn-branchname (Only for an official integration from CLDR git repositories) 16a. Check cldr-staging changes, and commit -``` +```sh cd $CLDR_TMP_DIR git status ``` Then `git add` or `git rm` files as necessary. Record the changes, commit and push. -``` +```sh git status > $NOTES/gitStatusDelta-production-afterAdd.txt git commit -m 'CLDR-nnnnn production data corresponding to CLDR release-nn-stage' git push origin main @@ -545,8 +557,8 @@ git push origin main (There may be other cldr-staging changes unrelated to production data, such as charts or spec; we want to include them in the tag, so pull first, but log to see what the -chnages are first) -``` +changes are first) +```sh cd $CLDR_TMP_DIR git pull git log @@ -559,7 +571,7 @@ git push --tags We need to tag the main cldr repository. If $CLDR_DIR represents that repository, this is easy: -``` +```sh cd $CLDR_DIR git tag -a "release-nn-stage" -m "CLDR-nnnnn: tag CLDR release-nn-stage" git push --tags @@ -567,7 +579,7 @@ git push --tags However if $CLDR_DIR represents your personal fork or a branch from it, you need to figure out what commit hash yo have integrated, and tag that hash in the main repo. -``` +```sh cd $CLDR_DIR git log ``` @@ -575,7 +587,7 @@ Note the latest commit hash hhhhhhhh... Then switch to the main repo, update it, and tag the appropriate hash (making sure it is in that repo!): -``` +```sh cd $HOME/cldr git pull git log @@ -583,7 +595,7 @@ git tag -a "release-nn-stage" -m "CLDR-nnnnn: tag CLDR release-nn-stage" hhhhhhh git push --tags ``` -## 18 Pubish the cldr tags in github +## 18 Publish the cldr tags in github You should publish the cldr and cldr-staging tags in github. diff --git a/docs/processes/release/tasks/build.md b/docs/processes/release/tasks/build.md index d307bfe51ac..066ce3d8a2b 100644 --- a/docs/processes/release/tasks/build.md +++ b/docs/processes/release/tasks/build.md @@ -59,6 +59,10 @@ Also, please look out for this type of message: "\***\*\* WARNING Bad namespace not defined inside the "icu" namespace. Consider adding **U_NAMESPACE_BEGIN** and **U_NAMESPACE_END** around the class and member definitions. +## Update the runners + +In all workflow yaml files, update macos-n, ubuntu-p.q, windows-yyyy to the version currently designated -latest on https://github.com/actions/runner-images?tab=readme-ov-file#available-images. + ## Update the pool bundles *Obsolete for ICU 64+*: The pool bundles are no longer checked in. Instead, diff --git a/docs/processes/release/tasks/healthy-code.md b/docs/processes/release/tasks/healthy-code.md index 5d4aa295faf..f1e7bf6a7bf 100644 --- a/docs/processes/release/tasks/healthy-code.md +++ b/docs/processes/release/tasks/healthy-code.md @@ -126,6 +126,37 @@ the UTF-8 signature byte sequence ("BOM").~~ ## Clean up import statements +### From command line + +This can be done from command line using the +[Google Java Format](https://github.com/google/google-java-format) tool. + +**WARNING:** requires JDK 17 or newer (December 2024) + +Download the latest Google Java Format from Maven Central: +```sh +mvn dependency:copy -Dartifact=com.google.googlejavaformat:google-java-format:LATEST:jar:all-deps \ + -DoutputDirectory=/tmp \ + -Dmdep.stripVersion=true \ + -q -ntp +``` + +Cleanup all Java files (only imports, nothing else): +```sh +find . -type f -name '*.java' | xargs java -jar /tmp/google-java-format-all-deps.jar -i --aosp --fix-imports-only --skip-sorting-imports +``` + +Remove the Google Java Format artifact from the temporary folder: +```sh +rm /tmp/google-java-format-all-deps.jar +``` + +You can (of course) download it from +[GitHub Releases](https://github.com/google/google-java-format/releases). \ +Or save it in a personal tools folder and keep it around. + +### From Eclipse + The Eclipse IDE provides a feature which allow you to organize import statements for multiple files. Right click on projects/source folders/files, you can select \[Source\] - \[Organize Imports\] which resolve all wildcard imports and sort diff --git a/docs/processes/release/tasks/updating-measure-unit-old.md b/docs/processes/release/tasks/updating-measure-unit-old.md new file mode 100644 index 00000000000..f5d9219cf95 --- /dev/null +++ b/docs/processes/release/tasks/updating-measure-unit-old.md @@ -0,0 +1,150 @@ +--- +layout: default +title: Updating MeasureUnit with new CLDR data +parent: Release & Milestone Tasks +grand_parent: Contributors +nav_order: 120 +--- + + + +# Updating MeasureUnit with new CLDR data +{: .no_toc } + +## Contents +{: .no_toc .text-delta } + +1. TOC +{:toc} + +--- + +This document explains how to update the C++ and Java version of the MeasureUnit +class with new CLDR data. + +Code is generated by running MeasureUnitTest.java unit tests, which writes +generated code to System.out. Two ways to access this: + +1. Within **eclipse**: + - Open MeasureUnitTest.java, run it by clicking on the green play button on + menu bar. + - Copy the generated code from the eclipse console to the clipboard. + +2. With **ant**: + - Run: `ant checkTest + -Dtestclass='com.ibm.icu.dev.test.format.MeasureUnitTest'` + - Open the checkTest output: `out/junit-results/checkTest/html/index.html` + - Navigate to "System.out" at the bottom of the MeasureUnitTest page to find + the generated code, and copy to the clipboard. + +After syncing CLDR data with ICU do the following. This documentation assumes +that you are updating the MeasureUnit clases for ICU 68. + +* Check out + $GIT_ROOT/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitTest.java +* Open MeasureUnitTest.java. +* Find the `testZZZ` test, its code should all be commented out. This test will + execute last and will run the desired code. + + Make sure DRAFT_VERSIONS at top of MeasureUnitTest.java is set correctly. + These are the ICU versions that have draft methods. + +## Update MeasureUnit.java + +* Change `testZZZ` to run `generateConstants(“68”); // ICU 68.` +* Run MeasureUnitTest.java, copy the generated code (see instructions above). +* Open MeasureUnit.java: + $GIT_ROOT/icu4j/main/core/src/main/java/com/ibm/icu/util/MeasureUnit.java +* Look for line containing: + + `// Start generated MeasureUnit constants` +* Look for line containing: + + `// End generated MeasureUnit constants` +* Replace all the generated code in between with the contents of the clipboard +* Run the MeasureUnitTest.java to ensure that the new code is backward + compatible. These compatibility tests are called something like + `TestCompatible65`, which tests backward compatibility with ICU 65. +* Create a compatibility test for ICU 68. Change `testZZZ` to run + `generateBackwardCompatibilityTest(“68”)` +* Run tests. +* Copy generated test (see instructions above) into MeasureUnitTest.java +* Run tests again to ensure that new code is backward compatible with itself + +## Update ICU4C + +* checkout ICU4C + +### Update measunit.h + +* Change testZZZ to run `generateCXXHConstants(“68”); // ICU 68`. +* Run MeasureUnitTest.java, copy the generated code (see instructions above). +* Open $GIT_ROOT/icu4c/source/i18n/unicode/measunit.h. Look for line containing: + + `// Start generated createXXX methods` +* Look for line: + + `// End generated createXXX methods` +* Replace all the generated code in between with the contents of the clipboard + +### Update measunit.cpp + +* Change testZZZ to run generateCXXConstants(); +* Run MeasureUnitTest.java, copy the generated code (see instructions above). +* Open $GIT_ROOT/icu4c/source/i18n/measunit.cpp. Look for line containing: + + `// Start generated code for measunit.cpp` +* Look for lines + + `// End generated code for measunit.cpp` +* Replace all the generated code in between with the contents of the clipboard + +### Run C++ tests + +* Run `./intltest format/MeasureFormatTest` from `test/intltest` to ensure new + code is backward compatible. +* Create a compatibility test for ICU 68. Change `testZZZ` in eclipse to run + `generateCXXBackwardCompatibilityTest(“68”)` +* Run tests. +* Copy generated test (see instructions above) into + $GIT_ROOT/icu4c/source/test/intltest/measfmttest.cpp. Make other necessary + changes to make test compile. You can find these changes by searching for + `TestCompatible65()` +* Run tests again to ensure that new code is backward compatible with itself + +## Finishing changes + +These last changes are necessary to permanently record the ICU version number of +any new measure units. Without these changes any new functions for this release +will be considered new for the next release too. + +* Change `testZZZ` to run `updateJAVAVersions(“68”);` +* Run MeasureUnitTest.java, copy the generated code (see instructions above). +* Append the clipboard contents to the values of the JAVA_VERSIONS variable + near the top of MeasureUnitTest.java. + + **Important:** what you are copying are just the new functions for the current + ICU version, in this case 68. Therefore append, do not replace. + +## Updating units.txt and unitConstants + +The standard ldml2icu process is used to update ICU's resource files (see +[cldr-icu-readme.txt](https://github.com/unicode-org/icu/blob/main/icu4c/source/data/cldr-icu-readme.txt)). +CLDR's units.xml defines conversion rates in terms of some constants defined in +`unitConstants`. + +For efficiency and simplicity, ICU does not read `unitConstants` from the +resource file. If any new constants are added, some code changes would be +needed. This would be caught by `testUnitConstantFreshness` unit test in +`units_test.cpp`. + +They are hard-coded: +* Java: `UnitConverter.java` has the constant names in + `UnitConverter.Factor.addEntity()` and constant values in + `UnitConverter.Factor.getConversionRate()`. +* C++: `units_converter.cpp` has the constant names in + `addSingleFactorConstant()`, with the constant values in `double + constantsValues[]` in the `units_converter.h` header file. diff --git a/docs/processes/release/tasks/updating-measure-unit.md b/docs/processes/release/tasks/updating-measure-unit.md index f5d9219cf95..be5add902ba 100644 --- a/docs/processes/release/tasks/updating-measure-unit.md +++ b/docs/processes/release/tasks/updating-measure-unit.md @@ -12,9 +12,11 @@ License & terms of use: http://www.unicode.org/copyright.html --> # Updating MeasureUnit with new CLDR data + {: .no_toc } ## Contents + {: .no_toc .text-delta } 1. TOC @@ -22,117 +24,94 @@ License & terms of use: http://www.unicode.org/copyright.html --- -This document explains how to update the C++ and Java version of the MeasureUnit +This document explains how to update the C++ and Java version of the `MeasureUnit` class with new CLDR data. -Code is generated by running MeasureUnitTest.java unit tests, which writes -generated code to System.out. Two ways to access this: +This document applies to ICU 77 and later. +For older versions see updating-measure-unit-old.md -1. Within **eclipse**: - - Open MeasureUnitTest.java, run it by clicking on the green play button on - menu bar. - - Copy the generated code from the eclipse console to the clipboard. +Make sure `DRAFT_VERSION_SET` at top of +`./icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitGeneratorTest.java` +is set correctly. \ +These are the ICU versions that have draft methods. -2. With **ant**: - - Run: `ant checkTest - -Dtestclass='com.ibm.icu.dev.test.format.MeasureUnitTest'` - - Open the checkTest output: `out/junit-results/checkTest/html/index.html` - - Navigate to "System.out" at the bottom of the MeasureUnitTest page to find - the generated code, and copy to the clipboard. +The code is generated by running `MeasureUnitGeneratorTest.java` unit tests, which writes +generated code to various file. -After syncing CLDR data with ICU do the following. This documentation assumes -that you are updating the MeasureUnit clases for ICU 68. +1. With **maven** (command line): + - Change folder to `{icuRoot}/icu4j` + - run `mvn install -DskipTests -DskipITs` + - run `mvn install -q -Dtest=MeasureUnitGeneratorTest -DgenerateMeasureUnitUpdate -f main/common_tests` -* Check out - $GIT_ROOT/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitTest.java -* Open MeasureUnitTest.java. -* Find the `testZZZ` test, its code should all be commented out. This test will - execute last and will run the desired code. +2. Within **Eclipse**: + - Open `MeasureUnitGeneratorTest.java`, find the `generateUnitTestsUpdate` methods + and run it by clicking on the green play button on menu bar. \ + Choose "JUnit Test" if asked. \ + This will not generate the update, but it will run the test and create a "Run Configuration". \ + Open it (Main menu -- "Run" -- "Run Configurations"), select the one named + `MeasureUnitGeneratorTest.generateUnitTestsUpdate`, go to the "Arguments" tab and add + `-DgenerateMeasureUnitUpdate` to the "VM Arguments" text area. - Make sure DRAFT_VERSIONS at top of MeasureUnitTest.java is set correctly. - These are the ICU versions that have draft methods. +Both methods will generate files with in `icu4j/main/common_tests/target/` folder. \ +The file names and the logging to the standard output will guide you. -## Update MeasureUnit.java +It currently looks something like this: +``` +Copy the generated code fragments from / to + /some/absolute/path/icu4j/main/common_tests/target/MeasureUnit.java \ + /some/absolute/path/icu4j/main/core/src/main/java/com/ibm/icu/util/MeasureUnit.java -* Change `testZZZ` to run `generateConstants(“68”); // ICU 68.` -* Run MeasureUnitTest.java, copy the generated code (see instructions above). -* Open MeasureUnit.java: - $GIT_ROOT/icu4j/main/core/src/main/java/com/ibm/icu/util/MeasureUnit.java -* Look for line containing: +Copy the generated code fragments from / to + /some/absolute/path/icu4j/main/common_tests/target/MeasureUnitCompatibilityTest.java \ + /some/absolute/path/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitCompatibilityTest.java - `// Start generated MeasureUnit constants` -* Look for line containing: +Copy the generated code fragments from / to + /some/absolute/path/icu4j/main/common_tests/target/measunit.h \ + /some/absolute/path/icu4c/source/i18n/unicode/measunit.h - `// End generated MeasureUnit constants` -* Replace all the generated code in between with the contents of the clipboard -* Run the MeasureUnitTest.java to ensure that the new code is backward - compatible. These compatibility tests are called something like - `TestCompatible65`, which tests backward compatibility with ICU 65. -* Create a compatibility test for ICU 68. Change `testZZZ` to run - `generateBackwardCompatibilityTest(“68”)` -* Run tests. -* Copy generated test (see instructions above) into MeasureUnitTest.java -* Run tests again to ensure that new code is backward compatible with itself +Copy the generated code fragments from / to + /some/absolute/path/icu4j/main/common_tests/target/measunit.cpp \ + /some/absolute/path/icu4c/source/i18n/measunit.cpp -## Update ICU4C +Copy the generated code fragments from / to + /some/absolute/path/icu4j/main/common_tests/target/measfmttest.cpp \ + /some/absolute/path/icu4c/source/test/intltest/measfmttest.cpp -* checkout ICU4C +Copy the generated code fragments from / to + /some/absolute/path/icu4j/main/common_tests/target/MeasureUnitGeneratorTest.java \ + /some/absolute/path/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitGeneratorTest.java +``` -### Update measunit.h +Some kind of diff tool or editor (for example `vi -d`) work nicely. -* Change testZZZ to run `generateCXXHConstants(“68”); // ICU 68`. -* Run MeasureUnitTest.java, copy the generated code (see instructions above). -* Open $GIT_ROOT/icu4c/source/i18n/unicode/measunit.h. Look for line containing: +Look for line containing `// Start generated ...` and `// End generated ...` +These lines exist in both the original files, and the generated one. \ +Replace all the generated code in between with the contents of the clipboard. - `// Start generated createXXX methods` -* Look for line: +If the generated code has no `// Start` ... `// End ...` pair then the new +code should be appended at some fixed place (details below). - `// End generated createXXX methods` -* Replace all the generated code in between with the contents of the clipboard +* **`MeasureUnit.java`:** replace range. +* **`MeasureUnitCompatibilityTest.java`:** append the new generated method at the end. \ + It is named something like `TestCompatible()`. \ + Don't add it if it already exists. +* **`measunit.h`:** replace range. +* **`measunit.cpp`:** replace range. +* **`measfmttest.cpp`:** append the new generated method after the last + `MeasureFormatTest::TestCompatible()` method. \ + Don't add it if it already exists. \ + WARNING: here you should add the method in two places. The method proper, with code, + as generated, and the declaration in the class definition. +* **`MeasureUnitGeneratorTest.java`:** append the new pairs of measure + version at + the end of the `JAVA_VERSIONS` structure. \ + Don't add them if they already exist. -### Update measunit.cpp +## Run tests for both `icu4c` and `icu4j` -* Change testZZZ to run generateCXXConstants(); -* Run MeasureUnitTest.java, copy the generated code (see instructions above). -* Open $GIT_ROOT/icu4c/source/i18n/measunit.cpp. Look for line containing: +## Updating `units.txt` and `unitConstants` - `// Start generated code for measunit.cpp` -* Look for lines - - `// End generated code for measunit.cpp` -* Replace all the generated code in between with the contents of the clipboard - -### Run C++ tests - -* Run `./intltest format/MeasureFormatTest` from `test/intltest` to ensure new - code is backward compatible. -* Create a compatibility test for ICU 68. Change `testZZZ` in eclipse to run - `generateCXXBackwardCompatibilityTest(“68”)` -* Run tests. -* Copy generated test (see instructions above) into - $GIT_ROOT/icu4c/source/test/intltest/measfmttest.cpp. Make other necessary - changes to make test compile. You can find these changes by searching for - `TestCompatible65()` -* Run tests again to ensure that new code is backward compatible with itself - -## Finishing changes - -These last changes are necessary to permanently record the ICU version number of -any new measure units. Without these changes any new functions for this release -will be considered new for the next release too. - -* Change `testZZZ` to run `updateJAVAVersions(“68”);` -* Run MeasureUnitTest.java, copy the generated code (see instructions above). -* Append the clipboard contents to the values of the JAVA_VERSIONS variable - near the top of MeasureUnitTest.java. - - **Important:** what you are copying are just the new functions for the current - ICU version, in this case 68. Therefore append, do not replace. - -## Updating units.txt and unitConstants - -The standard ldml2icu process is used to update ICU's resource files (see -[cldr-icu-readme.txt](https://github.com/unicode-org/icu/blob/main/icu4c/source/data/cldr-icu-readme.txt)). +The standard `ldml2icu` process is used to update ICU's resource files (see +[`cldr-icu-readme.txt`](https://github.com/unicode-org/icu/blob/main/icu4c/source/data/cldr-icu-readme.txt)). CLDR's units.xml defines conversion rates in terms of some constants defined in `unitConstants`. @@ -142,6 +121,7 @@ needed. This would be caught by `testUnitConstantFreshness` unit test in `units_test.cpp`. They are hard-coded: + * Java: `UnitConverter.java` has the constant names in `UnitConverter.Factor.addEntity()` and constant values in `UnitConverter.Factor.getConversionRate()`. diff --git a/docs/processes/release/tasks/versions.md b/docs/processes/release/tasks/versions.md index f64fc28c94b..23f0ea94069 100644 --- a/docs/processes/release/tasks/versions.md +++ b/docs/processes/release/tasks/versions.md @@ -53,6 +53,15 @@ need to be correspondingly updated. See below for more files to be updated and s [icu4c/source/data/misc/icuver.txt](https://github.com/unicode-org/icu/blob/main/icu4c/source/data/misc/icuver.txt) needs to be updated with the correct version number for ICU and its data. +### CLDR-to-ICU Conversion + +#### Since ICU 77 + +The tool takes the `icuVersion` and `icuDataVersion` from the official ICU APIs. +(from the icu4j listed as a dependency of the tool, usually the one you just built from the `icu4j` folder). + +If you need values different than that, you can specify them as the command line parameters (`--icuVersion` and `--icuDataVersion`). + #### Since ICU 68 In @@ -164,7 +173,7 @@ Changing the version for Java starting with ICU 74 requires a few steps: 2. [icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java](https://github.com/unicode-org/icu/blob/main/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java) There is a public string named `ICU4C_VERSION` which should be updated accordingly. - 'public static final String ICU4C_VERSION="74.0.1";' + `public static final String ICU4C_VERSION="74.0.1";` 3. When creating the final release of a major ICU version, or a point release (minor version update on a maintenance branch), @@ -201,7 +210,7 @@ The command requires a version number string that follows the typical Java / Mav This should happen at the same time and along with the work in the previous step for the version number when the version number is updated on `main` in the commit after the release/maintanence branch is cut. In other words, the above `versions:set-property` step should be executed at the same time - `mvn versions:set -DnewVersion=74.0.1-SNAPSHOT` is executed. + `mvn versions:set -DnewVersion=74.0.1-SNAPSHOT -DgenerateBackupPoms=false` is executed. 5. Update the following variables in `icu4j/releases_tools/shared.sh` @@ -212,8 +221,18 @@ The command requires a version number string that follows the typical Java / Mav 6. cldr-to-icu build tool has a dependency on the icu4j packages which needs to be updated in [`tools/cldr/cldr-to-icu/pom.xml`](https://github.com/unicode-org/icu/blob/main/tools/cldr/cldr-to-icu/pom.xml). Please update it to match the version that was updated in `icu4j/pom.xml` in the steps above. - `74.0.1-SNAPSHOT` +```xml +version>74.0.1-SNAPSHOT +``` +Since ICU 77 this moved to a property: +```xml +77.0.1-SNAPSHOT +``` +Which can be easily be set from command line: +```sh +mvn versions:set-property -Dproperty=icu4j.version -DnewVersion=77.1 -f $ICU_DIR/tools/cldr/cldr-to-icu -DgenerateBackupPoms=false +``` #### Until ICU 73 (inclusive) @@ -274,7 +293,7 @@ For updating ICU version numbers, follow the steps below. 3. [icu4j/main/core/src/main/java/com/ibm/icu/util/VersionInfo.java](https://github.com/unicode-org/icu/blob/main/icu4j/main/core/src/main/java/com/ibm/icu/util/VersionInfo.java) There is a static block starting at line 501 (as of 54.1) in the source file. - + Update the `ICU_VERSION` value, where the first three arguments represent the major, minor, and patch versions of a semantic version. Use the `getInstance(major, 0, 1, 0)` as the version during pre-release development, diff --git a/docs/userguide/datetime/calendar/index.md b/docs/userguide/datetime/calendar/index.md index e75d3752e06..ecc73c5b9f4 100644 --- a/docs/userguide/datetime/calendar/index.md +++ b/docs/userguide/datetime/calendar/index.md @@ -66,8 +66,7 @@ classes.* When a calendar object is created, via either `Calendar::create()`, or `ucal_open()`, or indirectly within a date formatter, ICU looks up the 'default' calendar type for that locale. At present, all locales default to a Gregorian -calendar, except for the compatibility locales th_TH_TRADITIONAL and -ja_JP_TRADITIONAL. If the "calendar" keyword is supplied, this value will +calendar. If the "calendar" keyword is supplied, this value will override the default for that locale. For instance, `Calendar::createInstance("fr_FR", status)` will create a Gregorian calendar, diff --git a/docs/userguide/dev/gitdev.md b/docs/userguide/dev/gitdev.md index adf4805df29..91a04b4194a 100644 --- a/docs/userguide/dev/gitdev.md +++ b/docs/userguide/dev/gitdev.md @@ -596,4 +596,4 @@ every Saturday (at 4:00 AM UTC) and post merging on the maintenance branches. They do not run on pull-requests by default as they take 1-2 hours to run. However, you can manually request the CI builds to run the exhaustive tests. -See [Continuous Integration / Exhaustive Tests](../userguide/dev/ci.md#exhaustive-tests). +See [Continuous Integration / Exhaustive Tests](../ci.md#exhaustive-tests). diff --git a/docs/userguide/dev/rules_update.md b/docs/userguide/dev/rules_update.md index 57d3fd96d45..b71da364e71 100644 --- a/docs/userguide/dev/rules_update.md +++ b/docs/userguide/dev/rules_update.md @@ -212,6 +212,16 @@ The rule updates are done first for ICU4C, and then ported (code changes) or mov Updating the test with new or revised rules requires changing the test source code, in `icu4c/source/test/intltest/rbbitst.cpp`. Look for the classes RBBICharMonkey, RBBIWordMonkey, RBBISentMonkey and RBBILineMonkey. The body of each class tracks the corresponding UAX-14 or UAX-29 specifications in defining the character classes and break rules. + The rules, as well as the partition of the code space used to generate the random sample strings, + are defined by regular expressions and Unicode sets generated by GenerateBreakTest in the + Unicode tools, which runs as part of MakeUnicodeFiles. + Copy the relevant lines from `Generated/UCD/17.0.0/extra/*BreakTest.cpp.txt` into `rbbitst.cpp`. + When developing changes to the line breaking algorithms that require changes to property assignments, + the generated rules and partition may need to be adjusted for testing. + However, the updated rules should only be merged into ICU once the property changes have actually been + made in the UCD and imported into ICU, at which point the unmodified generated partition and rules can + be used in `rbbitst.cpp`. + After making changes, as a final check, let the test run for an extended period of time, on the order of several hours. Run it from a terminal, and just interrupt it (Ctrl-C) when it's gone long enough. diff --git a/docs/userguide/format_parse/messages/mf2.md b/docs/userguide/format_parse/messages/mf2.md index bd1caa09b9b..a7f4c1fd45e 100644 --- a/docs/userguide/format_parse/messages/mf2.md +++ b/docs/userguide/format_parse/messages/mf2.md @@ -27,31 +27,33 @@ It will be a successor to the current [ICU MessageFormat](index.md). MessageFormat 2.0 is being developed [in a working group](https://github.com/unicode-org/message-format-wg), which has created a [draft specification](https://github.com/unicode-org/message-format-wg/tree/main/spec). +A version of the specification is included in [LDML 45](https://unicode.org/reports/tr35/tr35-messageFormat.html#Contents). Also see the [API docs for `MessageFormatter`](https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/index.html?com/ibm/icu/message2/MessageFormatter.html).* ## Overview of `MessageFormatter` -In ICU4J, the `MessageFormatter` class is the next iteration of [MessageFormat](https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/MessageFormat.html). -This new version will build on the lessons learned from using MessageFormat for 25 years in various environments, when used directly or as a base for other public APIs. +The `MessageFormatter` class is the next iteration of MessageFormat, implemented in both [ICU4J](https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/MessageFormat.html) and [ICU4C](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1message2_1_1MessageFormatter.html) +This new version builds on the lessons learned from using MessageFormat for 25 years in various environments, when used directly or as a base for other public APIs. -The effort to design a succesor to `MessageFormat` will result in a specification referred to as MessageFormat 2.0. +The effort to design a successor to `MessageFormat` is a specification referred to as MessageFormat 2.0. The reasoning for this effort is shared in the [“Why MessageFormat needs a successor”](https://github.com/unicode-org/message-format-wg/blob/main/docs/why_mf_next.md) document. -MessageFormat 2.0 will be more modular and easier to port and backport. -It will also provide extension points via interfaces to allow users to supply new formatters and selectors without having to modify the specification. +MessageFormat 2.0 is more modular and easier to port and backport. +It also provides extension points via interfaces to allow users to supply new formatters and selectors without having to modify the specification. ICU will eventually include support for new formatters, such as intervals, relative time, lists, measurement units, personal names, and more, as well as the ability for users to supply their own custom implementations. These will potentially support use cases like grammatical gender, inflection, markup regimes (such as those require for text-to-speech), and other complex message management needs. The MessageFormat Working Group, which develops the new data model, semantics, and syntax, is hosted on [GitHub](https://github.com/unicode-org/message-format-wg). The current specification for the syntax and data model can be found [here](https://github.com/unicode-org/message-format-wg/blob/main/spec/syntax.md). -This technical preview implements enough functions for `MessageFormater` to be useful in many situations, -but the final set of functions and the parameters accepted by those functions is not yet finalized. +This technical preview implements functions according to the LDML 45 version of the specification. -## Examples +### ICU4J -### Basic usage +#### Examples + +##### Basic usage ```java import static org.junit.Assert.assertEquals; @@ -81,7 +83,7 @@ public void testMf2() { } ``` -### Placeholder examples +##### Placeholder examples | Code to set runtime value for placeholder | Examples of placeholder in message pattern | |----------------------------------------------------|------------------------------------------------------------------------------| @@ -91,7 +93,7 @@ public void testMf2() { | No argument for fixed values known at build time | `{(123456789.531) :number}` | -### Plural selection message +#### Plural selection message ```java @Test @@ -123,12 +125,11 @@ public void testMf2Selection() { } ``` -### Built-in formatter functions +#### Built-in formatter functions -The tech preview implementation comes with formatters for numbers (`number`), -date / time (`datetime`), -plural selectors (`plural` and `selectordinal`), -and general selector (`select`), +The tech preview implementation comes with a formatter and selector for numbers (`number`), +date / time formatters (`datetime`), +and a string selector (`string`), very similar to what MessageFormat offers. The [ICU test code](https://github.com/unicode-org/icu/tree/main/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2) @@ -136,9 +137,10 @@ covers most features, and has examples of how to make custom placeholder formatt you can look for classes that implement `com.ibm.icu.message2.FormatterFactory` (they are named `Custom*Test.java`). -## Functions currently implemented +#### Functions currently implemented -These are the functions implemented right now: +These are the functions implemented in ICU 75.1. The functions will change +in a future release to be consistent with the current MF2 specification. @@ -191,19 +193,19 @@ TBD if this will be merged into plural (with some kind
selectLiteral match, same as MessageFormat's select.
-## Quickstart guide +#### Quickstart guide If you don't have ICU set up, here are instructions for doing that using Maven or Gradle: -### Requirements +##### Requirements - JDK (version 8 or newer) - Maven or Gradle - Your preferred IDE or text editor -### Maven +##### Maven -#### Create a new project +###### Create a new project ``` $ mvn archetype:generate -DgroupId=org.unicode -DartifactId=mf2 -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false @@ -211,7 +213,7 @@ $ mvn archetype:generate -DgroupId=org.unicode -DartifactId=mf2 -DarchetypeArtif $ cd mf2 ``` -#### Add a dependency to ICU4J 72.1 (or newer) +###### Add a dependency to ICU4J 75.1 (or newer) In the `pom.xml` find the `` element and add this: @@ -219,24 +221,24 @@ In the `pom.xml` find the `` element and add this: com.ibm.icu icu4j - 72.1 + 75.1 ``` -#### Add a bit of code +###### Add a bit of code Open the test file (`src/test/java/org/unicode/AppTest.java`) and copy / paste the include directives and the `testMf2()` method shown in the previous section. -#### Test it +###### Test it ``` $ mvn test ``` -### Gradle +##### Gradle -#### Create a new project +###### Create a new project ``` $ mkdir mf2 @@ -246,25 +248,25 @@ $ cd mf2 $ gradle init --dsl groovy --test-framework junit --type java-application --package org.unicode --project-name mf2 ``` -#### Add a dependency to ICU4J 72.1 (or newer) +###### Add a dependency to ICU4J 75.1 (or newer) In the `app/build.gradle` file, find the `dependencies {...}` section add this: ``` implementation 'com.ibm.icu:icu4j:72.1' ``` -#### Add a bit of code +###### Add a bit of code Open the test file (`src/test/java/org/unicode/AppTest.java`) and copy / paste the include directives and the `testMf2()` method shown in the previous section. -#### Test it +##### Test it ``` $ gradle test ``` -### Experiment from here +##### Experiment from here At this point you have a basic application using MessageFormat 2. @@ -276,3 +278,8 @@ You can experiment with more messages using as inspiration: You should be able to use your preferred IDE (Eclipse, IntelliJ, Visual Studio Code, more), use a different build system, etc. +### ICU4C + +Some helpful documentation for ICU4C in MF2 is being developed at [messageformat.dev](https://messageformat.dev/docs/integration/cpp/), +as well an unofficial [MF2 syntax documentation](https://messageformat.dev/docs/quick-start/) +and an interactive [playground](https://messageformat.dev/playground/) for testing messages. diff --git a/docs/userguide/icu_data/index.md b/docs/userguide/icu_data/index.md index b802aaaba91..8a637536128 100644 --- a/docs/userguide/icu_data/index.md +++ b/docs/userguide/icu_data/index.md @@ -163,6 +163,10 @@ example, even if ICU is built in "files" mode, you must still link against the This option builds ICU data as a single (large) static library. This mode is more complex to use. If you encounter errors, you may need to build ICU multiple times. +* `--with-data-packaging=auto` + With this option, `configure` will pick `library` unless the options + `--enable-static` and `--disable-shared` are also given, in which case + it'll pic `static` instead. * `--with-data-packaging=files` With this option, ICU outputs separate individual files (.res, .cnv, etc) which will be loaded at runtime. Read the rest of this document, especially diff --git a/docs/userguide/locale/index.md b/docs/userguide/locale/index.md index a4bf02a3489..96860ba2bf3 100644 --- a/docs/userguide/locale/index.md +++ b/docs/userguide/locale/index.md @@ -391,11 +391,7 @@ and `Locale::createCanonical`. The latter API exists in both C++ and Java. es@collation=traditional, hi__DIRECT => hi@collation=direct, zh_TW_STROKE => zh_TW@collation=stroke, zh__PINYIN => zh@collation=pinyin. -9. Variants specifying a calendar are remapped to calendar keyword specifiers, - as follows: ja_JP_TRADITIONAL => ja_JP@calendar=japanese, th_TH_TRADITIONAL - => th_TH@calendar=buddhist. - -10. Special case: C => en_US_POSIX. +9. Special case: C => en_US_POSIX. Certain other operations are not performed by either level 1 or level 2 canonicalization. These are listed here for completeness. diff --git a/docs/userguide/transforms/general/rules.md b/docs/userguide/transforms/general/rules.md index cd0d8835711..b476de1ef5a 100644 --- a/docs/userguide/transforms/general/rules.md +++ b/docs/userguide/transforms/general/rules.md @@ -503,7 +503,7 @@ the position, for those cases: The first rule will convert "x", when preceded by a vowel, into "ks". The transform will then backup to the position before the vowel and continue. In the next pass, the "ak" will match and be invoked. Thus, if the source text is "ax", -the result will be "ack". +the result will be "acks". > :point_right: **Note**: *Although you can move the cursor forward or backward, it is limited in two ways: (a) to the text that is matched, (b) within the original substring that is diff --git a/icu4c/source/acinclude.m4 b/icu4c/source/acinclude.m4 index a75ab2e294b..da29400a716 100644 --- a/icu4c/source/acinclude.m4 +++ b/icu4c/source/acinclude.m4 @@ -449,7 +449,7 @@ AC_DEFUN([AC_CHECK_64BIT_LIBS], AC_DEFUN([AC_CHECK_STRICT_COMPILE], [ AC_MSG_CHECKING([whether strict compiling is on]) - AC_ARG_ENABLE(strict,[ --enable-strict compile with strict compiler options [default=yes]], [ + AC_ARG_ENABLE(strict,[ --disable-strict do not compile with strict compiler options], [ if test "$enableval" = no then ac_use_strict_options=no diff --git a/icu4c/source/allinone/Build.Windows.IcuVersion.props b/icu4c/source/allinone/Build.Windows.IcuVersion.props index a4023ae9f79..7cfed86463c 100644 --- a/icu4c/source/allinone/Build.Windows.IcuVersion.props +++ b/icu4c/source/allinone/Build.Windows.IcuVersion.props @@ -3,6 +3,6 @@ - 76 + 77 diff --git a/icu4c/source/common/brkiter.cpp b/icu4c/source/common/brkiter.cpp index 4d945cc17e2..44a13ee6a2a 100644 --- a/icu4c/source/common/brkiter.cpp +++ b/icu4c/source/common/brkiter.cpp @@ -59,7 +59,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st { char fnbuff[256]; char ext[4]={'\0'}; - CharString actualLocale; + CharString actual; int32_t size; const char16_t* brkfname = nullptr; UResourceBundle brkRulesStack; @@ -94,7 +94,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st // Use the string if we found it if (U_SUCCESS(status) && brkfname) { - actualLocale.append(ures_getLocaleInternal(brkName, &status), -1, status); + actual.append(ures_getLocaleInternal(brkName, &status), -1, status); char16_t* extStart=u_strchr(brkfname, 0x002e); int len = 0; @@ -123,10 +123,9 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st if (U_SUCCESS(status) && result != nullptr) { U_LOCALE_BASED(locBased, *(BreakIterator*)result); - locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), - actualLocale.data()); - uprv_strncpy(result->requestLocale, loc.getName(), ULOC_FULLNAME_CAPACITY); - result->requestLocale[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate + locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), + actual.data(), status); + LocaleBased::setLocaleID(loc.getName(), result->requestLocale, status); } ures_close(b); @@ -206,26 +205,32 @@ BreakIterator::getAvailableLocales(int32_t& count) BreakIterator::BreakIterator() { - *validLocale = *actualLocale = *requestLocale = 0; } BreakIterator::BreakIterator(const BreakIterator &other) : UObject(other) { - uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); - uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); - uprv_strncpy(requestLocale, other.requestLocale, sizeof(requestLocale)); + UErrorCode status = U_ZERO_ERROR; + U_LOCALE_BASED(locBased, *this); + locBased.setLocaleIDs(other.validLocale, other.actualLocale, status); + LocaleBased::setLocaleID(other.requestLocale, requestLocale, status); + U_ASSERT(U_SUCCESS(status)); } BreakIterator &BreakIterator::operator =(const BreakIterator &other) { if (this != &other) { - uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); - uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); - uprv_strncpy(requestLocale, other.requestLocale, sizeof(requestLocale)); + UErrorCode status = U_ZERO_ERROR; + U_LOCALE_BASED(locBased, *this); + locBased.setLocaleIDs(other.validLocale, other.actualLocale, status); + LocaleBased::setLocaleID(other.requestLocale, requestLocale, status); + U_ASSERT(U_SUCCESS(status)); } return *this; } BreakIterator::~BreakIterator() { + delete validLocale; + delete actualLocale; + delete requestLocale; } // ------------------------------------------ @@ -394,7 +399,7 @@ BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& statu // revisit this in ICU 3.0 and clean it up/fix it/remove it. if (U_SUCCESS(status) && (result != nullptr) && *actualLoc.getName() != 0) { U_LOCALE_BASED(locBased, *result); - locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName()); + locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName(), status); } return result; } @@ -488,6 +493,7 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) } if (U_FAILURE(status)) { + delete result; return nullptr; } @@ -496,20 +502,25 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) Locale BreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - if (type == ULOC_REQUESTED_LOCALE) { - return {requestLocale}; + if (U_FAILURE(status)) { + return Locale::getRoot(); } - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + if (type == ULOC_REQUESTED_LOCALE) { + return requestLocale == nullptr ? + Locale::getRoot() : Locale(requestLocale->data()); + } + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } const char * BreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { - if (type == ULOC_REQUESTED_LOCALE) { - return requestLocale; + if (U_FAILURE(status)) { + return nullptr; } - U_LOCALE_BASED(locBased, *this); - return locBased.getLocaleID(type, status); + if (type == ULOC_REQUESTED_LOCALE) { + return requestLocale == nullptr ? "" : requestLocale->data(); + } + return LocaleBased::getLocaleID(validLocale, actualLocale, type, status); } @@ -536,8 +547,10 @@ int32_t BreakIterator::getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UE } BreakIterator::BreakIterator (const Locale& valid, const Locale& actual) { + UErrorCode status = U_ZERO_ERROR; U_LOCALE_BASED(locBased, (*this)); - locBased.setLocaleIDs(valid, actual); + locBased.setLocaleIDs(valid.getName(), actual.getName(), status); + U_ASSERT(U_SUCCESS(status)); } U_NAMESPACE_END diff --git a/icu4c/source/common/charstr.cpp b/icu4c/source/common/charstr.cpp index f76cc8a4dc9..88c75382bdb 100644 --- a/icu4c/source/common/charstr.cpp +++ b/icu4c/source/common/charstr.cpp @@ -70,6 +70,15 @@ CharString &CharString::copyFrom(const CharString &s, UErrorCode &errorCode) { return *this; } +CharString &CharString::copyFrom(StringPiece s, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { + return *this; + } + len = 0; + append(s, errorCode); + return *this; +} + int32_t CharString::lastIndexOf(char c) const { for(int32_t i=len; i>0;) { if(buffer[--i]==c) { diff --git a/icu4c/source/common/charstr.h b/icu4c/source/common/charstr.h index 08283ca452c..7cc6de122dd 100644 --- a/icu4c/source/common/charstr.h +++ b/icu4c/source/common/charstr.h @@ -74,6 +74,7 @@ public: * use a UErrorCode where memory allocations might be needed. */ CharString ©From(const CharString &other, UErrorCode &errorCode); + CharString ©From(StringPiece s, UErrorCode &errorCode); UBool isEmpty() const { return len==0; } int32_t length() const { return len; } diff --git a/icu4c/source/common/localefallback_data.h b/icu4c/source/common/localefallback_data.h index 0accf0324d7..45ac8d0e350 100644 --- a/icu4c/source/common/localefallback_data.h +++ b/icu4c/source/common/localefallback_data.h @@ -11,11 +11,11 @@ //====================================================================== // Default script table const char scriptCodeChars[] = - "Aghb\0Ahom\0Arab\0Armi\0Armn\0Avst\0Bamu\0Bass\0Batk\0Beng\0Bopo\0" - "Brah\0Cakm\0Cans\0Cari\0Cham\0Cher\0Chrs\0Copt\0Cprt\0Cyrl\0Deva\0" - "Egyp\0Elym\0Ethi\0Geor\0Gong\0Gonm\0Goth\0Gran\0Grek\0Gujr\0Guru\0" - "Hang\0Hani\0Hans\0Hant\0Hebr\0Hluw\0Hmnp\0Ital\0Java\0Jpan\0Kali\0" - "Kana\0Kawi\0Khar\0Khmr\0Kits\0Knda\0Kore\0Lana\0Laoo\0Latf\0Latg\0" + "Aghb\0Ahom\0Arab\0Armi\0Armn\0Avst\0Bali\0Bamu\0Bass\0Batk\0Beng\0" + "Bopo\0Brah\0Cakm\0Cans\0Cari\0Cham\0Cher\0Chrs\0Copt\0Cprt\0Cyrl\0" + "Deva\0Egyp\0Elym\0Ethi\0Geor\0Gong\0Gonm\0Goth\0Gran\0Grek\0Gujr\0" + "Guru\0Hang\0Hani\0Hans\0Hant\0Hebr\0Hluw\0Hmnp\0Ital\0Java\0Jpan\0" + "Kali\0Kana\0Khar\0Khmr\0Kits\0Knda\0Kore\0Lana\0Laoo\0Latf\0Latg\0" "Lepc\0Lina\0Linb\0Lisu\0Lyci\0Lydi\0Mand\0Mani\0Marc\0Medf\0Merc\0" "Mlym\0Modi\0Mong\0Mroo\0Mtei\0Mymr\0Narb\0Newa\0Nkoo\0Nshu\0Ogam\0" "Olck\0Orkh\0Orya\0Osge\0Ougr\0Pauc\0Phli\0Phnx\0Plrd\0Prti\0Rjng\0" @@ -110,8 +110,8 @@ const char dsLocaleIDChars[] = const int32_t defaultScriptTable[] = { 0, 330, // aaf -> Mlym 4, 10, // aao -> Arab - 8, 150, // aat -> Grek - 12, 100, // ab -> Cyrl + 8, 155, // aat -> Grek + 12, 105, // ab -> Cyrl 15, 10, // abh -> Arab 19, 435, // abl -> Rjng 23, 10, // abv -> Arab @@ -121,64 +121,64 @@ const int32_t defaultScriptTable[] = { 39, 10, // acx -> Arab 43, 10, // adf -> Arab 47, 555, // adx -> Tibt - 51, 100, // ady -> Cyrl + 51, 105, // ady -> Cyrl 55, 25, // ae -> Avst 58, 10, // aeb -> Arab 62, 10, // aec -> Arab 66, 10, // aee -> Arab 70, 10, // aeq -> Arab 74, 10, // afb -> Arab - 78, 105, // agi -> Deva - 82, 120, // agj -> Ethi - 86, 100, // agx -> Cyrl - 90, 120, // ahg -> Ethi + 78, 110, // agi -> Deva + 82, 125, // agj -> Ethi + 86, 105, // agx -> Cyrl + 90, 125, // ahg -> Ethi 94, 5, // aho -> Ahom - 98, 105, // ahr -> Deva + 98, 110, // ahr -> Deva 102, 10, // aib -> Arab 106, 495, // aii -> Syrc - 110, 185, // aij -> Hebr - 114, 220, // ain -> Kana + 110, 190, // aij -> Hebr + 114, 225, // ain -> Kana 118, 355, // aio -> Mymr 122, 10, // aiq -> Arab 126, 590, // akk -> Xsux - 130, 100, // akv -> Cyrl + 130, 105, // akv -> Cyrl 134, 260, // alk -> Laoo 138, 330, // all -> Mlym - 142, 100, // alr -> Cyrl - 146, 100, // alt -> Cyrl - 150, 120, // alw -> Ethi - 154, 120, // am -> Ethi - 157, 210, // ams -> Jpan + 142, 105, // alr -> Cyrl + 146, 105, // alt -> Cyrl + 150, 125, // alw -> Ethi + 154, 125, // am -> Ethi + 157, 215, // ams -> Jpan 161, 495, // amw -> Syrc - 165, 100, // ani -> Cyrl - 169, 105, // anp -> Deva - 173, 105, // anq -> Deva - 177, 105, // anr -> Deva - 181, 120, // anu -> Ethi - 185, 45, // aot -> Beng + 165, 105, // ani -> Cyrl + 169, 110, // anp -> Deva + 173, 110, // anq -> Deva + 177, 110, // anr -> Deva + 181, 125, // anu -> Ethi + 185, 50, // aot -> Beng 189, 10, // apc -> Arab 193, 10, // apd -> Arab - 197, 105, // aph -> Deva - 201, 100, // aqc -> Cyrl + 197, 110, // aph -> Deva + 201, 105, // aqc -> Cyrl 205, 10, // ar -> Arab 208, 15, // arc -> Armi 212, 10, // arq -> Arab 216, 10, // ars -> Arab 220, 10, // ary -> Arab 224, 10, // arz -> Arab - 228, 45, // as -> Beng + 228, 50, // as -> Beng 231, 465, // ase -> Sgnw 235, 10, // ask -> Arab - 239, 105, // asr -> Deva + 239, 110, // asr -> Deva 243, 10, // atn -> Arab - 247, 100, // atv -> Cyrl + 247, 105, // atv -> Cyrl 251, 10, // auj -> Arab 255, 10, // auz -> Arab - 259, 100, // av -> Cyrl + 259, 105, // av -> Cyrl 262, 10, // avd -> Arab 266, 10, // avl -> Arab - 270, 105, // awa -> Deva - 274, 120, // awn -> Ethi + 270, 110, // awa -> Deva + 274, 125, // awn -> Ethi 278, 20, // axm -> Armn 282, 10, // ayh -> Arab 286, 10, // ayl -> Arab @@ -186,547 +186,547 @@ const int32_t defaultScriptTable[] = { 294, 10, // ayp -> Arab 298, 10, // az_IQ -> Arab 304, 10, // az_IR -> Arab - 310, 100, // az_RU -> Cyrl + 310, 105, // az_RU -> Cyrl 316, 10, // azb -> Arab - 320, 100, // ba -> Cyrl + 320, 105, // ba -> Cyrl 323, 10, // bal -> Arab - 327, 105, // bap -> Deva - 331, 30, // bax -> Bamu - 335, 125, // bbl -> Geor - 339, 120, // bcq -> Ethi + 327, 110, // bap -> Deva + 331, 35, // bax -> Bamu + 335, 130, // bbl -> Geor + 339, 125, // bcq -> Ethi 343, 395, // bdv -> Orya 347, 10, // bdz -> Arab - 351, 100, // be -> Cyrl - 354, 105, // bee -> Deva + 351, 105, // be -> Cyrl + 354, 110, // bee -> Deva 358, 10, // bej -> Arab - 362, 105, // bfb -> Deva + 362, 110, // bfb -> Deva 366, 520, // bfq -> Taml 370, 10, // bft -> Arab 374, 555, // bfu -> Tibt 378, 395, // bfw -> Orya - 382, 105, // bfy -> Deva - 386, 105, // bfz -> Deva - 390, 100, // bg -> Cyrl - 393, 105, // bgc -> Deva - 397, 105, // bgd -> Deva + 382, 110, // bfy -> Deva + 386, 110, // bfz -> Deva + 390, 105, // bg -> Cyrl + 393, 110, // bgc -> Deva + 397, 110, // bgd -> Deva 401, 10, // bgn -> Arab 405, 10, // bgp -> Arab - 409, 105, // bgq -> Deva - 413, 105, // bgw -> Deva - 417, 150, // bgx -> Grek - 421, 105, // bha -> Deva - 425, 105, // bhb -> Deva - 429, 105, // bhd -> Deva + 409, 110, // bgq -> Deva + 413, 110, // bgw -> Deva + 417, 155, // bgx -> Grek + 421, 110, // bha -> Deva + 425, 110, // bhb -> Deva + 429, 110, // bhd -> Deva 433, 10, // bhe -> Arab - 437, 100, // bhh -> Cyrl - 441, 105, // bhi -> Deva - 445, 105, // bhj -> Deva + 437, 105, // bhh -> Cyrl + 441, 110, // bhi -> Deva + 445, 110, // bhj -> Deva 449, 10, // bhm -> Arab 453, 495, // bhn -> Syrc - 457, 105, // bho -> Deva - 461, 105, // bht -> Deva - 465, 105, // bhu -> Deva - 469, 105, // biy -> Deva + 457, 110, // bho -> Deva + 461, 110, // bht -> Deva + 465, 110, // bhu -> Deva + 469, 110, // biy -> Deva 473, 495, // bjf -> Syrc - 477, 105, // bjj -> Deva + 477, 110, // bjj -> Deva 481, 10, // bjm -> Arab 485, 555, // bkk -> Tibt 489, 355, // blk -> Mymr 493, 530, // blt -> Tavt - 497, 105, // bmj -> Deva - 501, 45, // bn -> Beng - 504, 105, // bns -> Deva + 497, 110, // bmj -> Deva + 501, 50, // bn -> Beng + 504, 110, // bns -> Deva 508, 555, // bo -> Tibt - 511, 100, // bph -> Cyrl - 515, 105, // bpx -> Deva - 519, 45, // bpy -> Beng + 511, 105, // bph -> Cyrl + 515, 110, // bpx -> Deva + 519, 50, // bpy -> Beng 523, 10, // bqi -> Arab - 527, 105, // bra -> Deva + 527, 110, // bra -> Deva 531, 235, // brb -> Khmr - 535, 105, // brd -> Deva + 535, 110, // brd -> Deva 539, 10, // brh -> Arab 543, 10, // brk -> Arab 547, 555, // bro -> Tibt 551, 260, // brv -> Laoo 555, 245, // brw -> Knda - 559, 105, // brx -> Deva + 559, 110, // brx -> Deva 563, 10, // bsh -> Arab 567, 10, // bsk -> Arab - 571, 35, // bsq -> Bass - 575, 120, // bst -> Ethi - 579, 40, // btd -> Batk - 583, 40, // btm -> Batk - 587, 105, // btv -> Deva - 591, 100, // bua -> Cyrl + 571, 40, // bsq -> Bass + 575, 125, // bst -> Ethi + 579, 45, // btd -> Batk + 583, 45, // btm -> Batk + 587, 110, // btv -> Deva + 591, 105, // bua -> Cyrl 595, 355, // bwe -> Mymr - 599, 100, // bxm -> Cyrl + 599, 105, // bxm -> Cyrl 603, 340, // bxu -> Mong - 607, 105, // byh -> Deva - 611, 120, // byn -> Ethi - 615, 105, // byw -> Deva + 607, 110, // byh -> Deva + 611, 125, // byn -> Ethi + 615, 110, // byw -> Deva 619, 550, // bzi -> Thai 623, 550, // cbn -> Thai - 627, 60, // ccp -> Cakm + 627, 65, // ccp -> Cakm 631, 535, // cde -> Telu - 635, 105, // cdh -> Deva - 639, 155, // cdi -> Gujr - 643, 105, // cdj -> Deva - 647, 105, // cdm -> Deva - 651, 175, // cdo -> Hans - 655, 45, // cdz -> Beng - 659, 100, // ce -> Cyrl + 635, 110, // cdh -> Deva + 639, 160, // cdi -> Gujr + 643, 110, // cdj -> Deva + 647, 110, // cdm -> Deva + 651, 180, // cdo -> Hans + 655, 50, // cdz -> Beng + 659, 105, // ce -> Cyrl 662, 555, // cgk -> Tibt 666, 10, // chg -> Arab - 670, 100, // chm -> Cyrl - 674, 80, // chr -> Cher - 678, 105, // chx -> Deva - 682, 105, // cih -> Deva + 670, 105, // chm -> Cyrl + 674, 85, // chr -> Cher + 678, 110, // chx -> Deva + 682, 110, // cih -> Deva 686, 10, // cja -> Arab - 690, 100, // cji -> Cyrl - 694, 75, // cjm -> Cham - 698, 175, // cjy -> Hans + 690, 105, // cji -> Cyrl + 694, 80, // cjm -> Cham + 698, 180, // cjy -> Hans 702, 10, // ckb -> Arab - 706, 100, // ckt -> Cyrl + 706, 105, // ckt -> Cyrl 710, 10, // clh -> Arab - 714, 100, // clw -> Cyrl + 714, 105, // clw -> Cyrl 718, 485, // cmg -> Soyo 722, 555, // cna -> Tibt - 726, 175, // cnp -> Hans + 726, 180, // cnp -> Hans 730, 550, // cog -> Thai - 734, 90, // cop -> Copt - 738, 150, // cpg -> Grek - 742, 65, // cr -> Cans - 745, 100, // crh -> Cyrl - 749, 65, // crj -> Cans - 753, 65, // crk -> Cans - 757, 65, // crl -> Cans - 761, 65, // crm -> Cans + 734, 95, // cop -> Copt + 738, 155, // cpg -> Grek + 742, 70, // cr -> Cans + 745, 105, // crh -> Cyrl + 749, 70, // crj -> Cans + 753, 70, // crk -> Cans + 757, 70, // crl -> Cans + 761, 70, // crm -> Cans 765, 355, // csh -> Mymr - 769, 175, // csp -> Hans - 773, 65, // csw -> Cans + 769, 180, // csp -> Hans + 773, 70, // csw -> Cans 777, 410, // ctd -> Pauc - 781, 45, // ctg -> Beng - 785, 105, // ctn -> Deva + 781, 50, // ctg -> Beng + 785, 110, // ctn -> Deva 789, 520, // ctt -> Taml 793, 520, // cty -> Taml - 797, 100, // cu -> Cyrl + 797, 105, // cu -> Cyrl 800, 255, // cuu -> Lana - 804, 100, // cv -> Cyrl - 807, 175, // czh -> Hans - 811, 185, // czk -> Hebr - 815, 105, // daq -> Deva - 819, 100, // dar -> Cyrl + 804, 105, // cv -> Cyrl + 807, 180, // czh -> Hans + 811, 190, // czk -> Hebr + 815, 110, // daq -> Deva + 819, 105, // dar -> Cyrl 823, 10, // dcc -> Arab - 827, 100, // ddo -> Cyrl + 827, 105, // ddo -> Cyrl 831, 10, // def -> Arab 835, 10, // deh -> Arab - 839, 45, // der -> Beng + 839, 50, // der -> Beng 843, 10, // dgl -> Arab - 847, 105, // dhi -> Deva - 851, 155, // dhn -> Gujr - 855, 105, // dho -> Deva - 859, 105, // dhw -> Deva + 847, 110, // dhi -> Deva + 851, 160, // dhn -> Gujr + 855, 110, // dho -> Deva + 859, 110, // dhw -> Deva 863, 555, // dka -> Tibt - 867, 100, // dlg -> Cyrl + 867, 105, // dlg -> Cyrl 871, 320, // dmf -> Medf 875, 10, // dmk -> Arab 879, 10, // dml -> Arab - 883, 100, // dng -> Cyrl + 883, 105, // dng -> Cyrl 887, 355, // dnu -> Mymr 891, 355, // dnv -> Mymr - 895, 105, // doi -> Deva - 899, 120, // dox -> Ethi + 895, 110, // doi -> Deva + 899, 125, // dox -> Ethi 903, 555, // dre -> Tibt - 907, 105, // drq -> Deva - 911, 120, // drs -> Ethi - 915, 105, // dry -> Deva + 907, 110, // drq -> Deva + 911, 125, // drs -> Ethi + 915, 110, // dry -> Deva 919, 395, // dso -> Orya - 923, 105, // dty -> Deva - 927, 155, // dub -> Gujr - 931, 105, // duh -> Deva - 935, 105, // dus -> Deva + 923, 110, // dty -> Deva + 927, 160, // dub -> Gujr + 931, 110, // duh -> Deva + 935, 110, // dus -> Deva 939, 545, // dv -> Thaa 942, 395, // dwk -> Orya - 946, 105, // dwz -> Deva + 946, 110, // dwz -> Deva 950, 555, // dz -> Tibt 953, 555, // dzl -> Tibt - 957, 150, // ecr -> Grek - 961, 95, // ecy -> Cprt - 965, 110, // egy -> Egyp - 969, 215, // eky -> Kali - 973, 150, // el -> Grek - 976, 105, // emg -> Deva - 980, 105, // emu -> Deva - 984, 100, // enf -> Cyrl - 988, 100, // enh -> Cyrl + 957, 155, // ecr -> Grek + 961, 100, // ecy -> Cprt + 965, 115, // egy -> Egyp + 969, 220, // eky -> Kali + 973, 155, // el -> Grek + 976, 110, // emg -> Deva + 980, 110, // emu -> Deva + 984, 105, // enf -> Cyrl + 988, 105, // enh -> Cyrl 992, 520, // era -> Taml - 996, 135, // esg -> Gonm + 996, 140, // esg -> Gonm 1000, 10, // esh -> Arab - 1004, 200, // ett -> Ital - 1008, 100, // eve -> Cyrl - 1012, 100, // evn -> Cyrl + 1004, 205, // ett -> Ital + 1008, 105, // eve -> Cyrl + 1012, 105, // evn -> Cyrl 1016, 10, // fa -> Arab 1019, 10, // fay -> Arab 1023, 10, // faz -> Arab 1027, 10, // fia -> Arab - 1031, 105, // fmu -> Deva + 1031, 110, // fmu -> Deva 1035, 10, // fub -> Arab - 1039, 175, // gan -> Hans + 1039, 180, // gan -> Hans 1043, 395, // gaq -> Orya - 1047, 155, // gas -> Gujr + 1047, 160, // gas -> Gujr 1051, 535, // gau -> Telu 1055, 395, // gbj -> Orya - 1059, 105, // gbk -> Deva - 1063, 155, // gbl -> Gujr - 1067, 105, // gbm -> Deva + 1059, 110, // gbk -> Deva + 1063, 160, // gbl -> Gujr + 1067, 110, // gbm -> Deva 1071, 10, // gbz -> Arab 1075, 395, // gdb -> Orya - 1079, 100, // gdo -> Cyrl - 1083, 105, // gdx -> Deva - 1087, 120, // gez -> Ethi + 1079, 105, // gdo -> Cyrl + 1083, 110, // gdx -> Deva + 1087, 125, // gez -> Ethi 1091, 10, // ggg -> Arab 1095, 10, // gha -> Arab - 1099, 105, // ghe -> Deva + 1099, 110, // ghe -> Deva 1103, 540, // gho -> Tfng 1107, 10, // ghr -> Arab 1111, 555, // ght -> Tibt 1115, 10, // gig -> Arab - 1119, 100, // gin -> Cyrl + 1119, 105, // gin -> Cyrl 1123, 10, // gjk -> Arab 1127, 10, // gju -> Arab - 1131, 100, // gld -> Cyrl + 1131, 105, // gld -> Cyrl 1135, 10, // glh -> Arab 1139, 10, // glk -> Arab 1143, 265, // gml -> Latf - 1147, 120, // gmv -> Ethi + 1147, 125, // gmv -> Ethi 1151, 285, // gmy -> Linb 1155, 555, // goe -> Tibt - 1159, 120, // gof -> Ethi - 1163, 105, // goj -> Deva - 1167, 105, // gok -> Deva - 1171, 105, // gon -> Deva - 1175, 140, // got -> Goth - 1179, 105, // gra -> Deva - 1183, 95, // grc -> Cprt - 1187, 45, // grt -> Beng - 1191, 120, // gru -> Ethi - 1195, 155, // gu -> Gujr - 1198, 105, // gvr -> Deva + 1159, 125, // gof -> Ethi + 1163, 110, // goj -> Deva + 1167, 110, // gok -> Deva + 1171, 110, // gon -> Deva + 1175, 145, // got -> Goth + 1179, 110, // gra -> Deva + 1183, 155, // grc -> Grek + 1187, 50, // grt -> Beng + 1191, 125, // gru -> Ethi + 1195, 160, // gu -> Gujr + 1198, 110, // gvr -> Deva 1202, 10, // gwc -> Arab 1206, 10, // gwf -> Arab 1210, 10, // gwt -> Arab - 1214, 105, // gyo -> Deva + 1214, 110, // gyo -> Deva 1218, 10, // gzi -> Arab 1222, 10, // ha_CM -> Arab 1228, 10, // ha_SD -> Arab 1234, 10, // hac -> Arab - 1238, 175, // hak -> Hans - 1242, 120, // har -> Ethi + 1238, 180, // hak -> Hans + 1242, 125, // har -> Ethi 1246, 10, // haz -> Arab - 1250, 185, // hbo -> Hebr - 1254, 120, // hdy -> Ethi - 1258, 185, // he -> Hebr - 1261, 105, // hi -> Deva - 1264, 105, // hif -> Deva + 1250, 190, // hbo -> Hebr + 1254, 125, // hdy -> Ethi + 1258, 190, // he -> Hebr + 1261, 110, // hi -> Deva + 1264, 110, // hif -> Deva 1268, 505, // hii -> Takr 1272, 590, // hit -> Xsux 1276, 10, // hkh -> Arab - 1280, 105, // hlb -> Deva - 1284, 190, // hlu -> Hluw + 1280, 110, // hlb -> Deva + 1284, 195, // hlu -> Hluw 1288, 425, // hmd -> Plrd - 1292, 50, // hmj -> Bopo - 1296, 50, // hmq -> Bopo + 1292, 55, // hmj -> Bopo + 1296, 55, // hmq -> Bopo 1300, 10, // hnd -> Arab - 1304, 105, // hne -> Deva - 1308, 195, // hnj -> Hmnp + 1304, 110, // hne -> Deva + 1308, 200, // hnj -> Hmnp 1312, 10, // hno -> Arab - 1316, 105, // hoc -> Deva + 1316, 110, // hoc -> Deva 1320, 10, // hoh -> Arab - 1324, 105, // hoj -> Deva - 1328, 170, // how -> Hani - 1332, 105, // hoy -> Deva + 1324, 110, // hoj -> Deva + 1328, 175, // how -> Hani + 1332, 110, // hoy -> Deva 1336, 355, // hpo -> Mymr 1340, 495, // hrt -> Syrc 1344, 10, // hrz -> Arab - 1348, 175, // hsn -> Hans + 1348, 180, // hsn -> Hans 1352, 10, // hss -> Arab 1356, 590, // htx -> Xsux - 1360, 105, // hut -> Deva - 1364, 185, // huy -> Hebr - 1368, 100, // huz -> Cyrl + 1360, 110, // hut -> Deva + 1364, 190, // huy -> Hebr + 1368, 105, // huz -> Cyrl 1372, 20, // hy -> Armn 1375, 20, // hyw -> Armn 1379, 595, // ii -> Yiii 1382, 295, // imy -> Lyci - 1386, 100, // inh -> Cyrl + 1386, 105, // inh -> Cyrl 1390, 355, // int -> Mymr - 1394, 120, // ior -> Ethi + 1394, 125, // ior -> Ethi 1398, 520, // iru -> Taml 1402, 10, // isk -> Arab - 1406, 185, // itk -> Hebr - 1410, 100, // itl -> Cyrl - 1414, 65, // iu -> Cans - 1417, 185, // iw -> Hebr - 1420, 210, // ja -> Jpan + 1406, 190, // itk -> Hebr + 1410, 105, // itl -> Cyrl + 1414, 70, // iu -> Cans + 1417, 190, // iw -> Hebr + 1420, 215, // ja -> Jpan 1423, 10, // jad -> Arab 1427, 10, // jat -> Arab - 1431, 185, // jbe -> Hebr + 1431, 190, // jbe -> Hebr 1435, 10, // jbn -> Arab - 1439, 100, // jct -> Cyrl + 1439, 105, // jct -> Cyrl 1443, 555, // jda -> Tibt 1447, 10, // jdg -> Arab - 1451, 100, // jdt -> Cyrl - 1455, 105, // jee -> Deva - 1459, 125, // jge -> Geor - 1463, 185, // ji -> Hebr - 1466, 165, // jje -> Hang + 1451, 105, // jdt -> Cyrl + 1455, 110, // jee -> Deva + 1459, 130, // jge -> Geor + 1463, 190, // ji -> Hebr + 1466, 170, // jje -> Hang 1470, 355, // jkm -> Mymr - 1474, 105, // jml -> Deva + 1474, 110, // jml -> Deva 1478, 505, // jna -> Takr 1482, 10, // jnd -> Arab - 1486, 105, // jnl -> Deva - 1490, 105, // jns -> Deva + 1486, 110, // jnl -> Deva + 1490, 110, // jns -> Deva 1494, 10, // jog -> Arab - 1498, 185, // jpa -> Hebr - 1502, 185, // jpr -> Hebr - 1506, 185, // jrb -> Hebr - 1510, 105, // jul -> Deva + 1498, 190, // jpa -> Hebr + 1502, 190, // jpr -> Hebr + 1506, 190, // jrb -> Hebr + 1510, 110, // jul -> Deva 1514, 395, // jun -> Orya 1518, 395, // juy -> Orya 1522, 555, // jya -> Tibt - 1526, 185, // jye -> Hebr - 1530, 125, // ka -> Geor - 1533, 100, // kaa -> Cyrl - 1537, 100, // kap -> Cyrl - 1541, 225, // kaw -> Kawi - 1545, 100, // kbd -> Cyrl + 1526, 190, // jye -> Hebr + 1530, 130, // ka -> Geor + 1533, 105, // kaa -> Cyrl + 1537, 105, // kap -> Cyrl + 1541, 30, // kaw -> Bali + 1545, 105, // kbd -> Cyrl 1549, 555, // kbg -> Tibt 1553, 10, // kbu -> Arab 1557, 10, // kby -> Arab - 1561, 100, // kca -> Cyrl + 1561, 105, // kca -> Cyrl 1565, 10, // kcy -> Arab - 1569, 45, // kdq -> Beng + 1569, 50, // kdq -> Beng 1573, 550, // kdt -> Thai - 1577, 100, // ket -> Cyrl + 1577, 105, // ket -> Cyrl 1581, 330, // kev -> Mlym - 1585, 105, // kex -> Deva + 1585, 110, // kex -> Deva 1589, 535, // key -> Telu 1593, 245, // kfa -> Knda - 1597, 105, // kfb -> Deva + 1597, 110, // kfb -> Deva 1601, 535, // kfc -> Telu 1605, 245, // kfd -> Knda 1609, 520, // kfe -> Taml 1613, 245, // kfg -> Knda 1617, 330, // kfh -> Mlym 1621, 520, // kfi -> Taml - 1625, 105, // kfk -> Deva + 1625, 110, // kfk -> Deva 1629, 10, // kfm -> Arab - 1633, 105, // kfp -> Deva - 1637, 105, // kfq -> Deva - 1641, 105, // kfr -> Deva - 1645, 105, // kfs -> Deva - 1649, 105, // kfu -> Deva - 1653, 105, // kfx -> Deva - 1657, 105, // kfy -> Deva - 1661, 105, // kgj -> Deva - 1665, 105, // kgy -> Deva + 1633, 110, // kfp -> Deva + 1637, 110, // kfq -> Deva + 1641, 110, // kfr -> Deva + 1645, 110, // kfs -> Deva + 1649, 110, // kfu -> Deva + 1653, 110, // kfx -> Deva + 1657, 110, // kfy -> Deva + 1661, 110, // kgj -> Deva + 1665, 110, // kgy -> Deva 1669, 515, // khb -> Talu 1673, 550, // khf -> Thai 1677, 555, // khg -> Tibt - 1681, 105, // khn -> Deva - 1685, 55, // kho -> Brah + 1681, 110, // khn -> Deva + 1685, 60, // kho -> Brah 1689, 355, // kht -> Mymr - 1693, 100, // khv -> Cyrl + 1693, 105, // khv -> Cyrl 1697, 10, // khw -> Arab - 1701, 105, // kif -> Deva - 1705, 100, // kim -> Cyrl - 1709, 105, // kip -> Deva + 1701, 110, // kif -> Deva + 1705, 105, // kim -> Cyrl + 1709, 110, // kip -> Deva 1713, 260, // kjg -> Laoo - 1717, 100, // kjh -> Cyrl - 1721, 105, // kjl -> Deva - 1725, 105, // kjo -> Deva + 1717, 105, // kjh -> Cyrl + 1721, 110, // kjl -> Deva + 1725, 110, // kjo -> Deva 1729, 355, // kjp -> Mymr 1733, 550, // kjt -> Thai 1737, 555, // kjz -> Tibt - 1741, 100, // kk -> Cyrl + 1741, 105, // kk -> Cyrl 1744, 10, // kk_AF -> Arab 1750, 10, // kk_CN -> Arab 1756, 10, // kk_IR -> Arab 1762, 10, // kk_MN -> Arab 1768, 555, // kkf -> Tibt 1772, 255, // kkh -> Lana - 1776, 105, // kkt -> Deva - 1780, 105, // kle -> Deva + 1776, 110, // kkt -> Deva + 1780, 110, // kle -> Deva 1784, 10, // klj -> Arab - 1788, 105, // klr -> Deva + 1788, 110, // klr -> Deva 1792, 235, // km -> Khmr - 1795, 105, // kmj -> Deva + 1795, 110, // kmj -> Deva 1799, 10, // kmz -> Arab 1803, 245, // kn -> Knda - 1806, 105, // knn -> Deva + 1806, 110, // knn -> Deva 1810, 250, // ko -> Kore - 1813, 100, // koi -> Cyrl - 1817, 105, // kok -> Deva - 1821, 100, // kpt -> Cyrl - 1825, 100, // kpy -> Cyrl + 1813, 105, // koi -> Cyrl + 1817, 110, // kok -> Deva + 1821, 105, // kpt -> Cyrl + 1825, 105, // kpy -> Cyrl 1829, 495, // kqd -> Syrc - 1833, 120, // kqy -> Ethi - 1837, 105, // kra -> Deva - 1841, 100, // krc -> Cyrl - 1845, 100, // krk -> Cyrl + 1833, 125, // kqy -> Ethi + 1837, 110, // kra -> Deva + 1841, 105, // krc -> Cyrl + 1845, 105, // krk -> Cyrl 1849, 235, // krr -> Khmr - 1853, 105, // kru -> Deva + 1853, 110, // kru -> Deva 1857, 235, // krv -> Khmr 1861, 10, // ks -> Arab 1864, 355, // ksu -> Mymr 1868, 355, // ksw -> Mymr - 1872, 105, // ksz -> Deva - 1876, 120, // ktb -> Ethi - 1880, 105, // kte -> Deva + 1872, 110, // ksz -> Deva + 1876, 125, // ktb -> Ethi + 1880, 110, // kte -> Deva 1884, 10, // ktl -> Arab 1888, 425, // ktp -> Plrd 1892, 10, // ku_LB -> Arab 1898, 260, // kuf -> Laoo - 1902, 100, // kum -> Cyrl - 1906, 100, // kv -> Cyrl - 1909, 100, // kva -> Cyrl + 1902, 105, // kum -> Cyrl + 1906, 105, // kv -> Cyrl + 1909, 105, // kva -> Cyrl 1913, 355, // kvq -> Mymr 1917, 355, // kvt -> Mymr 1921, 10, // kvx -> Arab - 1925, 215, // kvy -> Kali + 1925, 220, // kvy -> Kali 1929, 355, // kxf -> Mymr 1933, 355, // kxk -> Mymr 1937, 550, // kxm -> Thai 1941, 10, // kxp -> Arab - 1945, 100, // ky -> Cyrl + 1945, 105, // ky -> Cyrl 1948, 10, // ky_CN -> Arab - 1954, 215, // kyu -> Kali - 1958, 105, // kyv -> Deva - 1962, 105, // kyw -> Deva + 1954, 220, // kyu -> Kali + 1958, 110, // kyv -> Deva + 1962, 110, // kyw -> Deva 1966, 280, // lab -> Lina - 1970, 185, // lad -> Hebr - 1974, 105, // lae -> Deva + 1970, 190, // lad -> Hebr + 1974, 110, // lae -> Deva 1978, 10, // lah -> Arab - 1982, 100, // lbe -> Cyrl - 1986, 105, // lbf -> Deva + 1982, 105, // lbe -> Cyrl + 1986, 110, // lbf -> Deva 1990, 555, // lbj -> Tibt - 1994, 105, // lbm -> Deva + 1994, 110, // lbm -> Deva 1998, 260, // lbo -> Laoo - 2002, 105, // lbr -> Deva + 2002, 110, // lbr -> Deva 2006, 550, // lcp -> Thai 2010, 275, // lep -> Lepc - 2014, 100, // lez -> Cyrl - 2018, 105, // lhm -> Deva + 2014, 105, // lez -> Cyrl + 2018, 110, // lhm -> Deva 2022, 495, // lhs -> Syrc - 2026, 105, // lif -> Deva + 2026, 110, // lif -> Deva 2030, 290, // lis -> Lisu 2034, 555, // lkh -> Tibt 2038, 10, // lki -> Arab - 2042, 105, // lmh -> Deva + 2042, 110, // lmh -> Deva 2046, 535, // lmn -> Telu 2050, 260, // lo -> Laoo - 2053, 105, // loy -> Deva + 2053, 110, // loy -> Deva 2057, 425, // lpo -> Plrd 2061, 10, // lrc -> Arab 2065, 10, // lrk -> Arab 2069, 10, // lrl -> Arab 2073, 10, // lsa -> Arab - 2077, 185, // lsd -> Hebr + 2077, 190, // lsd -> Hebr 2081, 10, // lss -> Arab - 2085, 180, // ltc -> Hant + 2085, 185, // ltc -> Hant 2089, 555, // luk -> Tibt - 2093, 105, // luu -> Deva + 2093, 110, // luu -> Deva 2097, 10, // luv -> Arab 2101, 10, // luz -> Arab 2105, 550, // lwl -> Thai 2109, 550, // lwm -> Thai 2113, 555, // lya -> Tibt - 2117, 175, // lzh -> Hans - 2121, 105, // mag -> Deva - 2125, 105, // mai -> Deva + 2117, 180, // lzh -> Hans + 2121, 110, // mag -> Deva + 2125, 110, // mai -> Deva 2129, 370, // man_GN -> Nkoo 2136, 10, // mby -> Arab 2140, 10, // mde -> Arab - 2144, 100, // mdf -> Cyrl - 2148, 120, // mdx -> Ethi - 2152, 120, // mdy -> Ethi + 2144, 105, // mdf -> Cyrl + 2148, 125, // mdx -> Ethi + 2152, 125, // mdy -> Ethi 2156, 10, // mfa -> Arab 2160, 10, // mfi -> Arab 2164, 270, // mga -> Latg - 2168, 105, // mgp -> Deva + 2168, 110, // mgp -> Deva 2172, 10, // mhj -> Arab 2176, 305, // mid -> Mand - 2180, 105, // mjl -> Deva + 2180, 110, // mjl -> Deva 2184, 330, // mjq -> Mlym 2188, 330, // mjr -> Mlym - 2192, 105, // mjt -> Deva + 2192, 110, // mjt -> Deva 2196, 535, // mju -> Telu 2200, 330, // mjv -> Mlym - 2204, 105, // mjz -> Deva - 2208, 100, // mk -> Cyrl - 2211, 105, // mkb -> Deva - 2215, 105, // mke -> Deva + 2204, 110, // mjz -> Deva + 2208, 105, // mk -> Cyrl + 2211, 110, // mkb -> Deva + 2215, 110, // mke -> Deva 2219, 10, // mki -> Arab 2223, 550, // mkm -> Thai 2227, 330, // ml -> Mlym 2230, 550, // mlf -> Thai - 2234, 100, // mn -> Cyrl + 2234, 105, // mn -> Cyrl 2237, 340, // mn_CN -> Mong 2243, 340, // mnc -> Mong - 2247, 45, // mni -> Beng + 2247, 50, // mni -> Beng 2251, 10, // mnj -> Arab - 2255, 100, // mns -> Cyrl + 2255, 105, // mns -> Cyrl 2259, 355, // mnw -> Mymr 2263, 550, // mpz -> Thai - 2267, 105, // mr -> Deva + 2267, 110, // mr -> Deva 2270, 550, // mra -> Thai - 2274, 105, // mrd -> Deva - 2278, 100, // mrj -> Cyrl + 2274, 110, // mrd -> Deva + 2278, 105, // mrj -> Cyrl 2282, 345, // mro -> Mroo - 2286, 105, // mrr -> Deva + 2286, 110, // mrr -> Deva 2290, 10, // ms_CC -> Arab - 2296, 100, // mtm -> Cyrl - 2300, 105, // mtr -> Deva - 2304, 100, // mud -> Cyrl + 2296, 105, // mtm -> Cyrl + 2300, 110, // mtr -> Deva + 2304, 105, // mud -> Cyrl 2308, 555, // muk -> Tibt - 2312, 105, // mut -> Deva + 2312, 110, // mut -> Deva 2316, 520, // muv -> Taml - 2320, 120, // muz -> Ethi + 2320, 125, // muz -> Ethi 2324, 10, // mve -> Arab 2328, 340, // mvf -> Mong 2332, 10, // mvy -> Arab - 2336, 120, // mvz -> Ethi - 2340, 105, // mwr -> Deva + 2336, 125, // mvz -> Ethi + 2340, 110, // mwr -> Deva 2344, 355, // mwt -> Mymr - 2348, 195, // mww -> Hmnp + 2348, 200, // mww -> Hmnp 2352, 355, // my -> Mymr - 2355, 120, // mym -> Ethi - 2359, 100, // myv -> Cyrl + 2355, 125, // mym -> Ethi + 2359, 105, // myv -> Cyrl 2363, 305, // myz -> Mand 2367, 10, // mzn -> Arab - 2371, 175, // nan -> Hans - 2375, 105, // nao -> Deva - 2379, 105, // ncd -> Deva + 2371, 180, // nan -> Hans + 2375, 110, // nao -> Deva + 2379, 110, // ncd -> Deva 2383, 260, // ncq -> Laoo - 2387, 100, // ndf -> Cyrl - 2391, 105, // ne -> Deva - 2394, 100, // neg -> Cyrl + 2387, 105, // ndf -> Cyrl + 2391, 110, // ne -> Deva + 2394, 105, // neg -> Cyrl 2398, 555, // neh -> Tibt 2402, 590, // nei -> Xsux - 2406, 105, // new -> Deva + 2406, 110, // new -> Deva 2410, 260, // ngt -> Laoo - 2414, 100, // nio -> Cyrl + 2414, 105, // nio -> Cyrl 2418, 535, // nit -> Telu - 2422, 100, // niv -> Cyrl + 2422, 105, // niv -> Cyrl 2426, 10, // nli -> Arab 2430, 10, // nlm -> Arab - 2434, 105, // nlx -> Deva - 2438, 105, // nmm -> Deva + 2434, 110, // nlx -> Deva + 2438, 110, // nmm -> Deva 2442, 580, // nnp -> Wcho 2446, 255, // nod -> Lana - 2450, 105, // noe -> Deva - 2454, 100, // nog -> Cyrl - 2458, 105, // noi -> Deva + 2450, 110, // noe -> Deva + 2454, 105, // nog -> Cyrl + 2458, 110, // noi -> Deva 2462, 445, // non -> Runr 2466, 595, // nos -> Yiii 2470, 555, // npb -> Tibt @@ -734,68 +734,68 @@ const int32_t defaultScriptTable[] = { 2478, 445, // nrn -> Runr 2482, 595, // nsd -> Yiii 2486, 595, // nsf -> Yiii - 2490, 65, // nsk -> Cans + 2490, 70, // nsk -> Cans 2494, 560, // nst -> Tnsa 2498, 595, // nsv -> Yiii 2502, 595, // nty -> Yiii 2506, 10, // ntz -> Arab 2510, 365, // nwc -> Newa - 2514, 105, // nwx -> Deva + 2514, 110, // nwx -> Deva 2518, 550, // nyl -> Thai 2522, 10, // nyq -> Arab 2526, 550, // nyw -> Thai - 2530, 100, // oaa -> Cyrl - 2534, 100, // oac -> Cyrl + 2530, 105, // oaa -> Cyrl + 2534, 105, // oac -> Cyrl 2538, 495, // oar -> Syrc - 2542, 125, // oav -> Geor + 2542, 130, // oav -> Geor 2546, 420, // obm -> Phnx 2550, 355, // obr -> Mymr 2554, 10, // odk -> Arab 2558, 590, // oht -> Xsux - 2562, 65, // oj -> Cans - 2565, 65, // ojs -> Cans - 2569, 165, // okm -> Hang - 2573, 170, // oko -> Hani + 2562, 70, // oj -> Cans + 2565, 70, // ojs -> Cans + 2569, 170, // okm -> Hang + 2573, 175, // oko -> Hani 2577, 235, // okz -> Khmr - 2581, 105, // ola -> Deva + 2581, 110, // ola -> Deva 2585, 555, // ole -> Tibt - 2589, 100, // omk -> Cyrl + 2589, 105, // omk -> Cyrl 2593, 350, // omp -> Mtei 2597, 335, // omr -> Modi 2601, 355, // omx -> Mymr - 2605, 105, // oon -> Deva + 2605, 110, // oon -> Deva 2609, 395, // or -> Orya 2612, 535, // ort -> Telu 2616, 10, // oru -> Arab - 2620, 100, // orv -> Cyrl - 2624, 100, // os -> Cyrl + 2620, 105, // orv -> Cyrl + 2624, 105, // os -> Cyrl 2627, 400, // osa -> Osge - 2631, 200, // osc -> Ital - 2635, 205, // osi -> Java + 2631, 205, // osc -> Ital + 2635, 210, // osi -> Java 2639, 10, // ota -> Arab 2643, 555, // otb -> Tibt 2647, 390, // otk -> Orkh - 2651, 145, // oty -> Gran + 2651, 150, // oty -> Gran 2655, 405, // oui -> Ougr - 2659, 160, // pa -> Guru + 2659, 165, // pa -> Guru 2662, 10, // pa_PK -> Arab 2668, 415, // pal -> Phli - 2672, 100, // paq -> Cyrl + 2672, 105, // paq -> Cyrl 2676, 10, // pbt -> Arab 2680, 235, // pcb -> Khmr 2684, 355, // pce -> Mymr 2688, 330, // pcf -> Mlym 2692, 330, // pcg -> Mlym - 2696, 105, // pch -> Deva - 2700, 105, // pci -> Deva + 2696, 110, // pch -> Deva + 2700, 110, // pci -> Deva 2704, 535, // pcj -> Telu 2708, 395, // peg -> Orya 2712, 585, // peo -> Xpeo 2716, 230, // pgd -> Khar - 2720, 105, // pgg -> Deva + 2720, 110, // pgg -> Deva 2724, 380, // pgl -> Ogam - 2728, 200, // pgn -> Ital - 2732, 105, // phd -> Deva + 2728, 205, // pgn -> Ital + 2732, 110, // phd -> Deva 2736, 355, // phk -> Mymr 2740, 10, // phl -> Arab 2744, 420, // phn -> Phnx @@ -804,14 +804,14 @@ const int32_t defaultScriptTable[] = { 2756, 550, // pht -> Thai 2760, 550, // phu -> Thai 2764, 10, // phv -> Arab - 2768, 105, // phw -> Deva + 2768, 110, // phw -> Deva 2772, 470, // pi -> Sinh - 2775, 55, // pka -> Brah + 2775, 60, // pka -> Brah 2779, 330, // pkr -> Mlym 2783, 10, // plk -> Arab 2787, 355, // pll -> Mymr - 2791, 55, // pmh -> Brah - 2795, 150, // pnt -> Grek + 2791, 60, // pmh -> Brah + 2795, 155, // pnt -> Grek 2799, 230, // pra -> Khar 2803, 10, // prc -> Arab 2807, 10, // prd -> Arab @@ -821,67 +821,67 @@ const int32_t defaultScriptTable[] = { 2822, 10, // psh -> Arab 2826, 10, // psi -> Arab 2830, 10, // pst -> Arab - 2834, 55, // psu -> Brah - 2838, 105, // pum -> Deva + 2834, 60, // psu -> Brah + 2838, 110, // pum -> Deva 2842, 355, // pwo -> Mymr - 2846, 105, // pwr -> Deva + 2846, 110, // pwr -> Deva 2850, 550, // pww -> Thai 2854, 355, // pyx -> Mymr 2858, 10, // qxq -> Arab - 2862, 105, // raa -> Deva - 2866, 105, // rab -> Deva - 2870, 105, // raf -> Deva - 2874, 45, // rah -> Beng - 2878, 105, // raj -> Deva - 2882, 105, // rav -> Deva + 2862, 110, // raa -> Deva + 2866, 110, // rab -> Deva + 2870, 110, // raf -> Deva + 2874, 50, // rah -> Beng + 2878, 110, // raj -> Deva + 2882, 110, // rav -> Deva 2886, 355, // rbb -> Mymr 2890, 10, // rdb -> Arab 2894, 395, // rei -> Orya 2898, 440, // rhg -> Rohg - 2902, 105, // rji -> Deva - 2906, 105, // rjs -> Deva + 2902, 110, // rji -> Deva + 2906, 110, // rjs -> Deva 2910, 235, // rka -> Khmr 2914, 355, // rki -> Mymr - 2918, 45, // rkt -> Beng + 2918, 50, // rkt -> Beng 2922, 20, // rmi -> Armn 2926, 10, // rmt -> Arab 2930, 355, // rmz -> Mymr - 2934, 100, // rsk -> Cyrl - 2938, 105, // rtw -> Deva - 2942, 100, // ru -> Cyrl - 2945, 100, // rue -> Cyrl - 2949, 100, // rut -> Cyrl - 2953, 105, // rwr -> Deva - 2957, 220, // ryu -> Kana - 2961, 105, // sa -> Deva - 2964, 100, // sah -> Cyrl + 2934, 105, // rsk -> Cyrl + 2938, 110, // rtw -> Deva + 2942, 105, // ru -> Cyrl + 2945, 105, // rue -> Cyrl + 2949, 105, // rut -> Cyrl + 2953, 110, // rwr -> Deva + 2957, 225, // ryu -> Kana + 2961, 110, // sa -> Deva + 2964, 105, // sah -> Cyrl 2968, 450, // sam -> Samr 2972, 385, // sat -> Olck 2976, 460, // saz -> Saur 2980, 10, // sbn -> Arab 2984, 555, // sbu -> Tibt - 2988, 105, // sck -> Deva + 2988, 110, // sck -> Deva 2992, 10, // scl -> Arab - 2996, 105, // scp -> Deva + 2996, 110, // scp -> Deva 3000, 260, // sct -> Laoo 3004, 505, // scu -> Takr - 3008, 150, // scx -> Grek + 3008, 155, // scx -> Grek 3012, 10, // sd -> Arab - 3015, 105, // sd_IN -> Deva + 3015, 110, // sd_IN -> Deva 3021, 10, // sdb -> Arab 3025, 10, // sdf -> Arab 3029, 10, // sdg -> Arab 3033, 10, // sdh -> Arab - 3037, 45, // sdr -> Beng + 3037, 50, // sdr -> Beng 3041, 10, // sds -> Arab - 3045, 100, // sel -> Cyrl + 3045, 105, // sel -> Cyrl 3049, 425, // sfm -> Plrd 3053, 380, // sga -> Ogam - 3057, 100, // sgh -> Cyrl - 3061, 105, // sgj -> Deva + 3057, 105, // sgh -> Cyrl + 3061, 110, // sgj -> Deva 3065, 10, // sgr -> Arab 3069, 555, // sgt -> Tibt - 3073, 120, // sgw -> Ethi + 3073, 125, // sgw -> Ethi 3077, 10, // sgy -> Arab 3081, 10, // shd -> Arab 3085, 540, // shi -> Tfng @@ -890,15 +890,15 @@ const int32_t defaultScriptTable[] = { 3097, 10, // shu -> Arab 3101, 10, // shv -> Arab 3105, 470, // si -> Sinh - 3108, 100, // sia -> Cyrl + 3108, 105, // sia -> Cyrl 3112, 555, // sip -> Tibt 3116, 10, // siy -> Arab 3120, 10, // siz -> Arab - 3124, 100, // sjd -> Cyrl - 3128, 105, // sjp -> Deva - 3132, 100, // sjt -> Cyrl + 3124, 105, // sjd -> Cyrl + 3128, 110, // sjp -> Deva + 3132, 105, // sjt -> Cyrl 3136, 550, // skb -> Thai - 3140, 105, // skj -> Deva + 3140, 110, // skj -> Deva 3144, 10, // skr -> Arab 3148, 595, // smh -> Yiii 3152, 450, // smp -> Samr @@ -906,146 +906,146 @@ const int32_t defaultScriptTable[] = { 3160, 10, // smy -> Arab 3164, 530, // soa -> Tavt 3168, 475, // sog -> Sogd - 3172, 105, // soi -> Deva + 3172, 110, // soi -> Deva 3176, 550, // sou -> Thai 3180, 555, // spt -> Tibt 3184, 395, // spv -> Orya 3188, 10, // sqo -> Arab 3192, 260, // sqq -> Laoo 3196, 10, // sqt -> Arab - 3200, 100, // sr -> Cyrl + 3200, 105, // sr -> Cyrl 3203, 480, // srb -> Sora 3207, 10, // srh -> Arab - 3211, 105, // srx -> Deva + 3211, 110, // srx -> Deva 3215, 10, // srz -> Arab 3219, 10, // ssh -> Arab 3223, 260, // sss -> Laoo 3227, 10, // sts -> Arab - 3231, 120, // stv -> Ethi - 3235, 100, // sty -> Cyrl + 3231, 125, // stv -> Ethi + 3235, 105, // sty -> Cyrl 3239, 490, // suz -> Sunu - 3243, 125, // sva -> Geor + 3243, 130, // sva -> Geor 3247, 10, // swb -> Arab - 3251, 170, // swi -> Hani - 3255, 105, // swv -> Deva + 3251, 175, // swi -> Hani + 3255, 110, // swv -> Deva 3259, 445, // sxu -> Runr 3263, 495, // syc -> Syrc - 3267, 45, // syl -> Beng + 3267, 50, // syl -> Beng 3271, 495, // syn -> Syrc 3275, 495, // syr -> Syrc - 3279, 105, // syw -> Deva + 3279, 110, // syw -> Deva 3283, 520, // ta -> Taml - 3286, 100, // tab -> Cyrl - 3290, 105, // taj -> Deva + 3286, 105, // tab -> Cyrl + 3290, 110, // taj -> Deva 3294, 500, // tbk -> Tagb 3298, 555, // tcn -> Tibt 3302, 355, // tco -> Mymr 3306, 520, // tcx -> Taml 3310, 245, // tcy -> Knda 3314, 540, // tda -> Tfng - 3318, 105, // tdb -> Deva + 3318, 110, // tdb -> Deva 3322, 510, // tdd -> Tale - 3326, 105, // tdg -> Deva - 3330, 105, // tdh -> Deva + 3326, 110, // tdg -> Deva + 3330, 110, // tdh -> Deva 3334, 535, // te -> Telu - 3337, 205, // tes -> Java - 3341, 100, // tg -> Cyrl + 3337, 210, // tes -> Java + 3341, 105, // tg -> Cyrl 3344, 10, // tg_PK -> Arab - 3350, 105, // tge -> Deva + 3350, 110, // tge -> Deva 3354, 555, // tgf -> Tibt 3358, 550, // th -> Thai - 3361, 105, // the -> Deva - 3365, 105, // thf -> Deva + 3361, 110, // the -> Deva + 3365, 110, // thf -> Deva 3369, 510, // thi -> Tale - 3373, 105, // thl -> Deva + 3373, 110, // thl -> Deva 3377, 550, // thm -> Thai - 3381, 105, // thq -> Deva - 3385, 105, // thr -> Deva - 3389, 105, // ths -> Deva - 3393, 120, // ti -> Ethi - 3396, 120, // tig -> Ethi - 3400, 105, // tij -> Deva - 3404, 100, // tin -> Cyrl + 3381, 110, // thq -> Deva + 3385, 110, // thr -> Deva + 3389, 110, // ths -> Deva + 3393, 125, // ti -> Ethi + 3396, 125, // tig -> Ethi + 3400, 110, // tij -> Deva + 3404, 105, // tin -> Cyrl 3408, 355, // tjl -> Mymr 3412, 10, // tjo -> Arab - 3416, 105, // tkb -> Deva + 3416, 110, // tkb -> Deva 3420, 10, // tks -> Arab - 3424, 105, // tkt -> Deva + 3424, 110, // tkt -> Deva 3428, 495, // tmr -> Syrc - 3432, 60, // tnv -> Cakm + 3432, 65, // tnv -> Cakm 3436, 10, // tov -> Arab 3440, 235, // tpu -> Khmr 3444, 10, // tra -> Arab - 3448, 185, // trg -> Hebr + 3448, 190, // trg -> Hebr 3452, 10, // trm -> Arab 3456, 10, // trw -> Arab - 3460, 150, // tsd -> Grek + 3460, 155, // tsd -> Grek 3464, 555, // tsj -> Tibt - 3468, 100, // tt -> Cyrl + 3468, 105, // tt -> Cyrl 3471, 260, // tth -> Laoo 3475, 260, // tto -> Laoo 3479, 550, // tts -> Thai - 3483, 105, // ttz -> Deva + 3483, 110, // ttz -> Deva 3487, 355, // tvn -> Mymr - 3491, 105, // twm -> Deva + 3491, 110, // twm -> Deva 3495, 525, // txg -> Tang 3499, 565, // txo -> Toto 3503, 530, // tyr -> Tavt - 3507, 100, // tyv -> Cyrl - 3511, 100, // ude -> Cyrl + 3507, 105, // tyv -> Cyrl + 3511, 105, // ude -> Cyrl 3515, 330, // udg -> Mlym - 3519, 100, // udi -> Cyrl - 3523, 100, // udm -> Cyrl + 3519, 105, // udi -> Cyrl + 3523, 105, // udm -> Cyrl 3527, 10, // ug -> Arab - 3530, 100, // ug_KZ -> Cyrl - 3536, 100, // ug_MN -> Cyrl + 3530, 105, // ug_KZ -> Cyrl + 3536, 105, // ug_MN -> Cyrl 3542, 570, // uga -> Ugar - 3546, 100, // ugh -> Cyrl + 3546, 105, // ugh -> Cyrl 3550, 550, // ugo -> Thai - 3554, 100, // uk -> Cyrl + 3554, 105, // uk -> Cyrl 3557, 395, // uki -> Orya - 3561, 100, // ulc -> Cyrl - 3565, 45, // unr -> Beng - 3569, 105, // unr_NP -> Deva - 3576, 45, // unx -> Beng + 3561, 105, // ulc -> Cyrl + 3565, 50, // unr -> Beng + 3569, 110, // unr_NP -> Deva + 3576, 50, // unx -> Beng 3580, 10, // ur -> Arab 3583, 550, // urk -> Thai 3587, 10, // ush -> Arab - 3591, 150, // uum -> Grek + 3591, 155, // uum -> Grek 3595, 10, // uz_AF -> Arab - 3601, 100, // uz_CN -> Cyrl + 3601, 105, // uz_CN -> Cyrl 3607, 10, // uzs -> Arab 3611, 520, // vaa -> Taml 3615, 10, // vaf -> Arab - 3619, 105, // vah -> Deva + 3619, 110, // vah -> Deva 3623, 575, // vai -> Vaii - 3627, 105, // vas -> Deva - 3631, 105, // vav -> Deva - 3635, 105, // vay -> Deva + 3627, 110, // vas -> Deva + 3631, 110, // vav -> Deva + 3635, 110, // vay -> Deva 3639, 10, // vgr -> Arab - 3643, 105, // vjk -> Deva + 3643, 110, // vjk -> Deva 3647, 245, // vmd -> Knda 3651, 10, // vmh -> Arab - 3655, 120, // wal -> Ethi + 3655, 125, // wal -> Ethi 3659, 10, // wbk -> Arab 3663, 535, // wbq -> Telu - 3667, 105, // wbr -> Deva - 3671, 120, // wle -> Ethi + 3667, 110, // wbr -> Deva + 3671, 125, // wle -> Ethi 3675, 10, // wlo -> Arab - 3679, 105, // wme -> Deva + 3679, 110, // wme -> Deva 3683, 10, // wne -> Arab 3687, 10, // wni -> Arab - 3691, 130, // wsg -> Gong + 3691, 135, // wsg -> Gong 3695, 10, // wsv -> Arab - 3699, 105, // wtm -> Deva - 3703, 175, // wuu -> Hans + 3699, 110, // wtm -> Deva + 3703, 180, // wuu -> Hans 3707, 0, // xag -> Aghb - 3711, 100, // xal -> Cyrl - 3715, 120, // xan -> Ethi - 3719, 100, // xas -> Cyrl - 3723, 85, // xco -> Chrs - 3727, 70, // xcr -> Cari - 3731, 100, // xdq -> Cyrl + 3711, 105, // xal -> Cyrl + 3715, 125, // xan -> Ethi + 3719, 105, // xas -> Cyrl + 3723, 90, // xco -> Chrs + 3727, 75, // xcr -> Cari + 3731, 105, // xdq -> Cyrl 3735, 10, // xhe -> Arab 3739, 235, // xhm -> Khmr 3743, 395, // xis -> Orya @@ -1056,101 +1056,101 @@ const int32_t defaultScriptTable[] = { 3763, 10, // xkp -> Arab 3767, 295, // xlc -> Lyci 3771, 300, // xld -> Lydi - 3775, 115, // xly -> Elym - 3779, 125, // xmf -> Geor + 3775, 120, // xly -> Elym + 3779, 130, // xmf -> Geor 3783, 310, // xmn -> Mani 3787, 325, // xmr -> Merc 3791, 360, // xna -> Narb - 3795, 105, // xnr -> Deva - 3799, 150, // xpg -> Grek + 3795, 110, // xnr -> Deva + 3799, 155, // xpg -> Grek 3803, 380, // xpi -> Ogam - 3807, 100, // xpm -> Cyrl + 3807, 105, // xpm -> Cyrl 3811, 430, // xpr -> Prti - 3815, 100, // xrm -> Cyrl - 3819, 100, // xrn -> Cyrl + 3815, 105, // xrm -> Cyrl + 3819, 105, // xrn -> Cyrl 3823, 455, // xsa -> Sarb - 3827, 105, // xsr -> Deva - 3831, 55, // xtq -> Brah + 3827, 110, // xsr -> Deva + 3831, 60, // xtq -> Brah 3835, 520, // xub -> Taml 3839, 520, // xuj -> Taml - 3843, 200, // xve -> Ital + 3843, 205, // xve -> Ital 3847, 10, // xvi -> Arab - 3851, 100, // xwo -> Cyrl + 3851, 105, // xwo -> Cyrl 3855, 315, // xzh -> Marc - 3859, 100, // yai -> Cyrl - 3863, 105, // ybh -> Deva - 3867, 105, // ybi -> Deva + 3859, 105, // yai -> Cyrl + 3863, 110, // ybh -> Deva + 3867, 110, // ybi -> Deva 3871, 10, // ydg -> Arab 3875, 330, // yea -> Mlym - 3879, 150, // yej -> Grek + 3879, 155, // yej -> Grek 3883, 535, // yeu -> Telu 3887, 425, // ygp -> Plrd - 3891, 185, // yhd -> Hebr - 3895, 185, // yi -> Hebr + 3891, 190, // yhd -> Hebr + 3895, 190, // yi -> Hebr 3898, 595, // yig -> Yiii - 3902, 185, // yih -> Hebr + 3902, 190, // yih -> Hebr 3906, 595, // yiv -> Yiii - 3910, 100, // ykg -> Cyrl - 3914, 100, // ykh -> Cyrl + 3910, 105, // ykg -> Cyrl + 3914, 105, // ykh -> Cyrl 3918, 425, // yna -> Plrd - 3922, 100, // ynk -> Cyrl - 3926, 210, // yoi -> Jpan + 3922, 105, // ynk -> Cyrl + 3926, 215, // yoi -> Jpan 3930, 550, // yoy -> Thai - 3934, 100, // yrk -> Cyrl + 3934, 105, // yrk -> Cyrl 3938, 595, // ysd -> Yiii 3942, 595, // ysn -> Yiii 3946, 595, // ysp -> Yiii - 3950, 100, // ysr -> Cyrl + 3950, 105, // ysr -> Cyrl 3954, 425, // ysy -> Plrd - 3958, 185, // yud -> Hebr - 3962, 180, // yue -> Hant - 3966, 175, // yue_CN -> Hans - 3973, 100, // yug -> Cyrl - 3977, 100, // yux -> Cyrl + 3958, 190, // yud -> Hebr + 3962, 185, // yue -> Hant + 3966, 180, // yue_CN -> Hans + 3973, 105, // yug -> Cyrl + 3977, 105, // yux -> Cyrl 3981, 425, // ywq -> Plrd 3985, 425, // ywu -> Plrd 3989, 555, // zau -> Tibt 3993, 10, // zba -> Arab - 3997, 170, // zch -> Hani + 3997, 175, // zch -> Hani 4001, 10, // zdj -> Arab - 4005, 170, // zeh -> Hani + 4005, 175, // zeh -> Hani 4009, 540, // zen -> Tfng - 4013, 170, // zgb -> Hani + 4013, 175, // zgb -> Hani 4017, 540, // zgh -> Tfng - 4021, 170, // zgm -> Hani - 4025, 170, // zgn -> Hani - 4029, 175, // zh -> Hans - 4032, 180, // zh_AU -> Hant - 4038, 180, // zh_BN -> Hant - 4044, 180, // zh_GB -> Hant - 4050, 180, // zh_GF -> Hant - 4056, 180, // zh_HK -> Hant - 4062, 180, // zh_ID -> Hant - 4068, 180, // zh_MO -> Hant - 4074, 180, // zh_PA -> Hant - 4080, 180, // zh_PF -> Hant - 4086, 180, // zh_PH -> Hant - 4092, 180, // zh_SR -> Hant - 4098, 180, // zh_TH -> Hant - 4104, 180, // zh_TW -> Hant - 4110, 180, // zh_US -> Hant - 4116, 180, // zh_VN -> Hant - 4122, 170, // zhd -> Hani + 4021, 175, // zgm -> Hani + 4025, 175, // zgn -> Hani + 4029, 180, // zh -> Hans + 4032, 185, // zh_AU -> Hant + 4038, 185, // zh_BN -> Hant + 4044, 185, // zh_GB -> Hant + 4050, 185, // zh_GF -> Hant + 4056, 185, // zh_HK -> Hant + 4062, 185, // zh_ID -> Hant + 4068, 185, // zh_MO -> Hant + 4074, 185, // zh_PA -> Hant + 4080, 185, // zh_PF -> Hant + 4086, 185, // zh_PH -> Hant + 4092, 185, // zh_SR -> Hant + 4098, 185, // zh_TH -> Hant + 4104, 185, // zh_TW -> Hant + 4110, 185, // zh_US -> Hant + 4116, 185, // zh_VN -> Hant + 4122, 175, // zhd -> Hani 4126, 375, // zhx -> Nshu - 4130, 100, // zko -> Cyrl + 4130, 105, // zko -> Cyrl 4134, 240, // zkt -> Kits - 4138, 100, // zkz -> Cyrl - 4142, 170, // zlj -> Hani - 4146, 170, // zln -> Hani - 4150, 170, // zlq -> Hani - 4154, 170, // zqe -> Hani + 4138, 105, // zkz -> Cyrl + 4142, 175, // zlj -> Hani + 4146, 175, // zln -> Hani + 4150, 175, // zlq -> Hani + 4154, 175, // zqe -> Hani 4158, 395, // zrg -> Orya - 4162, 185, // zrp -> Hebr + 4162, 190, // zrp -> Hebr 4166, 10, // zum -> Arab - 4170, 120, // zwa -> Ethi - 4174, 170, // zyg -> Hani - 4178, 170, // zyn -> Hani - 4182, 170, // zzj -> Hani + 4170, 125, // zwa -> Ethi + 4174, 175, // zyg -> Hani + 4178, 175, // zyn -> Hani + 4182, 175, // zzj -> Hani }; //====================================================================== diff --git a/icu4c/source/common/locbased.cpp b/icu4c/source/common/locbased.cpp index 832bc3e88b1..6f35e72210f 100644 --- a/icu4c/source/common/locbased.cpp +++ b/icu4c/source/common/locbased.cpp @@ -12,44 +12,84 @@ */ #include "locbased.h" #include "cstring.h" +#include "charstr.h" U_NAMESPACE_BEGIN -Locale LocaleBased::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - const char* id = getLocaleID(type, status); +Locale LocaleBased::getLocale(const CharString* valid, const CharString* actual, + ULocDataLocaleType type, UErrorCode& status) { + const char* id = getLocaleID(valid, actual, type, status); return Locale(id != nullptr ? id : ""); } -const char* LocaleBased::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { +const char* LocaleBased::getLocaleID(const CharString* valid, const CharString* actual, + ULocDataLocaleType type, UErrorCode& status) { if (U_FAILURE(status)) { return nullptr; } switch(type) { case ULOC_VALID_LOCALE: - return valid; + return valid == nullptr ? "" : valid->data(); case ULOC_ACTUAL_LOCALE: - return actual; + return actual == nullptr ? "" : actual->data(); default: status = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; } } -void LocaleBased::setLocaleIDs(const char* validID, const char* actualID) { - if (validID != nullptr) { - uprv_strncpy(valid, validID, ULOC_FULLNAME_CAPACITY); - valid[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate - } - if (actualID != nullptr) { - uprv_strncpy(actual, actualID, ULOC_FULLNAME_CAPACITY); - actual[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate +void LocaleBased::setLocaleIDs(const CharString* validID, const CharString* actualID, UErrorCode& status) { + setValidLocaleID(validID, status); + setActualLocaleID(actualID,status); +} +void LocaleBased::setLocaleIDs(const char* validID, const char* actualID, UErrorCode& status) { + setValidLocaleID(validID, status); + setActualLocaleID(actualID,status); +} + +void LocaleBased::setLocaleID(const char* id, CharString*& dest, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + if (id == nullptr || *id == 0) { + delete dest; + dest = nullptr; + } else { + if (dest == nullptr) { + dest = new CharString(id, status); + if (dest == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + } else { + dest->copyFrom(id, status); + } } } -void LocaleBased::setLocaleIDs(const Locale& validID, const Locale& actualID) { - uprv_strcpy(valid, validID.getName()); - uprv_strcpy(actual, actualID.getName()); +void LocaleBased::setLocaleID(const CharString* id, CharString*& dest, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + if (id == nullptr || id->isEmpty()) { + delete dest; + dest = nullptr; + } else { + if (dest == nullptr) { + dest = new CharString(*id, status); + if (dest == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + } else { + dest->copyFrom(*id, status); + } + } +} + +bool LocaleBased::equalIDs(const CharString* left, const CharString* right) { + // true if both are nullptr + if (left == nullptr && right == nullptr) return true; + // false if only one is nullptr + if (left == nullptr || right == nullptr) return false; + return *left == *right; } U_NAMESPACE_END diff --git a/icu4c/source/common/locbased.h b/icu4c/source/common/locbased.h index 2d260b52787..9441eb82310 100644 --- a/icu4c/source/common/locbased.h +++ b/icu4c/source/common/locbased.h @@ -19,13 +19,14 @@ /** * Macro to declare a locale LocaleBased wrapper object for the given * object, which must have two members named `validLocale' and - * `actualLocale' of size ULOC_FULLNAME_CAPACITY + * `actualLocale' of which are pointers to the internal icu::CharString. */ #define U_LOCALE_BASED(varname, objname) \ LocaleBased varname((objname).validLocale, (objname).actualLocale) U_NAMESPACE_BEGIN +class CharString; /** * A utility class that unifies the implementation of getLocale() by * various ICU services. This class is likely to be removed in the @@ -41,33 +42,35 @@ class U_COMMON_API LocaleBased : public UMemory { * Construct a LocaleBased wrapper around the two pointers. These * will be aliased for the lifetime of this object. */ - inline LocaleBased(char* validAlias, char* actualAlias); - - /** - * Construct a LocaleBased wrapper around the two const pointers. - * These will be aliased for the lifetime of this object. - */ - inline LocaleBased(const char* validAlias, const char* actualAlias); + inline LocaleBased(CharString*& validAlias, CharString*& actualAlias); /** * Return locale meta-data for the service object wrapped by this * object. Either the valid or the actual locale may be * retrieved. + * @param valid The valid locale. + * @param actual The actual locale. * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE * @param status input-output error code * @return the indicated locale */ - Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + static Locale getLocale( + const CharString* valid, const CharString* actual, + ULocDataLocaleType type, UErrorCode& status); /** * Return the locale ID for the service object wrapped by this * object. Either the valid or the actual locale may be * retrieved. + * @param valid The valid locale. + * @param actual The actual locale. * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE * @param status input-output error code * @return the indicated locale ID */ - const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; + static const char* getLocaleID( + const CharString* valid, const CharString* actual, + ULocDataLocaleType type, UErrorCode& status); /** * Set the locale meta-data for the service object wrapped by this @@ -75,31 +78,40 @@ class U_COMMON_API LocaleBased : public UMemory { * @param valid the ID of the valid locale * @param actual the ID of the actual locale */ - void setLocaleIDs(const char* valid, const char* actual); + void setLocaleIDs(const char* valid, const char* actual, UErrorCode& status); + void setLocaleIDs(const CharString* valid, const CharString* actual, UErrorCode& status); - /** - * Set the locale meta-data for the service object wrapped by this - * object. - * @param valid the ID of the valid locale - * @param actual the ID of the actual locale - */ - void setLocaleIDs(const Locale& valid, const Locale& actual); + static void setLocaleID(const char* id, CharString*& dest, UErrorCode& status); + static void setLocaleID(const CharString* id, CharString*& dest, UErrorCode& status); + + static bool equalIDs(const CharString* left, const CharString* right); private: - char* valid; - - char* actual; + void setValidLocaleID(const CharString* id, UErrorCode& status); + void setActualLocaleID(const CharString* id, UErrorCode& status); + void setValidLocaleID(const char* id, UErrorCode& status); + void setActualLocaleID(const char* id, UErrorCode& status); + + CharString*& valid; + CharString*& actual; }; -inline LocaleBased::LocaleBased(char* validAlias, char* actualAlias) : +inline LocaleBased::LocaleBased(CharString*& validAlias, CharString*& actualAlias) : valid(validAlias), actual(actualAlias) { } -inline LocaleBased::LocaleBased(const char* validAlias, - const char* actualAlias) : - // ugh: cast away const - valid(const_cast(validAlias)), actual(const_cast(actualAlias)) { +inline void LocaleBased::setValidLocaleID(const CharString* id, UErrorCode& status) { + setLocaleID(id, valid, status); +} +inline void LocaleBased::setActualLocaleID(const CharString* id, UErrorCode& status) { + setLocaleID(id, actual, status); +} +inline void LocaleBased::setValidLocaleID(const char* id, UErrorCode& status) { + setLocaleID(id, valid, status); +} +inline void LocaleBased::setActualLocaleID(const char* id, UErrorCode& status) { + setLocaleID(id, actual, status); } U_NAMESPACE_END diff --git a/icu4c/source/common/locdispnames.cpp b/icu4c/source/common/locdispnames.cpp index ddf7687a2bf..d3521e879b6 100644 --- a/icu4c/source/common/locdispnames.cpp +++ b/icu4c/source/common/locdispnames.cpp @@ -19,6 +19,8 @@ * that then do not depend on resource bundle code and display name data. */ +#include + #include "unicode/utypes.h" #include "unicode/brkiter.h" #include "unicode/locid.h" @@ -359,7 +361,7 @@ _getStringOrCopyKey(const char *path, const char *locale, return u_terminateUChars(dest, destCapacity, length, &errorCode); } -using UDisplayNameGetter = icu::CharString(const char*, UErrorCode&); +using UDisplayNameGetter = icu::CharString(std::string_view, UErrorCode&); int32_t _getDisplayNameForComponent(const char *locale, @@ -377,6 +379,10 @@ _getDisplayNameForComponent(const char *locale, return 0; } + if (locale == nullptr) { + locale = uloc_getDefault(); + } + localStatus = U_ZERO_ERROR; icu::CharString localeBuffer = (*getter)(locale, localStatus); if (U_FAILURE(localStatus)) { diff --git a/icu4c/source/common/loclikely.cpp b/icu4c/source/common/loclikely.cpp index ccbcbfa7a5d..737899e5b7a 100644 --- a/icu4c/source/common/loclikely.cpp +++ b/icu4c/source/common/loclikely.cpp @@ -349,7 +349,9 @@ uloc_isRightToLeft(const char *locale) { UErrorCode errorCode = U_ZERO_ERROR; icu::CharString lang; icu::CharString script; - ulocimp_getSubtags(locale, &lang, &script, nullptr, nullptr, nullptr, errorCode); + ulocimp_getSubtags( + locale == nullptr ? uloc_getDefault() : 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. @@ -369,7 +371,7 @@ uloc_isRightToLeft(const char *locale) { if (U_FAILURE(errorCode)) { return false; } - ulocimp_getSubtags(likely.data(), nullptr, &script, nullptr, nullptr, nullptr, errorCode); + ulocimp_getSubtags(likely.toStringPiece(), nullptr, &script, nullptr, nullptr, nullptr, errorCode); if (U_FAILURE(errorCode) || script.isEmpty()) { return false; } @@ -430,7 +432,7 @@ ulocimp_getRegionForSupplementalData(const char *localeID, bool inferRegion, icu::CharString rgBuf = GetRegionFromKey(localeID, "rg", status); if (U_SUCCESS(status) && rgBuf.isEmpty()) { // No valid rg keyword value, try for unicode_region_subtag - rgBuf = ulocimp_getRegion(localeID, status); + rgBuf = ulocimp_getRegion(localeID == nullptr ? uloc_getDefault() : localeID, status); if (U_SUCCESS(status) && rgBuf.isEmpty() && inferRegion) { // Second check for sd keyword value rgBuf = GetRegionFromKey(localeID, "sd", status); @@ -439,7 +441,7 @@ ulocimp_getRegionForSupplementalData(const char *localeID, bool inferRegion, UErrorCode rgStatus = U_ZERO_ERROR; icu::CharString locBuf = ulocimp_addLikelySubtags(localeID, rgStatus); if (U_SUCCESS(rgStatus)) { - rgBuf = ulocimp_getRegion(locBuf.data(), status); + rgBuf = ulocimp_getRegion(locBuf.toStringPiece(), status); } } } diff --git a/icu4c/source/common/loclikelysubtags.cpp b/icu4c/source/common/loclikelysubtags.cpp index 7c6131197d8..7245a779816 100644 --- a/icu4c/source/common/loclikelysubtags.cpp +++ b/icu4c/source/common/loclikelysubtags.cpp @@ -527,7 +527,7 @@ LSR LikelySubtags::makeMaximizedLsrFrom(const Locale &locale, return {}; } const char *name = locale.getName(); - if (uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') { // name.startsWith("@x=") + if (!returnInputIfUnmatch && uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') { // name.startsWith("@x=") // Private use language tag x-subtag-subtag... which CLDR changes to // und-x-subtag-subtag... return LSR(name, "", "", LSR::EXPLICIT_LSR); diff --git a/icu4c/source/common/putil.cpp b/icu4c/source/common/putil.cpp index 4cf07797ba3..ea15fdff0b0 100644 --- a/icu4c/source/common/putil.cpp +++ b/icu4c/source/common/putil.cpp @@ -76,7 +76,7 @@ #include #ifndef U_COMMON_IMPLEMENTATION -#error U_COMMON_IMPLEMENTATION not set - must be set for all ICU source files in common/ - see https://unicode-org.github.io/icu/userguide/howtouseicu +#error U_COMMON_IMPLEMENTATION not set - must be set for all ICU source files in common/ - see https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html #endif diff --git a/icu4c/source/common/ucurr.cpp b/icu4c/source/common/ucurr.cpp index 9eceb43aeb3..db40f492c4c 100644 --- a/icu4c/source/common/ucurr.cpp +++ b/icu4c/source/common/ucurr.cpp @@ -2020,6 +2020,7 @@ static const struct CurrencyList { {"ZRN", UCURR_COMMON|UCURR_DEPRECATED}, {"ZRZ", UCURR_COMMON|UCURR_DEPRECATED}, {"ZWD", UCURR_COMMON|UCURR_DEPRECATED}, + {"ZWG", UCURR_COMMON|UCURR_NON_DEPRECATED}, {"ZWL", UCURR_COMMON|UCURR_DEPRECATED}, {"ZWR", UCURR_COMMON|UCURR_DEPRECATED}, { nullptr, 0 } // Leave here to denote the end of the list. diff --git a/icu4c/source/common/uloc.cpp b/icu4c/source/common/uloc.cpp index 51887c97c3e..f375bf758df 100644 --- a/icu4c/source/common/uloc.cpp +++ b/icu4c/source/common/uloc.cpp @@ -482,8 +482,8 @@ constexpr CanonicalizationMap CANONICALIZE_MAP[] = { /* ### BCP47 Conversion *******************************************/ /* Gets the size of the shortest subtag in the given localeID. */ -int32_t getShortestSubtagLength(const char *localeID) { - int32_t localeIDLength = static_cast(uprv_strlen(localeID)); +int32_t getShortestSubtagLength(std::string_view localeID) { + int32_t localeIDLength = static_cast(localeID.length()); int32_t length = localeIDLength; int32_t tmpLength = 0; int32_t i; @@ -507,8 +507,8 @@ 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; +inline bool _hasBCP47Extension(std::string_view id) { + return id.find('@') == std::string_view::npos && getShortestSubtagLength(id) == 1; } /* ### Keywords **************************************************/ @@ -523,10 +523,9 @@ inline bool UPRV_OK_VALUE_PUNCTUATION(char c) { return c == '_' || c == '-' || c #define ULOC_MAX_NO_KEYWORDS 25 U_CAPI const char * U_EXPORT2 -locale_getKeywordsStart(const char *localeID) { - const char *result = nullptr; - if((result = uprv_strchr(localeID, '@')) != nullptr) { - return result; +locale_getKeywordsStart(std::string_view localeID) { + if (size_t pos = localeID.find('@'); pos != std::string_view::npos) { + return localeID.data() + pos; } #if (U_CHARSET_FAMILY == U_EBCDIC_FAMILY) else { @@ -536,8 +535,8 @@ locale_getKeywordsStart(const char *localeID) { static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 }; const uint8_t *charToFind = ebcdicSigns; while(*charToFind) { - if((result = uprv_strchr(localeID, *charToFind)) != nullptr) { - return result; + if (size_t pos = localeID.find(*charToFind); pos != std::string_view::npos) { + return localeID.data() + pos; } charToFind++; } @@ -784,7 +783,7 @@ ulocimp_getKeywordValue(const char* localeID, return; } - if (_hasBCP47Extension(localeID)) { + if (localeID != nullptr && _hasBCP47Extension(localeID)) { tempBuffer = ulocimp_forLanguageTag(localeID, -1, nullptr, status); tmpLocaleID = U_SUCCESS(status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; } else { @@ -889,7 +888,8 @@ uloc_setKeywordValue(const char* keywordName, return 0; } - char* keywords = const_cast(locale_getKeywordsStart(buffer)); + char* keywords = const_cast( + locale_getKeywordsStart({buffer, static_cast(bufLen)})); 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, @@ -921,7 +921,7 @@ ulocimp_setKeywordValue(std::string_view keywordName, { if (U_FAILURE(status)) { return; } std::string_view keywords; - if (const char* start = locale_getKeywordsStart(localeID.data()); start != nullptr) { + if (const char* start = locale_getKeywordsStart(localeID.toStringPiece()); start != nullptr) { // This is safe because CharString::truncate() doesn't actually erase any // data, but simply sets the position for where new data will be written. int32_t size = start - localeID.data(); @@ -1138,15 +1138,18 @@ inline bool _isPrefixLetter(char a) { return a == 'x' || a == 'X' || a == 'i' || /*returns true if one of the special prefixes is here (s=string) 'x-' or 'i-' */ -inline bool _isIDPrefix(const char *s) { return _isPrefixLetter(s[0]) && _isIDSeparator(s[1]); } +inline bool _isIDPrefix(std::string_view s) { + return s.size() >= 2 && _isPrefixLetter(s[0]) && _isIDSeparator(s[1]); +} /* Dot terminates it because of POSIX form where dot precedes the codepage * except for variant */ -inline bool _isTerminator(char a) { return a == 0 || a == '.' || a == '@'; } +inline bool _isTerminator(char a) { return a == '.' || a == '@'; } -inline bool _isBCP47Extension(const char* p) { - return p[0] == '-' && +inline bool _isBCP47Extension(std::string_view p) { + return p.size() >= 3 && + p[0] == '-' && (p[1] == 't' || p[1] == 'T' || p[1] == 'u' || p[1] == 'U' || p[1] == 'x' || p[1] == 'X') && @@ -1202,49 +1205,44 @@ namespace { * TODO try to use this in Locale */ -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; - } else if (uprv_strnicmp(localeID, "und", 3) == 0 && - (localeID[3] == '\0' || +size_t _getLanguage(std::string_view localeID, ByteSink* sink, UErrorCode& status) { + size_t skip = 0; + if (localeID.size() == 4 && uprv_strnicmp(localeID.data(), "root", 4) == 0) { + skip = 4; + localeID.remove_prefix(skip); + } else if (localeID.size() >= 3 && uprv_strnicmp(localeID.data(), "und", 3) == 0 && + (localeID.size() == 3 || localeID[3] == '-' || localeID[3] == '_' || localeID[3] == '@')) { - localeID += 3; + skip = 3; + localeID.remove_prefix(skip); } constexpr int32_t MAXLEN = ULOC_LANG_CAPACITY - 1; // Minus NUL. /* if it starts with i- or x- then copy that prefix */ - int32_t len = _isIDPrefix(localeID) ? 2 : 0; - while (!_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) { + size_t len = _isIDPrefix(localeID) ? 2 : 0; + while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) { if (len == MAXLEN) { status = U_ILLEGAL_ARGUMENT_ERROR; - return; + return 0; } len++; } - *pEnd = localeID + len; - if (sink == nullptr || len == 0) { return; } + if (sink == nullptr || len == 0) { return skip + len; } - int32_t minCapacity = uprv_max(len, 4); // Minimum 3 letters plus NUL. + int32_t minCapacity = uprv_max(static_cast(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) { + for (size_t i = 0; i < len; ++i) { buffer[i] = uprv_tolower(localeID[i]); } - if (_isIDSeparator(localeID[1])) { + if (localeID.size() >= 2 && _isIDSeparator(localeID[1])) { buffer[1] = '-'; } @@ -1256,32 +1254,26 @@ _getLanguage(const char* localeID, if (offset.has_value()) { const char* const alias = LANGUAGES[*offset]; sink->Append(alias, static_cast(uprv_strlen(alias))); - return; + return skip + len; } } - sink->Append(buffer, len); + sink->Append(buffer, static_cast(len)); + return skip + len; } -void -_getScript(const char* localeID, - ByteSink* sink, - const char** pEnd) { - U_ASSERT(pEnd != nullptr); - *pEnd = localeID; - +size_t _getScript(std::string_view localeID, ByteSink* sink) { constexpr int32_t LENGTH = 4; - int32_t len = 0; - while (!_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len]) && + size_t len = 0; + while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len]) && uprv_isASCIILetter(localeID[len])) { - if (len == LENGTH) { return; } + if (len == LENGTH) { return 0; } len++; } - if (len != LENGTH) { return; } + if (len != LENGTH) { return 0; } - *pEnd = localeID + LENGTH; - if (sink == nullptr) { return; } + if (sink == nullptr) { return len; } char scratch[LENGTH]; int32_t capacity = 0; @@ -1294,27 +1286,21 @@ _getScript(const char* localeID, } sink->Append(buffer, LENGTH); + return len; } -void -_getRegion(const char* localeID, - ByteSink* sink, - const char** pEnd) { - U_ASSERT(pEnd != nullptr); - *pEnd = localeID; - +size_t _getRegion(std::string_view localeID, ByteSink* sink) { 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; } + size_t len = 0; + while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) { + if (len == MAXLEN) { return 0; } len++; } - if (len < MINLEN) { return; } + if (len < MINLEN) { return 0; } - *pEnd = localeID + len; - if (sink == nullptr) { return; } + if (sink == nullptr) { return len; } char scratch[ULOC_COUNTRY_CAPACITY]; int32_t capacity = 0; @@ -1325,7 +1311,7 @@ _getRegion(const char* localeID, UPRV_LENGTHOF(scratch), &capacity); - for (int32_t i = 0; i < len; ++i) { + for (size_t i = 0; i < len; ++i) { buffer[i] = uprv_toupper(localeID[i]); } @@ -1337,26 +1323,25 @@ _getRegion(const char* localeID, if (offset.has_value()) { const char* const alias = COUNTRIES[*offset]; sink->Append(alias, static_cast(uprv_strlen(alias))); - return; + return len; } } - sink->Append(buffer, len); + sink->Append(buffer, static_cast(len)); + return len; } /** * @param needSeparator if true, then add leading '_' if any variants * are added to 'variant' */ -void -_getVariant(const char* localeID, +size_t +_getVariant(std::string_view localeID, char prev, ByteSink* sink, - const char** pEnd, bool needSeparator, UErrorCode& status) { - if (U_FAILURE(status)) return; - if (pEnd != nullptr) { *pEnd = localeID; } + if (U_FAILURE(status)) return 0; // Reasonable upper limit for variants // There are no strict limitation of the syntax of variant in the legacy @@ -1369,13 +1354,13 @@ _getVariant(const char* localeID, constexpr int32_t MAX_VARIANTS_LENGTH = 179; /* get one or more variant tags and separate them with '_' */ - int32_t index = 0; + size_t index = 0; if (_isIDSeparator(prev)) { /* get a variant string after a '-' or '_' */ - for (index=0; !_isTerminator(localeID[index]); index++) { + for (; index < localeID.size() && !_isTerminator(localeID[index]); index++) { if (index >= MAX_VARIANTS_LENGTH) { // same as length > MAX_VARIANTS_LENGTH status = U_ILLEGAL_ARGUMENT_ERROR; - return; + return 0; } if (needSeparator) { if (sink != nullptr) { @@ -1389,43 +1374,46 @@ _getVariant(const char* localeID, sink->Append(&c, 1); } } - if (pEnd != nullptr) { *pEnd = localeID+index; } } - /* if there is no variant tag after a '-' or '_' then look for '@' */ - if (index == 0) { - if (prev=='@') { - /* keep localeID */ - } else if((localeID=locale_getKeywordsStart(localeID))!=nullptr) { - ++localeID; /* point after the '@' */ - } else { - return; - } - for(; !_isTerminator(localeID[index]); index++) { - if (index >= MAX_VARIANTS_LENGTH) { // same as length > MAX_VARIANTS_LENGTH - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - if (needSeparator) { - if (sink != nullptr) { - sink->Append("_", 1); - } - needSeparator = false; - } - if (sink != nullptr) { - char c = uprv_toupper(localeID[index]); - if (c == '-' || c == ',') c = '_'; - sink->Append(&c, 1); - } - } - if (pEnd != nullptr) { *pEnd = localeID + index; } + if (index > 0) { + return index; } + + size_t skip = 0; + /* if there is no variant tag after a '-' or '_' then look for '@' */ + if (prev == '@') { + /* keep localeID */ + } else if (const char* p = locale_getKeywordsStart(localeID); p != nullptr) { + skip = 1 + p - localeID.data(); /* point after the '@' */ + localeID.remove_prefix(skip); + } else { + return 0; + } + for (; index < localeID.size() && !_isTerminator(localeID[index]); index++) { + if (index >= MAX_VARIANTS_LENGTH) { // same as length > MAX_VARIANTS_LENGTH + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + if (needSeparator) { + if (sink != nullptr) { + sink->Append("_", 1); + } + needSeparator = false; + } + if (sink != nullptr) { + char c = uprv_toupper(localeID[index]); + if (c == '-' || c == ',') c = '_'; + sink->Append(&c, 1); + } + } + return skip + index; } } // namespace U_EXPORT CharString -ulocimp_getLanguage(const char* localeID, UErrorCode& status) { +ulocimp_getLanguage(std::string_view localeID, UErrorCode& status) { return ByteSinkUtil::viaByteSinkToCharString( [&](ByteSink& sink, UErrorCode& status) { ulocimp_getSubtags( @@ -1441,7 +1429,7 @@ ulocimp_getLanguage(const char* localeID, UErrorCode& status) { } U_EXPORT CharString -ulocimp_getScript(const char* localeID, UErrorCode& status) { +ulocimp_getScript(std::string_view localeID, UErrorCode& status) { return ByteSinkUtil::viaByteSinkToCharString( [&](ByteSink& sink, UErrorCode& status) { ulocimp_getSubtags( @@ -1457,7 +1445,7 @@ ulocimp_getScript(const char* localeID, UErrorCode& status) { } U_EXPORT CharString -ulocimp_getRegion(const char* localeID, UErrorCode& status) { +ulocimp_getRegion(std::string_view localeID, UErrorCode& status) { return ByteSinkUtil::viaByteSinkToCharString( [&](ByteSink& sink, UErrorCode& status) { ulocimp_getSubtags( @@ -1473,7 +1461,7 @@ ulocimp_getRegion(const char* localeID, UErrorCode& status) { } U_EXPORT CharString -ulocimp_getVariant(const char* localeID, UErrorCode& status) { +ulocimp_getVariant(std::string_view localeID, UErrorCode& status) { return ByteSinkUtil::viaByteSinkToCharString( [&](ByteSink& sink, UErrorCode& status) { ulocimp_getSubtags( @@ -1490,7 +1478,7 @@ ulocimp_getVariant(const char* localeID, UErrorCode& status) { U_EXPORT void ulocimp_getSubtags( - const char* localeID, + std::string_view localeID, CharString* language, CharString* script, CharString* region, @@ -1521,7 +1509,7 @@ ulocimp_getSubtags( U_EXPORT void ulocimp_getSubtags( - const char* localeID, + std::string_view localeID, ByteSink* language, ByteSink* script, ByteSink* region, @@ -1531,7 +1519,7 @@ ulocimp_getSubtags( if (U_FAILURE(status)) { return; } if (pEnd != nullptr) { - *pEnd = localeID; + *pEnd = localeID.data(); } else if (language == nullptr && script == nullptr && region == nullptr && @@ -1539,62 +1527,61 @@ ulocimp_getSubtags( return; } + if (localeID.empty()) { return; } + bool hasRegion = false; - if (localeID == nullptr) { - localeID = uloc_getDefault(); + { + size_t len = _getLanguage(localeID, language, status); + if (U_FAILURE(status)) { return; } + if (len > 0) { + localeID.remove_prefix(len); + } } - _getLanguage(localeID, language, &localeID, status); - if (U_FAILURE(status)) { return; } - U_ASSERT(localeID != nullptr); - if (pEnd != nullptr) { - *pEnd = localeID; + *pEnd = localeID.data(); } 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 (localeID.empty()) { return; } + + if (_isIDSeparator(localeID.front())) { + std::string_view sub = localeID; + sub.remove_prefix(1); + size_t len = _getScript(sub, script); + if (len > 0) { + localeID.remove_prefix(len + 1); + if (pEnd != nullptr) { *pEnd = localeID.data(); } } } - if (region == nullptr && variant == nullptr && pEnd == nullptr) { return; } + if ((region == nullptr && variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; } - if (_isIDSeparator(*localeID)) { - const char* begin = localeID + 1; - const char* end = nullptr; - _getRegion(begin, region, &end); - U_ASSERT(end != nullptr); - if (end != begin) { + if (_isIDSeparator(localeID.front())) { + std::string_view sub = localeID; + sub.remove_prefix(1); + size_t len = _getRegion(sub, region); + if (len > 0) { hasRegion = true; - localeID = end; - if (pEnd != nullptr) { *pEnd = localeID; } + localeID.remove_prefix(len + 1); + if (pEnd != nullptr) { *pEnd = localeID.data(); } } } - if (variant == nullptr && pEnd == nullptr) { return; } + if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; } - if (_isIDSeparator(*localeID) && !_isBCP47Extension(localeID)) { + if (_isIDSeparator(localeID.front()) && !_isBCP47Extension(localeID)) { + std::string_view sub = 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); + size_t skip = !hasRegion && localeID.size() > 1 && _isIDSeparator(localeID[1]) ? 2 : 1; + sub.remove_prefix(skip); + size_t len = _getVariant(sub, localeID[0], variant, false, status); if (U_FAILURE(status)) { return; } - U_ASSERT(end != nullptr); - if (end != begin && pEnd != nullptr) { *pEnd = end; } + if (len > 0 && pEnd != nullptr) { *pEnd = localeID.data() + skip + len; } } } @@ -1700,7 +1687,7 @@ uloc_openKeywords(const char* localeID, CharString tempBuffer; const char* tmpLocaleID; - if (_hasBCP47Extension(localeID)) { + if (localeID != nullptr && _hasBCP47Extension(localeID)) { tempBuffer = ulocimp_forLanguageTag(localeID, -1, nullptr, *status); tmpLocaleID = U_SUCCESS(*status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; } else { @@ -1769,7 +1756,7 @@ _canonicalize(const char* localeID, const char* keywordAssign = nullptr; const char* separatorIndicator = nullptr; - if (_hasBCP47Extension(localeID)) { + if (localeID != nullptr && _hasBCP47Extension(localeID)) { const char* localeIDPtr = localeID; // convert all underbars to hyphens, unless the "BCP47 extension" comes at the beginning of the string @@ -1895,7 +1882,7 @@ _canonicalize(const char* localeID, } CharStringByteSink s(&tag); - _getVariant(tmpLocaleID+1, '@', &s, nullptr, !variant.isEmpty(), err); + _getVariant(tmpLocaleID+1, '@', &s, !variant.isEmpty(), err); if (U_FAILURE(err)) { return; } } @@ -1989,6 +1976,10 @@ uloc_getLanguage(const char* localeID, int32_t languageCapacity, UErrorCode* err) { + if (localeID == nullptr) { + localeID = uloc_getDefault(); + } + /* uloc_getLanguage will return a 2 character iso-639 code if one exists. *CWB*/ return ByteSinkUtil::viaByteSinkToTerminatedChars( language, languageCapacity, @@ -2011,6 +2002,10 @@ uloc_getScript(const char* localeID, int32_t scriptCapacity, UErrorCode* err) { + if (localeID == nullptr) { + localeID = uloc_getDefault(); + } + return ByteSinkUtil::viaByteSinkToTerminatedChars( script, scriptCapacity, [&](ByteSink& sink, UErrorCode& status) { @@ -2032,6 +2027,10 @@ uloc_getCountry(const char* localeID, int32_t countryCapacity, UErrorCode* err) { + if (localeID == nullptr) { + localeID = uloc_getDefault(); + } + return ByteSinkUtil::viaByteSinkToTerminatedChars( country, countryCapacity, [&](ByteSink& sink, UErrorCode& status) { @@ -2053,6 +2052,10 @@ uloc_getVariant(const char* localeID, int32_t variantCapacity, UErrorCode* err) { + if (localeID == nullptr) { + localeID = uloc_getDefault(); + } + return ByteSinkUtil::viaByteSinkToTerminatedChars( variant, variantCapacity, [&](ByteSink& sink, UErrorCode& status) { diff --git a/icu4c/source/common/uloc_tag.cpp b/icu4c/source/common/uloc_tag.cpp index 7b3b1e73a37..4a5a83a6c54 100644 --- a/icu4c/source/common/uloc_tag.cpp +++ b/icu4c/source/common/uloc_tag.cpp @@ -1043,7 +1043,7 @@ _initializeULanguageTag(ULanguageTag* langtag) { } void -_appendLanguageToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { +_appendLanguageToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; if (U_FAILURE(status)) { @@ -1088,7 +1088,7 @@ _appendLanguageToLanguageTag(const char* localeID, icu::ByteSink& sink, bool str } void -_appendScriptToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { +_appendScriptToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; if (U_FAILURE(status)) { @@ -1118,7 +1118,7 @@ _appendScriptToLanguageTag(const char* localeID, icu::ByteSink& sink, bool stric } void -_appendRegionToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { +_appendRegionToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; if (U_FAILURE(status)) { @@ -1169,7 +1169,7 @@ void _sortVariants(VariantListEntry* first) { } void -_appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, bool& hadPosix, UErrorCode& status) { +_appendVariantsToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, bool& hadPosix, UErrorCode& status) { if (U_FAILURE(status)) { return; } UErrorCode tmpStatus = U_ZERO_ERROR; @@ -1872,7 +1872,7 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode& status) } void -_appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, bool /*hadPosix*/, UErrorCode& status) { +_appendPrivateuseToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, bool /*hadPosix*/, UErrorCode& status) { if (U_FAILURE(status)) { return; } UErrorCode tmpStatus = U_ZERO_ERROR; @@ -2604,7 +2604,7 @@ ulocimp_toLanguageTag(const char* localeID, } /* For handling special case - private use only tag */ - pKeywordStart = locale_getKeywordsStart(canonical.data()); + pKeywordStart = locale_getKeywordsStart(canonical.toStringPiece()); if (pKeywordStart == canonical.data()) { int kwdCnt = 0; bool done = false; @@ -2642,12 +2642,12 @@ 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); + _appendLanguageToLanguageTag(canonical.toStringPiece(), sink, strict, status); + _appendScriptToLanguageTag(canonical.toStringPiece(), sink, strict, status); + _appendRegionToLanguageTag(canonical.toStringPiece(), sink, strict, status); + _appendVariantsToLanguageTag(canonical.toStringPiece(), sink, strict, hadPosix, status); _appendKeywordsToLanguageTag(canonical.data(), sink, strict, hadPosix, status); - _appendPrivateuseToLanguageTag(canonical.data(), sink, strict, hadPosix, status); + _appendPrivateuseToLanguageTag(canonical.toStringPiece(), sink, strict, hadPosix, status); } diff --git a/icu4c/source/common/ulocimp.h b/icu4c/source/common/ulocimp.h index 1887e2a849a..bf5619020e5 100644 --- a/icu4c/source/common/ulocimp.h +++ b/icu4c/source/common/ulocimp.h @@ -119,16 +119,16 @@ ulocimp_getKeywordValue(const char* localeID, UErrorCode& status); U_EXPORT icu::CharString -ulocimp_getLanguage(const char* localeID, UErrorCode& status); +ulocimp_getLanguage(std::string_view localeID, UErrorCode& status); U_EXPORT icu::CharString -ulocimp_getScript(const char* localeID, UErrorCode& status); +ulocimp_getScript(std::string_view localeID, UErrorCode& status); U_EXPORT icu::CharString -ulocimp_getRegion(const char* localeID, UErrorCode& status); +ulocimp_getRegion(std::string_view localeID, UErrorCode& status); U_EXPORT icu::CharString -ulocimp_getVariant(const char* localeID, UErrorCode& status); +ulocimp_getVariant(std::string_view localeID, UErrorCode& status); U_EXPORT void ulocimp_setKeywordValue(std::string_view keywordName, @@ -145,7 +145,7 @@ ulocimp_setKeywordValue(std::string_view keywords, U_EXPORT void ulocimp_getSubtags( - const char* localeID, + std::string_view localeID, icu::CharString* language, icu::CharString* script, icu::CharString* region, @@ -155,7 +155,7 @@ ulocimp_getSubtags( U_EXPORT void ulocimp_getSubtags( - const char* localeID, + std::string_view localeID, icu::ByteSink* language, icu::ByteSink* script, icu::ByteSink* region, @@ -165,7 +165,7 @@ ulocimp_getSubtags( inline void ulocimp_getSubtags( - const char* localeID, + std::string_view localeID, std::nullptr_t, std::nullptr_t, std::nullptr_t, @@ -364,7 +364,7 @@ ulocimp_minimizeSubtags(const char* localeID, UErrorCode& err); U_CAPI const char * U_EXPORT2 -locale_getKeywordsStart(const char *localeID); +locale_getKeywordsStart(std::string_view localeID); bool ultag_isExtensionSubtags(const char* s, int32_t len); diff --git a/icu4c/source/common/umapfile.cpp b/icu4c/source/common/umapfile.cpp index b58ac37f4d4..ab8829d8c38 100644 --- a/icu4c/source/common/umapfile.cpp +++ b/icu4c/source/common/umapfile.cpp @@ -237,7 +237,7 @@ typedef HANDLE MemoryMap; pData->map = (char *)data + length; pData->pHeader=(const DataHeader *)data; pData->mapAddr = data; -#if U_PLATFORM == U_PF_IPHONE +#if U_PLATFORM == U_PF_IPHONE || U_PLATFORM == U_PF_ANDROID posix_madvise(data, length, POSIX_MADV_RANDOM); #endif return true; diff --git a/icu4c/source/common/unicode/brkiter.h b/icu4c/source/common/unicode/brkiter.h index 30c59c4a94a..d953925bd72 100644 --- a/icu4c/source/common/unicode/brkiter.h +++ b/icu4c/source/common/unicode/brkiter.h @@ -58,6 +58,8 @@ U_NAMESPACE_END U_NAMESPACE_BEGIN +class CharString; + /** * The BreakIterator class implements methods for finding the location * of boundaries in text. BreakIterator is an abstract base class. @@ -646,9 +648,9 @@ protected: private: /** @internal (private) */ - char actualLocale[ULOC_FULLNAME_CAPACITY]; - char validLocale[ULOC_FULLNAME_CAPACITY]; - char requestLocale[ULOC_FULLNAME_CAPACITY]; + CharString* actualLocale = nullptr; + CharString* validLocale = nullptr; + CharString* requestLocale = nullptr; }; #ifndef U_HIDE_DEPRECATED_API diff --git a/icu4c/source/common/unicode/char16ptr.h b/icu4c/source/common/unicode/char16ptr.h index daf35cd43ba..a2722d9f463 100644 --- a/icu4c/source/common/unicode/char16ptr.h +++ b/icu4c/source/common/unicode/char16ptr.h @@ -9,10 +9,13 @@ #include "unicode/utypes.h" -#if U_SHOW_CPLUSPLUS_API +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API #include #include +#include + +#endif /** * \file @@ -21,8 +24,6 @@ * Also conversion functions from char16_t * to UChar * and OldUChar *. */ -U_NAMESPACE_BEGIN - /** * \def U_ALIASING_BARRIER * Barrier for pointer anti-aliasing optimizations even across function boundaries. @@ -36,6 +37,11 @@ U_NAMESPACE_BEGIN # define U_ALIASING_BARRIER(ptr) #endif +// ICU DLL-exported +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + /** * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. * @stable ICU 59 @@ -251,6 +257,34 @@ const char16_t *ConstChar16Ptr::get() const { return u_.cp; } #endif /// \endcond +U_NAMESPACE_END + +#endif // U_SHOW_CPLUSPLUS_API + +// Usable in header-only definitions +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +namespace U_ICU_NAMESPACE_OR_INTERNAL { + +#ifndef U_FORCE_HIDE_INTERNAL_API +/** @internal */ +template>> +inline const char16_t *uprv_char16PtrFromUChar(const T *p) { + if constexpr (std::is_same_v) { + return p; + } else { +#if U_SHOW_CPLUSPLUS_API + return ConstChar16Ptr(p).get(); +#else +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +#endif + } +} +#endif + /** * Converts from const char16_t * to const UChar *. * Includes an aliasing barrier if available. @@ -307,6 +341,15 @@ inline OldUChar *toOldUCharPtr(char16_t *p) { return reinterpret_cast(p); } +} // U_ICU_NAMESPACE_OR_INTERNAL + +#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +// ICU DLL-exported +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + #ifndef U_FORCE_HIDE_INTERNAL_API /** * Is T convertible to a std::u16string_view or some other 16-bit string view? @@ -379,6 +422,6 @@ inline std::u16string_view toU16StringViewNullable(const T& text) { U_NAMESPACE_END -#endif /* U_SHOW_CPLUSPLUS_API */ +#endif // U_SHOW_CPLUSPLUS_API #endif // __CHAR16PTR_H__ diff --git a/icu4c/source/common/unicode/uniset.h b/icu4c/source/common/unicode/uniset.h index d070fd631a2..5b32f3ca5d4 100644 --- a/icu4c/source/common/unicode/uniset.h +++ b/icu4c/source/common/unicode/uniset.h @@ -1173,10 +1173,12 @@ public: inline U_HEADER_NESTED_NAMESPACE::USetStrings strings() const { return U_HEADER_NESTED_NAMESPACE::USetStrings(toUSet()); } +#endif // U_HIDE_DRAFT_API +#ifndef U_HIDE_DRAFT_API /** * Returns a C++ iterator for iterating over all of the elements of this set. - * Convenient all-in one iteration, but creates a UnicodeString for each + * Convenient all-in one iteration, but creates a std::u16string for each * code point or string. * (Similar to how Java UnicodeSet *is an* Iterable<String>.) * @@ -1185,13 +1187,14 @@ public: * \code * UnicodeSet set(u"[abcçカ🚴{}{abc}{de}]", errorCode); * for (auto el : set) { + * UnicodeString us(el); * std::string u8; - * printf("set.string length %ld \"%s\"\n", (long)el.length(), el.toUTF8String(u8).c_str()); + * printf("set.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); * } * \endcode * * @return an all-elements iterator. - * @draft ICU 76 + * @draft ICU 77 * @see end * @see codePoints * @see ranges @@ -1203,7 +1206,7 @@ public: /** * @return an exclusive-end sentinel for iterating over all of the elements of this set. - * @draft ICU 76 + * @draft ICU 77 * @see begin * @see codePoints * @see ranges diff --git a/icu4c/source/common/unicode/urename.h b/icu4c/source/common/unicode/urename.h index 9ac95e39efb..e39c779e81e 100644 --- a/icu4c/source/common/unicode/urename.h +++ b/icu4c/source/common/unicode/urename.h @@ -1820,7 +1820,6 @@ #define usnum_setMinimumIntegerDigits U_ICU_ENTRY_POINT_RENAME(usnum_setMinimumIntegerDigits) #define usnum_setSign U_ICU_ENTRY_POINT_RENAME(usnum_setSign) #define usnum_setToInt64 U_ICU_ENTRY_POINT_RENAME(usnum_setToInt64) -#define usnum_truncateStart U_ICU_ENTRY_POINT_RENAME(usnum_truncateStart) #define usnumf_close U_ICU_ENTRY_POINT_RENAME(usnumf_close) #define usnumf_format U_ICU_ENTRY_POINT_RENAME(usnumf_format) #define usnumf_formatInt64 U_ICU_ENTRY_POINT_RENAME(usnumf_formatInt64) diff --git a/icu4c/source/common/unicode/uset.h b/icu4c/source/common/unicode/uset.h index c8f9b5592df..b5333a5f5ce 100644 --- a/icu4c/source/common/unicode/uset.h +++ b/icu4c/source/common/unicode/uset.h @@ -32,12 +32,13 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" -#if U_SHOW_CPLUSPLUS_API +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +#include #include #include "unicode/char16ptr.h" #include "unicode/localpointer.h" -#include "unicode/unistr.h" -#endif // U_SHOW_CPLUSPLUS_API +#include "unicode/utf16.h" +#endif #ifndef USET_DEFINED @@ -1657,7 +1658,7 @@ public: int32_t length; const UChar *uchars = uset_getString(uset, index, &length); // assert uchars != nullptr; - return {ConstChar16Ptr(uchars), static_cast(length)}; + return {uprv_char16PtrFromUChar(uchars), static_cast(length)}; } return {}; } @@ -1737,17 +1738,19 @@ private: const USet *uset; int32_t count; }; +#endif // U_HIDE_DRAFT_API +#ifndef U_HIDE_DRAFT_API /** * Iterator returned by USetElements. - * @draft ICU 76 + * @draft ICU 77 */ class USetElementIterator { public: - /** @draft ICU 76 */ + /** @draft ICU 77 */ USetElementIterator(const USetElementIterator &other) = default; - /** @draft ICU 76 */ + /** @draft ICU 77 */ bool operator==(const USetElementIterator &other) const { // No need to compare rangeCount & end given private constructor // and assuming we don't compare iterators across the set being modified. @@ -1756,26 +1759,28 @@ public: return uset == other.uset && c == other.c && index == other.index; } - /** @draft ICU 76 */ + /** @draft ICU 77 */ bool operator!=(const USetElementIterator &other) const { return !operator==(other); } - /** @draft ICU 76 */ - UnicodeString operator*() const { + /** @draft ICU 77 */ + std::u16string operator*() const { if (c >= 0) { - return UnicodeString(c); + return c <= 0xffff ? + std::u16string({static_cast(c)}) : + std::u16string({U16_LEAD(c), U16_TRAIL(c)}); } else if (index < totalCount) { int32_t length; const UChar *uchars = uset_getString(uset, index - rangeCount, &length); // assert uchars != nullptr; - return UnicodeString(uchars, length); + return {uprv_char16PtrFromUChar(uchars), static_cast(length)}; } else { - return UnicodeString(); + return {}; } } /** * Pre-increment. - * @draft ICU 76 + * @draft ICU 77 */ USetElementIterator &operator++() { if (c < end) { @@ -1800,7 +1805,7 @@ public: /** * Post-increment. - * @draft ICU 76 + * @draft ICU 77 */ USetElementIterator operator++(int) { USetElementIterator result(*this); @@ -1840,7 +1845,7 @@ private: /** * A C++ "range" for iterating over all of the elements of a USet. - * Convenient all-in one iteration, but creates a UnicodeString for each + * Convenient all-in one iteration, but creates a std::u16string for each * code point or string. * * Code points are returned first, then empty and multi-character strings. @@ -1849,15 +1854,16 @@ private: * using U_HEADER_NESTED_NAMESPACE::USetElements; * LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, &errorCode)); * for (auto el : USetElements(uset.getAlias())) { + * UnicodeString us(el); * std::string u8; - * printf("uset.string length %ld \"%s\"\n", (long)el.length(), el.toUTF8String(u8).c_str()); + * printf("uset.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); * } * \endcode * * C++ UnicodeSet has member functions for iteration, including begin() and end(). * * @return an all-elements iterator. - * @draft ICU 76 + * @draft ICU 77 * @see USetCodePoints * @see USetRanges * @see USetStrings @@ -1866,21 +1872,21 @@ class USetElements { public: /** * Constructs a C++ "range" object over all of the elements of the USet. - * @draft ICU 76 + * @draft ICU 77 */ USetElements(const USet *uset) : uset(uset), rangeCount(uset_getRangeCount(uset)), stringCount(uset_getStringCount(uset)) {} - /** @draft ICU 76 */ + /** @draft ICU 77 */ USetElements(const USetElements &other) = default; - /** @draft ICU 76 */ + /** @draft ICU 77 */ USetElementIterator begin() const { return USetElementIterator(uset, 0, rangeCount, rangeCount + stringCount); } - /** @draft ICU 76 */ + /** @draft ICU 77 */ USetElementIterator end() const { return USetElementIterator(uset, rangeCount + stringCount, rangeCount, rangeCount + stringCount); } diff --git a/icu4c/source/common/unicode/utf8.h b/icu4c/source/common/unicode/utf8.h index 5a07435fcf6..96ad46161aa 100644 --- a/icu4c/source/common/unicode/utf8.h +++ b/icu4c/source/common/unicode/utf8.h @@ -124,7 +124,7 @@ * @internal */ U_CAPI UChar32 U_EXPORT2 -utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict); +utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, int8_t strict); /** * Function for handling "append code point" with error-checking. @@ -148,7 +148,7 @@ utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool * @internal */ U_CAPI UChar32 U_EXPORT2 -utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict); +utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, int8_t strict); /** * Function for handling "skip backward one code point" with error-checking. diff --git a/icu4c/source/common/unicode/uvernum.h b/icu4c/source/common/unicode/uvernum.h index a3cb882623b..b947ddf2917 100644 --- a/icu4c/source/common/unicode/uvernum.h +++ b/icu4c/source/common/unicode/uvernum.h @@ -53,19 +53,19 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 76 +#define U_ICU_VERSION_MAJOR_NUM 77 /** 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 1 +#define U_ICU_VERSION_MINOR_NUM 0 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_PATCHLEVEL_NUM 0 +#define U_ICU_VERSION_PATCHLEVEL_NUM 1 /** The current ICU build level version as an integer. * This value is for use by ICU clients. It defaults to 0. @@ -79,7 +79,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _76 +#define U_ICU_VERSION_SUFFIX _77 /** * \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 "76.1" +#define U_ICU_VERSION "77.0.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 "76" +#define U_ICU_VERSION_SHORT "77" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "76.1" +#define U_ICU_DATA_VERSION "77.0.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/icu4c/source/common/unicode/uversion.h b/icu4c/source/common/unicode/uversion.h index 25d73a3aeb5..a29bf21efda 100644 --- a/icu4c/source/common/unicode/uversion.h +++ b/icu4c/source/common/unicode/uversion.h @@ -125,7 +125,7 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; U_NAMESPACE_USE # endif -#ifndef U_HIDE_DRAFT_API +#ifndef U_FORCE_HIDE_DRAFT_API /** * \def U_HEADER_NESTED_NAMESPACE * Nested namespace used inside U_ICU_NAMESPACE for header-only APIs. @@ -150,22 +150,37 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; * @draft ICU 76 */ +/** + * \def U_ICU_NAMESPACE_OR_INTERNAL + * Namespace used for header-only APIs that used to be regular C++ APIs. + * Different when used inside ICU to prevent public use of internal instantiations. + * Similar to U_HEADER_ONLY_NAMESPACE, but the public definition is the same as U_ICU_NAMESPACE. + * "U_ICU_NAMESPACE" or "U_ICU_NAMESPACE::internal". + * + * @draft ICU 77 + */ + // The first test is the same as for defining U_EXPORT for Windows. #if defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \ UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllimport__)) # define U_HEADER_NESTED_NAMESPACE header +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE #elif defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \ defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) || \ defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_TOOLUTIL_IMPLEMENTATION) # define U_HEADER_NESTED_NAMESPACE internal +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE::internal + namespace U_ICU_NAMESPACE_OR_INTERNAL {} + using namespace U_ICU_NAMESPACE_OR_INTERNAL; #else # define U_HEADER_NESTED_NAMESPACE header +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE #endif #define U_HEADER_ONLY_NAMESPACE U_ICU_NAMESPACE::U_HEADER_NESTED_NAMESPACE namespace U_HEADER_ONLY_NAMESPACE {} -#endif // U_HIDE_DRAFT_API +#endif // U_FORCE_HIDE_DRAFT_API #endif /* __cplusplus */ diff --git a/icu4c/source/common/uresbund.cpp b/icu4c/source/common/uresbund.cpp index 3a09cbf3bca..812e0dab9a3 100644 --- a/icu4c/source/common/uresbund.cpp +++ b/icu4c/source/common/uresbund.cpp @@ -3244,7 +3244,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, const char *validLoc = ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus); 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); + CharString parentLang = ulocimp_getLanguage(parent.toStringPiece(), subStatus); if (U_SUCCESS(subStatus) && validLang != parentLang) { // validLoc is not root and has a different language than parent, use it instead found.clear().append(validLoc, subStatus); diff --git a/icu4c/source/common/uscript.cpp b/icu4c/source/common/uscript.cpp index c48a28fd143..ce40d354958 100644 --- a/icu4c/source/common/uscript.cpp +++ b/icu4c/source/common/uscript.cpp @@ -59,6 +59,9 @@ getCodesFromLocale(const char *locale, if (U_FAILURE(*err)) { return 0; } icu::CharString lang; icu::CharString script; + if (locale == nullptr) { + locale = uloc_getDefault(); + } ulocimp_getSubtags(locale, &lang, &script, nullptr, nullptr, nullptr, *err); if (U_FAILURE(*err)) { return 0; } // Multi-script languages, equivalent to the LocaleScript data diff --git a/icu4c/source/common/usprep.cpp b/icu4c/source/common/usprep.cpp index 477b8f2309d..048b423645f 100644 --- a/icu4c/source/common/usprep.cpp +++ b/icu4c/source/common/usprep.cpp @@ -126,7 +126,7 @@ compareEntries(const UHashTok p1, const UHashTok p2) { name2.pointer = b2->name; path1.pointer = b1->path; path2.pointer = b2->path; - return uhash_compareChars(name1, name2) & uhash_compareChars(path1, path2); + return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2); } static void diff --git a/icu4c/source/common/utf_impl.cpp b/icu4c/source/common/utf_impl.cpp index 827a82daf40..7da10c9b2d3 100644 --- a/icu4c/source/common/utf_impl.cpp +++ b/icu4c/source/common/utf_impl.cpp @@ -124,11 +124,9 @@ errorValue(int32_t count, int8_t strict) { * >0 Obsolete "strict" behavior of UTF8_NEXT_CHAR_SAFE(..., true): * Same as the obsolete "safe" behavior, but non-characters are also treated * like illegal sequences. - * - * Note that a UBool is the same as an int8_t. */ U_CAPI UChar32 U_EXPORT2 -utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict) { +utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, int8_t strict) { // *pi is one after byte c. int32_t i=*pi; // length can be negative for NUL-terminated strings: Read and validate one byte at a time. @@ -233,7 +231,7 @@ utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool } U_CAPI UChar32 U_EXPORT2 -utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict) { +utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, int8_t strict) { // *pi is the index of byte c. int32_t i=*pi; if(U8_IS_TRAIL(c) && i>start) { diff --git a/icu4c/source/configure b/icu4c/source/configure index aedcf0d35fa..5b40e1d3320 100755 --- a/icu4c/source/configure +++ b/icu4c/source/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for ICU 76.1. +# Generated by GNU Autoconf 2.72 for ICU 77.0.1. # # Report bugs to . # @@ -606,8 +606,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ICU' PACKAGE_TARNAME='icu4c' -PACKAGE_VERSION='76.1' -PACKAGE_STRING='ICU 76.1' +PACKAGE_VERSION='77.0.1' +PACKAGE_STRING='ICU 77.0.1' PACKAGE_BUGREPORT='https://icu.unicode.org/bugs' PACKAGE_URL='https://icu.unicode.org/' @@ -1387,7 +1387,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 ICU 76.1 to adapt to many kinds of systems. +'configure' configures ICU 77.0.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1453,7 +1453,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ICU 76.1:";; + short | recursive ) echo "Configuration of ICU 77.0.1:";; esac cat <<\_ACEOF @@ -1461,30 +1461,30 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-icu-config install icu-config - --enable-debug build debug libraries and enable the U_DEBUG define default=no - --enable-release build release libraries default=yes - --enable-strict compile with strict compiler options default=yes + --disable-icu-config do not install icu-config + --enable-debug build debug libraries and enable the U_DEBUG define + --disable-release do not build release libraries + --disable-strict do not compile with strict compiler options --enable-64bit-libs (deprecated, use --with-library-bits) build 64-bit libraries default= platform default - --enable-shared build shared libraries default=yes - --enable-static build static libraries default=no - --enable-auto-cleanup enable auto cleanup of libraries default=no - --enable-draft enable draft APIs (and internal APIs) default=yes - --enable-renaming add a version suffix to symbols default=yes - --enable-tracing enable function and data tracing default=no - --enable-plugins enable plugins default=no - --disable-dyload disable dynamic loading default=no + --disable-shared do not build shared libraries + --enable-static build static libraries + --enable-auto-cleanup enable auto cleanup of libraries + --disable-draft do not enable draft APIs (and internal APIs) + --disable-renaming do not add a version suffix to symbols + --enable-tracing enable function and data tracing + --enable-plugins enable plugins + --disable-dyload disable dynamic loading --enable-rpath use rpath when linking default is only if necessary - --enable-weak-threads weakly reference the threading library default=no - --enable-extras build ICU extras default=yes - --enable-icuio build ICU's icuio library default=yes - --enable-layoutex build ICU's Paragraph Layout library default=no. + --enable-weak-threads weakly reference the threading library + --disable-extras do not build ICU extras + --disable-icuio do not build ICU's icuio library + --enable-layoutex build ICU's Paragraph Layout library. icu-le-hb must be installed via pkg-config. See http://harfbuzz.org - --enable-tools build ICU's tools default=yes - --enable-fuzzer build ICU's fuzzer test targets default=no - --enable-tests build ICU tests default=yes - --enable-samples build ICU samples default=yes + --disable-tools do not build ICU's tools + --enable-fuzzer build ICU's fuzzer test targets + --disable-tests do not build ICU tests + --disable-samples do not build ICU samples Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries. @@ -1592,7 +1592,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ICU configure 76.1 +ICU configure 77.0.1 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2184,7 +2184,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 ICU $as_me 76.1, which was +It was created by ICU $as_me 77.0.1, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -8481,7 +8481,7 @@ echo "CXXFLAGS=$CXXFLAGS" # output the Makefiles -ac_config_files="$ac_config_files icudefs.mk Makefile data/pkgdataMakefile config/Makefile.inc config/icu.pc config/pkgdataMakefile data/Makefile stubdata/Makefile common/Makefile i18n/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/uconv/pkgdataMakefile extra/scrptrun/Makefile tools/Makefile tools/ctestfw/Makefile tools/toolutil/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gendict/Makefile tools/gentest/Makefile tools/gennorm2/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuinfo/Makefile tools/icupkg/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/icuexportdata/Makefile tools/tzcode/Makefile tools/gencfu/Makefile tools/escapesrc/Makefile test/Makefile test/compat/Makefile test/testdata/Makefile test/testdata/pkgdataMakefile test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/letest/Makefile test/perf/Makefile test/perf/collationperf/Makefile test/perf/collperf/Makefile test/perf/collperf2/Makefile test/perf/dicttrieperf/Makefile test/perf/ubrkperf/Makefile test/perf/charperf/Makefile test/perf/convperf/Makefile test/perf/localecanperf/Makefile test/perf/normperf/Makefile test/perf/DateFmtPerf/Makefile test/perf/howExpensiveIs/Makefile test/perf/strsrchperf/Makefile test/perf/unisetperf/Makefile test/perf/usetperf/Makefile test/perf/ustrperf/Makefile test/perf/utfperf/Makefile test/perf/utrie2perf/Makefile test/perf/leperf/Makefile test/fuzzer/Makefile samples/Makefile" +ac_config_files="$ac_config_files icudefs.mk Makefile data/pkgdataMakefile config/Makefile.inc config/icu.pc config/pkgdataMakefile data/Makefile stubdata/Makefile common/Makefile i18n/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/uconv/pkgdataMakefile extra/scrptrun/Makefile tools/Makefile tools/ctestfw/Makefile tools/toolutil/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gendict/Makefile tools/gentest/Makefile tools/gennorm2/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuinfo/Makefile tools/icupkg/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/icuexportdata/Makefile tools/tzcode/Makefile tools/gencfu/Makefile tools/escapesrc/Makefile test/Makefile test/compat/Makefile test/testdata/Makefile test/testdata/pkgdataMakefile test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/letest/Makefile test/perf/Makefile test/perf/collationperf/Makefile test/perf/collperf/Makefile test/perf/collperf2/Makefile test/perf/dicttrieperf/Makefile test/perf/ubrkperf/Makefile test/perf/charperf/Makefile test/perf/convperf/Makefile test/perf/localecanperf/Makefile test/perf/normperf/Makefile test/perf/DateFmtPerf/Makefile test/perf/howExpensiveIs/Makefile test/perf/strsrchperf/Makefile test/perf/unisetperf/Makefile test/perf/usetperf/Makefile test/perf/ustrperf/Makefile test/perf/utfperf/Makefile test/perf/utrie2perf/Makefile test/fuzzer/Makefile samples/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -9019,7 +9019,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 ICU $as_me 76.1, which was +This file was extended by ICU $as_me 77.0.1, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -9075,7 +9075,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="\\ -ICU config.status 76.1 +ICU config.status 77.0.1 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" @@ -9250,7 +9250,6 @@ do "test/perf/ustrperf/Makefile") CONFIG_FILES="$CONFIG_FILES test/perf/ustrperf/Makefile" ;; "test/perf/utfperf/Makefile") CONFIG_FILES="$CONFIG_FILES test/perf/utfperf/Makefile" ;; "test/perf/utrie2perf/Makefile") CONFIG_FILES="$CONFIG_FILES test/perf/utrie2perf/Makefile" ;; - "test/perf/leperf/Makefile") CONFIG_FILES="$CONFIG_FILES test/perf/leperf/Makefile" ;; "test/fuzzer/Makefile") CONFIG_FILES="$CONFIG_FILES test/fuzzer/Makefile" ;; "samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;; diff --git a/icu4c/source/configure.ac b/icu4c/source/configure.ac index be1cca63306..da4f170abfa 100644 --- a/icu4c/source/configure.ac +++ b/icu4c/source/configure.ac @@ -89,7 +89,7 @@ UCONFIG_CFLAGS="" # Check whether to install icu-config AC_ARG_ENABLE([icu-config], - AS_HELP_STRING([--enable-icu-config], [install icu-config]), + AS_HELP_STRING([--disable-icu-config], [do not install icu-config]), [case "${enableval}" in yes) enable_icu_config=true ;; no) enable_icu_config=false ;; @@ -102,7 +102,7 @@ AC_MSG_CHECKING([whether to build debug libraries]) enabled=no ENABLE_DEBUG=0 AC_ARG_ENABLE(debug, - [ --enable-debug build debug libraries and enable the U_DEBUG define [default=no]], + [ --enable-debug build debug libraries and enable the U_DEBUG define], [ case "${enableval}" in yes|"") enabled=yes; ENABLE_DEBUG=1; CONFIG_CPPFLAGS="$CONFIG_CPPFLAGS -DU_DEBUG=1" ;; *) ;; @@ -116,7 +116,7 @@ AC_MSG_CHECKING([whether to build release libraries]) enabled=yes ENABLE_RELEASE=1 AC_ARG_ENABLE(release, - [ --enable-release build release libraries [default=yes]], + [ --disable-release do not build release libraries], [ case "${enableval}" in no) enabled=no; ENABLE_RELEASE=0 ;; *) ;; @@ -270,7 +270,7 @@ AC_SUBST(LIB_M) AC_MSG_CHECKING([whether to build shared libraries]) enabled=no AC_ARG_ENABLE(shared, - [ --enable-shared build shared libraries [default=yes]], + [ --disable-shared do not build shared libraries], [ case "${enableval}" in yes|"") enabled=yes; ENABLE_SHARED=YES ;; no);; @@ -285,7 +285,7 @@ AC_SUBST(ENABLE_SHARED) AC_MSG_CHECKING([whether to build static libraries]) enabled=no AC_ARG_ENABLE(static, - [ --enable-static build static libraries [default=no]], + [ --enable-static build static libraries], [ case "${enableval}" in yes|"") enabled=yes; ENABLE_STATIC=YES ;; no) ;; @@ -332,7 +332,7 @@ AC_MSG_CHECKING([whether to enable auto cleanup of libraries]) enabled=no UCLN_NO_AUTO_CLEANUP=1 AC_ARG_ENABLE(auto-cleanup, - [ --enable-auto-cleanup enable auto cleanup of libraries [default=no]], + [ --enable-auto-cleanup enable auto cleanup of libraries], [ case "${enableval}" in yes) enabled=yes; CONFIG_CPPFLAGS="$CONFIG_CPPFLAGS -DUCLN_NO_AUTO_CLEANUP=0"; @@ -349,7 +349,7 @@ AC_MSG_CHECKING([whether to enable draft APIs]) enabled=yes U_DEFAULT_SHOW_DRAFT=1 AC_ARG_ENABLE(draft, - [ --enable-draft enable draft APIs (and internal APIs) [default=yes]], + [ --disable-draft do not enable draft APIs (and internal APIs)], [ case "${enableval}" in no) enabled=no; U_DEFAULT_SHOW_DRAFT=0; CONFIG_CPPFLAGS="$CONFIG_CPPFLAGS -DU_DEFAULT_SHOW_DRAFT=0" @@ -376,7 +376,7 @@ AC_MSG_CHECKING([whether to enable renaming of symbols]) enabled=yes U_DISABLE_RENAMING=0 AC_ARG_ENABLE(renaming, - [ --enable-renaming add a version suffix to symbols [default=yes]], + [ --disable-renaming do not add a version suffix to symbols], [ case "${enableval}" in yes|"") enabled=yes ;; no) enabled=no; U_DISABLE_RENAMING=1; @@ -392,7 +392,7 @@ AC_MSG_CHECKING([whether to enable function and data tracing]) enabled=no U_ENABLE_TRACING=0 AC_ARG_ENABLE(tracing, - [ --enable-tracing enable function and data tracing [default=no]], + [ --enable-tracing enable function and data tracing], [ case "${enableval}" in yes|"") enabled=yes; CONFIG_CPPFLAGS="$CONFIG_CPPFLAGS -DU_ENABLE_TRACING=1"; @@ -412,7 +412,7 @@ fi # Enable/disable plugins AC_ARG_ENABLE(plugins, - [ --enable-plugins enable plugins [default=no]], + [ --enable-plugins enable plugins], [case "${enableval}" in yes) plugins=true ;; no) plugins=false ;; @@ -430,7 +430,7 @@ U_ENABLE_DYLOAD=1 enable=yes AC_MSG_CHECKING([whether to enable dynamic loading of plugins. Ignored if plugins disabled.]) AC_ARG_ENABLE(dyload, - [ --disable-dyload disable dynamic loading [default=no]], + [ --disable-dyload disable dynamic loading], [ case "${enableval}" in yes|"") U_ENABLE_DYLOAD=1 @@ -577,7 +577,7 @@ case "${host}" in esac AC_ARG_ENABLE(weak-threads, - [ --enable-weak-threads weakly reference the threading library [default=no]], + [ --enable-weak-threads weakly reference the threading library], [case "${enableval}" in yes) LIB_THREAD="${LIBS%${OLD_LIBS}}" @@ -974,7 +974,7 @@ AC_MSG_RESULT($CHECK_UTF16_STRING_RESULT) # Enable/disable extras AC_ARG_ENABLE(extras, - [ --enable-extras build ICU extras [default=yes]], + [ --disable-extras do not build ICU extras], [case "${enableval}" in yes) extras=true ;; no) extras=false ;; @@ -983,7 +983,7 @@ AC_ARG_ENABLE(extras, extras=true) ICU_CONDITIONAL(EXTRAS, test "$extras" = true) AC_ARG_ENABLE(icuio, - [ --enable-icuio build ICU's icuio library [default=yes]], + [ --disable-icuio do not build ICU's icuio library], [case "${enableval}" in yes) icuio=true ;; no) icuio=false ;; @@ -994,7 +994,7 @@ ICU_CONDITIONAL(ICUIO, test "$icuio" = true) # Enable/disable layoutex AC_ARG_ENABLE(layoutex, - [ --enable-layoutex build ICU's Paragraph Layout library [default=no]. + [ --enable-layoutex build ICU's Paragraph Layout library. icu-le-hb must be installed via pkg-config. See http://harfbuzz.org], [case "${enableval}" in yes) layoutex=$have_icu_le_hb ;; @@ -1016,7 +1016,7 @@ AC_ARG_ENABLE(layout, # Enable/disable tools AC_ARG_ENABLE(tools, - [ --enable-tools build ICU's tools [default=yes]], + [ --disable-tools do not build ICU's tools], [case "${enableval}" in yes) tools=true ;; no) tools=false ;; @@ -1027,7 +1027,7 @@ ICU_CONDITIONAL(TOOLS, test "$tools" = true) # Enable/disable fuzzer target tests. AC_ARG_ENABLE(fuzzer, - [ --enable-fuzzer build ICU's fuzzer test targets [default=no]], + [ --enable-fuzzer build ICU's fuzzer test targets], [case "${enableval}" in yes) fuzzer=true ;; no) fuzzer=false ;; @@ -1144,7 +1144,7 @@ AC_SUBST(ICULIBSUFFIXCNAME) # Enable/disable tests AC_ARG_ENABLE(tests, - [ --enable-tests build ICU tests [default=yes]], + [ --disable-tests do not build ICU tests], [case "${enableval}" in yes) tests=true ;; no) tests=false ;; @@ -1155,7 +1155,7 @@ ICU_CONDITIONAL(TESTS, test "$tests" = true) # Enable/disable samples AC_ARG_ENABLE(samples, - [ --enable-samples build ICU samples [default=yes] + [ --disable-samples do not build ICU samples Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries.], @@ -1304,7 +1304,6 @@ AC_CONFIG_FILES([icudefs.mk \ test/perf/ustrperf/Makefile \ test/perf/utfperf/Makefile \ test/perf/utrie2perf/Makefile \ - test/perf/leperf/Makefile \ test/fuzzer/Makefile \ samples/Makefile]) AC_OUTPUT diff --git a/icu4c/source/data/brkitr/fi.txt b/icu4c/source/data/brkitr/fi.txt deleted file mode 100644 index e672992edb1..00000000000 --- a/icu4c/source/data/brkitr/fi.txt +++ /dev/null @@ -1,8 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml -fi{ - boundaries{ - word:process(dependency){"word_fi_sv.brk"} - } -} diff --git a/icu4c/source/data/brkitr/root.txt b/icu4c/source/data/brkitr/root.txt index 71070dd0558..74ac72fec68 100644 --- a/icu4c/source/data/brkitr/root.txt +++ b/icu4c/source/data/brkitr/root.txt @@ -25,5 +25,5 @@ root{ lstm{ Thai{"Thai_graphclust_model4_heavy.res"} Mymr{"Burmese_graphclust_model5_heavy.res"} - } + } } diff --git a/icu4c/source/data/brkitr/rules/char.txt b/icu4c/source/data/brkitr/rules/char.txt index f3b16ded679..12840aec7f3 100644 --- a/icu4c/source/data/brkitr/rules/char.txt +++ b/icu4c/source/data/brkitr/rules/char.txt @@ -24,13 +24,9 @@ $Regional_Indicator = [\p{Grapheme_Cluster_Break = Regional_Indicator}]; $Prepend = [\p{Grapheme_Cluster_Break = Prepend}]; $SpacingMark = [\p{Grapheme_Cluster_Break = SpacingMark}]; -# -# From cldr/common/properties/segments/ -# and issue CLDR-10994 -# -$Virama = [\p{Gujr}\p{sc=Telu}\p{sc=Mlym}\p{sc=Orya}\p{sc=Beng}\p{sc=Deva}&\p{Indic_Syllabic_Category=Virama}]; -$LinkingConsonant = [\p{Gujr}\p{sc=Telu}\p{sc=Mlym}\p{sc=Orya}\p{sc=Beng}\p{sc=Deva}&\p{Indic_Syllabic_Category=Consonant}]; -$ExtCccZwj = [[\p{gcb=Extend}-\p{ccc=0}] \p{gcb=ZWJ}]; +$InCBConsonant = [\p{InCB=Consonant}]; +$InCBExtend = [\p{InCB=Extend}]; +$InCBLinker = [\p{InCB=Linker}]; # Korean Syllable Definitions # @@ -64,8 +60,8 @@ $L ($L | $V | $LV | $LVT); # GB 9b $Prepend [^$Control $CR $LF]; -# GB 9.3, from CLDR-10994 -$LinkingConsonant $ExtCccZwj* $Virama $ExtCccZwj* $LinkingConsonant; +# GB 9c +$InCBConsonant [ $InCBExtend $InCBLinker ]* $InCBLinker [ $InCBExtend $InCBLinker ]* $InCBConsonant; # GB 11 Do not break within emoji modifier sequences or emoji zwj sequences. $Extended_Pict $Extend* $ZWJ $Extended_Pict; diff --git a/icu4c/source/data/brkitr/rules/line.txt b/icu4c/source/data/brkitr/rules/line.txt index 9f3e44984ea..e43e70b3631 100644 --- a/icu4c/source/data/brkitr/rules/line.txt +++ b/icu4c/source/data/brkitr/rules/line.txt @@ -297,7 +297,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_cj.txt b/icu4c/source/data/brkitr/rules/line_cj.txt index fc615f55db2..793163898e0 100644 --- a/icu4c/source/data/brkitr/rules/line_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_cj.txt @@ -298,7 +298,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose.txt b/icu4c/source/data/brkitr/rules/line_loose.txt index 2bb9be5845f..9ff4e17eb3a 100644 --- a/icu4c/source/data/brkitr/rules/line_loose.txt +++ b/icu4c/source/data/brkitr/rules/line_loose.txt @@ -306,7 +306,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose_cj.txt b/icu4c/source/data/brkitr/rules/line_loose_cj.txt index 15715a22512..428d225f16d 100644 --- a/icu4c/source/data/brkitr/rules/line_loose_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_loose_cj.txt @@ -318,7 +318,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt index 87ab33b48a1..2edf4b3bc33 100644 --- a/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_loose_phrase_cj.txt @@ -331,7 +331,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal.txt b/icu4c/source/data/brkitr/rules/line_normal.txt index c41280c28d1..bf6dee8c05c 100644 --- a/icu4c/source/data/brkitr/rules/line_normal.txt +++ b/icu4c/source/data/brkitr/rules/line_normal.txt @@ -299,7 +299,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal_cj.txt b/icu4c/source/data/brkitr/rules/line_normal_cj.txt index 31dd65854cb..f596454621d 100644 --- a/icu4c/source/data/brkitr/rules/line_normal_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_normal_cj.txt @@ -304,7 +304,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt index 85d771fcdbf..e0bbd00025f 100644 --- a/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_normal_phrase_cj.txt @@ -317,7 +317,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/line_phrase_cj.txt b/icu4c/source/data/brkitr/rules/line_phrase_cj.txt index 41e05bf4963..14b118789e7 100644 --- a/icu4c/source/data/brkitr/rules/line_phrase_cj.txt +++ b/icu4c/source/data/brkitr/rules/line_phrase_cj.txt @@ -310,7 +310,7 @@ $LB20NonBreaks = [$LB18NonBreaks - $CB]; # and then to default UAX #14 behaviour (UTC-179-C32). # ^($HY | $HH) $CM* $ALPlus; -$GL ($HY | $HH) $CM* $ALPlus; +$GL $CM* ($HY | $HH) $CM* $ALPlus; # Non-breaking CB from LB8a: $CB $CM* $ZWJ ($HY | $HH) $CM* $ALPlus; # Non-breaking SP from LB14: diff --git a/icu4c/source/data/brkitr/rules/word.txt b/icu4c/source/data/brkitr/rules/word.txt index e9420c8c5ff..a2eef17e652 100644 --- a/icu4c/source/data/brkitr/rules/word.txt +++ b/icu4c/source/data/brkitr/rules/word.txt @@ -11,7 +11,7 @@ # These rules are based on UAX #29 Revision 34 for Unicode Version 12.0 # # Note: Updates to word.txt will usually need to be merged into -# word_POSIX.txt and word_fi_sv.txt also. +# word_POSIX.txt also. ############################################################################## # @@ -42,7 +42,7 @@ $ALetter = [\p{Word_Break = ALetter}]; $Single_Quote = [\p{Word_Break = Single_Quote}]; $Double_Quote = [\p{Word_Break = Double_Quote}]; $MidNumLet = [\p{Word_Break = MidNumLet}]; -$MidLetter = [\p{Word_Break = MidLetter} - [\: \uFE55 \uFF1A]]; +$MidLetter = [\p{Word_Break = MidLetter}]; $MidNum = [\p{Word_Break = MidNum}]; $Numeric = [\p{Word_Break = Numeric}]; $ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; diff --git a/icu4c/source/data/brkitr/rules/word_POSIX.txt b/icu4c/source/data/brkitr/rules/word_POSIX.txt index 3cd0556eea7..73ddc8dc19b 100644 --- a/icu4c/source/data/brkitr/rules/word_POSIX.txt +++ b/icu4c/source/data/brkitr/rules/word_POSIX.txt @@ -42,7 +42,7 @@ $ALetter = [\p{Word_Break = ALetter}]; $Single_Quote = [\p{Word_Break = Single_Quote}]; $Double_Quote = [\p{Word_Break = Double_Quote}]; $MidNumLet = [\p{Word_Break = MidNumLet} - [.]]; -$MidLetter = [\p{Word_Break = MidLetter} - [\: \uFE55 \uFF1A]]; +$MidLetter = [\p{Word_Break = MidLetter} - [\:]]; $MidNum = [\p{Word_Break = MidNum} [.]]; $Numeric = [\p{Word_Break = Numeric}]; $ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; diff --git a/icu4c/source/data/brkitr/rules/word_fi_sv.txt b/icu4c/source/data/brkitr/rules/word_fi_sv.txt deleted file mode 100644 index daf5b3554d7..00000000000 --- a/icu4c/source/data/brkitr/rules/word_fi_sv.txt +++ /dev/null @@ -1,172 +0,0 @@ -# -# Copyright (C) 2016 and later: Unicode, Inc. and others. -# License & terms of use: http://www.unicode.org/copyright.html -# Copyright (C) 2002-2016, International Business Machines Corporation -# and others. All Rights Reserved. -# -# file: word_fi_sv.txt -# -# ICU Word Break Rules -# See Unicode Standard Annex #29. -# These rules are based on UAX #29 Revision 34 for Unicode Version 12.0 -# -# Note: Updates to word.txt will usually need to be merged into -# word_fi_sv.txt also. - -############################################################################## -# -# Character class definitions from TR 29 -# -############################################################################## - -!!chain; -!!quoted_literals_only; - - -# -# Character Class Definitions. -# - -$Han = [:Han:]; - -$CR = [\p{Word_Break = CR}]; -$LF = [\p{Word_Break = LF}]; -$Newline = [\p{Word_Break = Newline}]; -$Extend = [\p{Word_Break = Extend}-$Han]; -$ZWJ = [\p{Word_Break = ZWJ}]; -$Regional_Indicator = [\p{Word_Break = Regional_Indicator}]; -$Format = [\p{Word_Break = Format}]; -$Katakana = [\p{Word_Break = Katakana}]; -$Hebrew_Letter = [\p{Word_Break = Hebrew_Letter}]; -$ALetter = [\p{Word_Break = ALetter}]; -$Single_Quote = [\p{Word_Break = Single_Quote}]; -$Double_Quote = [\p{Word_Break = Double_Quote}]; -$MidNumLet = [\p{Word_Break = MidNumLet}]; -$MidLetter = [\p{Word_Break = MidLetter}]; -$MidNum = [\p{Word_Break = MidNum}]; -$Numeric = [\p{Word_Break = Numeric}]; -$ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; -$WSegSpace = [\p{Word_Break = WSegSpace}]; -$Extended_Pict = [\p{Extended_Pictographic}]; - -$Hiragana = [:Hiragana:]; -$Ideographic = [\p{Ideographic}]; - - -# Dictionary character set, for triggering language-based break engines. Currently -# limited to LineBreak=Complex_Context. Note that this set only works in Unicode -# 5.0 or later as the definition of Complex_Context was corrected to include all -# characters requiring dictionary break. - -$Control = [\p{Grapheme_Cluster_Break = Control}]; -$HangulSyllable = [\uac00-\ud7a3]; -$ComplexContext = [:LineBreak = Complex_Context:]; -$KanaKanji = [$Han $Hiragana $Katakana]; -$dictionaryCJK = [$KanaKanji $HangulSyllable]; -$dictionary = [$ComplexContext $dictionaryCJK]; - -# TODO: check if handling of katakana in dictionary makes rules incorrect/void - -# leave CJK scripts out of ALetterPlus -$ALetterPlus = [$ALetter-$dictionaryCJK [$ComplexContext-$Extend-$Control]]; - - -## ------------------------------------------------- - -# Rule 3 - CR x LF -# -$CR $LF; - -# Rule 3c Do not break within emoji zwj sequences. -# ZWJ × \p{Extended_Pictographic}. Precedes WB4, so no intervening Extend chars allowed. -# -$ZWJ $Extended_Pict; - -# Rule 3d - Keep horizontal whitespace together. -# -$WSegSpace $WSegSpace; - -# Rule 4 - ignore Format and Extend characters, except when they appear at the beginning -# of a region of Text. - -$ExFm = [$Extend $Format $ZWJ]; - -^$ExFm+; # This rule fires only when there are format or extend characters at the - # start of text, or immediately following another boundary. It groups them, in - # the event there are more than one. - -[^$CR $LF $Newline $ExFm] $ExFm*; # This rule rule attaches trailing format/extends to words, - # with no special rule status value. - -$Numeric $ExFm* {100}; # This group of rules also attach trailing format/extends, but -$ALetterPlus $ExFm* {200}; # with rule status set based on the word's final base character. -$HangulSyllable {200}; -$Hebrew_Letter $ExFm* {200}; -$Katakana $ExFm* {400}; # note: these status values override those from rule 5 -$Hiragana $ExFm* {400}; # by virtue of being numerically larger. -$Ideographic $ExFm* {400}; # - -# -# rule 5 -# Do not break between most letters. -# -($ALetterPlus | $Hebrew_Letter) $ExFm* ($ALetterPlus | $Hebrew_Letter); - -# rule 6 and 7 -($ALetterPlus | $Hebrew_Letter) $ExFm* ($MidLetter | $MidNumLet | $Single_Quote) $ExFm* ($ALetterPlus | $Hebrew_Letter) {200}; - -# rule 7a -$Hebrew_Letter $ExFm* $Single_Quote {200}; - -# rule 7b and 7c -$Hebrew_Letter $ExFm* $Double_Quote $ExFm* $Hebrew_Letter; - -# rule 8 - -$Numeric $ExFm* $Numeric; - -# rule 9 - -($ALetterPlus | $Hebrew_Letter) $ExFm* $Numeric; - -# rule 10 - -$Numeric $ExFm* ($ALetterPlus | $Hebrew_Letter); - -# rule 11 and 12 - -$Numeric $ExFm* ($MidNum | $MidNumLet | $Single_Quote) $ExFm* $Numeric; - -# rule 13 -# to be consistent with $KanaKanji $KanaKanhi, changed -# from 300 to 400. -# See also TestRuleStatus in intltest/rbbiapts.cpp -$Katakana $ExFm* $Katakana {400}; - -# rule 13a/b - -$ALetterPlus $ExFm* $ExtendNumLet {200}; # (13a) -$Hebrew_Letter $ExFm* $ExtendNumLet {200}; # (13a) -$Numeric $ExFm* $ExtendNumLet {100}; # (13a) -$Katakana $ExFm* $ExtendNumLet {400}; # (13a) -$ExtendNumLet $ExFm* $ExtendNumLet {200}; # (13a) - -$ExtendNumLet $ExFm* $ALetterPlus {200}; # (13b) -$ExtendNumLet $ExFm* $Hebrew_Letter {200}; # (13b) -$ExtendNumLet $ExFm* $Numeric {100}; # (13b) -$ExtendNumLet $ExFm* $Katakana {400}; # (13b) - -# rules 15 - 17 -# Pairs of Regional Indicators stay together. -# With incoming rule chaining disabled by ^, this rule will match exactly two of them. -# No other rule begins with a Regional_Indicator, so chaining cannot extend the match. -# -^$Regional_Indicator $ExFm* $Regional_Indicator; - -# special handling for CJK characters: chain for later dictionary segmentation -$HangulSyllable $HangulSyllable {200}; -$KanaKanji $KanaKanji {400}; # different rule status if both kana and kanji found - -# Rule 999 -# Match a single code point if no other rule applies. -.; diff --git a/icu4c/source/data/brkitr/sv.txt b/icu4c/source/data/brkitr/sv.txt deleted file mode 100644 index 09cef533f29..00000000000 --- a/icu4c/source/data/brkitr/sv.txt +++ /dev/null @@ -1,8 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml -sv{ - boundaries{ - word:process(dependency){"word_fi_sv.brk"} - } -} diff --git a/icu4c/source/data/dtd/cldr/common/dtd/ldml.dtd b/icu4c/source/data/dtd/cldr/common/dtd/ldml.dtd index efe1565f53d..444c58259ce 100644 --- a/icu4c/source/data/dtd/cldr/common/dtd/ldml.dtd +++ b/icu4c/source/data/dtd/cldr/common/dtd/ldml.dtd @@ -42,7 +42,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + diff --git a/icu4c/source/data/icu4j-readme.txt b/icu4c/source/data/icu4j-readme.txt index 2bc699e13c6..8ee8d7dc547 100644 --- a/icu4c/source/data/icu4j-readme.txt +++ b/icu4c/source/data/icu4j-readme.txt @@ -26,12 +26,15 @@ In the following, *Windows* - Add ICU_DATA_BUILDTOOL_OPTS as a system environment variable with value "--include_uni_core_data" - - Build $icu4c_root\source\allinone\allinone.sln in Visual Studio + set ICU_DATA_BUILDTOOL_OPTS=--include_uni_core_data + - Build %icu4c_root%\source\allinone\allinone.sln in Visual Studio + You can also do it from command line (adjust Platform if needed): + msbuild %icu4c_root%\source\allinone\allinone.sln /p:Configuration=Release /p:Platform=x64 /p:SkipUWP=true For more instructions on downloading and building ICU4C, see the ICU4C readme at: https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/main/icu4c/readme.html#HowToBuild - (Windows: build as 'x86, Release' otherwise you will have to set 'CFG' differently below.) + (Windows: build as 'x64, Release' otherwise you will have to set 'CFG' differently below.) *NOTE* You should do a full rebuild after any data changes. @@ -43,10 +46,13 @@ platform. *Windows* -2a. On Developer Command Prompt for VS, cd to $icu4c_root\source\data. +2a. On Developer Command Prompt for VS do + cd %icu4c_root%\source\data + nmake -f makedata.mak ICUMAKE=%icu4c_root%\source\data\ CFG=x64\Release JAR="%jdk_bin%\jar" ICU4J_ROOT=%icu4j_root% icu4j-data-install -2b. On Developer Command Prompt for VS, - nmake -f makedata.mak ICUMAKE=$icu4c_root\source\data\ CFG=x86\Release JAR="$jdk_bin\jar" ICU4J_ROOT=$icu4j_root icu4j-data-install +2b. Do + cd %icu4j_root% + .\extract-data-files.bat Continue with step 3 below, in Java: @@ -64,6 +70,11 @@ platform. (You can omit the JAR if it's just jar.) +2e. Do + cd $icu4j_root + ./extract-data-files.sh + + Continue with step 3, in Java: Step 2 on either platform will produce two files: icudata.jar and diff --git a/icu4c/source/data/locales/ja.txt b/icu4c/source/data/locales/ja.txt index 82052157182..972a0f464d4 100644 --- a/icu4c/source/data/locales/ja.txt +++ b/icu4c/source/data/locales/ja.txt @@ -283,8 +283,8 @@ ja{ "Hmmssz", "Hmmss", "Hmm", - "GGGGyMEEEEd", - "GGGGyMd", + "GGGGyMMMEEEEd", + "GGGGyMMMd", "GyMMdd", "GyMMdd", } @@ -761,8 +761,8 @@ ja{ "Hmmssz", "Hmmss", "Hmm", - "GyMEEEEd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", "GGGGGyMMdd", "GGGGGyMd", } @@ -1002,8 +1002,8 @@ ja{ "Hmmssz", "Hmmss", "Hmm", - "yMEEEEd", - "yMd", + "yMMMEEEEd", + "yMMMd", "yMMdd", "yMMdd", } @@ -1326,8 +1326,8 @@ ja{ "Hmmssz", "Hmmss", "Hmm", - "GyMEEEEd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", "GyMMdd", "GyMMdd", } @@ -1398,8 +1398,8 @@ ja{ "Hmmssz", "Hmmss", "Hmm", - "GyMEEEEd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", "GyMMdd", "GyMMdd", } @@ -1466,10 +1466,10 @@ ja{ "Hmmssz", "Hmmss", "Hmm", - "GyMEEEEd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", { - "GyMd", + "GyMMMd", "y=jpanyear", } "GGGGGyMd", @@ -2005,8 +2005,8 @@ ja{ "Hmmssz", "Hmmss", "Hmm", - "GyMEEEEd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", "GyMMdd", "GyMMdd", } diff --git a/icu4c/source/data/locales/ko.txt b/icu4c/source/data/locales/ko.txt index c85a7394c84..cec53b8cb78 100644 --- a/icu4c/source/data/locales/ko.txt +++ b/icu4c/source/data/locales/ko.txt @@ -856,8 +856,8 @@ ko{ "ahmsz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", "GyMd", "GyMd", } @@ -1085,8 +1085,8 @@ ko{ "ahmsz", "ahmmss", "ahmm", - "yMEEEEd", - "yMd", + "yMMMMEEEEd", + "yMMMMd", "yMd", "yyMd", } diff --git a/icu4c/source/data/locales/ko_CN.txt b/icu4c/source/data/locales/ko_CN.txt index 73d19e5af85..7a1a5850ac4 100644 --- a/icu4c/source/data/locales/ko_CN.txt +++ b/icu4c/source/data/locales/ko_CN.txt @@ -24,8 +24,8 @@ ko_CN{ "HHmmssz", "HHmmss", "HHmm", - "yMEEEEd", - "yMd", + "yMMMMEEEEd", + "yMMMMd", "yMd", "yyMd", } diff --git a/icu4c/source/data/locales/yue.txt b/icu4c/source/data/locales/yue.txt index 7b899d3dd7b..c736b1b31fe 100644 --- a/icu4c/source/data/locales/yue.txt +++ b/icu4c/source/data/locales/yue.txt @@ -770,9 +770,9 @@ yue{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMd", } availableFormats{ @@ -981,9 +981,9 @@ yue{ "ahmmssz", "ahmmss", "ahmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yMd", } availableFormats{ diff --git a/icu4c/source/data/locales/yue_Hans.txt b/icu4c/source/data/locales/yue_Hans.txt index d78d28d8b1b..9cfab564cf7 100644 --- a/icu4c/source/data/locales/yue_Hans.txt +++ b/icu4c/source/data/locales/yue_Hans.txt @@ -206,9 +206,9 @@ yue_Hans{ "HHmmssz", "HHmmss", "HHmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMd", } availableFormats{ @@ -766,9 +766,9 @@ yue_Hans{ "HHmmssz", "HHmmss", "HHmm", - "GyMMEEEEd", - "GyMMd", - "GyMMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMd", } availableFormats{ @@ -972,9 +972,9 @@ yue_Hans{ "HHmmssz", "HHmmss", "HHmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMdMM", + "yMMMd", "yMd", } appendItems{ @@ -1287,9 +1287,9 @@ yue_Hans{ "HHmmssz", "HHmmss", "HHmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMd", } eras{ @@ -1364,9 +1364,9 @@ yue_Hans{ "HHmmssz", "HHmmss", "HHmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMd", } availableFormats{ @@ -1446,9 +1446,9 @@ yue_Hans{ "HHmmssz", "HHmmss", "HHmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMMdd", } availableFormats{ @@ -1756,9 +1756,9 @@ yue_Hans{ "HHmmssz", "HHmmss", "HHmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } availableFormats{ diff --git a/icu4c/source/data/locales/yue_Hant_CN.txt b/icu4c/source/data/locales/yue_Hant_CN.txt index 42aec70a692..c5252d21fad 100644 --- a/icu4c/source/data/locales/yue_Hant_CN.txt +++ b/icu4c/source/data/locales/yue_Hant_CN.txt @@ -2,4 +2,33 @@ // License & terms of use: http://www.unicode.org/copyright.html // Generated using tools/cldr/cldr-to-icu/build-icu-data.xml yue_Hant_CN{ + calendar{ + gregorian{ + DateTimePatterns{ + "HH:mm:ss [zzzz]", + "HH:mm:ss [z]", + "HH:mm:ss", + "HH:mm", + "y年M月d日 EEEE", + "y年M月d日", + "y年M月d日", + "y/M/d", + "{1} {0}", + "{1} {0}", + "{1} {0}", + "{1} {0}", + "{1} {0}", + } + DateTimeSkeletons{ + "HHmmsszzzz", + "HHmmssz", + "HHmmss", + "HHmm", + "yMMMEEEEd", + "yMMMd", + "yMMMd", + "yMd", + } + } + } } diff --git a/icu4c/source/data/locales/zh.txt b/icu4c/source/data/locales/zh.txt index 61741bf9c18..c3b58e99651 100644 --- a/icu4c/source/data/locales/zh.txt +++ b/icu4c/source/data/locales/zh.txt @@ -677,8 +677,8 @@ zh{ "HHmmss", "HHmm", "GyMMEEEEd", - "GyMd", - "GyMd", + "GyMMMd", + "GyMMMd", "GyMd", } eras{ @@ -744,8 +744,8 @@ zh{ "HHmmss", "HHmm", "GyMMEEEEd", - "GyMd", - "GyMd", + "GyMMMd", + "GyMMMd", "GyMd", } eras{ @@ -821,9 +821,9 @@ zh{ "HHmmssz", "HHmmss", "HHmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMd", } availableFormats{ @@ -1022,9 +1022,9 @@ zh{ "HHmmssz", "HHmmss", "HHmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yMd", } appendItems{ @@ -1417,9 +1417,9 @@ zh{ "HHmmssz", "HHmmss", "HHmm", - "GyMMEEEEd", - "GyMMd", - "GyMMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMd", } availableFormats{ @@ -1542,9 +1542,9 @@ zh{ "HHmmssz", "HHmmss", "HHmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMMdd", } availableFormats{ diff --git a/icu4c/source/data/locales/zh_Hans_HK.txt b/icu4c/source/data/locales/zh_Hans_HK.txt index eedabfa157b..57f4cbd383a 100644 --- a/icu4c/source/data/locales/zh_Hans_HK.txt +++ b/icu4c/source/data/locales/zh_Hans_HK.txt @@ -24,9 +24,9 @@ zh_Hans_HK{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } availableFormats{ @@ -107,9 +107,9 @@ zh_Hans_HK{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GGGGGyyMd", } availableFormats{ @@ -173,9 +173,9 @@ zh_Hans_HK{ "ahmmssz", "ahmmss", "ahmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yyMd", } availableFormats{ @@ -240,9 +240,9 @@ zh_Hans_HK{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } } @@ -267,9 +267,9 @@ zh_Hans_HK{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } availableFormats{ @@ -298,9 +298,9 @@ zh_Hans_HK{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } availableFormats{ diff --git a/icu4c/source/data/locales/zh_Hans_MO.txt b/icu4c/source/data/locales/zh_Hans_MO.txt index c8090392d3d..ac8cc8b9a39 100644 --- a/icu4c/source/data/locales/zh_Hans_MO.txt +++ b/icu4c/source/data/locales/zh_Hans_MO.txt @@ -77,9 +77,9 @@ zh_Hans_MO{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GGGGGyyMd", } availableFormats{ @@ -149,9 +149,9 @@ zh_Hans_MO{ "ahmmssz", "ahmmss", "ahmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yyMd", } availableFormats{ @@ -224,9 +224,9 @@ zh_Hans_MO{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } } @@ -251,9 +251,9 @@ zh_Hans_MO{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } availableFormats{ diff --git a/icu4c/source/data/locales/zh_Hans_MY.txt b/icu4c/source/data/locales/zh_Hans_MY.txt index 7e463fa9744..2f433a5fdab 100644 --- a/icu4c/source/data/locales/zh_Hans_MY.txt +++ b/icu4c/source/data/locales/zh_Hans_MY.txt @@ -24,9 +24,9 @@ zh_Hans_MY{ "ahmmssz", "ahmmss", "ahmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yMd", } } diff --git a/icu4c/source/data/locales/zh_Hans_SG.txt b/icu4c/source/data/locales/zh_Hans_SG.txt index 3f9e897fef9..e3ddf81122d 100644 --- a/icu4c/source/data/locales/zh_Hans_SG.txt +++ b/icu4c/source/data/locales/zh_Hans_SG.txt @@ -24,9 +24,9 @@ zh_Hans_SG{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } intervalFormats{ @@ -102,9 +102,9 @@ zh_Hans_SG{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GGGGGyyMMdd", } availableFormats{ @@ -171,9 +171,9 @@ zh_Hans_SG{ "ahmmssz", "ahmmss", "ahmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yyMMdd", } availableFormats{ @@ -244,9 +244,9 @@ zh_Hans_SG{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } } @@ -271,9 +271,9 @@ zh_Hans_SG{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } availableFormats{ @@ -302,9 +302,9 @@ zh_Hans_SG{ "ahmmssz", "ahmmss", "ahmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyyMd", } availableFormats{ diff --git a/icu4c/source/data/locales/zh_Hant.txt b/icu4c/source/data/locales/zh_Hant.txt index 2ba12f9f1f0..a3049506944 100644 --- a/icu4c/source/data/locales/zh_Hant.txt +++ b/icu4c/source/data/locales/zh_Hant.txt @@ -807,9 +807,9 @@ zh_Hant{ "Bhmmssz", "Bhmmss", "Bhmm", - "GyMEEEEd", - "GyMd", - "GyMd", + "GyMMMEEEEd", + "GyMMMd", + "GyMMMd", "GyMd", } availableFormats{ @@ -967,9 +967,9 @@ zh_Hant{ "Bhmmssz", "Bhmmss", "Bhmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yMd", } availableFormats{ diff --git a/icu4c/source/data/locales/zh_Hant_HK.txt b/icu4c/source/data/locales/zh_Hant_HK.txt index bdecb6ce0d5..4e12cc954da 100644 --- a/icu4c/source/data/locales/zh_Hant_HK.txt +++ b/icu4c/source/data/locales/zh_Hant_HK.txt @@ -315,9 +315,9 @@ zh_Hant_HK{ "ahmmssz", "ahmmss", "ahmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yMd", } availableFormats{ diff --git a/icu4c/source/data/locales/zh_Hant_MY.txt b/icu4c/source/data/locales/zh_Hant_MY.txt index 3409d5815dc..768de2646f9 100644 --- a/icu4c/source/data/locales/zh_Hant_MY.txt +++ b/icu4c/source/data/locales/zh_Hant_MY.txt @@ -24,9 +24,9 @@ zh_Hant_MY{ "ahmmssz", "ahmmss", "ahmm", - "yMEEEEd", - "yMd", - "yMd", + "yMMMEEEEd", + "yMMMd", + "yMMMd", "yMd", } } diff --git a/icu4c/source/data/makedata.mak b/icu4c/source/data/makedata.mak index 5dd12bc0f79..b9ea7a1ba64 100644 --- a/icu4c/source/data/makedata.mak +++ b/icu4c/source/data/makedata.mak @@ -12,11 +12,11 @@ ############################################################################## # Keep the following in sync with the version - see common/unicode/uvernum.h -U_ICUDATA_NAME=icudt76 +U_ICUDATA_NAME=icudt77 ############################################################################## !IF "$(UWP)" == "UWP" # Optionally change the name of the data file for the UWP version. -U_ICUDATA_NAME=icudt76 +U_ICUDATA_NAME=icudt77 !ENDIF U_ICUDATA_ENDIAN_SUFFIX=l UNICODE_VERSION=16.0 diff --git a/icu4c/source/data/misc/icuver.txt b/icu4c/source/data/misc/icuver.txt index 048da6a25ce..6f59f13d379 100644 --- a/icu4c/source/data/misc/icuver.txt +++ b/icu4c/source/data/misc/icuver.txt @@ -9,6 +9,6 @@ // *************************************************************************** icuver:table(nofallback){ CLDRVersion{"46"} - DataVersion{"76.1.0.0"} - ICUVersion{"76.1.0.0"} + DataVersion{"77.0.1.0"} + ICUVersion{"77.0.1.0"} } diff --git a/icu4c/source/data/misc/langInfo.txt b/icu4c/source/data/misc/langInfo.txt index 211156c2aa1..5edea246a50 100644 --- a/icu4c/source/data/misc/langInfo.txt +++ b/icu4c/source/data/misc/langInfo.txt @@ -2372,8 +2372,7 @@ langInfo:table(nofallback){ 429046376, 421963412, 175390703, - 801876906, - 831789983, + 244587423, 423429458, 423471011, 423432374, @@ -2937,7 +2936,7 @@ langInfo:table(nofallback){ 145743985, 422414964, 429051780, - -970758812, + 1042507108, 421750845, 429053967, 430611138, @@ -6744,6 +6743,7 @@ langInfo:table(nofallback){ -1382726061, 1310926363, 377798675, + -970758812, -1083004914, 2020894394, 430158018, @@ -7780,11 +7780,11 @@ langInfo:table(nofallback){ 001a6df03a9374d96277ce9477a88b78 aebd79b8157a00186fc19d75957a647a 32e1d56de838f5d91d3001e1adf8ead9 -1d3a022a3e42d85bc94811616e01e2ab -aff4abaa0b4d26540f54d85b75552a56 -10ceabad10d3abac4dd87117502a5310 +1d3a022a3e42d85bbf4811616e01e2ab +aff4abaa0b4d26540f54d85b6b552a56 +10ceabad10d3abac4dd8710d502a5310 d2aba802c1aba7c6aba5c8aba647f05b -83473248d870f84910c4aba301c2abab +79473248d870ee4910c4aba301c2abab c6aba1754e776c7904e2d56de7d91d36 ead91d37eed91d38f0d91d3903e8d91d 31edd91d32eed91d33f9d91d3410e1d9 @@ -7817,9 +7817,9 @@ edd91ce8e7d91ce2e8d91ce3e9d91ce4 e40ce4d91cdfe5d91ce0e6d91ce1e1d9 1cdce2d91cdde3d91cde6866698a6b07 f00ff0d91cd3f4d561f5d91cd4fad91c -d5e1d91cd2e2b946e4b7c7efd91bb104 +d5e1d91cd2e2b945e4b7c6efd91bb104 e4d91cc7e9d91cc8eed91cc9f7d91cca -f8d59c07ee0feed91ccff2cd10f7d91c +f8d59c07ee0feed91ccff2cd0ff7d91c d0fad91cd1e1d91ccbebd91cccecd91c cdedd91cce6439645a65606705ed0ced d91cc4eed91cc5f2d91cc6e1d91cc2e2 @@ -7845,7 +7845,7 @@ f219f60cf6d91b02f8d91b03f9d91b04 f2d7fff4d91b00f5d91b01ec09ecd7fc edd7fdeed7fee1d7f9e2d7fae4d7fb70 5b705c72607307f20cf2d7eef3d7eff5 -d7f0f6d7f1e1d7ebe7d552e9d7ecebd7 +d7f0f6d7f1e1d7ebe7d551e9d7ecebd7 ed10e3d7db0ff01af60cf6d7e7f7d7e8 f8d7e9fad7eaf0d7e3f2d7e4f3d7e5f5 d7e6eb0cebd7e0ecd7e1edd7e2efd5bc @@ -7857,7 +7857,7 @@ e2d7cde3d7ce0ded17f30cf3d7bbf4d7 bcf7d7bdf8d7beedd7b8eed7b9efd7ba e40ce4d7b4e5d7b5e8d7b6e9d7b7e1d7 b1e2d7b2e3d7b30ded17f00cf0d7c8f5 -d7c9f7d7caf9b185edd7c6eec163efd7 +d7c9f7d7caf9b185edd7c6eec162efd7 c7e50ce5d7c2e7d7c3e9d7c4ebd7c5e2 d7bfe3d7c0e4d7c167b56a4a6a826b8c 6c0cef17f50cf5d7adf6d7aef7d7aff8 @@ -7865,7 +7865,7 @@ d7b0efd7aaf2d7abf3d7ace809e8d7a7 e9d7a8edd7a9e1d7a4e5d7a5e7d7a601 e1d79de9d79e04e1d79fe4d7a0f2d7a1 f7d7a2f9d7a3679e68a257690010eb1d -f20ff2d799f5d79af6d79bf7c715f9d7 +f20ff2d799f5d79af6d79bf7c714f9d7 9cebd795ecd796edd797eed798e70ce7 d791e8d792e9d793ead794e2d78de3d7 8ee5d78fe6d79007ef0cefd786f5d787 @@ -7874,7 +7874,7 @@ d78503e1d789e7d78aebd78bf5d78c64 52642e655a6610e7d78106eb0cebd771 f4d772f5d773f9d774e4d76ee7d76fea d7700def17f30cf3d77df4d77ef5d77f -f7d780efd180f0d77bf2d77ce80ce8d7 +f7d780efd17ff0d77bf2d77ce80ce8d7 78e9d779ecad7cedd77ae3d775e4d776 e7d777613662a2606301e1d76ce9d76d 0017ee2af514f809f8d759f9d75afad7 @@ -7910,15 +7910,15 @@ e9d91ba2e1d91b9de2d91b9ee4d91b9f 0eed22f210f2d91bb0f3d91bb1f5d91b b2f9d91bb3edd91baceed91badf0d91b aef1d91bafe80ee8d91baae9d91babea -cf57ecadc6e1d5a3e2d91ba8e5d91ba9 +cf56ecadc6e1d5a3e2d91ba8e5d91ba9 6ea2606fa295700014ec2ff219f70cf7 d91b9af8d91b9bfad91b9cf2d5a1f4d9 1b98f6d91b99ecd91b93edd91b94eed9 1b95efd91b96f1d91b97e714e7d91b8e e8d91b8fe9d91b90ead91b91ebd91b92 -e1d91b8ae2d91b8be4d91b8ce5b9dee6 -d91b8d0cee1cf40ef4c16ff5d91b7df9 -c37ffad91b7eeed91b7af1d91b7bf2d9 +e1d91b8ae2d91b8be4d91b8ce5b9dde6 +d91b8d0cee1cf40ef4c16ef5d91b7df9 +c37efad91b7eeed91b7af1d91b7bf2d9 1b7cea0cead91b77ebd91b78edd91b79 e1d599e2d91b75e9d91b760aed1af00c f0d91b87f2d91b88f7d91b89edd91b84 @@ -7947,16 +7947,16 @@ e4d58bf9d91b616838694e6a01e2d91b 1b30f9d91b3106f210f2d91b35f3d91b 36f4d91b37f5d91b38e4d91b32e7d91b 33edd91b34613c62a2566302e8abf8ef -d53bf2d53a0010ee26f414f4d91b1cf5 +d53af2d5390010ee26f414f4d91b1cf5 d91b1df6d91b1ef7d91b1ff9d91b20ee d91b18efd91b19f2d91b1af3d91b1bea 10ead91b14ebd91b15ecd91b16edd91b -17e1d91b11e2d91b12e7d52ae9d91b13 +17e1d91b11e2d91b12e7d529e9d91b13 0cea1ef010f0d91b29f2d91b2af7d91b 2bf9d91b2cead91b26edd91b27eed91b 28e50ce5d91b23e7d91b24e9d91b25e1 ab5ee2d91b21e4d91b2200166ec17576 -5c7912792ee9b72aefd91c5c01f2d91c +5c7912792ee9b729efd91c5c01f2d91c 9bf5d91c9c765c776a7805ed0cedd91c 98f5d91c99f9d91c9ae1d91c95e7d91c 96ecd91c9701e1d91c8cf4d91c8d06f1 @@ -7981,7 +7981,7 @@ eed91c63f3d91c64f4d91c65f9d91c66 e2d91c5de7d91c5ee9d91c5febd91c60 ecd91c6167c0df6b7e6b7c6ca2526d09 ed13edd91c51eed91c52efd91c53f0d9 -1c54f4c1eee2d91c4ce5d91c4de7d91c +1c54f4c1ede2d91c4ce5d91c4de7d91c 4eebd91c4fecd91c5008eb14ebd91c3e edd91c3fefd91c40f2d91c41f9d91c42 e1d91c3ae7d91c3be8d91c3ce9d91c3d @@ -8002,7 +8002,7 @@ ee3af41ef710f7d91c02f8d91c03f9d9 1c04fad91c05f4d91bfff5d91c00f6d9 1c01f10cf1d91bfcf2d91bfdf3d91bfe eed91bf9efd91bfaf0d91bfbe71dea0f -ead91bf6ebd91bf7ecd91bf8edbb94e7 +ead91bf6ebd91bf7ecd91bf8edbb93e7 d91bf3e8d91bf4e9d91bf5e40ce4d91b f0e5d91bf1e6d91bf2e1d91bede2d91b eee3d91bef0cea1eee10eed91c0eefd9 @@ -8010,9 +8010,9 @@ eee3d91bef0cea1eee10eed91c0eefd9 1c0cedd91c0de50ce5d91c08e8d91c09 e9d91c0ae1d91c06e2d91c07e4ab7d02 ecd91c12eed91c13f2d91c1404e1d91c -15e4b72ae5d91c16e7d91c17ebd91c18 +15e4b729e5d91c16e7d91c17ebd91c18 74a45675b2857600116e46751b753677 -46e5d701e9d525efd73702edd73feed7 +46e5d701e9d524efd73702edd73feed7 40f4d74110e1d7426e326f42724c7410 efd73e02ebd734edd735f0d73601f2d7 38f4d73903e1d73aefd73bf3d73cf4d7 @@ -8033,126 +8033,126 @@ d5f7efd5f8f0d5f9e80ce8d5f4e9d5b2 eab1cbecd5f5e1d5f0e5d5f1e6d5f2e7 d5f301e2d5ffebd70004e3d702edd703 efd704f0d705f2d706002775c18ce920 -f20ff2d1e3f3d1fcf4d30ef7a3b9f9d3 -67e9d139ebd159ecd16ceed19aefd1b0 -7a387a36e1cf9be5cff3e756e8d12706 -ed0cedd37aeed37befd37cf8d37de8d3 -77ead378ecd379012a2e41127261e2d1 -11012ad1105010cbd11175a24176a287 -77a2b578a2f3790ff21af60cf6d373f8 -d374f9d375fad376f2d36ff3d370f4d3 -71f5d372ea0cead191ecd36ceed36df0 -d36ee1d368e5d369e8d36ae9d36b0014 -ec25f314f809f8d337f9d338fad339f3 -d334f5d335f6d336ecd32fedd330eed3 -31efd332f1d333e60fe6d32ae7d32be8 -d32ce9d32dead32ee1d325e2d326e3d3 -27e4d328e5d3290dee17f40cf4d343f5 -d344f7d345f8d346eed340efd341f3d3 -42e90ce9d33cebd33decd33eedd33fe1 -d33ae4bba0e5d33b0012ee20f40ff4d3 -54f5d355f7d356f8d357f9d358eed34f -efd350f0d351f1d352f2d353e60fe6d3 -4be7d34ce8d34decd34eedd160e1d347 -e2d348e4d349e5d34a0def17f40cf4d3 -63f5d364f8d365f9d366efd360f1d361 -f3d362e90ce9d35cead35dedd35eeed3 -5fe1d359e5d35ae7d35b6bc2e870c158 +f20ff2d1e2f3d1fbf4d30df7a3b9f9d3 +66e9d138ebd158ecd16beed199efd1af +7a387a36e1cf9ae5cff2e756e8d12606 +ed0cedd379eed37aefd37bf8d37ce8d3 +76ead377ecd378012a2e41127261e2d1 +10012ad10f5010cbd11075a24176a287 +77a2b578a2f3790ff21af60cf6d372f8 +d373f9d374fad375f2d36ef3d36ff4d3 +70f5d371ea0cead190ecd36beed36cf0 +d36de1d367e5d368e8d369e9d36a0014 +ec25f314f809f8d336f9d337fad338f3 +d333f5d334f6d335ecd32eedd32feed3 +30efd331f1d332e60fe6d329e7d32ae8 +d32be9d32cead32de1d324e2d325e3d3 +26e4d327e5d3280dee17f40cf4d342f5 +d343f7d344f8d345eed33fefd340f3d3 +41e90ce9d33bebd33cecd33dedd33ee1 +d339e4bb9fe5d33a0012ee20f40ff4d3 +53f5d354f7d355f8d356f9d357eed34e +efd34ff0d350f1d351f2d352e60fe6d3 +4ae7d34be8d34cecd34dedd15fe1d346 +e2d347e4d348e5d3490def17f40cf4d3 +62f5d363f8d364f9d365efd35ff1d360 +f3d361e90ce9d35bead35cedd35deed3 +5ee1d358e5d359e7d35a6bc2e870c158 70a25d71a29e72a2b973a40e740016ee -2af414f709f7d322f9d323fad324f4d3 -1ff5d320f6d321f109f1d18af2d31df3 -d31eeed31aefd31bf0d31ce814eb09eb -d317ecd318edd319e8d314e9d315ead3 -16e2d30fe3d310e4d311e5d312e6d313 -0013ee20f60ff6d1d6f7d1d1f8d1d7f9 -d1d8fad1d9eed1d1f0d1d2f2d1d3f4d1 -d4f5d1d5e90fe9d1ccead1cdebd1ceec -d1cfedd1d0e1d1c7e3d1c8e5d1c9e6d1 -cae7d1cb08ef0fefd1def0d1dff4d1e0 -f5d1e1f7d1e2e2d1daecd1dbedd1dcee -d1dd0017ef2af514f809f8d1f9f9d1fa -fad1fbf5d1f6f6d1f7f7d1f8f209f2d1 -f3f3d1f4f4d1f5efd1f0f0d1f1f1d1f2 -e814ec09ecd1ededd1eeeed1efe8d1ea -e9d1ebead1ece509e5d1e7e6d1e8e7d1 -e9e1d1e4e2d1e5e3d1e60011ec1df50f -f5d309f6d30af7d30bf8d30cfad30dec -d305f0d306f2d307f4d308e60fe6cfa3 -e7d301e8d302e9d303ead304e1d1fde2 -d1fee3d1ffe4d3006ba2586ca2936da2 -de6ea4336f0015ef25f514f809f8d1c4 -f9d1c5fad1c6f5d1c1f6d1c2f7d1c3ef -d1bcf0d1bdf1d1bef2d1bff3d1c0e814 -eb09ebd1b9ecd1baedd1bbe8d1b6e9d1 -b7ead1b8e2d1b1e3d1b2e4d1b3e6d1b4 -e7d1b50011f11df50ff5d167f6d168f7 -d169f8d16afad16bf1d163f2d164f3d1 -65f4d166e60fe6d15ee7d15febd160ec -d161f0d162e1d15ae2d15be4d15ce5d1 -5d0015ee25f414f709f7d180f8d181f9 -d182f4d17df5d17ef6d17feed178f0d1 -79f1d17af2d17bf3d17ce714eb09ebd1 -75ecd176edd177e7d172e9d173ead174 -e1d16de2d16ee3d16fe4d170e6d17100 -17ed2af414f709f7d197f9d198fad199 -f4d194f5d195f6d196f009f0d191f1d1 -92f2d193edd18eeed18fefd190e714ea -09ead18cebcfe3ecd18de7d189e8d18a -e9d18be409e4d186e5d187e6d188e1d1 -83e2d184e3d1850015ee25f314f709f7 -d1adf8d1aef9d1aff3d1aaf4d1abf6d1 -aceed1a5efd1a6f0d1a7f1d1a8f2d1a9 -e714eb09ebd1a2ecd1a3edd1a4e7d19f -e8d1a0e9d1a1e1d19be2d19ce3d19de4 -d19ee5b77c66c11b667e679a68a28869 -a2c36a0aee14f309f3d156f5d157f7d1 -58eed153efd154f0d155e1d14ee7d14f -e9d150ead151ecd15204e9d10beed10c -efd10df2d10ef4d10f0015ef25f514f8 -09f8d124f9d125fad126f5d121f6d122 -f7d123efd11cf0d11df1d11ef3d11ff4 -d120e614e909e9d119ead11aeed11be6 -d117e7a7c9e8d118e1d112e2d113e3d1 -14e4d115e5d1160011f11df50ff5d135 -f6d136f7c77cf9d137fad138f1d131f2 -d132f3d133f4d134e90fe9d12cebd12d -ecd12eedd12ff0d130e4d128e5d129e6 -d12ae8d12b0015ee25f414f709f7d14b -f8d14cf9d14df4d148f5d149f6d14aee -d143efd144f0d145f1d146f3d147e814 -eb09ebd140ecd141edd142e8d13de9d1 -3eead13fe2a936e3d13ae4b5d8e6d13b -e7d13c61a25d62a2a863a2f864a43e65 -0016ef2af514f809f8d108f9d109fad1 -0af5d105f6d106f7d107f209f2d102f3 -d103f4d104efcffff0d100f1d101e714 -eb09ebcffcedcffdeecffee7cff9e8cf -fae9cffbe1cff4e2cff5e3cff6e4cff7 -e5cff80015ef25f514f809f8cfaff9cf -b0facfb1f5cfacf6cfadf7cfaeefcfa7 -f0cfa8f1cfa9f2cfaaf3cfabe614eb09 -ebcfa4eccfa5eecfa6e6cfa1e7cfa2ea -cfa3e1cf9ce2cf9de3cf9ee4cf9fe5cf -a00016ed2af514f809f8cfc6f9cfc7fa -cfc8f5cfc3f6cfc4f7cfc5f009f0cfc0 -f3cfc1f4cfc2edcfbdeecfbeefcfbfe7 -14ea09eacfbaebcfbbeccfbce7cfb7e8 -cfb8e9cfb9e1cfb2e3cfb3e4cfb4e5cf -b5e6cfb60014ed25f314f809f8cfdbf9 -cfdcfacfddf3cfd8f5cfd9f7cfdaedcf -d3eecfd4efcfd5f0cfd6f1cfd7e60fe6 -cfcee7cfcfe8cfd0e9cfd1ebcfd2e1cf -c9e2cfcae3cfcbe4cfcce5cfcd0015ed -25f314f609f6cff0f8cff1f9cff2f3cf -eef4cfeff5af69edcfe9eecfeaefcfeb -f1cfecf2cfede714ea09eacfe6ebcfe7 -eccfe8e7cfe3e8cfe4e9cfe5e1cfdee2 -cfdfe3cfe0e4cfe1e5cfe2001a6fc101 -775ae72ce742ebd39df2d50cfa012a8a +2af414f709f7d321f9d322fad323f4d3 +1ef5d31ff6d320f109f1d189f2d31cf3 +d31deed319efd31af0d31be814eb09eb +d316ecd317edd318e8d313e9d314ead3 +15e2d30ee3d30fe4d310e5d311e6d312 +0013ee20f60ff6d1d5f7d1d0f8d1d6f9 +d1d7fad1d8eed1d0f0d1d1f2d1d2f4d1 +d3f5d1d4e90fe9d1cbead1ccebd1cdec +d1ceedd1cfe1d1c6e3d1c7e5d1c8e6d1 +c9e7d1ca08ef0fefd1ddf0d1def4d1df +f5d1e0f7d1e1e2d1d9ecd1daedd1dbee +d1dc0017ef2af514f809f8d1f8f9d1f9 +fad1faf5d1f5f6d1f6f7d1f7f209f2d1 +f2f3d1f3f4d1f4efd1eff0d1f0f1d1f1 +e814ec09ecd1ecedd1edeed1eee8d1e9 +e9d1eaead1ebe509e5d1e6e6d1e7e7d1 +e8e1d1e3e2d1e4e3d1e50011ec1df50f +f5d308f6d309f7d30af8d30bfad30cec +d304f0d305f2d306f4d307e60fe6cfa2 +e7d300e8d301e9d302ead303e1d1fce2 +d1fde3d1fee4d1ff6ba2586ca2936da2 +de6ea4336f0015ef25f514f809f8d1c3 +f9d1c4fad1c5f5d1c0f6d1c1f7d1c2ef +d1bbf0d1bcf1d1bdf2d1bef3d1bfe814 +eb09ebd1b8ecd1b9edd1bae8d1b5e9d1 +b6ead1b7e2d1b0e3d1b1e4d1b2e6d1b3 +e7d1b40011f11df50ff5d166f6d167f7 +d168f8d169fad16af1d162f2d163f3d1 +64f4d165e60fe6d15de7d15eebd15fec +d160f0d161e1d159e2d15ae4d15be5d1 +5c0015ee25f414f709f7d17ff8d180f9 +d181f4d17cf5d17df6d17eeed177f0d1 +78f1d179f2d17af3d17be714eb09ebd1 +74ecd175edd176e7d171e9d172ead173 +e1d16ce2d16de3d16ee4d16fe6d17000 +17ed2af414f709f7d196f9d197fad198 +f4d193f5d194f6d195f009f0d190f1d1 +91f2d192edd18deed18eefd18fe714ea +09ead18bebcfe2ecd18ce7d188e8d189 +e9d18ae409e4d185e5d186e6d187e1d1 +82e2d183e3d1840015ee25f314f709f7 +d1acf8d1adf9d1aef3d1a9f4d1aaf6d1 +abeed1a4efd1a5f0d1a6f1d1a7f2d1a8 +e714eb09ebd1a1ecd1a2edd1a3e7d19e +e8d19fe9d1a0e1d19ae2d19be3d19ce4 +d19de5b77b66c11b667e679a68a28869 +a2c36a0aee14f309f3d155f5d156f7d1 +57eed152efd153f0d154e1d14de7d14e +e9d14fead150ecd15104e9d10aeed10b +efd10cf2d10df4d10e0015ef25f514f8 +09f8d123f9d124fad125f5d120f6d121 +f7d122efd11bf0d11cf1d11df3d11ef4 +d11fe614e909e9d118ead119eed11ae6 +d116e7a7c9e8d117e1d111e2d112e3d1 +13e4d114e5d1150011f11df50ff5d134 +f6d135f7c77bf9d136fad137f1d130f2 +d131f3d132f4d133e90fe9d12bebd12c +ecd12dedd12ef0d12fe4d127e5d128e6 +d129e8d12a0015ee25f414f709f7d14a +f8d14bf9d14cf4d147f5d148f6d149ee +d142efd143f0d144f1d145f3d146e814 +eb09ebd13fecd140edd141e8d13ce9d1 +3dead13ee2a936e3d139e4b5d7e6d13a +e7d13b61a25d62a2a863a2f864a43e65 +0016ef2af514f809f8d107f9d108fad1 +09f5d104f6d105f7d106f209f2d101f3 +d102f4d103efcffef0cffff1d100e714 +eb09ebcffbedcffceecffde7cff8e8cf +f9e9cffae1cff3e2cff4e3cff5e4cff6 +e5cff70015ef25f514f809f8cfaef9cf +affacfb0f5cfabf6cfacf7cfadefcfa6 +f0cfa7f1cfa8f2cfa9f3cfaae614eb09 +ebcfa3eccfa4eecfa5e6cfa0e7cfa1ea +cfa2e1cf9be2cf9ce3cf9de4cf9ee5cf +9f0016ed2af514f809f8cfc5f9cfc6fa +cfc7f5cfc2f6cfc3f7cfc4f009f0cfbf +f3cfc0f4cfc1edcfbceecfbdefcfbee7 +14ea09eacfb9ebcfbaeccfbbe7cfb6e8 +cfb7e9cfb8e1cfb1e3cfb2e4cfb3e5cf +b4e6cfb50014ed25f314f809f8cfdaf9 +cfdbfacfdcf3cfd7f5cfd8f7cfd9edcf +d2eecfd3efcfd4f0cfd5f1cfd6e60fe6 +cfcde7cfcee8cfcfe9cfd0ebcfd1e1cf +c8e2cfc9e3cfcae4cfcbe5cfcc0015ed +25f314f609f6cfeff8cff0f9cff1f3cf +edf4cfeef5af69edcfe8eecfe9efcfea +f1cfebf2cfece714ea09eacfe5ebcfe6 +eccfe7e7cfe2e8cfe3e9cfe4e1cfdde2 +cfdee3cfdfe4cfe0e5cfe1001a6fc101 +775ae72ce742ebd39cf2d50bfa012a8a 41127261e2d5ed012a2e43127972ecd3 -91022ad3904b2a4d10ced39210dad391 +90022ad38f4b2a4d10ced39110dad390 776479687a01ee26f3d5ef012a2e4112 -7261e2d5ed022ad523412a4310ced5ee +7261e2d5ed022ad522412a4310ced5ee 10c6d5ed10e1d5eb10e1d5ec7345733e 746a75907602e5d5e8e8d5e9ecd5ea06 eb0cebd5ddf0d5def3d5dff5d5e0e1d5 @@ -8168,898 +8168,898 @@ c468c0dc6bc0c26ba2436ca2666da28e 6e0bee25f509f5d5bff8d5c0fad5c1ee d5bbf0d5bcf2012a2e44126576e1d5be 012ad5bd4e10d0d5bee909e9d5b8ebd5 -b9edd5bae1d3bee5d5b6e7d5b70af014 -f609f6d3a6f7d3a7f9d3a8f0d3a3f1d3 -a4f5d3a5e1d39ee7d39fe8d3a0e9d3a1 -ebd3a20beb14f509f5d3b2f7cf59f9d3 -b3ebd3afedd3b0eed3b1e509e5d3ace6 -d3ade9d3aee1d3a9e2d3aae3d3ab0bee -14f209f2d3bcf3d3bdf5adc4eed3b9ef -d3baf0d3bbe709e7d3b7e9cf93edd3b8 -e1d3b4e2d3b5e4d3b6682e69386a10e9 -d39c01e1d398eed39901f3d39af6d39b -651d6546664a6704e1d393e2d394e5d3 -95e8d396efd39710f3d38e10e9d38f61 -5c62666407ea0cead38aecd38bedd38c -f5d38de1d386e5d387e7d388e9d38901 -edd37ef2d37f05f209f2d383f5d384f9 -d385e1d380e9d381ecd38270ced670b0 +b9edd5bae1d3bde5d5b6e7d5b70af014 +f609f6d3a5f7d3a6f9d3a7f0d3a2f1d3 +a3f5d3a4e1d39de7d39ee8d39fe9d3a0 +ebd3a10beb14f509f5d3b1f7cf58f9d3 +b2ebd3aeedd3afeed3b0e509e5d3abe6 +d3ace9d3ade1d3a8e2d3a9e3d3aa0bee +14f209f2d3bbf3d3bcf5adc4eed3b8ef +d3b9f0d3bae709e7d3b6e9cf92edd3b7 +e1d3b3e2d3b4e4d3b5682e69386a10e9 +d39b01e1d397eed39801f3d399f6d39a +651d6546664a6704e1d392e2d393e5d3 +94e8d395efd39610f3d38d10e9d38e61 +5c62666407ea0cead389ecd38aedd38b +f5d38ce1d385e5d386e7d387e9d38801 +edd37df2d37e05f209f2d382f5d383f9 +d384e1d37fe9d380ecd38170ced670b0 2871b8d372ba9c73002b77c12fec3af2 -29f509f5cf50f6cf63f7cf6af22cf3cf -25f4cf3a22032acbfe4daebd522a5410 -d2cd0201cfcd01d5cbffeccda8edcdb9 -eecdceefcde3f1a3cfe336e709e7cd43 -e9cd6cebcd8fe3cbfce426e5cd27032a -3644444b4c5312696ee4cd16012acd13 -4910cecd14126576e1cd1412686feacd -15773878a24a79a25f7aa28ae1cbcd00 -12f020f50ff5cf78f6cf79f7cf7af8cf -7bf9cf7cf0cf73f1cf74f2cf75f3cf76 -f4cf77e90fe9cf6eeacf6febcf70edcf -71efcf72e2cf6be6cf6ce7cf6de8cf6a -06f20cf2cf80f3cf81f5cf82f7cf83e2 -cf7de5cf7eeecf7f0ced17f20cf2abe7 -f3cf8df7cf8ef8cf8fedcf8aeecf8bef -cf8ce909e9cf87ebcf88eccf89e1cf84 -e2cf85e3cf860aec14f609f6cf98f7cf -99f9cf9aeccf95eecf96f0cf97e1cf90 -e2cf91e3cf92e4cf93e7cf946cc2c171 -c15d74a5745275a25f7605e509e5cf67 -edcf68f3cf69e1cf64e2cf65e3cf6600 -14ed25f214f609f6cf4df7cf4ef9cf4f -f2cf4af3cf4bf4cf4cedcf45eecf46ef -cf47f0cf48f1cf49e80fe8cf40e9cf41 -eacf42ebcf43eccf44e1cf3be2cf3ce5 -cf3de6cf3ee7cf3f0012ed20f40ff4cf -5ef6cf5ff7cf60f9cf61facf62edcf59 -efcf5af1cf5bf2cf5cf3cf5de70fe7cf -55e9cf56eacf57ebcf58eccd47e1cf51 -e2cf52e3cf53e5cf5471a24872a25d73 -0013ee20f50ff5cf35f6cf36f8cf37f9 -cf38facf39eecf30efcf31f1cf32f3cf -33f4cf34e70fe7cf2be8cf2ceacf2dec -cf2eedcf2fe2cf26e3cf27e4cf28e5cf -29e6cf2a06ef0cefcf0cf1cf0df4cf0e -f5cf0fe1cf09e8cf0aedcf0b0016ee2a -f514f809f8b3e0f9cf23facf24f5cf20 -f6cf21f7cf22f209f2cf1df3cf1ef4cf -1feecf1aefcf1bf1cf1ce714eb09ebcf -17eccf18edcf19e7cf14e8cf15e9cf16 -e1cf10e2cf11e3cbfce5cf12e6cf136c +29f509f5cf4ff6cf62f7cf69f22cf3cf +24f4cf3922032acbfd4daebd522a5410 +d2cd0101cfcd00d5cbfeeccda7edcdb8 +eecdcdefcde2f1a3cfe336e709e7cd42 +e9cd6bebcd8ee3cbfbe426e5cd26032a +3644444b4c5312696ee4cd15012acd12 +4910cecd13126576e1cd1312686feacd +14773878a24a79a25f7aa28ae1cbcc00 +12f020f50ff5cf77f6cf78f7cf79f8cf +7af9cf7bf0cf72f1cf73f2cf74f3cf75 +f4cf76e90fe9cf6deacf6eebcf6fedcf +70efcf71e2cf6ae6cf6be7cf6ce8cf69 +06f20cf2cf7ff3cf80f5cf81f7cf82e2 +cf7ce5cf7deecf7e0ced17f20cf2abe7 +f3cf8cf7cf8df8cf8eedcf89eecf8aef +cf8be909e9cf86ebcf87eccf88e1cf83 +e2cf84e3cf850aec14f609f6cf97f7cf +98f9cf99eccf94eecf95f0cf96e1cf8f +e2cf90e3cf91e4cf92e7cf936cc2c171 +c15d74a5745275a25f7605e509e5cf66 +edcf67f3cf68e1cf63e2cf64e3cf6500 +14ed25f214f609f6cf4cf7cf4df9cf4e +f2cf49f3cf4af4cf4bedcf44eecf45ef +cf46f0cf47f1cf48e80fe8cf3fe9cf40 +eacf41ebcf42eccf43e1cf3ae2cf3be5 +cf3ce6cf3de7cf3e0012ed20f40ff4cf +5df6cf5ef7cf5ff9cf60facf61edcf58 +efcf59f1cf5af2cf5bf3cf5ce70fe7cf +54e9cf55eacf56ebcf57eccd46e1cf50 +e2cf51e3cf52e5cf5371a24872a25d73 +0013ee20f50ff5cf34f6cf35f8cf36f9 +cf37facf38eecf2fefcf30f1cf31f3cf +32f4cf33e70fe7cf2ae8cf2beacf2cec +cf2dedcf2ee2cf25e3cf26e4cf27e5cf +28e6cf2906ef0cefcf0bf1cf0cf4cf0d +f5cf0ee1cf08e8cf09edcf0a0016ee2a +f514f809f8b3dff9cf22facf23f5cf1f +f6cf20f7cf21f209f2cf1cf3cf1df4cf +1eeecf19efcf1af1cf1be714eb09ebcf +16eccf17edcf18e7cf13e8cf14e9cf15 +e1cf0fe2cf10e3cbfbe5cf11e6cf126c a2486da2806ea2c66fa411700011ee1d -f20ff2cf05f3cf06f4cf07f6cf08f9b9 -83eecf01efcf02f0cf03f1cf04e70fe7 -cdfce9cdfdebcdfeeccdffedcf00e2cd -f8e3cdf9e4cdfae5cdfb0010ee1df50f -f5cdb4f7cdb5f8cdb6f9cdb7facdb8ee -cdb1efcd8ff0cdb2f2cdb3e90ce9cdad -eacdaeeccdafedcdb0e3cda9e4cdaae7 -cdabe8cdac0014ee25f414f809f8cdcb -f9cdccfacdcdf4cdc8f5cdc9f7cdcaee -cdc3f0cdc4f1cdc5f2cdc6f3cdc7e70f -e7cdbee8cdbfeacdc0ebcdc1eccdc2e1 -cdbae2cdbbe3cdbce4b992e6cdbd0015 -ef25f514f809f8cde1f9cde2faa564f5 -cddef6cddff7cde0efcdd9f0cddaf1cd -dbf2cddcf3cddde914ec09eccdd6edcd -d7eecdd8e9cdd3eacdd4ebcdd5e2a7f3 -e3cdcfe5cdd0e6cdd1e7cdd20013f020 -f60ff6cdf3f7cdf4f8cdf5f9cdf6facd -f7f0cdeef1cdeff2cdf0f3cdf1f5cdf2 -e70fe7cde9e9cdeaebcdebeccdecefcd -ede1cde4e2cde5e3cde6e4cde7e5cde8 +f20ff2cf04f3cf05f4cf06f6cf07f9b9 +82eecf00efcf01f0cf02f1cf03e70fe7 +cdfbe9cdfcebcdfdeccdfeedcdffe2cd +f7e3cdf8e4cdf9e5cdfa0010ee1df50f +f5cdb3f7cdb4f8cdb5f9cdb6facdb7ee +cdb0efcd8ef0cdb1f2cdb2e90ce9cdac +eacdadeccdaeedcdafe3cda8e4cda9e7 +cdaae8cdab0014ee25f414f809f8cdca +f9cdcbfacdccf4cdc7f5cdc8f7cdc9ee +cdc2f0cdc3f1cdc4f2cdc5f3cdc6e70f +e7cdbde8cdbeeacdbfebcdc0eccdc1e1 +cdb9e2cdbae3cdbbe4b991e6cdbc0015 +ef25f514f809f8cde0f9cde1faa564f5 +cdddf6cddef7cddfefcdd8f0cdd9f1cd +daf2cddbf3cddce914ec09eccdd5edcd +d6eecdd7e9cdd2eacdd3ebcdd4e2a7f3 +e3cdcee5cdcfe6cdd0e7cdd10013f020 +f60ff6cdf2f7cdf3f8cdf4f9cdf5facd +f6f0cdedf1cdeef2cdeff3cdf0f5cdf1 +e70fe7cde8e9cde9ebcdeaeccdebefcd +ece1cde3e2cde4e3cde5e4cde6e5cde7 66c17d69c0d869a25c6aa2a76b0017ef -2af514f809f8cda5f9cda6facda7f5cd -a2f6cda3f7cda4f209f2cd9ff3cda0f4 -cda1efcd9cf0cd9df1cd9ee714ea09ea -cd99edcd9aeecd9be7cd96e8cd97e9cd -98e409e4cd93e5cd94e6cd95e1cd90e2 -cd91e3cd920015ed25f514f809f8cd80 -f9cd81facd82f5cd7df6cd7ef7cd7fed -cd78f0cd79f1cd7af2cd7bf3cd7ce714 -ea09eacd75ebcd76eccd77e7cd72e8cd -73e9cd74e1cd6de2cd6ee4cd6fe5cd70 -e6cd710bed14f409f4cd8cf5cd8df7cd -8eedcd89f0cd8af2cd8be509e5cd86e7 -cd87eccd88e1cd83e2cd84e4cd8566a2 -5767a25e680016ee2af414f709f7cd69 -f9cd6afacd6bf4cd66f5cd67f6cd68f1 -09f1cd63f2cd64f3cd65eecd60efcd61 -f0cd62e714ea09eacd5debcd5eedcd5f -e7cd5ae8cd5be9cd5ce1cd55e2cd56e3 -cd57e4cd58e5cd5902e5cd40edcd41f7 -cd420011ed1df40ff4cd50f5cd51f7cd -52f9cd53facd54edcd4cf0cd4df2cd4e -f3cd4fe50fe5cd48e8cd49e9cd4aeacd -4becb5d0e1cd44e2cd45e3cd46e4cd47 +2af514f809f8cda4f9cda5facda6f5cd +a1f6cda2f7cda3f209f2cd9ef3cd9ff4 +cda0efcd9bf0cd9cf1cd9de714ea09ea +cd98edcd99eecd9ae7cd95e8cd96e9cd +97e409e4cd92e5cd93e6cd94e1cd8fe2 +cd90e3cd910015ed25f514f809f8cd7f +f9cd80facd81f5cd7cf6cd7df7cd7eed +cd77f0cd78f1cd79f2cd7af3cd7be714 +ea09eacd74ebcd75eccd76e7cd71e8cd +72e9cd73e1cd6ce2cd6de4cd6ee5cd6f +e6cd700bed14f409f4cd8bf5cd8cf7cd +8dedcd88f0cd89f2cd8ae509e5cd85e7 +cd86eccd87e1cd82e2cd83e4cd8466a2 +5767a25e680016ee2af414f709f7cd68 +f9cd69facd6af4cd65f5cd66f6cd67f1 +09f1cd62f2cd63f3cd64eecd5fefcd60 +f0cd61e714ea09eacd5cebcd5dedcd5e +e7cd59e8cd5ae9cd5be1cd54e2cd55e3 +cd56e4cd57e5cd5802e5cd3fedcd40f7 +cd410011ed1df40ff4cd4ff5cd50f7cd +51f9cd52facd53edcd4bf0cd4cf2cd4d +f3cd4ee50fe5cd47e8cd48e9cd49eacd +4aecb5cfe1cd43e2cd44e3cd45e4cd46 61a26262a2ad63a40564a466650017ee -2af414f709f7cd3df9cd3efacd3ff4cd -3af5cd3bf6cd3cf109f1cd37f2cd38f3 -cd39eecd34efcd35f0cd36e714ea09ea -cd31ebcd32eccd33e7cd2ee8cd2fe9cd -30e409e4cd2be5cd2ce6cd2de1cd28e2 -cd29e3cd2a0015f025f514f809f8cbe0 -f9cbe1facbe2f5cbddf6cbdef7cbdff0 -a546f1cbd9f2cbdaf3cbdbf4cbdce614 -eb09ebcbd6edcbd7efcbd8e6cbd3e8cb -d4eacbd5e1cbcee2cbcfe3cbd0e4cbd1 -e5cbd20018ee2df417f70cf7cbf8f8cb -f9f9cbfafacbfbf4cbf5f5cbf6f6cbf7 -f109f1cbf2f2cbf3f3cbf4eecbefefcb -f0f0cbf1e814eb09ebcbececcbededcb -eee8cbe9e9cbeaeacbebe409e4cbe6e5 -cbe7e7cbe8e1cbe3e2cbe4e3cbe50012 -ee20f40ff4cd0ef5cd0ff6cd10f7cd11 -f8cd12eecd0aefcd0bf0cd0cf2b51ef3 -cd0de70fe7cd05e8cd06e9cd07ebcd08 -eccd09e2cbfde32ce5cd03e6cd042205 -5211522e53325410d2cd0210cfcd0110 -d5cbff2acbfe312a4d10c5cd001137b2 -cbff0feb1af20cf2cd23f3cd24f5cd25 -f8cd26ebcd1feecd20efcd21f1cd22e6 -0ce6cd1be7cd1ce8cd1deacd1ee1cd17 -e2cd18e3cd19e5cd1a001d70c17b784b -e90ce9c947ecc967f3c906f4c9dc7850 -79547a7ae1012a2e41127261e2c7df01 -2ac7de5010cbc7df10edcb0205f509f5 -cb06f8cb07f9cb08e5cb03edcb04eecb -0502e5cb09e8cb0aeecb0b73af736474 -a24575a2637707ee0ceec9feefc9fff2 -cb00f7cb01e1c9fae2c9fbe7c9fcedc9 -fd0aee14f409f4c9d9f5c9daf7c9dbee -c9d6f1c9d7f3c9d8e1c9d1e5c9d2e8c9 -d3e9c9d4edc9d509f00ff0c9e2f2c9e3 -f4c9e4f5c9e5f6c9e6e1c9dde8c9dee9 -c9dfeec9e0efc9e10013ef20f50ff5c9 -f6f7c9f7f8c9f8f9c9f9fac9e8efc9f1 -f0c9f2f1c9f3f2c9f4f4c9f5e60fe6c9 -ece7c9ede9c9eeeac9efedc9f0e1c9e7 -e2c9e8e3c9e9e4c9eae5c9eb70a24571 -a270720012ed20f40ff4c9cdf5c9cef7 -c9cff8c9d0f9c9cdedc9c9efc9caf0b3 -65f1c9cbf2c9cce60fe6c9c4e7c9c5e8 -c9c6e9c9c7ebc9c8e1c9c0e3c9c1e4c9 -c2e5c9c30cee17f10cf1c9bbf2bd11f3 -c9bcf4c9bdeec9b8efc9b9f0c9baeb09 -ebc9b5ecc9b6edc9b7e1a776e5c9b3e9 -c9b401e1c9beedc9bf68c1ce6cc1246c +2af414f709f7cd3cf9cd3dfacd3ef4cd +39f5cd3af6cd3bf109f1cd36f2cd37f3 +cd38eecd33efcd34f0cd35e714ea09ea +cd30ebcd31eccd32e7cd2de8cd2ee9cd +2fe409e4cd2ae5cd2be6cd2ce1cd27e2 +cd28e3cd290015f025f514f809f8cbdf +f9cbe0facbe1f5cbdcf6cbddf7cbdef0 +a546f1cbd8f2cbd9f3cbdaf4cbdbe614 +eb09ebcbd5edcbd6efcbd7e6cbd2e8cb +d3eacbd4e1cbcde2cbcee3cbcfe4cbd0 +e5cbd10018ee2df417f70cf7cbf7f8cb +f8f9cbf9facbfaf4cbf4f5cbf5f6cbf6 +f109f1cbf1f2cbf2f3cbf3eecbeeefcb +eff0cbf0e814eb09ebcbebeccbecedcb +ede8cbe8e9cbe9eacbeae409e4cbe5e5 +cbe6e7cbe7e1cbe2e2cbe3e3cbe40012 +ee20f40ff4cd0df5cd0ef6cd0ff7cd10 +f8cd11eecd09efcd0af0cd0bf2b51df3 +cd0ce70fe7cd04e8cd05e9cd06ebcd07 +eccd08e2cbfce32ce5cd02e6cd032205 +5211522e53325410d2cd0110cfcd0010 +d5cbfe2acbfd312a4d10c5cbff1137b2 +cbfe0feb1af20cf2cd22f3cd23f5cd24 +f8cd25ebcd1eeecd1fefcd20f1cd21e6 +0ce6cd1ae7cd1be8cd1ceacd1de1cd16 +e2cd17e3cd18e5cd19001d70c17b784b +e90ce9c946ecc966f3c905f4c9db7850 +79547a7ae1012a2e41127261e2c7de01 +2ac7dd5010cbc7de10edcb0105f509f5 +cb05f8cb06f9cb07e5cb02edcb03eecb +0402e5cb08e8cb09eecb0a73af736474 +a24575a2637707ee0ceec9fdefc9fef2 +c9fff7cb00e1c9f9e2c9fae7c9fbedc9 +fc0aee14f409f4c9d8f5c9d9f7c9daee +c9d5f1c9d6f3c9d7e1c9d0e5c9d1e8c9 +d2e9c9d3edc9d409f00ff0c9e1f2c9e2 +f4c9e3f5c9e4f6c9e5e1c9dce8c9dde9 +c9deeec9dfefc9e00013ef20f50ff5c9 +f5f7c9f6f8c9f7f9c9f8fac9e7efc9f0 +f0c9f1f1c9f2f2c9f3f4c9f4e60fe6c9 +ebe7c9ece9c9edeac9eeedc9efe1c9e6 +e2c9e7e3c9e8e4c9e9e5c9ea70a24571 +a270720012ed20f40ff4c9ccf5c9cdf7 +c9cef8c9cff9c9ccedc9c8efc9c9f0b3 +64f1c9caf2c9cbe60fe6c9c3e7c9c4e8 +c9c5e9c9c6ebc9c7e1c9bfe3c9c0e4c9 +c1e5c9c20cee17f10cf1c9baf2bd10f3 +c9bbf4c9bceec9b7efc9b8f0c9b9eb09 +ebc9b4ecc9b5edc9b6e1a776e5c9b2e9 +c9b301e1c9bdedc9be68c1ce6cc1246c a2426da27d6ea2c86f0010ee1df30ff3 -c9aef4c9aff6c9b0f7c9b1f9c9b2eec9 -aaefc9abf0c9acf1c9ade80ce8c9a6e9 -c9a7ebc9a8edc9a9e3c9a2e5c9a3e6c9 -a4e7c9a50011ee1df40ff4bfb1f5b905 -f6c975f7c976fac977eec971efc972f2 -c973f3c974e50fe5c96ce7c96de8c96e -ebc96fecc970e1c968e2c969e3c96ae4 -c96b0015ee25f414f809f8c989f9c98a -fac98bf4c987f5c942f7c988eec982ef -c983f1c984f2c985f3c986e614ea09ea -c97fecc980edc981e6c97ce8c97de9c9 -7ee1c978e2c979e3b547e4c97ae5c97b -0016ed2af314f709f7c99ff9c9a0fac9 -a1f3c99cf4c99df6c99ef009f0c999f1 -c99af2c99bedc996eec997efc998e714 -ea09eac993ebc994ecc995e7c990e8c9 -91e9c992e1c98ce2bbe8e3c98de4c98e -e5c98f686a69a2506aa29b6b08ee0fee -c962efc963f0c964f2c965f5c966e1c9 -5ee2c95fe7c960e8c9610cee17f40cf4 -c943f5c944f6c945f7c946eec940efc9 -41f2c942eb09ebc93decc93eedc93fe4 -c93ae7c93be8c93c0015ef25f514f809 -f8c95af9c95bfac95cf5c957f6c958f7 -c959efc952f0c953f2c954f3c955f4c9 -56e714ec09ecc94fedc950eec951e7c9 -4de8c94eeaad1ee1c948e2c949e3c94a -e4c94be6c94c10f4c95d64836468658e -66a2726708eb0febc935ecc936eec937 -f3c938f5c939e1c931e4c932e7c933e9 -c93405ef09efc91bf4c91cf5c91de1c9 -18e3c919eec91a0011ef1df30ff3b112 -f6c92af8c92bf9c92cfac92defc927f0 -c928f1c929f2b112e70fe7c922e9c923 -ebc924ecc925edc926e1c91ee2c91fe4 -c920e5c92102e1c92ee5c92fecc93061 -9662a295630fe91aee0ceec915f0c916 -f2a355f7c917e9c911eac912ebc913ed -c914e50ce5c90de6c90ee7c90fe8c910 -e1c909e2c90ae3c90be4c90c0016ef2a -f514f809f8c7f4f9c7f5fac7f6f5c7f1 -f6c7f2f7c7f3f209f2c7eff3c7f0f4bb -aaefc7ecf0c7edf1c7eee71eeb13ebc7 -e8ec26edc7eb012ac7e95012686cf0c7 -eae7c7e5e8c7e6e9c7e7e2c7e0e3c7e1 -e4c7e2e5c7e3e6c7e40011ee1df30ff3 -c904f4c905f5c906f6c907f9c908eec9 -00efc901f0c902f2c903e70fe7c7fbe8 -c7fce9c7fdecc7feedc7ffe2c7f7e3c7 -f8e5c7f9e6c7fa057839782a797cf5cb -0c0bf014f409f4cb3df5cb3ef7cb3ff0 -cb3af1cb3bf2cb3cec09eccb37eecb38 -efcb39e1cb34e3cb35e8cb3601e1cb40 -f0cb41755276a25a7705ed09edcb31f3 -cb32f4cb33e1cb2ee3cb2fe8cb300013 -ee20f60ff6cb1cf7cb1df8cb1ef9cb1f -facb0ceecb17f0cb18f1cb19f2cb1af3 -cb1be70fe7cb12e9cb13ebcb14eccb15 -edcb16e1cb0de2cb0ee3cb0fe4cb10e6 -cb110ded17f00cf0cb2af3cb2bf7cb2c -facb2dedcb27eecb28efcb29e80ce8cb -23e9cb24eacb25eccb26e1cb20e3cb21 -e5cb220019709f7820ee0ceecb95efc1 -6af5cbb4f7cbc3782a7934edcb7f01e4 -cbcaf7cbcb10f5cbcc745b7450756677 -05ed09edcbc7efcbc8f2cbc9e1cbc4eb -cbc5eccbc603e3cbb0e8cbb1edcbb2f7 -cbb30eed1af40cf4cbbff5cbc0f9cbc1 -facbc2edc16aefcbbcf0cbbdf1cbbee6 -0ce6cbb8e7cbb9e9cbbaebcbbbe2cbb5 -e3cbb6e5cbb77034723e7301ebcbaef7 -cbaf01eecba8f4cba903e9cbaaedcbab -efcbacf4cbad68c0ea6bb76b8a6da24a -6ea29a6f0cec17f00cf0cba4f2cba5f5 -cba6f7cba7eccba2edcb93efcba3e509 -e5cb9fe6cba0e7cba1e2cb9ce3cb9de4 -cb9e06e90ce9ab7dedcb7cf4cb7df7cb -7ee1cb79e2cb7ae8cb7b0016ed2af414 -f809f8bda2f9cb93facb94f4cb90f5cb -91f7cb92f009f0cb8ef1cb8ff2afd6ed -cb8beecb8cefcb8de614e909e9cb88eb -cb89eccb8ae6cb85e7cb86e8cb87e1cb -80e2cb81e3cb82e4cb83e5cb8405ee09 -eecb99f2cb9af7cb9be4cb96e7cb97ec -cb98683a69446a02e7cb76e9cb77f3cb -7801e7cb6cf0cb6d07ee0ceecb72f2cb -73f4cb74f5cb75e1cb6ee6cb6feccb70 -edcb7164446446654a6704e1cb67eecb -68f2cb69f3cb6af5cb6b10e2cb5a0bec -14f309f3cb64f4cb65f9cb66eccb61ed -cb62eecb63e709e7cb5ee9cb5feacb60 -e1cb5be2cb5ce5cb5d613062a2496310 -e6cb590013ed20f60ff6cb50f7cb51f8 -cb52f9cb53facb54edcb4beecb4cefcb -4df0cb4ef2cb4fe70fe7cb47e8cb48e9 -cb49eac307ebcb4ae1cb42e2cb43e3cb -44e4cb45e6cb4603e2cb55ebcb56eccb -57f0cb586da6596eb8666f001b70c0f2 -7923ea0ceac766edb182f2c7a9f3c7b8 -792a7a3ae3c75202e4c7daedc7dbf9c7 -dc10edc7dd7462743c75a24976a25677 -01e9c7d8ecc7d90011f11df50ff5c7ce -f7c7cff8c7d0f9c7d1fac7d2f1c7caf2 -c7cbf3c7ccf4c7cde90fe9c7c5ebc7c6 -ecc7c7edc7c8eec7c9e1c7c1e2c7c2e4 -c7c3e5c7c404e2c7d3e5c7d4e9c7d5ed -c7d6eeb1cb10e4c7d7705c72827307f0 -0cf0c7bdf4c7bef5c7bff8c7c0e1c7b9 -e3c7bae9c7bbefc7bc05ef09efc7a6f4 -c7a7f9c7a8e1b55febc7a4edc7a50ef3 -1af70cf7c7b5f8c7b6f9c7a9fac7b7f3 -c7b1f4c7b2f5c7b3f6c7b4e70ce7c7ad -eec7aeefc7aff2c7b0e1c7aae3c7abe5 -c7ac69c0f06c926c406d786ea25a6f02 -e4c7a1eec7a2f2c7a308ed0fedc780ef -c781f2c782f4c783f5c784e1c77ce4c7 -7de5c77eebc77f0def17f40cf4c78ff5 -c790f7c791f8c792efc78cf0c78df2c7 -8ee70ce7c788e9c789ebc78aecc78be1 -c785e2c786e3c7870def17f30cf3c79d -f4c79ef5c79ff8c7a0efc79af0c79bf2 -c79ce90ce9c796eac797ebc798eec799 -e1c793e5c794e7c79569966aa2426b0f -ed1af50cf5c778f6c779f8c77afac77b -edc774efc775f2c776f3c777e50ce5c7 -70e7c771e9c772ebc773e1c76ce2c76d -e3c76ee4c76f02e1c763e5c764eec765 -05f309f3c769f6c76af7c76be2c767e3 -c768e7c76664326438664e67586801f4 -c761f5c76203e1c756ebc757f4c758f5 -c75901f3c75af5c75b04e2c75ce3c75d -e7c75eefc75ff5c760613a62506302e1 -c753efc754f5c75503e1c746e3c747f2 -c748f6c74907ef0cefc74ef2c74ff4c7 -50f5c751e9c74aebc74becc74cedc74d -002473c2cae82aef0fefc16af2c1b2f3 -b200f4c1e1f9a9d2e8bfcbe9bf2debbf -24ecc126ee012ad833c24d126f6ee7af +c9adf4c9aef6c9aff7c9b0f9c9b1eec9 +a9efc9aaf0c9abf1c9ace80ce8c9a5e9 +c9a6ebc9a7edc9a8e3c9a1e5c9a2e6c9 +a3e7c9a40011ee1df40ff4bfb0f5b904 +f6c974f7c975fac976eec970efc971f2 +c972f3c973e50fe5c96be7c96ce8c96d +ebc96eecc96fe1c967e2c968e3c969e4 +c96a0015ee25f414f809f8c988f9c989 +fac98af4c986f5c941f7c987eec981ef +c982f1c983f2c984f3c985e614ea09ea +c97eecc97fedc980e6c97be8c97ce9c9 +7de1c977e2c978e3b546e4c979e5c97a +0016ed2af314f709f7c99ef9c99ffac9 +a0f3c99bf4c99cf6c99df009f0c998f1 +c999f2c99aedc995eec996efc997e714 +ea09eac992ebc993ecc994e7c98fe8c9 +90e9c991e1c98be2bbe7e3c98ce4c98d +e5c98e686a69a2506aa29b6b08ee0fee +c961efc962f0c963f2c964f5c965e1c9 +5de2c95ee7c95fe8c9600cee17f40cf4 +c942f5c943f6c944f7c945eec93fefc9 +40f2c941eb09ebc93cecc93dedc93ee4 +c939e7c93ae8c93b0015ef25f514f809 +f8c959f9c95afac95bf5c956f6c957f7 +c958efc951f0c952f2c953f3c954f4c9 +55e714ec09ecc94eedc94feec950e7c9 +4ce8c94deaad1ee1c947e2c948e3c949 +e4c94ae6c94b10f4c95c64836468658e +66a2726708eb0febc934ecc935eec936 +f3c937f5c938e1c930e4c931e7c932e9 +c93305ef09efc91af4c91bf5c91ce1c9 +17e3c918eec9190011ef1df30ff3b112 +f6c929f8c92af9c92bfac92cefc926f0 +c927f1c928f2b112e70fe7c921e9c922 +ebc923ecc924edc925e1c91de2c91ee4 +c91fe5c92002e1c92de5c92eecc92f61 +9662a295630fe91aee0ceec914f0c915 +f2a355f7c916e9c910eac911ebc912ed +c913e50ce5c90ce6c90de7c90ee8c90f +e1c908e2c909e3c90ae4c90b0016ef2a +f514f809f8c7f3f9c7f4fac7f5f5c7f0 +f6c7f1f7c7f2f209f2c7eef3c7eff4bb +a9efc7ebf0c7ecf1c7ede71eeb13ebc7 +e7ec26edc7ea012ac7e85012686cf0c7 +e9e7c7e4e8c7e5e9c7e6e2c7dfe3c7e0 +e4c7e1e5c7e2e6c7e30011ee1df30ff3 +c903f4c904f5c905f6c906f9c907eec7 +ffefc900f0c901f2c902e70fe7c7fae8 +c7fbe9c7fcecc7fdedc7fee2c7f6e3c7 +f7e5c7f8e6c7f9057839782a797cf5cb +0b0bf014f409f4cb3cf5cb3df7cb3ef0 +cb39f1cb3af2cb3bec09eccb36eecb37 +efcb38e1cb33e3cb34e8cb3501e1cb3f +f0cb40755276a25a7705ed09edcb30f3 +cb31f4cb32e1cb2de3cb2ee8cb2f0013 +ee20f60ff6cb1bf7cb1cf8cb1df9cb1e +facb0beecb16f0cb17f1cb18f2cb19f3 +cb1ae70fe7cb11e9cb12ebcb13eccb14 +edcb15e1cb0ce2cb0de3cb0ee4cb0fe6 +cb100ded17f00cf0cb29f3cb2af7cb2b +facb2cedcb26eecb27efcb28e80ce8cb +22e9cb23eacb24eccb25e1cb1fe3cb20 +e5cb210019709f7820ee0ceecb94efc1 +69f5cbb3f7cbc2782a7934edcb7e01e4 +cbc9f7cbca10f5cbcb745b7450756677 +05ed09edcbc6efcbc7f2cbc8e1cbc3eb +cbc4eccbc503e3cbafe8cbb0edcbb1f7 +cbb20eed1af40cf4cbbef5cbbff9cbc0 +facbc1edc169efcbbbf0cbbcf1cbbde6 +0ce6cbb7e7cbb8e9cbb9ebcbbae2cbb4 +e3cbb5e5cbb67034723e7301ebcbadf7 +cbae01eecba7f4cba803e9cba9edcbaa +efcbabf4cbac68c0ea6bb76b8a6da24a +6ea29a6f0cec17f00cf0cba3f2cba4f5 +cba5f7cba6eccba1edcb92efcba2e509 +e5cb9ee6cb9fe7cba0e2cb9be3cb9ce4 +cb9d06e90ce9ab7dedcb7bf4cb7cf7cb +7de1cb78e2cb79e8cb7a0016ed2af414 +f809f8bda1f9cb92facb93f4cb8ff5cb +90f7cb91f009f0cb8df1cb8ef2afd6ed +cb8aeecb8befcb8ce614e909e9cb87eb +cb88eccb89e6cb84e7cb85e8cb86e1cb +7fe2cb80e3cb81e4cb82e5cb8305ee09 +eecb98f2cb99f7cb9ae4cb95e7cb96ec +cb97683a69446a02e7cb75e9cb76f3cb +7701e7cb6bf0cb6c07ee0ceecb71f2cb +72f4cb73f5cb74e1cb6de6cb6eeccb6f +edcb7064446446654a6704e1cb66eecb +67f2cb68f3cb69f5cb6a10e2cb590bec +14f309f3cb63f4cb64f9cb65eccb60ed +cb61eecb62e709e7cb5de9cb5eeacb5f +e1cb5ae2cb5be5cb5c613062a2496310 +e6cb580013ed20f60ff6cb4ff7cb50f8 +cb51f9cb52facb53edcb4aeecb4befcb +4cf0cb4df2cb4ee70fe7cb46e8cb47e9 +cb48eac306ebcb49e1cb41e2cb42e3cb +43e4cb44e6cb4503e2cb54ebcb55eccb +56f0cb576da6596eb8666f001b70c0f2 +7923ea0ceac765edb182f2c7a8f3c7b7 +792a7a3ae3c75102e4c7d9edc7daf9c7 +db10edc7dc7462743c75a24976a25677 +01e9c7d7ecc7d80011f11df50ff5c7cd +f7c7cef8c7cff9c7d0fac7d1f1c7c9f2 +c7caf3c7cbf4c7cce90fe9c7c4ebc7c5 +ecc7c6edc7c7eec7c8e1c7c0e2c7c1e4 +c7c2e5c7c304e2c7d2e5c7d3e9c7d4ed +c7d5eeb1cb10e4c7d6705c72827307f0 +0cf0c7bcf4c7bdf5c7bef8c7bfe1c7b8 +e3c7b9e9c7baefc7bb05ef09efc7a5f4 +c7a6f9c7a7e1b55eebc7a3edc7a40ef3 +1af70cf7c7b4f8c7b5f9c7a8fac7b6f3 +c7b0f4c7b1f5c7b2f6c7b3e70ce7c7ac +eec7adefc7aef2c7afe1c7a9e3c7aae5 +c7ab69c0f06c926c406d786ea25a6f02 +e4c7a0eec7a1f2c7a208ed0fedc77fef +c780f2c781f4c782f5c783e1c77be4c7 +7ce5c77debc77e0def17f40cf4c78ef5 +c78ff7c790f8c791efc78bf0c78cf2c7 +8de70ce7c787e9c788ebc789ecc78ae1 +c784e2c785e3c7860def17f30cf3c79c +f4c79df5c79ef8c79fefc799f0c79af2 +c79be90ce9c795eac796ebc797eec798 +e1c792e5c793e7c79469966aa2426b0f +ed1af50cf5c777f6c778f8c779fac77a +edc773efc774f2c775f3c776e50ce5c7 +6fe7c770e9c771ebc772e1c76be2c76c +e3c76de4c76e02e1c762e5c763eec764 +05f309f3c768f6c769f7c76ae2c766e3 +c767e7c76564326438664e67586801f4 +c760f5c76103e1c755ebc756f4c757f5 +c75801f3c759f5c75a04e2c75be3c75c +e7c75defc75ef5c75f613a62506302e1 +c752efc753f5c75403e1c745e3c746f2 +c747f6c74807ef0cefc74df2c74ef4c7 +4ff5c750e9c749ebc74aecc74bedc74c +002473c2cae82aef0fefc169f2c1b1f3 +b200f4c1e0f9a9d2e8bfcae9bf2cebbf +23ecc125ee012ad833b84d126f6ee7af 5077c14c773878a26179a2bc7aa2fde7 -bfb10017ed2af314f609f6c338f7c339 -fac33af3c335f4c336f5c337f009f0c3 -33f1c334f2addeedc330eec331efc332 -e714ea09eab1cbebc32eecc32fe7c32b -e8c32ce9c32de409e4af28e5c329e6c3 -2ae1c326e2c327e3c3280019ee2df417 -f70cf7c351f8c352f9c353fac354f4c3 -4ef5c34ff6c350f109f1c34bf2c34cf3 -c34deec348efc349f0c34ae717ea0cea -c344ebc345ecc346edc347e7c341e8c3 -42e9c343e409e4c33ee5c33fe6c340e1 -c33be2c33ce3c33d0013ed20f60ff6c3 -62f7c363f8c364f9c365fac366edc35e -f0c35ff2c360f4c1c9f5c361e70fe7c3 -59e8c35aeac35bebc35cecc35de2c355 -e3c356e4a51de5c357e6c3580013ef20 -f50ff5c376f6c377f7c378f8c379fac3 -7aefc371f0c372f1c373f2c374f4c375 -ea0feac36cebc36decc36eedc36feec3 -70e1c367e4c368e5c369e8c36ae9c36b +bfb00017ed2af314f609f6c337f7c338 +fac339f3c334f4c335f5c336f009f0c3 +32f1c333f2addeedc32feec330efc331 +e714ea09eab1cbebc32decc32ee7c32a +e8c32be9c32ce409e4af28e5c328e6c3 +29e1c325e2c326e3c3270019ee2df417 +f70cf7c350f8c351f9c352fac353f4c3 +4df5c34ef6c34ff109f1c34af2c34bf3 +c34ceec347efc348f0c349e717ea0cea +c343ebc344ecc345edc346e7c340e8c3 +41e9c342e409e4c33de5c33ee6c33fe1 +c33ae2c33be3c33c0013ed20f60ff6c3 +61f7c362f8c363f9c364fac365edc35d +f0c35ef2c35ff4c1c8f5c360e70fe7c3 +58e8c359eac35aebc35becc35ce2c354 +e3c355e4a51de5c356e6c3570013ef20 +f50ff5c375f6c376f7c377f8c378fac3 +79efc370f0c371f1c372f2c373f4c374 +ea0feac36bebc36cecc36dedc36eeec3 +6fe1c366e4c367e5c368e8c369e9c36a 73a25074a2a075a2f8760014f025f514 -f809f8c323f9c324fac325f5c320f6c3 -21f7c322f0c31bf1c31cf2c31df3c31e -f4c31fe80fe8c316ebc317ecc318eec3 -19efc31ae1c311e4c312e5c313e6c314 -e7c3150016ee2af514f809f8c1def9c1 -dffac1e0f5c1dbf6c1dcf7c1ddf109f1 -c1d9f3c1daf4c1c9eec1d6efc1d7f0c1 -d8e814eb09ebc1d3ecc1d4edc1d5e8c1 -d0e9c1d1eac1d2e2c1cbe3c1cce5c1cd -e6c1cee7c1cf0018ed2df317f60cf6c1 -f7f7c1f8f8c1f9f9c1faf3c1f4f4c1f5 -f5c1f6f009f0c1f1f1c1f2f2c1f3edc1 -eeeec1efefc1f0e714ea09eac1ebebc1 -ececc1ede7c1e8e8c1e9e9c1eae409e4 -c1e5e5c1e6e6c1e7e1c1e2e2c1e3e3c1 -e40015ef25f414f809f8c30ef9c30ffa -c310f4c30bf5c30cf6c30defc306f0c3 -07f1c308f2c309f3c30ae714ea09eac3 -03ebc304edc305e7c300e8c301e9c302 -e1c1fbe2c1fce3c1fde4c1fee5c1ff6a +f809f8c322f9c323fac324f5c31ff6c3 +20f7c321f0c31af1c31bf2c31cf3c31d +f4c31ee80fe8c315ebc316ecc317eec3 +18efc319e1c310e4c311e5c312e6c313 +e7c3140016ee2af514f809f8c1ddf9c1 +defac1dff5c1daf6c1dbf7c1dcf109f1 +c1d8f3c1d9f4c1c8eec1d5efc1d6f0c1 +d7e814eb09ebc1d2ecc1d3edc1d4e8c1 +cfe9c1d0eac1d1e2c1cae3c1cbe5c1cc +e6c1cde7c1ce0018ed2df317f60cf6c1 +f6f7c1f7f8c1f8f9c1f9f3c1f3f4c1f4 +f5c1f5f009f0c1f0f1c1f1f2c1f2edc1 +edeec1eeefc1efe714ea09eac1eaebc1 +ebecc1ece7c1e7e8c1e8e9c1e9e409e4 +c1e4e5c1e5e6c1e6e1c1e1e2c1e2e3c1 +e30015ef25f414f809f8c30df9c30efa +c30ff4c30af5c30bf6c30cefc305f0c3 +06f1c307f2c308f3c309e714ea09eac3 +02ebc303edc304e7c1ffe8c300e9c301 +e1c1fae2c1fbe3c1fce4c1fde5c1fe6a c3076ec1c76ea2626fa2bb70a40b71a4 -63720017ef2af514f809f8c1c8f9c1c9 -fac1caf5c1c5f6c1c6f7c1c7f209f2c1 -c2f3c1c3f4c1c4efc1bff0c1c0f1c1c1 -e814ec09ecc1bcedc1bdeec1bee8c1b9 -eac1baebc1bbe409e4c1b6e6c1b7e7c1 -b8e1c1b3e2c1b4e3c1b50018ed2df417 -f70cf7c166f8c167f9c168fac169f4c1 -63f5c164f6c165f109f1c160f2c161f3 -c162edc15deec15ef0c15fe715ea0aea -c15bebd8299aecc15ce7c158e8c159e9 -c15ae409e4c155e5c156e6c157e1c152 -e2c153e3c1540016ef2af514f809f8c1 -7ef9c17ffac180f5c17bf6c17cf7c17d -f209f2c178f3c179f4c17aefc175f0c1 -76f1c177e714ea09eac173ebc174edab -d2e7c170e8c171e9c172e1c16be3c16c -e4c16de5c16ee6c16f0018ee2df417f7 -0cf7c196f8c197f9c198fac199f4c193 -f5c194f6c195f109f1c190f2c191f3c1 -92eec18defc18ef0c18fe814eb09ebc1 -8aecc18bedc18ce8c187e9c188eac189 -e409e4c184e5c185e7c186e1c181e2c1 -82e3c1830017ee2af514f809f8c1aff9 -c1b0fac1b1f5c1acf6c1adf7c1aef109 -f1c1a9f2c1aaf3c1abeec1a6efc1a7f0 -c1a8e814eb09ebc1a3ecc1a4edc1a5e8 -c1a0e9c1a1eac1a2e509e5c19de6c19e -e7c19fe1c19ae2c19be3c19c6aa2556b +63720017ef2af514f809f8c1c7f9c1c8 +fac1c9f5c1c4f6c1c5f7c1c6f209f2c1 +c1f3c1c2f4c1c3efc1bef0c1bff1c1c0 +e814ec09ecc1bbedc1bceec1bde8c1b8 +eac1b9ebc1bae409e4c1b5e6c1b6e7c1 +b7e1c1b2e2c1b3e3c1b40018ed2df417 +f70cf7c165f8c166f9c167fac168f4c1 +62f5c163f6c164f109f1c15ff2c160f3 +c161edc15ceec15df0c15ee715ea0aea +c15aebd82990ecc15be7c157e8c158e9 +c159e409e4c154e5c155e6c156e1c151 +e2c152e3c1530016ef2af514f809f8c1 +7df9c17efac17ff5c17af6c17bf7c17c +f209f2c177f3c178f4c179efc174f0c1 +75f1c176e714ea09eac172ebc173edab +d2e7c16fe8c170e9c171e1c16ae3c16b +e4c16ce5c16de6c16e0018ee2df417f7 +0cf7c195f8c196f9c197fac198f4c192 +f5c193f6c194f109f1c18ff2c190f3c1 +91eec18cefc18df0c18ee814eb09ebc1 +89ecc18aedc18be8c186e9c187eac188 +e409e4c183e5c184e7c185e1c180e2c1 +81e3c1820017ee2af514f809f8c1aef9 +c1affac1b0f5c1abf6c1acf7c1adf109 +f1c1a8f2c1a9f3c1aaeec1a5efc1a6f0 +c1a7e814eb09ebc1a2ecc1a3edc1a4e8 +c19fe9c1a0eac1a1e509e5c19ce6c19d +e7c19ee1c199e2c19ae3c19b6aa2556b a2a06ca2eb6d0015ef25f514f809f8c1 -4ff9c150fac151f5c14cf6c14df7c14e -efc147f0c148f1c149f2c14af4c14be6 -14e909e9c144edc145eec146e6c141e7 -c142e8c143e1c13ce2c13de3c13ee4c1 -3fe5c1400015ee25f514f809f8c10df9 -c10efac10ff5c10af6c10bf7c10ceec1 -05f1c106f2c107f3c108f4c109e814eb -09ebc102ecc103edc104e8bfffe9c100 -eac101e2bffae3bffbe4bffce5bffde7 -bffe0015ef25f514f809f8c123f9c124 -fac125f5c120f6c121f7c122efc11bf0 -c11cf2c11df3c11ef4c11fe914ec09ec -c118edc119eec11ae9c115eac116ebc1 -17e1c110e2c111e3c112e5c113e6c114 -0014ee25f314f709f7c139f8c13afac1 -3bf3c136f5c137f6c138eec131efc132 -f0c133f1c134f2c135e80fe8c12ce9c1 -2deac12eebc12fecc130e1c127e2c128 -e3c129e5c12ae6c12b65c1c465a26266 +4ef9c14ffac150f5c14bf6c14cf7c14d +efc146f0c147f1c148f2c149f4c14ae6 +14e909e9c143edc144eec145e6c140e7 +c141e8c142e1c13be2c13ce3c13de4c1 +3ee5c13f0015ee25f514f809f8c10cf9 +c10dfac10ef5c109f6c10af7c10beec1 +04f1c105f2c106f3c107f4c108e814eb +09ebc101ecc102edc103e8bffee9bfff +eac100e2bff9e3bffae4bffbe5bffce7 +bffd0015ef25f514f809f8c122f9c123 +fac124f5c11ff6c120f7c121efc11af0 +c11bf2c11cf3c11df4c11ee914ec09ec +c117edc118eec119e9c114eac115ebc1 +16e1c10fe2c110e3c111e5c112e6c113 +0014ee25f314f709f7c138f8c139fac1 +3af3c135f5c136f6c137eec130efc131 +f0c132f1c133f2c134e80fe8c12be9c1 +2ceac12debc12eecc12fe1c126e2c127 +e3c128e5c129e6c12a65c1c465a26266 a2b267a40a68a465690017ed2af414f8 -09f8bff7f9bff8fabff9f4bff4f5bff5 -f7bff6f009f0bff1f1bff2f2bff3edbf -eeeebfefefbff0e714ea09eabfebebbf -ececbfede7bfe8e8bfe9e9bfeae409e4 -bfe5e5bfe6e6bfe7e1bfe2e2bfe3e3bf -e40016ee2af414f709f7bf95f9bf96fa -bf97f4bf92f5bf93f6bf94f109f1bf8f -f2bf90f3bf91eebf8cefbf8df0bf8ee7 -14eb09ebbf89ecbf8aedbf8be7abc6e8 -bf87eabf88e1bf82e2bf83e3bf84e4bf -85e5bf860018ed2df417f70cf7bfadf8 -bfaef9bfaffabfb0f4bfaaf5bfabf6bf -acf009f0bfa7f1bfa8f2bfa9edbfa4ee -bfa5efbfa6e714ea09eabfa1ebbfa2ec -bfa3e7bf9ee8bf9fe9bfa0e409e4bf9b -e5bf9ce6bf9de1bf98e2bf99e3bf9a00 -19ee2df417f70cf7bfc8f8b710f9bfc9 -fabfcaf4bfc5f5bfc6f6bfc7f109f1bf -c2f2bfc3f3bfc4eebfbfefbfc0f0bfc1 -e717ea0ceabfbbebbfbcecbfbdedbfbe -e7bfb8e8bfb9e9bfbae409e4bfb5e5bf -b6e6bfb7e1bfb2e2bfb3e3bfb40016ee -2af414f809f8bfdff9bfe0fabfe1f4bf -dcf5bfddf7bfdef109f1bfdaf2abb3f3 -bfdbeebfd7efbfd8f0bfd9e714eb09eb -bfd4ecbfd5edbfd6e7bfd1e9bfd2eabf -d3e2bfcce3bfcde4bfcee5bfcfe6bfd0 +09f8bff6f9bff7fabff8f4bff3f5bff4 +f7bff5f009f0bff0f1bff1f2bff2edbf +edeebfeeefbfefe714ea09eabfeaebbf +ebecbfece7bfe7e8bfe8e9bfe9e409e4 +bfe4e5bfe5e6bfe6e1bfe1e2bfe2e3bf +e30016ee2af414f709f7bf94f9bf95fa +bf96f4bf91f5bf92f6bf93f109f1bf8e +f2bf8ff3bf90eebf8befbf8cf0bf8de7 +14eb09ebbf88ecbf89edbf8ae7abc6e8 +bf86eabf87e1bf81e2bf82e3bf83e4bf +84e5bf850018ed2df417f70cf7bfacf8 +bfadf9bfaefabfaff4bfa9f5bfaaf6bf +abf009f0bfa6f1bfa7f2bfa8edbfa3ee +bfa4efbfa5e714ea09eabfa0ebbfa1ec +bfa2e7bf9de8bf9ee9bf9fe409e4bf9a +e5bf9be6bf9ce1bf97e2bf98e3bf9900 +19ee2df417f70cf7bfc7f8b70ff9bfc8 +fabfc9f4bfc4f5bfc5f6bfc6f109f1bf +c1f2bfc2f3bfc3eebfbeefbfbff0bfc0 +e717ea0ceabfbaebbfbbecbfbcedbfbd +e7bfb7e8bfb8e9bfb9e409e4bfb4e5bf +b5e6bfb6e1bfb1e2bfb2e3bfb30016ee +2af414f809f8bfdef9bfdffabfe0f4bf +dbf5bfdcf7bfddf109f1bfd9f2abb3f3 +bfdaeebfd6efbfd7f0bfd8e714eb09eb +bfd3ecbfd4edbfd5e7bfd0e9bfd1eabf +d2e2bfcbe3bfcce4bfcde5bfcee6bfcf 61a25f62a2b463a409640017ee2af514 -f809f8bf7ff9bf80fabf81f5bf7cf6bf -7df7bf7ef209f2bf79f3bf7af4bf7bee -bf76f0bf77f1bf78e714ea09eabf73eb -bf74edbf75e7bf70e8bf71e9bf72e409 -e4bf6de5bf6ee6bf6fe1bf6ae2bf6be3 -bf6c0015ee2ff51df812f8bf34f926fa -bf3722012abf354310c3bf36f5bf31f6 -bf32f7bf33eed824e7efbf2df1bf2ef3 -bf2ff4bf30e614ea09eabf2aebbf2bed -bf2ce6bf27e7bf28e9bf29e1bf22e2bf -23e3bf24e4bf25e5bf260017ef2af514 -f809f8bf4df9bf4efabf4ff5bf4af6bf -4bf7bf4cf209f2bf47f3bf48f4bf49ef -bf44f0bf45f1bf46e914ec09ecbf41ed -bf42eebf43e9bf3eeabf3febbf40e409 -e4bf3be6bf3ce8bf3de1bf38e2bf39e3 -bf3a0019ee2df417f70cf7bf66f8bf67 -f9bf68fabf69f4bf63f5bf64f6bf65f1 -09f1bf60f2bf61f3bf62eebf5defbf5e -f0bf5fe717ea0ceabf59ebbf5aecbf5b -edbf5ce7bf56e8bf57e9bf58e409e4bf -53e5bf54e6bf55e1bf50e2bf51e3bf52 -002473c1dfe220ee0feec586efc59ef2 -c5c5f6c70cf9c724e2c392e4c3bce5c3 -d5e7c3f0ecaf8277c0d27736787479a2 -527aa2a7e1c37b09ed0fedc714efc715 -f2c716f7c717f8c718e2c70fe3c710e5 -c711e7c712e9c7130bee14f209f2c722 -f5a958f8c723eec71fefc720f1c721e7 -09e7c71ce9c71decc71ee1c719e4c71a -e5c71b0017ee2af414f709f7c739f8c7 -3af9c73bf4c736f5c737f6c738f109f1 -c733f2c734f3c735eec730efc731f0c7 -32e814eb09ebc72decc72eedc72fe8c7 -2ae9c72beac72ce509e5c727e6c728e7 -c729e2c725e3b364e4c72609ed0fedc7 -41f2c742f5c743f9c744fac745e1c73c -e2c73de4c73ee9c73febc740734274a2 -5775a2887602e8c70dedc70eefa70000 -14ee25f514f809f8c5e4f9c5e5fac5e6 -f5c5e1f6c5e2f7c5e3eec5dcefc5ddf1 -c5def3c5dff4c5e0e60fe6c5d7e7c5d8 -e8c5d9ebc5daedc5dbe1c5d2e2c5d3e3 -c5d4e4c5d5e5c5d60eef1af50cf5c5f1 -f8c5f2f9c5f3fac5f4efc5eef0c5eff2 -c5f0f3ad1ee90ce9c5eaeac5ebebc5ec -edc5ede4c5e7e5c5e8e7c5e90017ef2a -f514f809f8c709f9c70afac70bf5c706 -f6c707f7c708f209f2c703f3c704f4c7 -05efc700f0c701f1c702e814eb09ebc5 -feedc5ffeea5dce8c5fbe9c5fceac5fd -e509e5c5f8e6c5f9e7c5fae1c5f5e3c5 -f6e4c5f76ac2596ec1256e966fa29370 -a2d971a2fc720dec17f00cf0c5cff5c3 -98f8c5d0fac5d1ecc5ccedc5cdeec5ce -e60ce6c5c9e7c5cae9c5cbebc566e1c5 -c6e2c5c7e5c5c80018ed2df417f70cf7 -c59bf8c503f9c59cfac59df4c598f5c5 -99f6c59af109f1c596f2c597f3c3a2ed -c593eec594f0c595e714ea09eac590eb -c591ecc592e7c58de8c58ee9c58fe409 -e4c58ae5c58be6c58ce1c587e2c588e3 -c5890014ed25f314f609f6c5aff7c5b0 -f9c5b1f3c5acf4c5adf5c5aeedab6cee -c5a9efaf63f0c5aaf1c5abe70fe7c5a4 -e8c5a5e9c5a6eac5a7ebc5a8e1c59fe3 -c5a0e4c5a1e5c5a2e6c5a30aee14f509 -f5c5b9f8c5baf9c5bbeec5b6efc5b7f3 -c5b8e2c5b2e7c5b3e8c5b4e9c3d5ecc5 -b508ee0feec5c0efc5c1f1c5c2f4c5c3 -f9c5c4e7c5bcebc5bdecc5beedc5bf6a +f809f8bf7ef9bf7ffabf80f5bf7bf6bf +7cf7bf7df209f2bf78f3bf79f4bf7aee +bf75f0bf76f1bf77e714ea09eabf72eb +bf73edbf74e7bf6fe8bf70e9bf71e409 +e4bf6ce5bf6de6bf6ee1bf69e2bf6ae3 +bf6b0015ee2ff51df812f8bf33f926fa +bf3622012abf344310c3bf35f5bf30f6 +bf31f7bf32eed824ddefbf2cf1bf2df3 +bf2ef4bf2fe614ea09eabf29ebbf2aed +bf2be6bf26e7bf27e9bf28e1bf21e2bf +22e3bf23e4bf24e5bf250017ef2af514 +f809f8bf4cf9bf4dfabf4ef5bf49f6bf +4af7bf4bf209f2bf46f3bf47f4bf48ef +bf43f0bf44f1bf45e914ec09ecbf40ed +bf41eebf42e9bf3deabf3eebbf3fe409 +e4bf3ae6bf3be8bf3ce1bf37e2bf38e3 +bf390019ee2df417f70cf7bf65f8bf66 +f9bf67fabf68f4bf62f5bf63f6bf64f1 +09f1bf5ff2bf60f3bf61eebf5cefbf5d +f0bf5ee717ea0ceabf58ebbf59ecbf5a +edbf5be7bf55e8bf56e9bf57e409e4bf +52e5bf53e6bf54e1bf4fe2bf50e3bf51 +002473c1dfe220ee0feec585efc59df2 +c5c4f6c70bf9c723e2c391e4c3bbe5c3 +d4e7c3efecaf8277c0d27736787479a2 +527aa2a7e1c37a09ed0fedc713efc714 +f2c715f7c716f8c717e2c70ee3c70fe5 +c710e7c711e9c7120bee14f209f2c721 +f5a958f8c722eec71eefc71ff1c720e7 +09e7c71be9c71cecc71de1c718e4c719 +e5c71a0017ee2af414f709f7c738f8c7 +39f9c73af4c735f5c736f6c737f109f1 +c732f2c733f3c734eec72fefc730f0c7 +31e814eb09ebc72cecc72dedc72ee8c7 +29e9c72aeac72be509e5c726e6c727e7 +c728e2c724e3b363e4c72509ed0fedc7 +40f2c741f5c742f9c743fac744e1c73b +e2c73ce4c73de9c73eebc73f734274a2 +5775a2887602e8c70cedc70defa70000 +14ee25f514f809f8c5e3f9c5e4fac5e5 +f5c5e0f6c5e1f7c5e2eec5dbefc5dcf1 +c5ddf3c5def4c5dfe60fe6c5d6e7c5d7 +e8c5d8ebc5d9edc5dae1c5d1e2c5d2e3 +c5d3e4c5d4e5c5d50eef1af50cf5c5f0 +f8c5f1f9c5f2fac5f3efc5edf0c5eef2 +c5eff3ad1ee90ce9c5e9eac5eaebc5eb +edc5ece4c5e6e5c5e7e7c5e80017ef2a +f514f809f8c708f9c709fac70af5c705 +f6c706f7c707f209f2c702f3c703f4c7 +04efc5fff0c700f1c701e814eb09ebc5 +fdedc5feeea5dce8c5fae9c5fbeac5fc +e509e5c5f7e6c5f8e7c5f9e1c5f4e3c5 +f5e4c5f66ac2596ec1256e966fa29370 +a2d971a2fc720dec17f00cf0c5cef5c3 +97f8c5cffac5d0ecc5cbedc5cceec5cd +e60ce6c5c8e7c5c9e9c5caebc565e1c5 +c5e2c5c6e5c5c70018ed2df417f70cf7 +c59af8c502f9c59bfac59cf4c597f5c5 +98f6c599f109f1c595f2c596f3c3a1ed +c592eec593f0c594e714ea09eac58feb +c590ecc591e7c58ce8c58de9c58ee409 +e4c589e5c58ae6c58be1c586e2c587e3 +c5880014ed25f314f609f6c5aef7c5af +f9c5b0f3c5abf4c5acf5c5adedab6cee +c5a8efaf63f0c5a9f1c5aae70fe7c5a3 +e8c5a4e9c5a5eac5a6ebc5a7e1c59ee3 +c59fe4c5a0e5c5a1e6c5a20aee14f509 +f5c5b8f8c5b9f9c5baeec5b5efc5b6f3 +c5b7e2c5b1e7c5b2e8c5b3e9c3d4ecc5 +b408ee0feec5bfefc5c0f1c5c1f4c5c2 +f9c5c3e7c5bbebc5bcecc5bdedc5be6a a2626ba29a6ca2ea6d0018ed2df317f6 -0cf6c582f7c583f8c584fac585f3c57f -f4c580f5c581f009f0c57cf1c57df2c5 -7eedc579eec57aefc57be714ea09eac5 -76ebc577ecc578e7c573e8c574e9c575 -e409e4c570e5c571e6c572e1c56de2c5 -6ee3c56f0010ee1df40ff4c541f5c542 -f8c543f9c544faad92eec53defc53ef2 -c53ff3c540e90ce9c539eac53aecc53b -edc53ce1c535e2c536e4c537e8c53800 -16ed2af414f709f7c559f8c55afac55b -f4c556f5c557f6c558f109f1c553f2c5 -54f3c555edc550eec551efc552e614e9 -09e9c54deac54eebc54fe6c54ae7c54b -e8c54ce1c545e2c546e3c547e4c548e5 -c5490011ef1df60ff6c568f7c569f8c5 -6af9c56bfac56cefc564f1c565f2c566 -f5c567e90fe9c560eac561ebc562edc5 -63eea5e3e1c55ce3c55de5c55ee7c55f +0cf6c581f7c582f8c583fac584f3c57e +f4c57ff5c580f009f0c57bf1c57cf2c5 +7dedc578eec579efc57ae714ea09eac5 +75ebc576ecc577e7c572e8c573e9c574 +e409e4c56fe5c570e6c571e1c56ce2c5 +6de3c56e0010ee1df40ff4c540f5c541 +f8c542f9c543faad92eec53cefc53df2 +c53ef3c53fe90ce9c538eac539ecc53a +edc53be1c534e2c535e4c536e8c53700 +16ed2af414f709f7c558f8c559fac55a +f4c555f5c556f6c557f109f1c552f2c5 +53f3c554edc54feec550efc551e614e9 +09e9c54ceac54debc54ee6c549e7c54a +e8c54be1c544e2c545e3c546e4c547e5 +c5480011ef1df60ff6c567f7c568f8c5 +69f9c56afac56befc563f1c564f2c565 +f5c566e90fe9c55feac560ebc561edc5 +62eea5e3e1c55be3c55ce5c55de7c55e 65c15f65a25d66a2a367a2b068a40569 -0016ee2af514f809f8c532f9c533fac5 -34f5c52ff6c530f7c531f209f2c52cf3 -c52df4c52eeec529efc52af1c52be714 -ea09eac526ecc527edc528e7c523e8c5 -24e9c525e1c51ee2c51fe4c520e5c521 -e6c5220014ed25f414f809f8c3e8f9c3 -e9fac3eaf4c3e5f5c3e6f7c3e7edc3e0 -eec3e1efc3e2f1c3e3f2c3e4e70fe7c3 -dbe8c3dce9c3ddeac3deebc3dfe1c3d6 -e2c3d7e3c3d8e4c3d9e5c3da04e1c3eb -e4c3ececc3edf2c3eef5c3ef0017ee2a -f514f809f8c505f9c506fac507f5c502 -f6c503f7c504f209f2c500f3c501f4bd -91eec3fdf0c3fef1c3ffe814eb09ebc3 -faecc3fbedc3fce8c3f7e9c3f8eac3f9 -e409e4c3f4e5c3f5e7c3f6e1c3f1e2c3 -f2e3c3f30015ef25f514f809f8c51bf9 -c51cfac51df5c518f6c519f7c51aefc5 -13f0c514f1c515f2c516f4c517e614eb -09ebc510edc511eec512e6c50de7c50e -e9c50fe1c508e2c509e3c50ae4c50be5 -c50c61a25f62a2aa63a2f0640017ee2a -f514f809f8c3d2f9c3d3fac3d4f5c3cf -f6c3d0f7c3d1f209f2c3ccf3c3cdf4c3 -ceeec3c9f0c3caf1c3cbe814eb09ebc3 -c6ecc3c7edc3c8e8c3c3e9c3c4eac3c5 -e409e4c3c0e6c3c1e7c3c2e1c3bde2c3 -bee3c3bf0015ee25f314f809f8c38ff9 -c390fac391f3c38cf4c38df7c38eeec3 -87efc388f0c389f1c38af2c38be614eb -09ebc384ecc385edc386e6c381e7c382 -eac383e1c37ce2c37de3c37ee4c37fe5 -c3800014ed25f214f609f6c3a5f7c3a6 -f9c3a7f2c3a2f4c3a3f5c3a4edc39dee -c39eefc39ff0c3a0f1c3a1e60fe6c398 -e8c399e9c39aeac39bebc39ce1c393e2 -c394e3c395e4c396e5c3970015ec25f1 -14f509f5c3b9f8c3bafac3bbf1b7fef2 -c3b7f4c3b8ecc3b3edc3b4eec3b5efc3 -b6f0b7cbe614e909e9c3b0eac3b1ebc3 -b2e6c3ade7c3aee8c3afe1c3a8e2c3a9 -e3c3aae4c3abe5c3ac66dbdb69d2d969 +0016ee2af514f809f8c531f9c532fac5 +33f5c52ef6c52ff7c530f209f2c52bf3 +c52cf4c52deec528efc529f1c52ae714 +ea09eac525ecc526edc527e7c522e8c5 +23e9c524e1c51de2c51ee4c51fe5c520 +e6c5210014ed25f414f809f8c3e7f9c3 +e8fac3e9f4c3e4f5c3e5f7c3e6edc3df +eec3e0efc3e1f1c3e2f2c3e3e70fe7c3 +dae8c3dbe9c3dceac3ddebc3dee1c3d5 +e2c3d6e3c3d7e4c3d8e5c3d904e1c3ea +e4c3ebecc3ecf2c3edf5c3ee0017ee2a +f514f809f8c504f9c505fac506f5c501 +f6c502f7c503f209f2c3fff3c500f4bd +90eec3fcf0c3fdf1c3fee814eb09ebc3 +f9ecc3faedc3fbe8c3f6e9c3f7eac3f8 +e409e4c3f3e5c3f4e7c3f5e1c3f0e2c3 +f1e3c3f20015ef25f514f809f8c51af9 +c51bfac51cf5c517f6c518f7c519efc5 +12f0c513f1c514f2c515f4c516e614eb +09ebc50fedc510eec511e6c50ce7c50d +e9c50ee1c507e2c508e3c509e4c50ae5 +c50b61a25f62a2aa63a2f0640017ee2a +f514f809f8c3d1f9c3d2fac3d3f5c3ce +f6c3cff7c3d0f209f2c3cbf3c3ccf4c3 +cdeec3c8f0c3c9f1c3cae814eb09ebc3 +c5ecc3c6edc3c7e8c3c2e9c3c3eac3c4 +e409e4c3bfe6c3c0e7c3c1e1c3bce2c3 +bde3c3be0015ee25f314f809f8c38ef9 +c38ffac390f3c38bf4c38cf7c38deec3 +86efc387f0c388f1c389f2c38ae614eb +09ebc383ecc384edc385e6c380e7c381 +eac382e1c37be2c37ce3c37de4c37ee5 +c37f0014ed25f214f609f6c3a4f7c3a5 +f9c3a6f2c3a1f4c3a2f5c3a3edc39cee +c39defc39ef0c39ff1c3a0e60fe6c397 +e8c398e9c399eac39aebc39be1c392e2 +c393e3c394e4c395e5c3960015ec25f1 +14f509f5c3b8f8c3b9fac3baf1b7fdf2 +c3b6f4c3b7ecc3b2edc3b3eec3b4efc3 +b5f0b7cae614e909e9c3afeac3b0ebc3 +b1e6c3ace7c3ade8c3aee1c3a7e2c3a8 +e3c3a9e4c3aae5c3ab66dbd169d2d969 aacd6ab04b6bb42f6c002272c12de11d -ee0feebdadefbdbcf4bdedf5bdf6f6bf -0ce1bbe1e2bbf6e7bd3ce9bd54765676 -4c777278a24479a2457a03e8bf1eecbf -1feebf20fabf2105ec09ecbf10f3bf0c -f5bf11e1bf0de9bf0eebbf0f08ec0fec -bf16edbf17efbf18f4bf19f7bf1ae1bf -12e5bf13e7bf14e8bf1510edbf1b01e1 -bf1ceebf1d72a25573a27d74a2927500 -15ef25f414f709f7bf0af9ab12fabf0b -f4bf07f5bf08f6bf09efbf02f0bf03f1 -bf04f2bf05f3bf06e914ec09ecbdffed -bf00eebf01e9bdfceabdfdebbdfee1bd -f7e3bdf8e4bdf9e5bdfae6bdfb0bed14 -f409f4bde3f6bde4fabde5edbde0eebd -e1efbde2e909e9bdddebbddeecbddfe1 -bddae3bddbe7bddc06e90ce9bde9edbd -eaf2bdebf3bdece1bde6e4bde7e5bde8 -07ee0ceebdf2efbdf3f3bdf4f5bdf5e3 -bdeee7bdefe8bdf0e9bdf169c1ed6dc0 +ee0feebdacefbdbbf4bdecf5bdf5f6bf +0be1bbe0e2bbf5e7bd3be9bd53765676 +4c777278a24479a2457a03e8bf1decbf +1eeebf1ffabf2005ec09ecbf0ff3bf0b +f5bf10e1bf0ce9bf0debbf0e08ec0fec +bf15edbf16efbf17f4bf18f7bf19e1bf +11e5bf12e7bf13e8bf1410edbf1a01e1 +bf1beebf1c72a25573a27d74a2927500 +15ef25f414f709f7bf09f9ab12fabf0a +f4bf06f5bf07f6bf08efbf01f0bf02f1 +bf03f2bf04f3bf05e914ec09ecbdfeed +bdffeebf00e9bdfbeabdfcebbdfde1bd +f6e3bdf7e4bdf8e5bdf9e6bdfa0bed14 +f409f4bde2f6bde3fabde4edbddfeebd +e0efbde1e909e9bddcebbdddecbddee1 +bdd9e3bddae7bddb06e90ce9bde8edbd +e9f2bdeaf3bdebe1bde5e4bde6e5bde7 +07ee0ceebdf1efbdf2f3bdf3f5bdf4e3 +bdede7bdeee8bdefe9bdf069c1ed6dc0 f76d3c6ea25e6fa28c70a2dc7110f2bd -d90016ec2af214f709f7bdaaf8bdabf9 -bdacf2bda7f5bda8f6bda9ef09efbda4 -f0bda5f1bda6ecbda1edbda2eebda3e6 -14e909e9bd9eeabd9febbda0e6bd9be7 -bd9ce8bd9de1bd96e2bd97e3bd98e4bd -99e5bd9a0dec17f30cf3bdb8f5bdb9f7 -bdbafabdbbecbdb5edbdb6eebdb7e70c -e7bdb1e8bdb2e9bdb3eabdb4e1bdaee2 -bdafe4bdb00016ee2af414f809f8bdd1 -f9bdd2fabdd3f4bdcef5bdcff7bdd0f1 -09f1bdcbf2bdccf3bdcdeebdc8efbdc9 -f0bdcae814eb09ebbdc5ecbdc6edbdc7 -e8bdc2e9bdc3eabdc4e1bdbde2bdbee3 -bdbfe5bdc0e7bdc104e1bdd4e5bdd5ee -bdd6efbdd7f8bdd869a2456aa29a6ba2 -af6c0011eb1def0fefbd91f0bd92f1bd -93f5bd94f8bd95ebbd8decbd8eedbd8f -eebd90e50fe5bd88e6bd89e7bd8ae9bd -8beabd8ce1bd84e2bd85e3bd86e4bd87 -0015ef25f514f809f8bd69f9bd6afabd -6bf5bd66f6bd67f7bd68efbd61f0bd62 -f1bd63f2bd64f3bd65e61eea09eabd5e -ebbd5fecbd60e62ce7bd5ce8bd5d012a -bd5a4c12696de2bd5be1bd55e2bd56e3 -bd57e4bd58e5bd5906ec0cecbd6ff0bd -70f7bd71f8bd72e1bd6ce5bd6de9bd6e -0010ec1df20ff2bd7ff3bd80f4bd81f5 -bd82f9bd83ecbd7bedbd7ceebd7defbd -7ee50ce5bd77e8bd78e9bd79eabd7ae1 -bd73e2bd74e3bd75e4bd7665bd656466 -a27d67a2816807ee0ceebd50f3bd51f4 -bd52f5bd53e1bd4ce8bd4de9bd4eedbd -4f0019ee2df417f70cf7bd36f8bd37f9 -bd38fabd39f4bd33f5bd34f6bd35f109 -f1bd30f2bd31f3bd32eebd2defbd2ef0 -bd2fe717ea0ceabd29ebbd2aecbd2bed -bd2ce7afe0e8bd27e9bd28e409e4bd24 -e5bd25e6bd26e1bd21e2bd22e3bd2301 -e1bd3aeebd3b0eed1af20cf2bd48f4bd -49f5bd4afabd4bedbd44eebd45efbd46 -f1bd47e80ce8bd40e9bd41ebbd42ecbd -43e1bd3de2bd3ee7bd3f619062a27e63 -a2bc640deb17ee0ceebd1defbd1ef0bd -1ff1bd20ebbd1aecbd1bedbd1ce70ce7 -bd16e8bd17e9bd18eabd19e1bd13e2bd -14e4bd150014ec25f214f709f7bbf3f8 -bbf4fabbf5f2bbf0f3bbf1f5bbf2ecbb -ebedbbeceebbedf0bbeef1bbefe70fe7 -bbe7e8bbe8e9bbe9eabbeaebbb32e1bb -e2e2bbe3e3bbe4e4bbe5e5bbe60012ef -20f60ff6bd04f7bd05f8bd06f9bd07fa -bd08efbbfff1bd00f2bd01f4bd02f5bd -03ea0feabbfbeba921ecbbfcedbbfdee -bbfee2bbf7e5bbf8e6bbf9e9bbfa09ec -0fecbd0eedbd0ff0bd10f1bd11f3bd12 -e3bd09e4bd0ae5bd0be6bd0ce8bd0d00 -2474a9e520ef0fefb5bbf3b567f4b5d6 -f5b593f7b5eae5b575e7b57ee9b58ceb -affaeeb5b2782d7834793e7a4ee1b556 -e4b56a01e3b5efecb5f002e1b5f1efb5 -f2f8b5f304e8b5f4e9b110edb5f5f2b5 -f6fab5f7744875a24876a2497703ebb5 -ebedb5ecefb5edf3b5ee0ff21af70cf7 -b5e3f8b5e4f9b5e5fab5e6f2b5dff3b5 -e0f4b5e1f6b5e2eb0cebb5dbecb5dced -b5ddefb5dee2b5d7e4b5d8e5b5d9e9b5 -da10edb5e701e2b5e8f6b5e96bc0fc6f +d80016ec2af214f709f7bda9f8bdaaf9 +bdabf2bda6f5bda7f6bda8ef09efbda3 +f0bda4f1bda5ecbda0edbda1eebda2e6 +14e909e9bd9deabd9eebbd9fe6bd9ae7 +bd9be8bd9ce1bd95e2bd96e3bd97e4bd +98e5bd990dec17f30cf3bdb7f5bdb8f7 +bdb9fabdbaecbdb4edbdb5eebdb6e70c +e7bdb0e8bdb1e9bdb2eabdb3e1bdade2 +bdaee4bdaf0016ee2af414f809f8bdd0 +f9bdd1fabdd2f4bdcdf5bdcef7bdcff1 +09f1bdcaf2bdcbf3bdcceebdc7efbdc8 +f0bdc9e814eb09ebbdc4ecbdc5edbdc6 +e8bdc1e9bdc2eabdc3e1bdbce2bdbde3 +bdbee5bdbfe7bdc004e1bdd3e5bdd4ee +bdd5efbdd6f8bdd769a2456aa29a6ba2 +af6c0011eb1def0fefbd90f0bd91f1bd +92f5bd93f8bd94ebbd8cecbd8dedbd8e +eebd8fe50fe5bd87e6bd88e7bd89e9bd +8aeabd8be1bd83e2bd84e3bd85e4bd86 +0015ef25f514f809f8bd68f9bd69fabd +6af5bd65f6bd66f7bd67efbd60f0bd61 +f1bd62f2bd63f3bd64e61eea09eabd5d +ebbd5eecbd5fe62ce7bd5be8bd5c012a +bd594c12696de2bd5ae1bd54e2bd55e3 +bd56e4bd57e5bd5806ec0cecbd6ef0bd +6ff7bd70f8bd71e1bd6be5bd6ce9bd6d +0010ec1df20ff2bd7ef3bd7ff4bd80f5 +bd81f9bd82ecbd7aedbd7beebd7cefbd +7de50ce5bd76e8bd77e9bd78eabd79e1 +bd72e2bd73e3bd74e4bd7565bd656466 +a27d67a2816807ee0ceebd4ff3bd50f4 +bd51f5bd52e1bd4be8bd4ce9bd4dedbd +4e0019ee2df417f70cf7bd35f8bd36f9 +bd37fabd38f4bd32f5bd33f6bd34f109 +f1bd2ff2bd30f3bd31eebd2cefbd2df0 +bd2ee717ea0ceabd28ebbd29ecbd2aed +bd2be7afe0e8bd26e9bd27e409e4bd23 +e5bd24e6bd25e1bd20e2bd21e3bd2201 +e1bd39eebd3a0eed1af20cf2bd47f4bd +48f5bd49fabd4aedbd43eebd44efbd45 +f1bd46e80ce8bd3fe9bd40ebbd41ecbd +42e1bd3ce2bd3de7bd3e619062a27e63 +a2bc640deb17ee0ceebd1cefbd1df0bd +1ef1bd1febbd19ecbd1aedbd1be70ce7 +bd15e8bd16e9bd17eabd18e1bd12e2bd +13e4bd140014ec25f214f709f7bbf2f8 +bbf3fabbf4f2bbeff3bbf0f5bbf1ecbb +eaedbbebeebbecf0bbedf1bbeee70fe7 +bbe6e8bbe7e9bbe8eabbe9ebbb31e1bb +e1e2bbe2e3bbe3e4bbe4e5bbe50012ef +20f60ff6bd03f7bd04f8bd05f9bd06fa +bd07efbbfef1bbfff2bd00f4bd01f5bd +02ea0feabbfaeba921ecbbfbedbbfcee +bbfde2bbf6e5bbf7e6bbf8e9bbf909ec +0fecbd0dedbd0ef0bd0ff1bd10f3bd11 +e3bd08e4bd09e5bd0ae6bd0be8bd0c00 +2474a9e520ef0fefb5baf3b566f4b5d5 +f5b592f7b5e9e5b574e7b57de9b58beb +affaeeb5b1782d7834793e7a4ee1b555 +e4b56901e3b5eeecb5ef02e1b5f0efb5 +f1f8b5f204e8b5f3e9b110edb5f4f2b5 +f5fab5f6744875a24876a2497703ebb5 +eaedb5ebefb5ecf3b5ed0ff21af70cf7 +b5e2f8b5e3f9b5e4fab5e5f2b5def3b5 +dff4b5e0f6b5e1eb0cebb5daecb5dbed +b5dcefb5dde2b5d6e4b5d7e5b5d8e9b5 +d910edb5e601e2b5e7f6b5e86bc0fc6f 626f7a708a7194729e730aeb14ef09ef -b5d3f4b5d4f5b5d5ebb5d0edb5d1eeb5 -d2e1b5cbe3b5cce4b5cde8b5cee9b5cf -02f2b5bcf5b5bdf7b5be01e9b5bfefb5 -c001f5b5c1f7b5c207ee0ceeb5c7f5b5 -c8f8b5c9f9b5cae5b5c3e8b5c4e9b5c5 -ebb5c66b646ca24d6da2756e07ee0cee -b5b7efb5b8f0b5b9f4b5bae2b5b3e7b5 -b4e8b5b5eab5b60cf017f60cf6b59cf7 -b59df8b59efab59ff0b599f2b59af4b5 -9beb09ebb596ecb597efb598e5b593e8 -b594e9b5950bed14f509f5b5a8f6b5a9 -f7b175edb5a5efb5a6f0b5a7e909e9b5 -a3ebb5a4ecb5a5e1b5a0e2b5a1e7b5a2 -07f20cf2b5aef3b5aff4b5b0f9b5b1e9 -b5aaecb5abeeb5acefb5ad6665665267 -8468a24d69a2576a04e3b58ee5b58fea -b590eeb591f3b59207eb0cebb57aedb5 -7bf5b57cf9b57de1b576e2b577e5b578 -e6b57908ed0fedb583eeb584efb585f3 -b586f7b587e2b57fe5b580e7b581ecb5 -8203e2b588e9b589f0b58af7b58b10ee -b58d616e627e63a25a6409e90fe9b570 -f2b571f3b572f4b573f5b574e1b56be2 -b56ce3b56de4b56ee5b56f02e9b557ee -b558f2b5590ce917ee0ceeb562f2b563 -f5b564f9b565e9b55fecb560edb561e5 -09e5b55ce7b55de8b55ee1a7f3e2b55a -e4b55b03e1b566e5b567e8b568f2b569 -00186eb07628e10ce1b5f8e9b72af6b7 -6cf7b76f763a77447902e1b771e5b772 -f9b77301e4b76deeb76e10e9b7707150 -71947298750fee1af40cf4b768f5b769 -f7b76af9b76beeb764efb765f0b766f2 -b767e90ce9b760ebb761ecb762edb763 -e1b75ce2b75de4b75ee8b75f10f2b757 -04e1b758e2a3b6f2b759f4b75af5b75b -6e346f607001e1b755f2b75606e90ce9 -b74ceab74decb74ef3b74fe1b749e4b7 -4ae7b74b04e2b750e4b751e7b752f2b7 -53f7b75468796b3c6b726c886d0aec14 -f309f3b746f7b747f8b748ecb743eeb7 -44f2b745e1b73ee2b73fe3b740e4b741 -e9b74203e1b739edb73aefb73bf5b73c -10e5b73d683469386a01e5b737f2b738 -10e9b7290bec14f509f5b734f6b735f9 -b736ecb731edb732f4b733e409e4b72e -e5b72fe7b730e1b72be2b72ce3b72d64 -3d644065506703e2b726e5b727ebb706 -efb72802e1b719e7b71af4b71b09ec0f -ecb721eeb722f2b723f4b724f5b725e2 -b71ce5b71de8b71ee9b71febb7206130 -62a24e6310f4b7180014ed25f314f809 -f8b70af9b70bfab70cf3b707f4b708f5 -b709edb702eeb703efb704f1b705f2b7 -06e60fe6b5fee8b5ffeab700ebb701ec -b526e1b5f9e2b5fae3b5fbe4b5fce5b5 -fd0aee14f409f4b715f5b716f7b717ee -b712efb713f2b714e5b70de9b70eeab7 -0febb710edb711002875c29feb74f23f -f628f6b9eef7bb83f9022a32414c4c12 -6174eebbb3022abbb1432a5410d2bbb3 -10cebbb2127261e2bbb2f2b9b0f3bb23 -f5022aac7d41ac835912657ae9b9a4eb -38ecb975edb990eeb9adefb9c6012a2e -41127261e2b959042ab9574132433649 -3a4d10ceb95b10c6b95810ceb95910d2 -b95a7a667a38e1b1c2e7b7fbe9b928ea -b93f0017ee2af514f809f8bbdef9bbdf -fabbe0f5bbdbf6bbdcf7bbddf209f2bb -d9f3bbdaf4af69eebbd6efbbd7f0bbd8 -e814eb09ebaf55ecbbd4edbbd5e8add5 -e9bbd3eaaf69e409e4bbd0e5bbd1e6bb -d2e1bbcde2bbcee3bbcf75a26576a2ba +b5d2f4b5d3f5b5d4ebb5cfedb5d0eeb5 +d1e1b5cae3b5cbe4b5cce8b5cde9b5ce +02f2b5bbf5b5bcf7b5bd01e9b5beefb5 +bf01f5b5c0f7b5c107ee0ceeb5c6f5b5 +c7f8b5c8f9b5c9e5b5c2e8b5c3e9b5c4 +ebb5c56b646ca24d6da2756e07ee0cee +b5b6efb5b7f0b5b8f4b5b9e2b5b2e7b5 +b3e8b5b4eab5b50cf017f60cf6b59bf7 +b59cf8b59dfab59ef0b598f2b599f4b5 +9aeb09ebb595ecb596efb597e5b592e8 +b593e9b5940bed14f509f5b5a7f6b5a8 +f7b175edb5a4efb5a5f0b5a6e909e9b5 +a2ebb5a3ecb5a4e1b59fe2b5a0e7b5a1 +07f20cf2b5adf3b5aef4b5aff9b5b0e9 +b5a9ecb5aaeeb5abefb5ac6665665267 +8468a24d69a2576a04e3b58de5b58eea +b58feeb590f3b59107eb0cebb579edb5 +7af5b57bf9b57ce1b575e2b576e5b577 +e6b57808ed0fedb582eeb583efb584f3 +b585f7b586e2b57ee5b57fe7b580ecb5 +8103e2b587e9b588f0b589f7b58a10ee +b58c616e627e63a25a6409e90fe9b56f +f2b570f3b571f4b572f5b573e1b56ae2 +b56be3b56ce4b56de5b56e02e9b556ee +b557f2b5580ce917ee0ceeb561f2b562 +f5b563f9b564e9b55eecb55fedb560e5 +09e5b55be7b55ce8b55de1a7f3e2b559 +e4b55a03e1b565e5b566e8b567f2b568 +00186eb07628e10ce1b5f7e9b729f6b7 +6bf7b76e763a77447902e1b770e5b771 +f9b77201e4b76ceeb76d10e9b76f7150 +71947298750fee1af40cf4b767f5b768 +f7b769f9b76aeeb763efb764f0b765f2 +b766e90ce9b75febb760ecb761edb762 +e1b75be2b75ce4b75de8b75e10f2b756 +04e1b757e2a3b6f2b758f4b759f5b75a +6e346f607001e1b754f2b75506e90ce9 +b74beab74cecb74df3b74ee1b748e4b7 +49e7b74a04e2b74fe4b750e7b751f2b7 +52f7b75368796b3c6b726c886d0aec14 +f309f3b745f7b746f8b747ecb742eeb7 +43f2b744e1b73de2b73ee3b73fe4b740 +e9b74103e1b738edb739efb73af5b73b +10e5b73c683469386a01e5b736f2b737 +10e9b7280bec14f509f5b733f6b734f9 +b735ecb730edb731f4b732e409e4b72d +e5b72ee7b72fe1b72ae2b72be3b72c64 +3d644065506703e2b725e5b726ebb705 +efb72702e1b718e7b719f4b71a09ec0f +ecb720eeb721f2b722f4b723f5b724e2 +b71be5b71ce8b71de9b71eebb71f6130 +62a24e6310f4b7170014ed25f314f809 +f8b709f9b70afab70bf3b706f4b707f5 +b708edb701eeb702efb703f1b704f2b7 +05e60fe6b5fde8b5feeab5ffebb700ec +b525e1b5f8e2b5f9e3b5fae4b5fbe5b5 +fc0aee14f409f4b714f5b715f7b716ee +b711efb712f2b713e5b70ce9b70deab7 +0eebb70fedb710002875c29feb74f23f +f628f6b9edf7bb82f9022a32414c4c12 +6174eebbb2022abbb0432a5410d2bbb2 +10cebbb1127261e2bbb1f2b9aff3bb22 +f5022aac7d41ac835912657ae9b9a3eb +38ecb974edb98feeb9acefb9c5012a2e +41127261e2b958042ab9564132433649 +3a4d10ceb95a10c6b95710ceb95810d2 +b9597a667a38e1b1c2e7b7fae9b927ea +b93e0017ee2af514f809f8bbddf9bbde +fabbdff5bbdaf6bbdbf7bbdcf209f2bb +d8f3bbd9f4af69eebbd5efbbd6f0bbd7 +e814eb09ebaf55ecbbd3edbbd4e8add5 +e9bbd2eaaf69e409e4bbcfe5bbd0e6bb +d1e1bbcce2bbcde3bbce75a26576a2ba 77a40f78a467790018ed2df417f70cf7 -bbc9f8bbcaf9bbcbfabbccf4bbc6f5bb -c7f6bbc8f109f1bbc3f2bbc4f3bbc5ed -bbc0eebbc1efbbc2e714ea09eabbbdeb -bbbeecbbbfe7bbbae8bbbbe9bbbce409 -e4bbb7e5bbb8e6bbb9e1bbb4e2bbb5e3 -bbb60017ee2af514f809f8bb69f9bb6a -fabb6bf5bb66f6bb67f7bb68f109f1bb -63f3bb64f4bb65eebb60efbb61f0bb62 -e814eb09ebbb5decbb5eedbb5fe8bb5a -e9bb5beabb5ce509e5bb57e6bb58e7bb -59e2bb54e3bb55e4bb560017ee2af414 -f809f8bb80f9bb81fabb82f4bb7df6bb -7ef7bb7ff109f1bb7bf2bb7cf3b1acee -bb78efbb79f0bb7ae714ea09eabb75ec -bb76edbb77e7bb72e8bb73e9bb74e409 -e4bb6fe5bb70e6bb71e1bb6ce2bb6de3 -bb6e0018ed2df317f60cf6b9cff7bb99 -f9bb9afabb9bf3bb96f4bb97f5bb98f0 -09f0bb93f1bb94f2bb95edbb90eebb91 -efbb92e714ea09eabb8debbb8eecbb8f -e7bb8ae8bb8be9bb8ce409e4bb87e5bb -88e6bb89e1bb84e2bb85e3bb860015ee -25f414f809f8bbaef9bbaffabbb0f4bb -abf6bbacf7bbadeebba6efbba7f0bba8 -f1bba9f2bbaae614eb09ebbba4ecbb1d -edbba5e6bba1e9bba2eabba3e1bb9ce2 -bb9de3bb9ee4bb9fe5bba06bc3b470c1 +bbc8f8bbc9f9bbcafabbcbf4bbc5f5bb +c6f6bbc7f109f1bbc2f2bbc3f3bbc4ed +bbbfeebbc0efbbc1e714ea09eabbbceb +bbbdecbbbee7bbb9e8bbbae9bbbbe409 +e4bbb6e5bbb7e6bbb8e1bbb3e2bbb4e3 +bbb50017ee2af514f809f8bb68f9bb69 +fabb6af5bb65f6bb66f7bb67f109f1bb +62f3bb63f4bb64eebb5fefbb60f0bb61 +e814eb09ebbb5cecbb5dedbb5ee8bb59 +e9bb5aeabb5be509e5bb56e6bb57e7bb +58e2bb53e3bb54e4bb550017ee2af414 +f809f8bb7ff9bb80fabb81f4bb7cf6bb +7df7bb7ef109f1bb7af2bb7bf3b1acee +bb77efbb78f0bb79e714ea09eabb74ec +bb75edbb76e7bb71e8bb72e9bb73e409 +e4bb6ee5bb6fe6bb70e1bb6be2bb6ce3 +bb6d0018ed2df317f60cf6b9cef7bb98 +f9bb99fabb9af3bb95f4bb96f5bb97f0 +09f0bb92f1bb93f2bb94edbb8feebb90 +efbb91e714ea09eabb8cebbb8decbb8e +e7bb89e8bb8ae9bb8be409e4bb86e5bb +87e6bb88e1bb83e2bb84e3bb850015ee +25f414f809f8bbadf9bbaefabbaff4bb +aaf6bbabf7bbaceebba5efbba6f0bba7 +f1bba8f2bba9e614eb09ebbba3ecbb1c +edbba4e6bba0e9bba1eabba2e1bb9be2 +bb9ce3bb9de4bb9ee5bb9f6bc3b470c1 cf70a26871a2c072a41b73a46b740019 -ee2df417f70cf7bb51f8bb52f9bb53fa -a591f4bb4ef5bb4ff6bb50f109f1bb4c -f2af69f3bb4deebb49efbb4af0bb4be7 -17ea0ceabb45ebbb46ecbb47edbb48e7 -bb42e8bb43e9bb44e409e4bb3fe5bb40 -e6bb41e1bb3ce2bb3de3bb3e0018ee2d -f417f70cf7b9eff8b9f0f9b9f1fab9f2 -f4b9ecf5b9edf6b9eef109f1b9e9f2b9 -eaf3b9ebeeb9e7efb9e8f0b73ae814eb -09ebb9e4ecb9e5edb9e6e8b9e1e9b9e2 -eab9e3e509e5b9dee6b9dfe7b9e0e1b9 -dbe3b9dce4b9dd0019ee2df417f70cf7 -bb09f8bb0af9bb0bfabb0cf4bb06f5bb -07f6bb08f109f1bb03f2bb04f3bb05ee -bb00efbb01f0bb02e717ea0ceab9fceb -b9fdecb9feedb9ffe7b9f9e8b9fae9b9 -fbe409e4b9f6e5b9f7e6b9f8e1b9f3e2 -b9f4e3b9f50016ed2af514f809f8bb20 -f9bb21fabb22f5bb1df6bb1ef7bb1ff2 -09f2bb1af3bb1bf4bb1ceda90beebb18 -f0bb19e614ea09eabb15ebbb16ecbb17 -e6bb12e8bb13e9bb14e1bb0de2bb0ee3 -bb0fe4bb10e5bb110017ee2af414f709 -f7bb39f8bb3afabb3bf4bb36f5bb37f6 -bb38f109f1bb33f2bb34f3bb35eebb30 -efbb31f0bb32e814eb09ebbb2decbb2e -edbb2fe8bb2ae9bb2beabb2ce509e5bb -27e6bb28e7bb29e2bb24e3bb25e4bb26 +ee2df417f70cf7bb50f8bb51f9bb52fa +a591f4bb4df5bb4ef6bb4ff109f1bb4b +f2af69f3bb4ceebb48efbb49f0bb4ae7 +17ea0ceabb44ebbb45ecbb46edbb47e7 +bb41e8bb42e9bb43e409e4bb3ee5bb3f +e6bb40e1bb3be2bb3ce3bb3d0018ee2d +f417f70cf7b9eef8b9eff9b9f0fab9f1 +f4b9ebf5b9ecf6b9edf109f1b9e8f2b9 +e9f3b9eaeeb9e6efb9e7f0b739e814eb +09ebb9e3ecb9e4edb9e5e8b9e0e9b9e1 +eab9e2e509e5b9dde6b9dee7b9dfe1b9 +dae3b9dbe4b9dc0019ee2df417f70cf7 +bb08f8bb09f9bb0afabb0bf4bb05f5bb +06f6bb07f109f1bb02f2bb03f3bb04ee +b9ffefbb00f0bb01e717ea0ceab9fbeb +b9fcecb9fdedb9fee7b9f8e8b9f9e9b9 +fae409e4b9f5e5b9f6e6b9f7e1b9f2e2 +b9f3e3b9f40016ed2af514f809f8bb1f +f9bb20fabb21f5bb1cf6bb1df7bb1ef2 +09f2bb19f3bb1af4bb1beda90beebb17 +f0bb18e614ea09eabb14ebbb15ecbb16 +e6bb11e8bb12e9bb13e1bb0ce2bb0de3 +bb0ee4bb0fe5bb100017ee2af414f709 +f7bb38f8bb39fabb3af4bb35f5bb36f6 +bb37f109f1bb32f2bb33f3bb34eebb2f +efbb30f0bb31e814eb09ebbb2cecbb2d +edbb2ee8bb29e9bb2aeabb2be509e5bb +26e6bb27e7bb28e2bb23e3bb24e4bb25 6ba2536ca2ab6da4066ea47b6f0014ec -25f414f709f7b9d8f9b9d9fab9daf4b9 -d5f5b9d6f6b9d7ecb9d0efb9d1f0b9d2 -f1b9d3f3b9d4e70fe7b9cce8b9cde9b9 -ceeab9cfebb33ae1b9c7e3b9c8e4b9c9 -e5b9cae6b9cb0018ed2df417f70cf7b9 -71f8b972f9b973fab974f4b96ef5b96f -f6b970f109f1b96bf2b96cf3b96dedb9 -68efb969f0b96ae714ea09eab965ebb9 -66ecb967e7b962e8b963e9b964e409e4 -b95fe5b960e6b961e1b95ce2b95de3b9 -5e0019ee2df417f70cf7b98cf8b98df9 -b98efab98ff4b989f5b98af6b98bf109 -f1b986f2b987f3b988eeb983efb984f0 -b985e717ea0ceab97febb980ecb981ed -b982e7b97ce8b97de9b97ee409e4b979 -e5b97ae6b97be1b976e2b977e3b97800 -19ee47f417f70cf7b9a9f8b9aaf9b9ab -fab9acf4b9a6f5b9a7f6b9a8f123f1b9 -a0f226f3b9a5022a3241405912657ae9 -b9a4012ab9a14c10c2b9a2127261e2b9 -a3eeb99defb99ef0b99fe717ea0ceab9 -9aebb99becb901edb99ce7b997e8b998 -e9b999e409e4b994e5b995e6b996e1b9 -91e2b992e3b9930018ee2df417f70cf7 -b9c2f8b9c3f9b9c4fab9c5f4b9bff5b9 -c0f6b9c1f109f1b9bcf2b9bdf3b9beee -b9b9efb9baf0b9bbe714eb09ebb9b6ec -b9b7edb9b8e7b7fbe9b9b4eab9b5e409 -e4b9b1e5b9b2e6b9b3e1b9aee2b9afe3 -b9b066c1a766a25d67a2b268a2f869a4 -4d6a0016ed2af314f809f8b954f9b955 -fab956f3b951f4b952f5b953f009f0b9 -4ef1b94ff2b950edb94beeb94cefb94d -e714ea09eab948ebb949ecb94ae7b945 -e8b946e9b947e1b940e2b941e3b942e4 -b943e5b9440017ee2af514f809f8b7f8 -f9b7f9fab7faf5b7f5f6b7f6f7b7f7f1 -09f1b7f2f2b7f3f3b7f4eeb7efefb7f0 -f0b7f1e714eb09ebb7ececb7ededb7ee -e7b7e9e8b7eae9b7ebe409e4b7e6e5b7 -e7e6b7e8e1b7e3e2b7e4e3b7e50014ef -25f414f709f7b90ef8b90ff9b910f4b9 -0bf5b90cf6b90defb906f0b907f1b908 -f2b909f3b90ae80fe8b901eab902ebb9 -03ecb904edb905e1b7fce2b7fde4b7fe -e5b7ffe6b9000017ef2af514f809f8b9 -25f9b926fab927f5b922f6b923f7b924 -f209f2b91ff3b920f4b921efb91cf0b9 -1df1b91ee714eb09ebc817ecb91aeeb9 -1be7b917e8b918eab919e409e4b914e5 -b915e6b916e1b911e2b912e3b9130015 -ef25f514f809f8b93cf9b93dfab93ef5 -b939f6b93af7b93befb934f0b935f1b9 -36f3b937f4b938e614ea09eab931ecb9 -32edb933e6b92ee7b92fe8b930e1b929 -e2b92ae3b92be4b92ce5b92d61a25d62 +25f414f709f7b9d7f9b9d8fab9d9f4b9 +d4f5b9d5f6b9d6ecb9cfefb9d0f0b9d1 +f1b9d2f3b9d3e70fe7b9cbe8b9cce9b9 +cdeab9ceebb33ae1b9c6e3b9c7e4b9c8 +e5b9c9e6b9ca0018ed2df417f70cf7b9 +70f8b971f9b972fab973f4b96df5b96e +f6b96ff109f1b96af2b96bf3b96cedb9 +67efb968f0b969e714ea09eab964ebb9 +65ecb966e7b961e8b962e9b963e409e4 +b95ee5b95fe6b960e1b95be2b95ce3b9 +5d0019ee2df417f70cf7b98bf8b98cf9 +b98dfab98ef4b988f5b989f6b98af109 +f1b985f2b986f3b987eeb982efb983f0 +b984e717ea0ceab97eebb97fecb980ed +b981e7b97be8b97ce9b97de409e4b978 +e5b979e6b97ae1b975e2b976e3b97700 +19ee47f417f70cf7b9a8f8b9a9f9b9aa +fab9abf4b9a5f5b9a6f6b9a7f123f1b9 +9ff226f3b9a4022a3241405912657ae9 +b9a3012ab9a04c10c2b9a1127261e2b9 +a2eeb99cefb99df0b99ee717ea0ceab9 +99ebb99aecb900edb99be7b996e8b997 +e9b998e409e4b993e5b994e6b995e1b9 +90e2b991e3b9920018ee2df417f70cf7 +b9c1f8b9c2f9b9c3fab9c4f4b9bef5b9 +bff6b9c0f109f1b9bbf2b9bcf3b9bdee +b9b8efb9b9f0b9bae714eb09ebb9b5ec +b9b6edb9b7e7b7fae9b9b3eab9b4e409 +e4b9b0e5b9b1e6b9b2e1b9ade2b9aee3 +b9af66c1a766a25d67a2b268a2f869a4 +4d6a0016ed2af314f809f8b953f9b954 +fab955f3b950f4b951f5b952f009f0b9 +4df1b94ef2b94fedb94aeeb94befb94c +e714ea09eab947ebb948ecb949e7b944 +e8b945e9b946e1b93fe2b940e3b941e4 +b942e5b9430017ee2af514f809f8b7f7 +f9b7f8fab7f9f5b7f4f6b7f5f7b7f6f1 +09f1b7f1f2b7f2f3b7f3eeb7eeefb7ef +f0b7f0e714eb09ebb7ebecb7ecedb7ed +e7b7e8e8b7e9e9b7eae409e4b7e5e5b7 +e6e6b7e7e1b7e2e2b7e3e3b7e40014ef +25f414f709f7b90df8b90ef9b90ff4b9 +0af5b90bf6b90cefb905f0b906f1b907 +f2b908f3b909e80fe8b900eab901ebb9 +02ecb903edb904e1b7fbe2b7fce4b7fd +e5b7fee6b7ff0017ef2af514f809f8b9 +24f9b925fab926f5b921f6b922f7b923 +f209f2b91ef3b91ff4b920efb91bf0b9 +1cf1b91de714eb09ebc80decb919eeb9 +1ae7b916e8b917eab918e409e4b913e5 +b914e6b915e1b910e2b911e3b9120015 +ef25f514f809f8b93bf9b93cfab93df5 +b938f6b939f7b93aefb933f0b934f1b9 +35f3b936f4b937e614ea09eab930ecb9 +31edb932e6b92de7b92ee8b92fe1b928 +e2b929e3b92ae4b92be5b92c61a25d62 a29563a2ed64a442650016ed2af514f8 -09f8b7e0f9b7e1fab7e2f5b7ddf6b7de -f7b7dff209f2b7daf3b7dbf4b7dcedb7 -d7eeb7d8efb7d9e614e909e9b7d4ebb7 -d5ecb7d6e6b7d1e7b7d2e8b7d3e1b7cc -e2b7cde3b7cee4b7cfe5b7d00010eb1d -f10ff1b780f6b781f7b782f8b783f9b7 -84ebb77cedb77defb77ef0b77fe70ce7 -b778e8b779e9b77aeab77be1b774e2b7 -75e3b776e4b7770018ee2df417f70cf7 -b79af8b79bf9b79cfab79df4b797f5b7 -98f6b799f109f1b794f2b795f3b796ee -b791efb792f0b793e814eb09ebb78eec -b78fedb790e8b78be9b78ceab78de409 -e4b788e5b789e7b78ae1b785e2b786e3 -b7870017ed2af414f709f7b7b3f9b7b4 -fab7b5f4b7b0f5b7b1f6b7b2f009f0b7 -adf1b7aef3b7afedb7aaeeb7abefb7ac -e714ea09eab7a7ebb7a8ecb7a9e7b7a4 -e8b7a5e9b7a6e409e4b7a1e5b7a2e6b7 -a3e1b79ee2b79fe3b7a00015ed25f414 -f809f8b7c9f9b7cafab7cbf4b7c6f6b7 -c7f7b7c8edb7c1eeb7c2f0b7c3f1b7c4 -f2b7c5e714ea09eab7beebb7bfecb7c0 -e7b7bbe8b7bce9b7bde1b7b6e3b7b7e4 -b7b8e5b7b9e6b7ba66a6b367aa206800 -1e72c0f8e51af40cf4b52ff5b535f9a5 -54fab555e5b3c9e9b3d5efb50bf2b51e -763f765877747984e122032ab3a9372e -43345310c4b3aa1133b6b3aa10cdb3ab -04e3b54be5b54cebb54deeb54ef6b54f -02e1b550e3b551efb55201e1b553f7b5 -5472a25073a27b74a282750014ed25f5 -14f809f8b548f9b549fab54af5b545f6 -b546f7b547edb540f0b541f2b542f3b5 -43f4b544e70fe7b53be8b53ce9b53deb -b53eecb53fe2b536e3b537e4b538e5b5 -39e6b53a0cf017f50cf5b528f7b529f8 -b52afab52bf0b525f2b526f4b527eb09 -ebb522edb523efb524e1b51fe3b520e5 -b52102e2b52ceeb52df3b52e04e9b530 -efb531f3b532f5b533f8b53469c1116d -ae6d366ea2436fa26b7010efb51d0010 -f11df50ff5b3fbf6b3fcf7b3fdf9b3fe -fab3fff1b3f7f2b3f8f3b3f9f4b3faea -0ceab3f4edb3f5eeb3caf0b3f6e1b3f0 -e2b3f1e4b3f2e6b3f309e919e9b505ea -32eeb508efb509f3b50a012ab5064812 -6d6ee7b507e1b500e4b501e5b502e7b5 -03e8b5040010ec1df20ff2b518f4b519 -f6b51af7b51bf9b51cecb514edb515ef -b516f0b517e50ce5b510e8b511e9b512 -eab513e1b50ce2b50de3b50ee4b50f69 -4e6aa24b6ba24c6c04e1b3ebe2b3ece4 -b3edf4b3eef5b3ef0feb1af20cf2b3e2 -f4b3e3f7b3e4f8b3e5ebb3deecb3dfed -b3e0efb3e1e70ce7b3dae8b3dbe9b3dc -eab3dde1b3d6e2b3d7e4b3d8e6b3d910 -e9b3e603e1b3e7e5b3e8e8b3e9ebb3ea -6434643e6548676e6802e9b3d2f2b3d3 -f9b3d401eeb3b2f9b3c805e809e8b3cd -e9b3ceedb3cfe1b3cae4b3cbe7b3cc01 -edb3d0f7b3d1613062a2536310e8b3c7 -0015ee25f314f809f8b3bff9b3c0fab3 -c1f3b3bcf6b3bdf7b3beeeb3b7efb3b8 -f0b3b9f1b3baf2b3bbe814eb09ebb3b4 -ecb3b5edb3b6e8b3b1e9b3b2eab3b3e1 -b3ace3b3ade4b3aee5b3afe7b3b004e1 -b3c2e2b3c3eeb3c4efb3c5f5b3c60017 +09f8b7dff9b7e0fab7e1f5b7dcf6b7dd +f7b7def209f2b7d9f3b7daf4b7dbedb7 +d6eeb7d7efb7d8e614e909e9b7d3ebb7 +d4ecb7d5e6b7d0e7b7d1e8b7d2e1b7cb +e2b7cce3b7cde4b7cee5b7cf0010eb1d +f10ff1b77ff6b780f7b781f8b782f9b7 +83ebb77bedb77cefb77df0b77ee70ce7 +b777e8b778e9b779eab77ae1b773e2b7 +74e3b775e4b7760018ee2df417f70cf7 +b799f8b79af9b79bfab79cf4b796f5b7 +97f6b798f109f1b793f2b794f3b795ee +b790efb791f0b792e814eb09ebb78dec +b78eedb78fe8b78ae9b78beab78ce409 +e4b787e5b788e7b789e1b784e2b785e3 +b7860017ed2af414f709f7b7b2f9b7b3 +fab7b4f4b7aff5b7b0f6b7b1f009f0b7 +acf1b7adf3b7aeedb7a9eeb7aaefb7ab +e714ea09eab7a6ebb7a7ecb7a8e7b7a3 +e8b7a4e9b7a5e409e4b7a0e5b7a1e6b7 +a2e1b79de2b79ee3b79f0015ed25f414 +f809f8b7c8f9b7c9fab7caf4b7c5f6b7 +c6f7b7c7edb7c0eeb7c1f0b7c2f1b7c3 +f2b7c4e714ea09eab7bdebb7beecb7bf +e7b7bae8b7bbe9b7bce1b7b5e3b7b6e4 +b7b7e5b7b8e6b7b966a6b367aa206800 +1e72c0f8e51af40cf4b52ef5b534f9a5 +54fab554e5b3c8e9b3d4efb50af2b51d +763f765877747984e122032ab3a8372e +43345310c4b3a91133b6b3a910cdb3aa +04e3b54ae5b54bebb54ceeb54df6b54e +02e1b54fe3b550efb55101e1b552f7b5 +5372a25073a27b74a282750014ed25f5 +14f809f8b547f9b548fab549f5b544f6 +b545f7b546edb53ff0b540f2b541f3b5 +42f4b543e70fe7b53ae8b53be9b53ceb +b53decb53ee2b535e3b536e4b537e5b5 +38e6b5390cf017f50cf5b527f7b528f8 +b529fab52af0b524f2b525f4b526eb09 +ebb521edb522efb523e1b51ee3b51fe5 +b52002e2b52beeb52cf3b52d04e9b52f +efb530f3b531f5b532f8b53369c1116d +ae6d366ea2436fa26b7010efb51c0010 +f11df50ff5b3faf6b3fbf7b3fcf9b3fd +fab3fef1b3f6f2b3f7f3b3f8f4b3f9ea +0ceab3f3edb3f4eeb3c9f0b3f5e1b3ef +e2b3f0e4b3f1e6b3f209e919e9b504ea +32eeb507efb508f3b509012ab5054812 +6d6ee7b506e1b3ffe4b500e5b501e7b5 +02e8b5030010ec1df20ff2b517f4b518 +f6b519f7b51af9b51becb513edb514ef +b515f0b516e50ce5b50fe8b510e9b511 +eab512e1b50be2b50ce3b50de4b50e69 +4e6aa24b6ba24c6c04e1b3eae2b3ebe4 +b3ecf4b3edf5b3ee0feb1af20cf2b3e1 +f4b3e2f7b3e3f8b3e4ebb3ddecb3deed +b3dfefb3e0e70ce7b3d9e8b3dae9b3db +eab3dce1b3d5e2b3d6e4b3d7e6b3d810 +e9b3e503e1b3e6e5b3e7e8b3e8ebb3e9 +6434643e6548676e6802e9b3d1f2b3d2 +f9b3d301eeb3b1f9b3c705e809e8b3cc +e9b3cdedb3cee1b3c9e4b3cae7b3cb01 +edb3cff7b3d0613062a2536310e8b3c6 +0015ee25f314f809f8b3bef9b3bffab3 +c0f3b3bbf6b3bcf7b3bdeeb3b6efb3b7 +f0b3b8f1b3b9f2b3bae814eb09ebb3b3 +ecb3b4edb3b5e8b3b0e9b3b1eab3b2e1 +b3abe3b3ace4b3ade5b3aee7b3af04e1 +b3c1e2b3c2eeb3c3efb3c4f5b3c50017 7199e614ef09efb143f2b14cf9b168e6 a254e9b12beab1347612762a772ee1b1 1210f2b16501e1b166e5b16771a24272 @@ -9083,726 +9083,726 @@ a3b9f5b121f8b122f9b123fab124ecb1 1cedb11deeb11ef0b11ff2b120e70fe7 b117e8b118e9b119eab11aebb11be1b1 13e2b114e4b115e6b11610eca799001f -71c1947953ec0cecb1ffeeb319f5b365 -f6b37b79307a8ee1b169e4b1a30dec17 -ef0cefb3a2f2b3a3f9b3a4fab3a5ecb3 -9fedb3a0eeb3a1e50ce5b39be6b39ce7 -b39de9b39ee1b183e2b399e4b39a02e1 -b3a6e9b3a7eeb3a875c0c5753676a25b -77a2867810f8b3980016ed2af414f709 -f7b378f8b379fab37af4b376f5b377f6 -af88f009f0b373f1b374f2b375edb370 -eeb371efb372e614e909e9b36debb36e -ecb36fe6b36be7b319e8b36ce1b366e2 -b367e3b368e4b369e5b36a0ced17f00c -f0b385f2b1d3f3b386f9b387edb382ee -b383efb384e609e6b37feab380ecb381 -e1b37ce3b37de5b37e0fea1af40cf4b3 -94f5b395f7b396f8b397eab390edb391 -eeb392f2b393e50ce5b38ce6b38de7b3 -8ee9b38fe1b388e2b389e3b38ae4b38b -7140725073a2607402e1b363e9b364f5 +71c18a7953ec0cecb1ffeeb319f5b364 +f6b37a79307a8ee1b169e4b1a30dec17 +ef0cefb3a1f2b3a2f9b3a3fab3a4ecb3 +9eedb39feeb3a0e50ce5b39ae6b39be7 +b39ce9b39de1b183e2b398e4b39902e1 +b3a5e9b3a6eeb3a775c0c5753676a25b +77a2867810f8b3970016ed2af414f709 +f7b377f8b378fab379f4b375f5b376f6 +af88f009f0b372f1b373f2b374edb36f +eeb370efb371e614e909e9b36cebb36d +ecb36ee6b36ae7b319e8b36be1b365e2 +b366e3b367e4b368e5b3690ced17f00c +f0b384f2b1d3f3b385f9b386edb381ee +b382efb383e609e6b37eeab37fecb380 +e1b37be3b37ce5b37d0fea1af40cf4b3 +93f5b394f7b395f8b396eab38fedb390 +eeb391f2b392e50ce5b38be6b38ce7b3 +8de9b38ee1b387e2b388e3b389e4b38a +7140725073a2567402e1b362e9b363f5 b1d402e1b349eeb34af2b34b0012ed20 -f60ff6b359f7b35af8b35bf9b35cfab3 -5dedb354f1b355f3b356f4b357f5b358 -e50fe5afc3e7b350e8b351e9b352eab3 -53e1b34ce2b191e326e4b34f012ab34d -4c12696ee2b34e04ecb35eeeb35fefb3 -60f0b361f7b36269c17f6dc0e26d406e -9e6fa2807002e1b346e5b347eeb3480d -ee17f60cf6b315f8b316f9b317fab318 -eeb312f2b313f5b314e70ce7b30ee8b3 -0fecb310edb311e1b30be2b30ce4b30d -0013ec20f20ff2b329f4b32af5b32bf7 -b32cfab32decb324edb325eeb326efb3 -27f1b328e70fe7b31fe8b320e9b321ea -b322ebb323e1b31ae2b31be3b31ce4b3 -1de5b31e0018ed2df317f60cf6b342f7 -b343f8b344f9b345f3b33ff4b340f5b3 -41f009f0b33cf1b33df2b33eedb33aee -b327efb33be714ea09eab337ebb338ec -b339e7b334e8b335e9b336e409e4b331 -e5b332e6b333e1b32ee2b32fe3b33069 -846aa26d6ba27a6c0beb14f209f2b308 -f5b309f7b30aebb305ecb306efb307e8 -09e8b303e9af55eab304e2b300e3b301 -e4b3020011ee1df30ff3b1eef4b1eff8 -b1f0f9b1f1fab1f2eeb1eaf0b1ebf1b1 -ecf2b1ede50fe5b1e5e7b1e6e8b1e7ec -b1e8edb1e9e1b1e1e2b1e2e3b1e3e4b1 -e404ebb1f3edb1f4eeb1f5f2b1f6f5b1 -f706ee0ceeb1fbefb1fcf0b1fdf5b1fe -e1b1f8e4b1f9e5b1fa65a0656a66a266 -67a26a6808ee0feeb1dcefb1ddf2b1de -f3b1dff4b1e0e1b1d8e3b1d9e5b1daeb -b1db0013ec20f60ff6b1c5f7b1c6f8b1 -c7f9b1c8fab1c9ecb1c1efb1c2f1b1c3 -f2adbbf3b1c4e70fe7b1bce8b1bde9b1 -beeab1bfebb1c0e1b1b7e2b1b8e3b1b9 -e4b1bae6b1bb01ebb1caf8b1cb0cec17 -f20cf2b1d4f4b1d5f5b1d6f7b1d7ecb1 -d2eeb1d3efaff7e509e5b1cfe7b1d0eb -b1d1e1b1cce2b1cde4b1ce61a24862a2 -a363a2fb640012eb20f10ff1b1b2f2b1 -b3f4b1b4f5b1b5f8b1b6ebb1adecb1ae -edb1afeeb1b0efb1b1e60fe6b1a8e7b1 -a9e8b1aae9b1abeab1ace2b1a4e3b1a5 -e4b1a6e5b1a70019ee2df417f70cf7b1 -7ff8b180f9b181fab182f4b17df5b17e -f6adcaf109f1b17af2b17bf3b17ceeb1 -77efb178f0b179e717ea0ceab173ebb1 -74ecb175edb176e7b170e8b171e9b172 -e409e4b16de5b16ee6b16fe1b16ae2b1 -6be3b16c0018ed2df317f70cf7b198f8 -b199f9b19afab19bf3b195f5b196f6b1 -97f009f0b192f1b193f2b194edb18fee -b190efb191e714ea09eab18cebb18dec -b18ee7b189e8b18ae9b18be409e4b186 -e5b187e6b188e1b183e2b184e3b18506 -ec0cecb19feeb1a0f2b1a1f4b1a2e3b1 -9ce4b19de6b19e63cb0963a4e464aeac -65001d73927a29ef0cefafe9f3aff5f4 -afbcf5a5f87a44e5afaaecafc3ee012a -afd853126861f7afd901e1b110e5b111 -762076387748784c7901e1b10eefb10f -02e5b109e8b10aeeb10b10efb10c10f4 -b10d732e74667510e4b10808eb0febaf -faedaffbf3affcf5affdf9affee5aff6 -e7aff7e8aff8e9aff908f30ff3b103f4 -b104f5b105f8b106fab107e2afffeeb1 -00efb101f2b1026ac0f16e636e6a6fa2 -5670a2577208eb0febaff0f2aff1f3af -f2f4aff3f7aff4e1afece7afede8afee -e9afef0eed1af20cf2afe5f6afe6f7af -e7f8afe8edafe1eeafe2efafe3f1afe4 -e40ce4afdde6afdee8afdfecafe0e1af -dae2afdbe3afdc10f4afea10e9afeb6a -a24a6ba24b6ca26e6d0dee17f50cf5af -d4f7afd5f8afd6faafd7eeafd1f0afd2 -f3afd3e71ee7afcce9afcdeb26edafd0 -012a2e4e126b6fefafcf012aafce4710 -ceafcfe1afc9e2afcae5afcb10e1afb7 -0aec14f009f0afc0f2afc1f9afc2ecaf -bdedafbeefafbfe1afb8e5afb9e7afba -e9afbbebafbc05ef09efafc7f0a3f2f5 -afc8e5afc4ebafc5edafc6662f663e67 -4e686a6902f0afb4f4afb5f6afb602e1 -afabe5aface9afad04e1afaeecafafed -afb0efafb1f9afb210f5afb361346238 -6301f2afa8f9afa910e1afa205ef09ef -afa5f2afa6f5afa7e3afa3e7afa4eba7 -d5002272c161e127f219f2ad2cf3ad43 -f52cf6ad73f9ad7c012aad6247126c61 -e7ad63e1ab49e5ab88e8ab98efad0b76 -43764e7758787e79827a04e5ad43e8ad -80ebad81eead82f4ad8301e7ad74eead -7505e509e5ad78e7ad79f4ad7ae1ad76 -e2ad77e4ad2c10e8ad7b02e1ad7de2ad -7eefad7f729673a28674a2b4750eec1a -f50cf5ad6ff6ad70f8ad71f9ad72ecad -6befad6cf0ad6df4ad6ee80ce8ad67e9 -ad68eaad69ebad6ae1ad64e2ad65e3ad -660015ed25f414f809f8ad40f9ad41fa -ad42f4ad3df6ad3ef7ad3fedad38eead -39efad3af1ad3bf3ad3ce714ea09eaad -35ebad36ecad37e7ad32e8ad33e9ad34 -e1ad2de2ad2ee3ad2fe4ad30e6ad310d -f017f60cf6ad4ef7ad4ff9ad50faad51 -f0ad4bf3ad4cf4ad4dea0ceaad47ebad -48edad49efad4ae1ad44e2ad45e8ad46 -0fee1af40cf4ad5ef5ad5ff9ad60faad -61eead5aefad5bf0ad5cf3ad5de70ce7 -ad56e8ad57ecad58edad59e1ad52e3ad -53e4ad54e5ad5569c1986dc0d06d3a6e -826fa25f70a2a07110e4ad2b0aec14f2 -09f2abd6f3abfbf4abfcecabf9eea4b3 -efabfae1abf4e5abf5e7abf6e9abf7eb -abf80dec17f30cf3ad07f4ad08f7ad09 -f8ad0aecad04f0ad05f1ad06e70ce7ad -00e8ad01e9ad02ebad03e1abfde2abfe -e3abff0013ec20f40ff4ad1bf5ad1cf8 -ad1df9ad1efaad1fecad16edad17efad -18f0ad19f1ad1ae60fe6ad11e7ad12e8 -ad13eaad14ebad15e1ad0ce2ad0de3ad -0ee4ad0fe5ad100aee14f509f5ad28f8 -ad29f9ad2aeead25efad26f3ad27e1ad -20e2ad21e3ad22e7ad23e9ad2469966a -a25e6ba2896c0eeb1af40cf4abf0f5ab -f1f7abf2f9abf3ebabececabededabee -efabefe50ce5abe8e8abe9e9abeaeaab -ebe1abe5e3abe6e4abe70aed14f209f2 -abc6f7abc7f9abc8edabc3eeabc4f0ab -c5e1abbee2abbfe3abc0e5abc1e8abc2 -0cee17f20cf2abd2f3abd3f6abd4f9ab -d5eeabcfefabd0f0abd1e909e9abcceb -abcdedabcee1abc9e5abcae8abcb0ef2 -1af60cf6abe1f8abe2f9abe3faabe4f2 -abddf3abdef4abdff5abe0ed0cedabd9 -eeabdaefabdbf1abdce1abd6e2abd7ec -abd865c0e465a2af66a2c467a2ce6800 -13ee20f40ff4abb9f7abbaf8abbbf9ab -bcfaabbdeeabb4efabb5f0abb6f1abb7 -f2abb8e973e938eaabb0ebabb1ecabb2 -edabb3022a3c42a2594811616e01e2ab -aff4abaa0b4d2d5417542e55385610c4 -abad01c8aba9d7abaa01cbababd3abac -4dcca0502a5310d2aba802c6aba5c8ab -a6daaba7470e473048cc844910c4aba3 -10c6aba12aab9e412a4210ceaba010d5 -ab9f126f70efabaee2ab99e4ab9ae6ab -9be7ab9ce8ab9d06eb0cebab8ceeab8d -f4ab8ef9ab8fe1ab89e2ab8ae7ab8b03 -e1ab90e4ab91e7ab92edab9303e1ab94 -e3ab95e7ab96ebab97616a62a27563a2 -b06408ea0feaab83edab84efab85f2ab -86faab87e5ab7fe6ab80e8ab81e9ab82 -0016ed2af314f809f8ab5ef9ab5ffaab -60f3ab5bf6ab5cf7ab5df009f0ab58f1 -ab59f2ab5aedab55eeab56efab57e614 -ea09eaab52ebab53ecab54e6ab4fe7ab -50e8ab51e1ab4ae2ab4be3ab4ce4ab4d -e5ab4e0011ef1df40ff4ab6ef5ab6ff6 -ab70f7ab71f9ab72efab6af1ab6bf2ab -6cf3ab6de90fe9ab65eaab66ebab67ec -ab68eeab69e2ab61e3ab62e4ab63e7ab -640bec14f009f0ab7cf1ab7df2ab7eec -ab79edab7aefab7be709e7ab76e8ab77 -eaab78e3ab73e4ab74e5ab75001a6fc1 -b2776ce10ce1ad84e5adbbf6af89faa3 -4f775079887a05e709e7af9fecafa0ee -afa1e1af9de4af9ee5af0908f30ff3af -8ef5af78f7af8ff9af90faaf91e1af8b -ebaf8cecada9f2af8d0aed14f209f2af -9af5af9bf9af9cedaf97eeaf98efaf99 -e1af92e2af93e4af94e7af95e9af9673 -b37334746075a24e7610e1af8a06eb0c -ebaf5deeaf5eefaf5ff1af60e2af5ae8 -af5be9af5c0def17f30cf3af6bf4af6c -f5af6df9af6eefaf68f0af69f2af6ae8 -0ce8af64e9af65ebaf66edaf67e1af61 -e2af62e4af630019ee2df417f70cf7af -85f8af86f9af87faaf88f4af82f5af83 -f6af84f109f1af7ff2af80f3af81eeaf -7cefaf7df0af7ee717ea0ceaaf78ebaf -79ecaf7aedaf7be7af75e8af76e9af77 -e409e4af72e5af73e6af74e1af6fe2af -70e3af716fa24770a285720def17f30c -f3af56f4af57f5af58f9af59efaf53f1 -af54f2af55e81ee832e9af51eca7beee -af52012a2e4d126f6ee7af50012aaf4f -4310ceaf50e3af4ce5af4de7af4e0012 -ee20f40ff4af46f6af47f7af48f8af49 -f9af4aeeaf41efaf42f0af43f2af44f3 -af45e60fe6af3de8af3ee9add7ebaf3f -ecaf40e1af39e2af3ae3af3be5af3c10 -f0af4b68c15d6b9d6b966ca2506da257 -6e0eee1af50cf5af35f6af36f7af37f9 -af38eeaf31efaf32f2af33f4af34e70c -e7af2ee9af2feaad89ebaf30e1af2be4 -af2ce5af2d06ec0ceca540f2af13f3af -14f8af15e1af10e7af11ebaf1202e7af -16edaf17eeaf180011ed1df50ff5af26 -f6af27f7af28f8af29f9af2aedaf22ef -af23f2af24f3af25e50fe5af1de6af1e -e7af1febaf20ecaf21e1af19e2af1ae3 -af1be4af1c689669a2666a0feb1aef0c -efaf0cf2af0df5af0ef7af0febaf08ec -af09edaf0aeeaf0be50ce5af04e6af05 -e9af06eaaf07e1af00e2af01e3af02e4 -af030cef17f50cf5ade7f6ade8f7ade9 -f8adeaefade4f2ade5f3ade6ec09ecad -e1edade2eeade3e4addee7addfe9ade0 -0016ee2af414f809f8adfdf9adfefaad -fff4adeff5adfbf7adfcf109f1adf8f2 -adf9f3adfaeeadf4efadf6f0adf7e714 -ea09eaadf3ebadf4ecadf5e7adf0e8ad -f1e9adf2e1adebe2adece3adede4adee -e6adef64a264a24265a265670011ec1d -f30ff3add9f4addaf7addbf8addcfaad -ddecadd5eeadd6efadd7f2add8e50fe5 -add0e7add1e8add2e9add3ebadd4e1ad -cce2adcde3adcee4adcf0aea14f209f2 -adb8f3adb9f7adbaeaadb5eeadb6efad -b7e1adb0e4adb1e5adb2e7adb3e9adb4 -0fec1af20cf2adc8f3adc9f6adcafaad -cbecadc4edadc5eeadc6f1adc7e70ce7 -adc0e8adc1e9adc2ebadc3e3adbce4ad -bde5adbee6adbf613662a2566301e3ad -aef2adaf0015ed25f314f709f7ad98f8 -ad99faad9af3ad95f5ad96f6ad97edad -90efad91f0ad92f1ad93f2ad94e714ea -09eaad8debad8eecad8fe7ad8ae8ad8b -e9ad8ce1ad85e3ad86e4ad87e5ad88e6 -ad890012ed20f40ff4ada9f5adaaf6ad -abf7adacf9adadedada4eeada5efada6 -f0ada7f1ada8e60fe6ad9fe7ada0e9ad -a1eaada2ecada3e1ad9be2ad9ce4ad9d -e5ad9e2ab40061ccf262002373c2d0e5 -1ded0feda905eea91eefa936f2a979f3 -a993e5a74be7a778e8a78ee9a7a777c1 -4b773878a26179a2a77aa2e8e1a5ea00 -17ed2af414f809f8ab07f9ab08faab09 -f4ab04f5ab05f7ab06f109f1ab01f2ab -02f3ab03eda9feefa9fff0ab00e714ea -09eaa9fbeba9fceca9fde7a9f8e8a9f9 -e9a9fae409e4a9f5e5a9f6e6a9f7e1a9 -f2e2a9f3e3a9f40014ed25f214f609f6 -ab1bf7ab1cfaab1df2a9c2f3ab19f5ab -1aedab14eeab15efab16f0ab17f1ab18 -e80fe8ab0fe9ab10eaab11ebab12ecab -13e1ab0ae2ab0be3ab0ce6ab0de7ab0e -0013ec20f30ff3ab2df6ab2ef7ab2ff8 -ab30faab31ecab28edab29eeab2af0ab -2bf2ab2ce60fe6ab23e8ab24e9ab25ea -ab26ebab27e1ab1ee2ab1fe3ab20e4ab -21e5ab220017ee2af514f809f8ab46f9 -ab47faab48f5ab43f6ab44f7ab45f109 -f1ab40f2ab41f4ab42eeab3defab3ef0 -ab3fe814eb09ebab3aecab3bedab3ce8 -ab37e9ab38eaab39e409e4ab34e5ab35 -e6ab36e1ab32e2ab33e3a7ca73a25a74 -a2aa75a2ff760016ed2af514f809f8a9 -eff9a9f0faa9f1f5a9ecf6a9edf7a9ee -f109f1a9e9f2a9eaf4a9ebeda9e6eea9 -e7efa9e8e614e909e9a9e3eaa9e4eba9 -e5e6a9e0e7a9e1e8a9e2e1a9dbe2a9dc -e3a9dde4a9dee5a9df0016ee2af414f7 -09f7a9a8f8a9a9f9a9aaf4a9a5f5a9a6 -f6a9a7f109f1a9a2f2a9a3f3a9a4eea9 -9fefa9a0f0a9a1e814eb09eba99ceca9 -9deda99ee8a999e9a99aeaa99be1a994 -e2a995e3a996e5a997e6a9980017ef2a -f514f809f8a9bff9a9c0faa9c1f5a9bc -f6a9bdf7a9bef209f2a9b9f3a9baf4a9 -bbefa9b6f0a9b7f1a9b8e714ea09eaa9 -b3eda9b4eea9b5e7a9b0e8a9b1e9a9b2 -e409e4a9ade5a9aee6a9afe1a9abe2a7 -4de3a9ac0018ee2df417f70cf7a9d7f8 -a9d8f9a9d9faa9daf4a9d4f5a9d5f6a9 -d6f109f1a9d1f2a9d2f3a9d3eea9ceef -a9cff0a9d0e714ea09eaa9cbeba9cced -a9cde7a9c8e8a9c9e9a9cae409e4a9c5 -e5a9c6e6a9c7e1a9c2e2a9c3e3a9c46a -c3186ec1a56ea2656fa2b570a2fb71a4 -4b720018ee2df417f70cf7a98ff8a990 -f9a991faa992f4a98cf5a98df6a98ef1 -09f1a989f2a98af3a98beea986efa987 -f0a988e814eb09eba983eca984eda985 -e8a980e9a981eaa982e409e4a97de6a9 -7ee7a97fe1a97ae2a97be3a97c0016ee -2af514f809f8a933f9a934faa935f5a9 -30f6a931f7a932f109f1a92df2a92ef3 -a92feea92aefa92bf0a92ce614ea09ea -a927eba928eda929e6a924e7a925e9a9 -26e1a91fe2a920e3a921e4a922e5a923 -0014ef25f514f809f8a949f9a94afaa9 -4bf5a946f6a947f7a948efa941f0a942 -f1a943f2a944f4a945ea0feaa93ceba9 -3deca93eeda93feea940e1a937e2a938 -e5a939e6a93ae8a93b0016ef2af514f8 -09f8a960f9a961faa962f5a95df6a95e -f7a95ff209f2a95af3a95bf4a95cefa9 -57f0a958f1a959e814eb09eba954eca9 -55eda956e8a951e9a952eaa953e1a94c -e3a94de4a94ee5a94fe7a9500015ef25 -f414f709f7a976f8a977faa978f4a973 -f5a974f6a975efa96ef0a96ff1a970f2 -a971f3a972e714eb09eba96beca96ced -a96de7a968e9a969eaa96ae1a963e2a9 -64e3a965e4a966e6a9676aa25f6ba2b7 -6ca40f6d0017ed2af314f709f7a91bf8 -a91cfaa91df3a918f5a919f6a91af009 -f0a915f1a916f2a917eda912eea913ef -a914e714ea09eaa90feba910eca911e7 -a90ce8a90de9a90ee409e4a909e5a90a -e6a90be1a906e2a907e3a9080018ee2d -f417f70cf7a7d0f8a7d1f9a7d2faa7d3 -f4a7cdf5a7cef6a7cff109f1a7caf2a7 -cbf3a7cceea7c7efa7c8f0a7c9e814eb -09eba7c4eca7c5eda7c6e8a7c1e9a7c2 -eaa7c3e409e4a7bee6a7bfe7a7c0e1a7 -bbe2a7bce3a7bd0018ee2df417f70cf7 -a7e9f8a7eaf9a7ebfaa7ecf4a7e6f5a7 -e7f6a7e8f109f1a7e3f2a7e4f3a7e5ee -a7e0efa7e1f0a7e2e814eb09eba7ddec -a7deeda7dfe8a7dae9a7dbeaa7dce409 -e4a7d7e6a7d8e7a7d9e1a7d4e2a7d5e3 -a7d60017ee2af414f809f8a902f9a903 -faa904f4a7fff6a900f7a901f109f1a7 -fcf2a7fdf3a7feeea7f9efa7faf0a7fb -e714ea09eaa7f6eba7f7eda7f8e7a7f3 -e8a7f4e9a7f5e409e4a7f0e5a7f1e6a7 -f2e1a7ede2a7eee3a7ef65c19b65a253 -66a29e67a2e968a434690014ee25f414 -f709f7a7b8f9a7b9faa7baf4a7b5f5a7 -b6f6a7b7eea7b1efa7b2f0a7b3f1a7b4 -f2a7aae60fe6a7ade7a7aeeba723eca7 -afeda7b0e1a7a8e2a7a9e3a7aae4a7ab -e5a7ac0015ef25f514f809f8a75ff9a7 -60faa761f5a75cf6a75df7a75eefa757 -f0a758f1a759f3a75af4a75be614ea09 -eaa754eba755eda756e6a751e8a752e9 -a753e1a74ce2a74de3a74ee4a74fe5a7 -500015ee25f414f809f8a775f9a776fa -a777f4a772f5a773f7a774eea76defa7 -6ef0a76ff1a770f3a771e614ea09eaa7 -6aeca76beda76ce6a767e7a768e8a769 -e1a762e2a763e3a764e4a765e5a76600 -15f025f514f809f8a78bf9a78cfaa78d -f5a788f6a789f7a78af0a783f1a784f2 -a785f3a786f4a787e714ed09eda71eee -a781efa782e7a77ee9a77feaa780e1a7 -79e2a77ae3a77be4a77ce6a77d0018ed -2df317f60cf6a7a3f7a7a4f9a7a5faa7 -a6f3a7a0f4a7a1f5a7a2f009f0a79df1 -a79ef2a79feda79beea79cefa78ee714 -ea09eaa798eba799eca79ae7a795e8a7 -96e9a797e409e4a792e5a793e6a794e1 -a78fe2a790e3a79161a26562a2b563a4 -0a640019ee2df417f70cf7a747f8a748 -f9a749faa74af4a744f5a745f6a746f1 -09f1a741f2a742f3a743eea73eefa73f -f0a740e717ea0ceaa73aeba73beca73c -eda73de7a737e8a738e9a739e409e4a7 -34e5a735e6a736e1a731e2a732e3a733 -0014ef2ff514f809f8a5fef9a5fffaa7 -00f5a5fbf6a5fcf7a5fdefa5f5f032f1 -a5f8f2a5f9f3a5fa012aa5f64b127261 -e9a5f7e70fe7a5f0e8a5f1eaa5f2eca5 -f3eea5f4e1a5ebe2a5ece3a5ede5a5ee -e6a5ef0017ee2af414f709f7a716f8a7 -17f9a718f4a713f5a714f6a715f109f1 -a710f2a711f3a712eea70defa70ef0a7 -0fe714eb09eba70aeca70beda70ce7a7 -07e9a708eaa709e409e4a704e5a705e6 -a706e1a701e2a702e3a7030018ed2df3 -17f60cf6a72df7a72ef9a72ffaa730f3 -a72af4a72bf5a72cf009f0a727f1a728 -f2a729eda724eea725efa726e714ea09 -eaa721eba722eca723e7a71ee8a71fe9 -a720e409e4a71be5a71ce6a71de1a719 -e2a71ae3a5f300184dc2af54c0f25737 -5736584e59665a12616ee2d5b501612c -631168efc5951172e1d5b401702c7311 -75f8a3c21165efc92701652c691169e9 -b58c117ae9b9a4544455a2ae5601612c -691174e8d5b31169e9d5b208685e683c -698c6ea2466fa248751174e7d5b11061 -01e158e9042ad12743324b364c3a5410 -c8d12710cebd1010c8d5ad10c1d5ae01 -2aaf894d10d6af8901622a7210e8d5af -10f4012aa9364210d4a34f1173e1c5e0 -01642a7410efd36010f2d5b061346580 -668667116ce7d5ac056d116d2e6e3276 -10f4a7ff10eccf9b10e7d35b67346b38 -6c01e5cfe1f5b91210e2d5a910f2d5aa -116cf5cff3116ee7d5ab126761f2d393 -50c0c850a27652a2ad5306694769426f -6a759079016c2a7210e3abe710efd5a8 -01643e6e01e4cd16e8012acd6c4c10cb -cd6c10e4d5a502672e72387910efabf6 -01e4cde9efd5a610e1cf11106e01e4d5 -a7f5cf62613e675e6801612a7210e4d5 -a410f7afd9026d2e72327510f2cbe210 -f2cdc410e2d5a3116ef7a56504613865 -4c68526c78721174e9d5a1016c2a7510 -e3ad5410eda54c1172edd59f02612e6c -326e10f8c94010e7d5a001e9c7e9f0c7 -ea1172e4b3f2026a306f3675116ef2c5 -a9116ee7d5a21168e7cb6c4d9a4ea2b3 -4f05722272307344751167f2c7d5016b -2a7910e1c7a910e8c7c601672a6d10e1 -d59e10e5c7b967306c366e1161efd59d -1161edcd441163ebcbdc07722e725a74 -60756679116df2032aa9d2492e4d3254 -10c8d59610ceb92110cda9d2116fefc1 -bf1165e9d594116cf4d595614265746c -9a6f01642a6e10e7af5010e9d5930368 -326b366e3a7210e3d58f10ead58c10e1 -d58d01e4c366e9d58e0264346e387201 -e3d591efd59210e6af1e10e4d5901179 -edc1260461386258655e6b64731168f5 -d59c02672e6e327210e2d59910edd597 -10e4d5981161f4a54b1177e1d59a116f -ef012aafcf4d10ccd59b47c4674ac373 -4aa6f74ba8104c03614665a6d369a6d5 -7901632a6410e9d58b10e9d58a026ea6 -b06fa6b17410ee001d4ac15d539f571a -57aced58acf159305a01cda756d7cdce -02c4d565c5d565d4d529534854a24855 -a26b5603c1d524c5d526ced525d5a7a7 -0fce1ad40cd4d519d5bb17d6d51ad9d5 -86ced516cfcde3d2d517d3d585ca0cca -d514cbcd8fccbb14cdd515c3d513c4d5 -64c5cf63c9cda80ccd17d20cd2d1e3d6 -d33ed7d1f7dacf6acdd159ced588cfd1 -b0c8c614c8d587cbd161ccd51f04c1d5 -89c7d521d3afd8d9d522dad5234d8f4d -484ea24f50a2645203c5d512cfc16ad5 -bb17d7cbc30011cf1dd50fd5bf9cd6d5 -82d8d501d9bf35dad502cfd580d1d3ff -d2d581d4c1e1c60fc6d3fec7bfb1cbd5 -7fcca905cdb776c1d57ec3d3fcc4d3fd -c5cd0006c90cc9d506ccaf82cfc392d0 -d583c1d503c3d504c5d5050bcc14d409 -d4d510d7c7f1d9b319ccc967cdd50dd2 -d50ec7c5d0c7d1ccc8b12fcbd5844a56 -4b5a4c06d30cd3d3f8d4bdedd5d3f9d6 -bf0cc2d57cc9d3f7cbd57d10cfd57902 -c5d3f1cdd57adad57b42c0f6465b4662 -477248a2444907d10cd1d577d2d578d3 -b567d4b5d6c3d3eec4b56accd575ced5 -7602c9b12bcfb143d2b14c0ace0cd2c6 -3bd2d573d4d3ebd7d3ecc1d3e6c5d572 -c6d3e7c8a3b9ccb97504cbd574ced3ed -d2b51ed4b52fd5b535425e43a24d44a2 -814506c70cc7d570d2d571d3aff5d4d5 -63c1d3e2c3d3e3c5afbc0dcc17d10cd1 -d3d2d2c9dcd4d56bd5b776ccd3cfced3 -d0cfd3d1c60cc6d3ccc7d56ac9cb95ca -d3cec1a993c4d569c5d3cb0fce1ad60c -d6d3ddd7c7edd9d56edaad43ced56dcf -d3dad2d3dbd5d3dcc80cc8d3d6c9d3d7 -ccd3d8cdd3d9c3d56cc4d3d3c6d3d4c7 -d3d504c5adbbcad3dfcbad84cfd3e0da -d56f343d34aea5377c3882410bd214d7 -09d7d3c9d8d3cadaa5ded2d3c6d3d3c7 -d4d3c8cc09cca3cfcdd568cfd3c5c4d3 -c2c5d566c6d5671133b6d5641138b6d5 -652aafd8312c321133b0d5631137b2bb -1710e1c5a110ef012abdbc4c10c1bdbc -1170e3bd2f026d2e6e327310f5bd6510 -e2bd5b01e1bbe3e2b34e01613a701161 -ee012ab5f84a10d0b5f8016d2a7610e1 -d55f10efd55e066e256e346f3a725474 -1168e9d5621164e1b9ad1172e5012ab9 -c64b01d0d3f3d2b9c61161e9a5f76130 -6850691174f3d561026c2e6e327710e9 -b78210e9afc210e1d56002612e6d326f -10eacd1510f2c9c010f2012ab9904b10 -c8b990473448a26a49127461ecb10405 -6f456f4a726475026a2e6b327210f5c7 -de10f2b36510e8d554016e2a7410e8b3 -4001e7d552edaff70161506510eb032a -afc3432e47325410d2a78b10d9d3de10 -d2afc310eed553613065366c1161e7ad -631172e1d551116ff2012ab1c24710c5 -b1c2056c186c306d3675116ee7d55d11 -75f7b3ef106e01e7b507f0b506613265 -a247691172e1d55c016e2a7410f2a54a -05ef2defd557f35ef4042aabaa433248 -3c4d405410d7abaa01c1d558ced55910 -cbaba210cfaba4012aab9e4310ceab9e -e2abafe7d555e9d5561162f2032ab3c9 -493453385501c1b72ad3d55b10ccb3c9 -10c5d55a43c135437444a2ee45026744 -6c4a741168e9012aa3e54501d2d3e5d4 -a3e51179f0afb201622a7910edd55010 -e1d54f0461a28e68a29d6fa2ac70a2ae -791172ec0e4b48541d5432553c584659 -10d5cbfe01cad110d2d54701c1d39dda -d54810cbd5494b324d3c52525310cbd5 -4601c7bbb1dad3f503c4d543c5d544cb -bf24ceaf4f02cfd545d3cbfed5cbb442 -1f4232434247464910d2d54202c1d540 -c7a778d9a74b10d3cbfe01c551d2d541 -2acbb438364102c6d53dccd53edad53f -1139b0cbfe026b2e6e327210e9d53a10 -edab7c10f3b59302612e65327210f3d5 -3b10edabce10f2abb81170f4ad19016d -2a7210f4b34d10eed53c03653469866f -8c751170ecd54e1176e106491749324d -364e3a5010cba9bd10ceb3d510d5d54b -10d0c3d52ab3d5422a4610cab3d910d4 -d54a1161ebd54c1167f2d54d2aa25441 -a8a642056f1f6f3e72447501672a6810 -e4d53910e9d5381170efabae106101e8 -c95ee9d5376130655c68116bf3d53603 -6c326d36733a7410ebd53510e9d53410 -f5a5fe10f3a9a2116ee7012aa91e4210 -c4a91e00204ac1c152c0d6563b564257 -5e5868596c5a02cda756d2d3d3d7cdce -04c1d524c4d525c5d526ced525d5a7a7 -01c6d527d3cdb910cbd52803c4d3c1c5 -d3c1d4d529d5cbfe5246536c54a25e55 -03c1d39dc7d521d9d522dad52305d309 -d3cbfed5cbb4d7cbc3c5d512c8cdcecf -c16a0010cd1dd30fd3d518d4d519d5cb -b4d6d51ad9d51bcdd515ced516cfcde3 -d2d517c90cc9cda8cad514cbcd8fccbb -14c1d507c3d513c4d3c0c5cf630ecd1a -d20cd2d1e3d6d33ed7abaadacf6acdd1 -59ced520cfd1b0d0d51fc80cc8d127ca -d110cbd161ccd51fc4d51cc6d51dc7d5 -1e4e5b4e344fa80850665110c1d51108 -c90fc9d506ccaf82cfc392d0c3d5d4d5 -07c1d503c3d504c5d505c8a7a70dcd17 -d40cd4d510d7c7f1d9b319dad509cdd5 -0dd2d50ed3d50fc70cc7d1ccc8b12fcb -d50cccc967c1d509c5d50ac6d50b4aa2 -484ba24c4ca2644d0012ce20d50fd5bf -9cd6af89d8d501d9bf35dad502ceaf4f -cfaba4d1d3ffd2d500d4c1e1c60fc6d3 -fec7bfb1cbbf24cca905cda9d2c1d3fb -c3d3fcc4d3fdc5cd0001cfd3f0d0b5f8 -07d00cd0d3f3d2b9c6d7d3f4dad3f5c5 -d3f1c7bbb1c8b990cdd3f208d30fd3d3 -f8d4bdedd5d3f9d6bf0cd9d3fac1bdbc -c2d3f6c9d3f7cbcd6c42c11b466b4662 -477848a24f4907d10cd1d3efd2b112d3 -b567d4b5d6c3d3eec4b56accb3c9ceb3 -d503c9b12bcfb143d2b14cd8b14c0ace -14d209d2afc3d4d3ebd7d3ecced3e8d0 -d3e9d1d3eac1d3e6c5b1c2c6d3e7c8a3 -b9ccb97505d409d4b52fd5b535d6d3cc -cbaba2ced3edd2b51e426443a25644a2 -8e4507c80cc8d3e4d2d3e5d3aff5d4a3 -e5c1d3e2c3d3e3c5afbcc7a5480fcc1a -d20cd2c9dcd4a34fd5a9d2d9a74bccd3 -cfced3d0cfd3d1d1d3d2c70cc7a778c8 -d3cdc9cb95cad3cec1a993c4a91ec5d3 -cbc6d3cc0010ce1dd50fd5d3dcd6d3dd -d7c7edd9d3dedaad43ceab9ecfd3dad2 -d3dbd3cbfec80cc8d3d6c9d3d7ccd3d8 -cdd3d9c3bf36c4d3d3c6d3d4c7d3d506 -cb0ccbad84cfd3e0d9d3cedad3e1c4ad -bbc5adbbcad3df354b3586378c389241 -0ccf17d40cd4d3c8d7d3c9d8d3cadaa5 -decfd3c5d2d3c6d3d3c7cc09cca3cfcd -a554cec7edc4d3c2c5d3c3c6d3c41133 -b2c7ed1133b6d3c001382a3910b0cbfe -10b6d3c12aafd831303236341131b9d3 -bf1137b2cbb402302e33323810b0adbb -10b0ad4310b0a3e5046438673e684472 -4a761173f4a358116cedb1271168e2d5 -2a116feda39601613e6d01e9a549ee01 -2aa5544110cda55410e200134c665135 -513c5340545655725901c5d3c1d4cf6b -10c1d51103c1d507c4d3c0d3d518d9d5 -1b04c7a52ac8bf98cad532ced520d2d5 -3310cbd52d4c3c4d464e624f665001cb -d50cd3d50f01c2d3f6d9d3fa04c1d3fb -cdd52cceb95bd2d500d5d53010c7d531 -10cdd508452f4542474c49504a664b02 -c8abc9cdd3f2d7d3f401c7a548c8d3e4 -10c2d52d03c4d52eced52fd1d3efd2b1 -1210cfd3f02aa5484132423c434c4410 -dad3e101c5d3c3c6d3c402c8d3cdced5 -2bd5d52c01c3bf36ced390002574c1f5 -e534f223f2a548f3a560f6a5a3f9a5ca -fa012a2e41127261e2a5e0022aa5de49 -a2b55210d5a5e1e5a358e6a366eba3b9 -eda3e5eea3fc78a67832795e7aa260e1 -25e25106eb0ceba5c6eca5c7eda5c8f8 -a5c9e2a5c3e5a5c4e7a5c50013ee20f3 -0ff3a5d9f4a5daf5a5dbf8a5dcfaa5dd -eea5d5efa5d6f0a5d7f1a5d8f2a5cae7 -0fe7a5d0e8a5d1e9a5d2eba5d3eca5d4 -e1a5cbe2a5cce3a5cde4a5cee5a5cf08 -ed0feda5e5eea5e6efa5e7f4a5e8faa5 -e9e2a5e2e4a5e3e7a5e4ea012a2e4112 -7261e2a5e0032aa5de312e49345310d5 -a5e11137b2a5e101d1a5dfd2a5e074a2 -4875a29d76a2e3770012ee20f50ff5a5 -bef6a5bff7a5c0f8a5c1f9a5c2eea5b9 -efa5baf2a5bbf3a5bcf4a5bde70fe7a5 -b4e8a5b5e9a5b6eba5b7eda5b8e1a5b0 -e2a5b1e3a5b2e5a5b30017ef2af514f8 -09f8a58bf9a58cfaa58df5a588f6a589 -f7a58af209f2a585f3a586f4a587efa5 -82f0a583f1a584e914ec09eca57feda5 -80eea581e9a57ceaa57deba57ee409e4 -a579e5a57ae7a57be1a576e2a577e3a5 -780014ed25f214f709f7a5a0f9a5a1fa -a5a2f2a59df4a59ef5a59feda598eea5 -99efa59af0a59bf1a59ce80fe8a593e9 -a594eaa595eba596eca597e1a58ee3a5 -8fe4a590e5a591e7a5920bee14f409f4 -a5adf5a5aef6a5afeea5aaefa5abf3a5 -aceb09eba5a7eca5a8eda5a9e2a5a4e4 -a5a5e9a5a66ac2e86fc16d6fa25370a2 -8e71a2e372a2fe730014ec25f414f809 -f8a573f9a574faa575f4a570f5a571f6 -a572eca56beea56cefa56df2a56ef3a5 -6fe70fe7a566e8a567e9a568eaa569eb -a56ae1a561e2a562e3a563e4a564e5a5 -650011eb1df20ff2a524f3a525f4a526 -f8a527faa528eba520eca521eda522ee -a523e50fe5a51be6a51ce7a51de9a51e -eaa51fe1a517e2a518e3a519e4a51a00 -17ee2af514f809f8a53cf9a53dfaa53e -f5a539f6a53af7a53bf209f2a536f3a5 -37f4a538eea533efa534f0a535e814eb -09eba530eca531eda532e8a52de9a52e -eaa52fe509e5a52be6a382e7a52ce2a5 -29e3a3b5e4a52a08ed0feda543eea544 -f2a545f4a546faa547e3a53fe4a540e7 -a541eba5420014ee25f314f809f8a55d -f9a55efaa55ff3a55af5a55bf7a55cee -a555efa556f0a557f1a558f2a559e90f -e9a550eaa551eba552eca553eda554e2 -a548e332e4a54de5a54ee8a54f032aa5 -4948324e3a5012616ceda54c126174f2 -a54a126261f4a54b6aa2686ba2836ca2 -c46da4196e0019ee2df417f70cf7a513 -f8a514f9a515faa516f4a510f5a511f6 -a512f109f1a50df2a50ef3a50feea50a -efa50bf0a50ce717ea0ceaa506eba507 -eca508eda509e7a503e8a504e9a505e4 -09e4a500e5a501e6a502e1a3fde2a3fe -e3a3ff08f00ff0a3b5f4a35af5a3b6f7 -a3b7faa3b8e1a3b1e7a3b2e9a3b3eea3 -b40013ef20f40ff4a3c9f5a3caf6a3cb -f7a3ccfaa3cdefa3c4f0a3c5f1a3c6f2 -a3c7f3a3c8e70fe7a3bfe8a3c0e9a3c1 -eba3c2eca3c3e2a3bae3a3bbe4a3bce5 -a3bde6a3be0017ee2af414f809f8a3e2 -f9a3e3faa3e4f4a3dff5a3e0f7a3e1f1 -09f1a3ddf2a3def3a3cfeea3daefa3db -f0a3dce814eb09eba3d7eca3d8eda3d9 -e8a3d4e9a3d5eaa3d6e409e4a3d1e5a3 -d2e6a3d3e1a3cee2a3cfe3a3d00016ef -2af514f809f8a3f9f9a3fafaa3fbf5a3 -f6f6a3f7f7a3f8f209f2a3f3f3a3f4f4 -a3f5efa3f0f0a3f1f1a3f2e714eb09eb -a3ededa3eeeea3efe7a3ebe9a3aceaa3 -ece1a3e6e2a3e7e3a3e8e5a3e9e6a3ea -65c14365a25866a28367a2ab68a40669 -0015ed25f214f709f7a3aef8a3aff9a3 -b0f2a3abf3a3acf4a3adeda3a6eea3a7 -efa3a8f0a3a9f1a3aae614ea09eaa3a3 -eba3a4eca3a5e6a3a0e7a3a1e9a3a2e1 -a39be2a39ce3a39de4a39ee5a39f0ced -17f50cf5a362f7a363f9a364faa365ed -a35ff1a360f2a361e509e5a35ceba35d -eca35ee1a359e2a35ae3a35b0bee14f3 -09f3a370f5a371faa372eea36defa36e -f0a36fe809e8a36ae9a36beba36ce2a3 -67e4a368e5a3690019ee2df417f70cf7 -a389f8a38af9a38bfaa38cf4a386f5a3 -87f6a388f109f1a383f2a384f3a385ee -a380efa381f0a382e717ea0ceaa37ceb -a37deca37eeda37fe7a379e8a37ae9a3 -7be409e4a376e5a377e6a378e1a373e2 -a374e3a3750ded17f00cf0a397f2a398 -f3a399f4a39aeda394eea395efa396e8 -0ce8a390e9a391eba392eca393e1a38d -e2a38ee7a38f61a25062a28563a2be64 -0014ee25f414f809f8a355f9a356faa3 -57f4a352f5a353f7a354eea34defa34e -f0a34ff1a350f2a351e70fe7a348e8a3 -49e9a34aeaa34beca34ce1a343e2a344 -e4a345e5a346e6a3470015ed1af30ef7 -06f74bf84dfa4ff33df447f549ed3dee -3fef41f043f145e60ee906e937eb39ec -3be631e733e835e127e229e32be42de5 -2f0016ee1ef50ef806f87bf97dfa7ff5 -75f677f779f206f26ff371f473ee69ef -6bf06de60ee906e963ec65ed67e65de7 -5fe861e153e255e357e459e55b0012f1 -18f60cf69df79ff8a1f9a341faa342f1 -93f295f397f499f59be60ae689e88bed -8dee8ff091e181e283e485e587 +f60ff6b358f7b359f8b35af9b35bfab3 +5cedb353f1b354f3b355f4b356f5b357 +e50fe5afc3e7b34fe8b350e9b351eab3 +52e1b34ce2b191e3b34de4b34e04ecb3 +5deeb35eefb35ff0b360f7b36169c17f +6dc0e26d406e9e6fa2807002e1b346e5 +b347eeb3480dee17f60cf6b315f8b316 +f9b317fab318eeb312f2b313f5b314e7 +0ce7b30ee8b30fecb310edb311e1b30b +e2b30ce4b30d0013ec20f20ff2b329f4 +b32af5b32bf7b32cfab32decb324edb3 +25eeb326efb327f1b328e70fe7b31fe8 +b320e9b321eab322ebb323e1b31ae2b3 +1be3b31ce4b31de5b31e0018ed2df317 +f60cf6b342f7b343f8b344f9b345f3b3 +3ff4b340f5b341f009f0b33cf1b33df2 +b33eedb33aeeb327efb33be714ea09ea +b337ebb338ecb339e7b334e8b335e9b3 +36e409e4b331e5b332e6b333e1b32ee2 +b32fe3b33069846aa26d6ba27a6c0beb +14f209f2b308f5b309f7b30aebb305ec +b306efb307e809e8b303e9af55eab304 +e2b300e3b301e4b3020011ee1df30ff3 +b1eef4b1eff8b1f0f9b1f1fab1f2eeb1 +eaf0b1ebf1b1ecf2b1ede50fe5b1e5e7 +b1e6e8b1e7ecb1e8edb1e9e1b1e1e2b1 +e2e3b1e3e4b1e404ebb1f3edb1f4eeb1 +f5f2b1f6f5b1f706ee0ceeb1fbefb1fc +f0b1fdf5b1fee1b1f8e4b1f9e5b1fa65 +a0656a66a26667a26a6808ee0feeb1dc +efb1ddf2b1def3b1dff4b1e0e1b1d8e3 +b1d9e5b1daebb1db0013ec20f60ff6b1 +c5f7b1c6f8b1c7f9b1c8fab1c9ecb1c1 +efb1c2f1b1c3f2adbbf3b1c4e70fe7b1 +bce8b1bde9b1beeab1bfebb1c0e1b1b7 +e2b1b8e3b1b9e4b1bae6b1bb01ebb1ca +f8b1cb0cec17f20cf2b1d4f4b1d5f5b1 +d6f7b1d7ecb1d2eeb1d3efaff7e509e5 +b1cfe7b1d0ebb1d1e1b1cce2b1cde4b1 +ce61a24862a2a363a2fb640012eb20f1 +0ff1b1b2f2b1b3f4b1b4f5b1b5f8b1b6 +ebb1adecb1aeedb1afeeb1b0efb1b1e6 +0fe6b1a8e7b1a9e8b1aae9b1abeab1ac +e2b1a4e3b1a5e4b1a6e5b1a70019ee2d +f417f70cf7b17ff8b180f9b181fab182 +f4b17df5b17ef6adcaf109f1b17af2b1 +7bf3b17ceeb177efb178f0b179e717ea +0ceab173ebb174ecb175edb176e7b170 +e8b171e9b172e409e4b16de5b16ee6b1 +6fe1b16ae2b16be3b16c0018ed2df317 +f70cf7b198f8b199f9b19afab19bf3b1 +95f5b196f6b197f009f0b192f1b193f2 +b194edb18feeb190efb191e714ea09ea +b18cebb18decb18ee7b189e8b18ae9b1 +8be409e4b186e5b187e6b188e1b183e2 +b184e3b18506ec0cecb19feeb1a0f2b1 +a1f4b1a2e3b19ce4b19de6b19e63cb09 +63a4e464aeac65001d73927a29ef0cef +afe9f3aff5f4afbcf5a5f87a44e5afaa +ecafc3ee012aafd853126861f7afd901 +e1b110e5b111762076387748784c7901 +e1b10eefb10f02e5b109e8b10aeeb10b +10efb10c10f4b10d732e74667510e4b1 +0808eb0febaffaedaffbf3affcf5affd +f9affee5aff6e7aff7e8aff8e9aff908 +f30ff3b103f4b104f5b105f8b106fab1 +07e2afffeeb100efb101f2b1026ac0f1 +6e636e6a6fa25670a2577208eb0febaf +f0f2aff1f3aff2f4aff3f7aff4e1afec +e7afede8afeee9afef0eed1af20cf2af +e5f6afe6f7afe7f8afe8edafe1eeafe2 +efafe3f1afe4e40ce4afdde6afdee8af +dfecafe0e1afdae2afdbe3afdc10f4af +ea10e9afeb6aa24a6ba24b6ca26e6d0d +ee17f50cf5afd4f7afd5f8afd6faafd7 +eeafd1f0afd2f3afd3e71ee7afcce9af +cdeb26edafd0012a2e4e126b6fefafcf +012aafce4710ceafcfe1afc9e2afcae5 +afcb10e1afb70aec14f009f0afc0f2af +c1f9afc2ecafbdedafbeefafbfe1afb8 +e5afb9e7afbae9afbbebafbc05ef09ef +afc7f0a3f2f5afc8e5afc4ebafc5edaf +c6662f663e674e686a6902f0afb4f4af +b5f6afb602e1afabe5aface9afad04e1 +afaeecafafedafb0efafb1f9afb210f5 +afb3613462386301f2afa8f9afa910e1 +afa205ef09efafa5f2afa6f5afa7e3af +a3e7afa4eba7d5002272c161e127f219 +f2ad2cf3ad43f52cf6ad73f9ad7c012a +ad6247126c61e7ad63e1ab49e5ab88e8 +ab98efad0b7643764e7758787e79827a +04e5ad43e8ad80ebad81eead82f4ad83 +01e7ad74eead7505e509e5ad78e7ad79 +f4ad7ae1ad76e2ad77e4ad2c10e8ad7b +02e1ad7de2ad7eefad7f729673a28674 +a2b4750eec1af50cf5ad6ff6ad70f8ad +71f9ad72ecad6befad6cf0ad6df4ad6e +e80ce8ad67e9ad68eaad69ebad6ae1ad +64e2ad65e3ad660015ed25f414f809f8 +ad40f9ad41faad42f4ad3df6ad3ef7ad +3fedad38eead39efad3af1ad3bf3ad3c +e714ea09eaad35ebad36ecad37e7ad32 +e8ad33e9ad34e1ad2de2ad2ee3ad2fe4 +ad30e6ad310df017f60cf6ad4ef7ad4f +f9ad50faad51f0ad4bf3ad4cf4ad4dea +0ceaad47ebad48edad49efad4ae1ad44 +e2ad45e8ad460fee1af40cf4ad5ef5ad +5ff9ad60faad61eead5aefad5bf0ad5c +f3ad5de70ce7ad56e8ad57ecad58edad +59e1ad52e3ad53e4ad54e5ad5569c198 +6dc0d06d3a6e826fa25f70a2a07110e4 +ad2b0aec14f209f2abd6f3abfbf4abfc +ecabf9eea4b3efabfae1abf4e5abf5e7 +abf6e9abf7ebabf80dec17f30cf3ad07 +f4ad08f7ad09f8ad0aecad04f0ad05f1 +ad06e70ce7ad00e8ad01e9ad02ebad03 +e1abfde2abfee3abff0013ec20f40ff4 +ad1bf5ad1cf8ad1df9ad1efaad1fecad +16edad17efad18f0ad19f1ad1ae60fe6 +ad11e7ad12e8ad13eaad14ebad15e1ad +0ce2ad0de3ad0ee4ad0fe5ad100aee14 +f509f5ad28f8ad29f9ad2aeead25efad +26f3ad27e1ad20e2ad21e3ad22e7ad23 +e9ad2469966aa25e6ba2896c0eeb1af4 +0cf4abf0f5abf1f7abf2f9abf3ebabec +ecabededabeeefabefe50ce5abe8e8ab +e9e9abeaeaabebe1abe5e3abe6e4abe7 +0aed14f209f2abc6f7abc7f9abc8edab +c3eeabc4f0abc5e1abbee2abbfe3abc0 +e5abc1e8abc20cee17f20cf2abd2f3ab +d3f6abd4f9abd5eeabcfefabd0f0abd1 +e909e9abccebabcdedabcee1abc9e5ab +cae8abcb0ef21af60cf6abe1f8abe2f9 +abe3faabe4f2abddf3abdef4abdff5ab +e0ed0cedabd9eeabdaefabdbf1abdce1 +abd6e2abd7ecabd865c0e465a2af66a2 +c467a2ce680013ee20f40ff4abb9f7ab +baf8abbbf9abbcfaabbdeeabb4efabb5 +f0abb6f1abb7f2abb8e973e938eaabb0 +ebabb1ecabb2edabb3022a3c42a25948 +11616e01e2abaff4abaa0b4d2d541754 +2e55385610c4abad01c8aba9d7abaa01 +cbababd3abac4dcca0502a5310d2aba8 +02c6aba5c8aba6daaba7470e473048cc +844910c4aba310c6aba12aab9e412a42 +10ceaba010d5ab9f126f70efabaee2ab +99e4ab9ae6ab9be7ab9ce8ab9d06eb0c +ebab8ceeab8df4ab8ef9ab8fe1ab89e2 +ab8ae7ab8b03e1ab90e4ab91e7ab92ed +ab9303e1ab94e3ab95e7ab96ebab9761 +6a62a27563a2b06408ea0feaab83edab +84efab85f2ab86faab87e5ab7fe6ab80 +e8ab81e9ab820016ed2af314f809f8ab +5ef9ab5ffaab60f3ab5bf6ab5cf7ab5d +f009f0ab58f1ab59f2ab5aedab55eeab +56efab57e614ea09eaab52ebab53ecab +54e6ab4fe7ab50e8ab51e1ab4ae2ab4b +e3ab4ce4ab4de5ab4e0011ef1df40ff4 +ab6ef5ab6ff6ab70f7ab71f9ab72efab +6af1ab6bf2ab6cf3ab6de90fe9ab65ea +ab66ebab67ecab68eeab69e2ab61e3ab +62e4ab63e7ab640bec14f009f0ab7cf1 +ab7df2ab7eecab79edab7aefab7be709 +e7ab76e8ab77eaab78e3ab73e4ab74e5 +ab75001a6fc1b2776ce10ce1ad84e5ad +bbf6af89faa34f775079887a05e709e7 +af9fecafa0eeafa1e1af9de4af9ee5af +0908f30ff3af8ef5af78f7af8ff9af90 +faaf91e1af8bebaf8cecada9f2af8d0a +ed14f209f2af9af5af9bf9af9cedaf97 +eeaf98efaf99e1af92e2af93e4af94e7 +af95e9af9673b37334746075a24e7610 +e1af8a06eb0cebaf5deeaf5eefaf5ff1 +af60e2af5ae8af5be9af5c0def17f30c +f3af6bf4af6cf5af6df9af6eefaf68f0 +af69f2af6ae80ce8af64e9af65ebaf66 +edaf67e1af61e2af62e4af630019ee2d +f417f70cf7af85f8af86f9af87faaf88 +f4af82f5af83f6af84f109f1af7ff2af +80f3af81eeaf7cefaf7df0af7ee717ea +0ceaaf78ebaf79ecaf7aedaf7be7af75 +e8af76e9af77e409e4af72e5af73e6af +74e1af6fe2af70e3af716fa24770a285 +720def17f30cf3af56f4af57f5af58f9 +af59efaf53f1af54f2af55e81ee832e9 +af51eca7beeeaf52012a2e4d126f6ee7 +af50012aaf4f4310ceaf50e3af4ce5af +4de7af4e0012ee20f40ff4af46f6af47 +f7af48f8af49f9af4aeeaf41efaf42f0 +af43f2af44f3af45e60fe6af3de8af3e +e9add7ebaf3fecaf40e1af39e2af3ae3 +af3be5af3c10f0af4b68c15d6b9d6b96 +6ca2506da2576e0eee1af50cf5af35f6 +af36f7af37f9af38eeaf31efaf32f2af +33f4af34e70ce7af2ee9af2feaad89eb +af30e1af2be4af2ce5af2d06ec0ceca5 +40f2af13f3af14f8af15e1af10e7af11 +ebaf1202e7af16edaf17eeaf180011ed +1df50ff5af26f6af27f7af28f8af29f9 +af2aedaf22efaf23f2af24f3af25e50f +e5af1de6af1ee7af1febaf20ecaf21e1 +af19e2af1ae3af1be4af1c689669a266 +6a0feb1aef0cefaf0cf2af0df5af0ef7 +af0febaf08ecaf09edaf0aeeaf0be50c +e5af04e6af05e9af06eaaf07e1af00e2 +af01e3af02e4af030cef17f50cf5ade7 +f6ade8f7ade9f8adeaefade4f2ade5f3 +ade6ec09ecade1edade2eeade3e4adde +e7addfe9ade00016ee2af414f809f8ad +fdf9adfefaadfff4adeff5adfbf7adfc +f109f1adf8f2adf9f3adfaeeadf4efad +f6f0adf7e714ea09eaadf3ebadf4ecad +f5e7adf0e8adf1e9adf2e1adebe2adec +e3adede4adeee6adef64a264a24265a2 +65670011ec1df30ff3add9f4addaf7ad +dbf8addcfaadddecadd5eeadd6efadd7 +f2add8e50fe5add0e7add1e8add2e9ad +d3ebadd4e1adcce2adcde3adcee4adcf +0aea14f209f2adb8f3adb9f7adbaeaad +b5eeadb6efadb7e1adb0e4adb1e5adb2 +e7adb3e9adb40fec1af20cf2adc8f3ad +c9f6adcafaadcbecadc4edadc5eeadc6 +f1adc7e70ce7adc0e8adc1e9adc2ebad +c3e3adbce4adbde5adbee6adbf613662 +a2566301e3adaef2adaf0015ed25f314 +f709f7ad98f8ad99faad9af3ad95f5ad +96f6ad97edad90efad91f0ad92f1ad93 +f2ad94e714ea09eaad8debad8eecad8f +e7ad8ae8ad8be9ad8ce1ad85e3ad86e4 +ad87e5ad88e6ad890012ed20f40ff4ad +a9f5adaaf6adabf7adacf9adadedada4 +eeada5efada6f0ada7f1ada8e60fe6ad +9fe7ada0e9ada1eaada2ecada3e1ad9b +e2ad9ce4ad9de5ad9e2ab40061ccf262 +002373c2d0e51ded0feda905eea91eef +a936f2a979f3a993e5a74be7a778e8a7 +8ee9a7a777c14b773878a26179a2a77a +a2e8e1a5ea0017ed2af414f809f8ab07 +f9ab08faab09f4ab04f5ab05f7ab06f1 +09f1ab01f2ab02f3ab03eda9feefa9ff +f0ab00e714ea09eaa9fbeba9fceca9fd +e7a9f8e8a9f9e9a9fae409e4a9f5e5a9 +f6e6a9f7e1a9f2e2a9f3e3a9f40014ed +25f214f609f6ab1bf7ab1cfaab1df2a9 +c2f3ab19f5ab1aedab14eeab15efab16 +f0ab17f1ab18e80fe8ab0fe9ab10eaab +11ebab12ecab13e1ab0ae2ab0be3ab0c +e6ab0de7ab0e0013ec20f30ff3ab2df6 +ab2ef7ab2ff8ab30faab31ecab28edab +29eeab2af0ab2bf2ab2ce60fe6ab23e8 +ab24e9ab25eaab26ebab27e1ab1ee2ab +1fe3ab20e4ab21e5ab220017ee2af514 +f809f8ab46f9ab47faab48f5ab43f6ab +44f7ab45f109f1ab40f2ab41f4ab42ee +ab3defab3ef0ab3fe814eb09ebab3aec +ab3bedab3ce8ab37e9ab38eaab39e409 +e4ab34e5ab35e6ab36e1ab32e2ab33e3 +a7ca73a25a74a2aa75a2ff760016ed2a +f514f809f8a9eff9a9f0faa9f1f5a9ec +f6a9edf7a9eef109f1a9e9f2a9eaf4a9 +ebeda9e6eea9e7efa9e8e614e909e9a9 +e3eaa9e4eba9e5e6a9e0e7a9e1e8a9e2 +e1a9dbe2a9dce3a9dde4a9dee5a9df00 +16ee2af414f709f7a9a8f8a9a9f9a9aa +f4a9a5f5a9a6f6a9a7f109f1a9a2f2a9 +a3f3a9a4eea99fefa9a0f0a9a1e814eb +09eba99ceca99deda99ee8a999e9a99a +eaa99be1a994e2a995e3a996e5a997e6 +a9980017ef2af514f809f8a9bff9a9c0 +faa9c1f5a9bcf6a9bdf7a9bef209f2a9 +b9f3a9baf4a9bbefa9b6f0a9b7f1a9b8 +e714ea09eaa9b3eda9b4eea9b5e7a9b0 +e8a9b1e9a9b2e409e4a9ade5a9aee6a9 +afe1a9abe2a74de3a9ac0018ee2df417 +f70cf7a9d7f8a9d8f9a9d9faa9daf4a9 +d4f5a9d5f6a9d6f109f1a9d1f2a9d2f3 +a9d3eea9ceefa9cff0a9d0e714ea09ea +a9cbeba9cceda9cde7a9c8e8a9c9e9a9 +cae409e4a9c5e5a9c6e6a9c7e1a9c2e2 +a9c3e3a9c46ac3186ec1a56ea2656fa2 +b570a2fb71a44b720018ee2df417f70c +f7a98ff8a990f9a991faa992f4a98cf5 +a98df6a98ef109f1a989f2a98af3a98b +eea986efa987f0a988e814eb09eba983 +eca984eda985e8a980e9a981eaa982e4 +09e4a97de6a97ee7a97fe1a97ae2a97b +e3a97c0016ee2af514f809f8a933f9a9 +34faa935f5a930f6a931f7a932f109f1 +a92df2a92ef3a92feea92aefa92bf0a9 +2ce614ea09eaa927eba928eda929e6a9 +24e7a925e9a926e1a91fe2a920e3a921 +e4a922e5a9230014ef25f514f809f8a9 +49f9a94afaa94bf5a946f6a947f7a948 +efa941f0a942f1a943f2a944f4a945ea +0feaa93ceba93deca93eeda93feea940 +e1a937e2a938e5a939e6a93ae8a93b00 +16ef2af514f809f8a960f9a961faa962 +f5a95df6a95ef7a95ff209f2a95af3a9 +5bf4a95cefa957f0a958f1a959e814eb +09eba954eca955eda956e8a951e9a952 +eaa953e1a94ce3a94de4a94ee5a94fe7 +a9500015ef25f414f709f7a976f8a977 +faa978f4a973f5a974f6a975efa96ef0 +a96ff1a970f2a971f3a972e714eb09eb +a96beca96ceda96de7a968e9a969eaa9 +6ae1a963e2a964e3a965e4a966e6a967 +6aa25f6ba2b76ca40f6d0017ed2af314 +f709f7a91bf8a91cfaa91df3a918f5a9 +19f6a91af009f0a915f1a916f2a917ed +a912eea913efa914e714ea09eaa90feb +a910eca911e7a90ce8a90de9a90ee409 +e4a909e5a90ae6a90be1a906e2a907e3 +a9080018ee2df417f70cf7a7d0f8a7d1 +f9a7d2faa7d3f4a7cdf5a7cef6a7cff1 +09f1a7caf2a7cbf3a7cceea7c7efa7c8 +f0a7c9e814eb09eba7c4eca7c5eda7c6 +e8a7c1e9a7c2eaa7c3e409e4a7bee6a7 +bfe7a7c0e1a7bbe2a7bce3a7bd0018ee +2df417f70cf7a7e9f8a7eaf9a7ebfaa7 +ecf4a7e6f5a7e7f6a7e8f109f1a7e3f2 +a7e4f3a7e5eea7e0efa7e1f0a7e2e814 +eb09eba7ddeca7deeda7dfe8a7dae9a7 +dbeaa7dce409e4a7d7e6a7d8e7a7d9e1 +a7d4e2a7d5e3a7d60017ee2af414f809 +f8a902f9a903faa904f4a7fff6a900f7 +a901f109f1a7fcf2a7fdf3a7feeea7f9 +efa7faf0a7fbe714ea09eaa7f6eba7f7 +eda7f8e7a7f3e8a7f4e9a7f5e409e4a7 +f0e5a7f1e6a7f2e1a7ede2a7eee3a7ef +65c19b65a25366a29e67a2e968a43469 +0014ee25f414f709f7a7b8f9a7b9faa7 +baf4a7b5f5a7b6f6a7b7eea7b1efa7b2 +f0a7b3f1a7b4f2a7aae60fe6a7ade7a7 +aeeba723eca7afeda7b0e1a7a8e2a7a9 +e3a7aae4a7abe5a7ac0015ef25f514f8 +09f8a75ff9a760faa761f5a75cf6a75d +f7a75eefa757f0a758f1a759f3a75af4 +a75be614ea09eaa754eba755eda756e6 +a751e8a752e9a753e1a74ce2a74de3a7 +4ee4a74fe5a7500015ee25f414f809f8 +a775f9a776faa777f4a772f5a773f7a7 +74eea76defa76ef0a76ff1a770f3a771 +e614ea09eaa76aeca76beda76ce6a767 +e7a768e8a769e1a762e2a763e3a764e4 +a765e5a7660015f025f514f809f8a78b +f9a78cfaa78df5a788f6a789f7a78af0 +a783f1a784f2a785f3a786f4a787e714 +ed09eda71eeea781efa782e7a77ee9a7 +7feaa780e1a779e2a77ae3a77be4a77c +e6a77d0018ed2df317f60cf6a7a3f7a7 +a4f9a7a5faa7a6f3a7a0f4a7a1f5a7a2 +f009f0a79df1a79ef2a79feda79beea7 +9cefa78ee714ea09eaa798eba799eca7 +9ae7a795e8a796e9a797e409e4a792e5 +a793e6a794e1a78fe2a790e3a79161a2 +6562a2b563a40a640019ee2df417f70c +f7a747f8a748f9a749faa74af4a744f5 +a745f6a746f109f1a741f2a742f3a743 +eea73eefa73ff0a740e717ea0ceaa73a +eba73beca73ceda73de7a737e8a738e9 +a739e409e4a734e5a735e6a736e1a731 +e2a732e3a7330014ef2ff514f809f8a5 +fef9a5fffaa700f5a5fbf6a5fcf7a5fd +efa5f5f032f1a5f8f2a5f9f3a5fa012a +a5f64b127261e9a5f7e70fe7a5f0e8a5 +f1eaa5f2eca5f3eea5f4e1a5ebe2a5ec +e3a5ede5a5eee6a5ef0017ee2af414f7 +09f7a716f8a717f9a718f4a713f5a714 +f6a715f109f1a710f2a711f3a712eea7 +0defa70ef0a70fe714eb09eba70aeca7 +0beda70ce7a707e9a708eaa709e409e4 +a704e5a705e6a706e1a701e2a702e3a7 +030018ed2df317f60cf6a72df7a72ef9 +a72ffaa730f3a72af4a72bf5a72cf009 +f0a727f1a728f2a729eda724eea725ef +a726e714ea09eaa721eba722eca723e7 +a71ee8a71fe9a720e409e4a71be5a71c +e6a71de1a719e2a71ae3a5f300184dc2 +af54c0f257375736584e59665a12616e +e2d5b501612c631168efc5941172e1d5 +b401702c731175f8a3c21165efc92601 +652c691169e9b58b117ae9b9a3544455 +a2ae5601612c691174e8d5b31169e9d5 +b208685e683c698c6ea2466fa2487511 +74e7d5b1106101e158e9042ad1264332 +4b364c3a5410c8d12610cebd0f10c8d5 +ad10c1d5ae012aaf894d10d6af890162 +2a7210e8d5af10f4012aa9364210d4a3 +4f1173e1c5df01642a7410efd35f10f2 +d5b061346580668667116ce7d5ac056d +116d2e6e327610f4a7ff10eccf9a10e7 +d35a67346b386c01e5cfe0f5b91110e2 +d5a910f2d5aa116cf5cff2116ee7d5ab +126761f2d39250c0c850a27652a2ad53 +06694769426f6a759079016c2a7210e3 +abe710efd5a801643e6e01e4cd15e801 +2acd6b4c10cbcd6b10e4d5a502672e72 +387910efabf601e4cde8efd5a610e1cf +10106e01e4d5a7f5cf61613e675e6801 +612a7210e4d5a410f7afd9026d2e7232 +7510f2cbe110f2cdc310e2d5a3116ef7 +a565046138654c68526c78721174e9d5 +a1016c2a7510e3ad5410eda54c1172ed +d59f02612e6c326e10f8c93f10e7d5a0 +01e9c7e8f0c7e91172e4b3f1026a306f +3675116ef2c5a8116ee7d5a21168e7cb +6b4d9a4ea2b34f057222723073447511 +67f2c7d4016b2a7910e1c7a810e8c7c5 +01672a6d10e1d59e10e5c7b867306c36 +6e1161efd59d1161edcd431163ebcbdb +07722e725a7460756679116df2032aa9 +d2492e4d325410c8d59610ceb92010cd +a9d2116fefc1be1165e9d594116cf4d5 +95614265746c9a6f01642a6e10e7af50 +10e9d5930368326b366e3a7210e3d58f +10ead58c10e1d58d01e4c365e9d58e02 +64346e387201e3d591efd59210e6af1e +10e4d5901179edc1250461386258655e +6b64731168f5d59c02672e6e327210e2 +d59910edd59710e4d5981161f4a54b11 +77e1d59a116fef012aafcf4d10ccd59b +47c4674ac3734aa6f74ba8104c036146 +65a6d369a6d57901632a6410e9d58b10 +e9d58a026ea6b06fa6b17410ee001d4a +c15d539f571a57aced58acf159305a01 +cda756d7cdcd02c4d565c5d565d4d528 +534854a24855a26b5603c1d523c5d525 +ced524d5a7a70fce1ad40cd4d518d5bb +16d6d519d9d586ced515cfcde2d2d516 +d3d585ca0ccad513cbcd8eccbb13cdd5 +14c3d512c4d564c5cf62c9cda70ccd17 +d20cd2d1e2d6d33dd7d1f6dacf69cdd1 +58ced588cfd1afc8c614c8d587cbd160 +ccd51e04c1d589c7d520d3afd8d9d521 +dad5224d8f4d484ea24f50a2645203c5 +d511cfc169d5bb16d7cbc20011cf1dd5 +0fd5bf9bd6d582d8d500d9bf34dad501 +cfd580d1d3fed2d581d4c1e0c60fc6d3 +fdc7bfb0cbd57fcca905cdb775c1d57e +c3d3fbc4d3fcc5cbff06c90cc9d505cc +af82cfc391d0d583c1d502c3d503c5d5 +040bcc14d409d4d50fd7c7f0d9b319cc +c966cdd50cd2d50dc7c5d0c7d1cbc8b1 +2fcbd5844a564b5a4c06d30cd3d3f7d4 +bdecd5d3f8d6bf0bc2d57cc9d3f6cbd5 +7d10cfd57902c5d3f0cdd57adad57b42 +c0f6465b4662477248a2444907d10cd1 +d577d2d578d3b566d4b5d5c3d3edc4b5 +69ccd575ced57602c9b12bcfb143d2b1 +4c0ace0cd2c63bd2d573d4d3ead7d3eb +c1d3e5c5d572c6d3e6c8a3b9ccb97404 +cbd574ced3ecd2b51dd4b52ed5b53442 +5e43a24d44a2814506c70cc7d570d2d5 +71d3aff5d4d563c1d3e1c3d3e2c5afbc +0dcc17d10cd1d3d1d2c9dbd4d56bd5b7 +75ccd3ceced3cfcfd3d0c60cc6d3cbc7 +d56ac9cb94cad3cdc1a993c4d569c5d3 +ca0fce1ad60cd6d3dcd7c7ecd9d56eda +ad43ced56dcfd3d9d2d3dad5d3dbc80c +c8d3d5c9d3d6ccd3d7cdd3d8c3d56cc4 +d3d2c6d3d3c7d3d404c5adbbcad3decb +ad84cfd3dfdad56f343d34aea5377c38 +82410bd214d709d7d3c8d8d3c9daa5de +d2d3c5d3d3c6d4d3c7cc09cca3cfcdd5 +68cfd3c4c4d3c1c5d566c6d5671133b6 +d5641138b6d5652aafd8312c321133b0 +d5631137b2bb1610e1c5a010ef012abd +bb4c10c1bdbb1170e3bd2e026d2e6e32 +7310f5bd6410e2bd5a01e1bbe2e2b317 +01613a701161ee012ab5f74a10d0b5f7 +016d2a7610e1d55e10efd55d066e256e +346f3a7254741168e9d5621164e1b9ac +1172e5012ab9c54b01d0d3f2d2b9c511 +61e9a5f761306850691174f3d561026c +2e6e327710e9d56010e9afc210e1d55f +02612e6d326f10eacd1410f2c9bf10f2 +012ab98f4b10c8b98f473448a26a4912 +7461ecb104056f456f4a726475026a2e +6b327210f5c7dd10f2b36410e8d55301 +6e2a7410e8b34001e7d551edaff70161 +506510eb032aafc3432e47325410d2a7 +8b10d9d3dd10d2afc310eed552613065 +366c1161e7ad631172e1d550116ff201 +2ab1c24710c5b1c2056c186c306d3675 +116ee7d55c1175f7b3ee106e01e7b506 +f0b505613265a247691172e1d55b016e +2a7410f2a54a05ef2defd556f35ef404 +2aabaa4332483c4d405410d7abaa01c1 +d557ced55810cbaba210cfaba4012aab +9e4310ceab9ee2abafe7d554e9d55511 +62f2032ab3c8493453385501c1b729d3 +d55a10ccb3c810c5d55943c135437444 +a2ee450267446c4a741168e9012aa3e5 +4501d2d3e4d4a3e51179f0afb201622a +7910edd54f10e1d54e0461a28e68a29d +6fa2ac70a2ae791172ec0e4b48541d54 +32553c58465910d5cbfd01cad10fd2d5 +4601c1d39cdad54710cbd5484b324d3c +52525310cbd54501c7bbb0dad3f403c4 +d542c5d543cbbf23ceaf4f02cfd544d3 +cbfdd5cbb3421f4232434247464910d2 +d54102c1d53fc7a778d9a74b10d3cbfd +01c551d2d5402acbb338364102c6d53c +ccd53ddad53e1139b0cbfd026b2e6e32 +7210e9d53910edab7c10f3b59202612e +65327210f3d53a10edabce10f2abb811 +70f4ad19016d2a7210f4afa910eed53b +03653469866f8c751170ecd54d1176e1 +06491749324d364e3a5010cba9bd10ce +b3d410d5d54a10d0c3d42ab3d4422a46 +10cab3d810d4d5491161ebd54b1167f2 +d54c2aa25441a8a642056f1f6f3e7244 +7501672a6810e4d53810e9d5371170ef +abae106101e8c95de9d5366130655c68 +116bf3d535036c326d36733a7410ebd5 +3410e9d53310f5a5fe10f3a9a2116ee7 +012aa91e4210c4a91e00204ac1c152c0 +d6563b5642575e5868596c5a02cda756 +d2d3d2d7cdcd04c1d523c4d524c5d525 +ced524d5a7a701c6d526d3cdb810cbd5 +2703c4d3c0c5d3c0d4d528d5cbfd5246 +536c54a25e5503c1d39cc7d520d9d521 +dad52205d309d3cbfdd5cbb3d7cbc2c5 +d511c8cdcdcfc1690010cd1dd30fd3d5 +17d4d518d5cbb3d6d519d9d51acdd514 +ced515cfcde2d2d516c90cc9cda7cad5 +13cbcd8eccbb13c1d506c3d512c4d3bf +c5cf620ecd1ad20cd2d1e2d6d33dd7ab +aadacf69cdd158ced51fcfd1afd0d51e +c80cc8d126cad10fcbd160ccd51ec4d5 +1bc6d51cc7d51d4e5b4e344fa8085066 +5110c1d51008c90fc9d505ccaf82cfc3 +91d0c3d4d4d506c1d502c3d503c5d504 +c8a7a70dcd17d40cd4d50fd7c7f0d9b3 +19dad508cdd50cd2d50dd3d50ec70cc7 +d1cbc8b12fcbd50bccc966c1d508c5d5 +09c6d50a4aa2484ba24c4ca2644d0012 +ce20d50fd5bf9bd6af89d8d500d9bf34 +dad501ceaf4fcfaba4d1d3fed2d3ffd4 +c1e0c60fc6d3fdc7bfb0cbbf23cca905 +cda9d2c1d3fac3d3fbc4d3fcc5cbff01 +cfd3efd0b5f707d00cd0d3f2d2b9c5d7 +d3f3dad3f4c5d3f0c7bbb0c8b98fcdd3 +f108d30fd3d3f7d4bdecd5d3f8d6bf0b +d9d3f9c1bdbbc2d3f5c9d3f6cbcd6b42 +c11b466b4662477848a24f4907d10cd1 +d3eed2b112d3b566d4b5d5c3d3edc4b5 +69ccb3c8ceb3d403c9b12bcfb143d2b1 +4cd8b14c0ace14d209d2afc3d4d3ead7 +d3ebced3e7d0d3e8d1d3e9c1d3e5c5b1 +c2c6d3e6c8a3b9ccb97405d409d4b52e +d5b534d6d3cbcbaba2ced3ecd2b51d42 +6443a25644a28e4507c80cc8d3e3d2d3 +e4d3aff5d4a3e5c1d3e1c3d3e2c5afbc +c7a5480fcc1ad20cd2c9dbd4a34fd5a9 +d2d9a74bccd3ceced3cfcfd3d0d1d3d1 +c70cc7a778c8d3ccc9cb94cad3cdc1a9 +93c4a91ec5d3cac6d3cb0010ce1dd50f +d5d3dbd6d3dcd7c7ecd9d3dddaad43ce +ab9ecfd3d9d2d3dad3cbfdc80cc8d3d5 +c9d3d6ccd3d7cdd3d8c3bf35c4d3d2c6 +d3d3c7d3d406cb0ccbad84cfd3dfd9d3 +cddad3e0c4adbbc5adbbcad3de354b35 +86378c3892410ccf17d40cd4d3c7d7d3 +c8d8d3c9daa5decfd3c4d2d3c5d3d3c6 +cc09cca3cfcda554cec7ecc4d3c1c5d3 +c2c6d3c31133b2c7ec1133b6d3bf0138 +2a3910b0cbfd10b6d3c02aafd8313032 +36341131b9d3be1137b2cbb302302e33 +323810b0adbb10b0ad4310b0a3e50464 +38673e6844724a761173f4a358116ced +b1271168e2d529116feda39601613e6d +01e9a549ee012aa5544110cda55410e2 +00134c665135513c5340545655725901 +c5d3c0d4cf6a10c1d51003c1d506c4d3 +bfd3d517d9d51a04c7a52ac8bf97cad5 +31ced51fd2d53210cbd52c4c3c4d464e +624f665001cbd50bd3d50e01c2d3f5d9 +d3f904c1d3facdd52bceb95ad2d3ffd5 +d52f10c7d53010cdd507452f4542474c +49504a664b02c8abc9cdd3f1d7d3f301 +c7a548c8d3e310c2d52c03c4d52dced5 +2ed1d3eed2b11210cfd3ef2aa5484132 +423c434c4410dad3e001c5d3c2c6d3c3 +02c8d3ccced52ad5d52b01c3bf35ced3 +8f002574c1f5e534f223f2a548f3a560 +f6a5a3f9a5cafa012a2e41127261e2a5 +e0022aa5de49a2b55210d5a5e1e5a358 +e6a366eba3b9eda3e5eea3fc78a67832 +795e7aa260e125e25106eb0ceba5c6ec +a5c7eda5c8f8a5c9e2a5c3e5a5c4e7a5 +c50013ee20f30ff3a5d9f4a5daf5a5db +f8a5dcfaa5ddeea5d5efa5d6f0a5d7f1 +a5d8f2a5cae70fe7a5d0e8a5d1e9a5d2 +eba5d3eca5d4e1a5cbe2a5cce3a5cde4 +a5cee5a5cf08ed0feda5e5eea5e6efa5 +e7f4a5e8faa5e9e2a5e2e4a5e3e7a5e4 +ea012a2e41127261e2a5e0032aa5de31 +2e49345310d5a5e11137b2a5e101d1a5 +dfd2a5e074a24875a29d76a2e3770012 +ee20f50ff5a5bef6a5bff7a5c0f8a5c1 +f9a5c2eea5b9efa5baf2a5bbf3a5bcf4 +a5bde70fe7a5b4e8a5b5e9a5b6eba5b7 +eda5b8e1a5b0e2a5b1e3a5b2e5a5b300 +17ef2af514f809f8a58bf9a58cfaa58d +f5a588f6a589f7a58af209f2a585f3a5 +86f4a587efa582f0a583f1a584e914ec +09eca57feda580eea581e9a57ceaa57d +eba57ee409e4a579e5a57ae7a57be1a5 +76e2a577e3a5780014ed25f214f709f7 +a5a0f9a5a1faa5a2f2a59df4a59ef5a5 +9feda598eea599efa59af0a59bf1a59c +e80fe8a593e9a594eaa595eba596eca5 +97e1a58ee3a58fe4a590e5a591e7a592 +0bee14f409f4a5adf5a5aef6a5afeea5 +aaefa5abf3a5aceb09eba5a7eca5a8ed +a5a9e2a5a4e4a5a5e9a5a66ac2e86fc1 +6d6fa25370a28e71a2e372a2fe730014 +ec25f414f809f8a573f9a574faa575f4 +a570f5a571f6a572eca56beea56cefa5 +6df2a56ef3a56fe70fe7a566e8a567e9 +a568eaa569eba56ae1a561e2a562e3a5 +63e4a564e5a5650011eb1df20ff2a524 +f3a525f4a526f8a527faa528eba520ec +a521eda522eea523e50fe5a51be6a51c +e7a51de9a51eeaa51fe1a517e2a518e3 +a519e4a51a0017ee2af514f809f8a53c +f9a53dfaa53ef5a539f6a53af7a53bf2 +09f2a536f3a537f4a538eea533efa534 +f0a535e814eb09eba530eca531eda532 +e8a52de9a52eeaa52fe509e5a52be6a3 +82e7a52ce2a529e3a3b5e4a52a08ed0f +eda543eea544f2a545f4a546faa547e3 +a53fe4a540e7a541eba5420014ee25f3 +14f809f8a55df9a55efaa55ff3a55af5 +a55bf7a55ceea555efa556f0a557f1a5 +58f2a559e90fe9a550eaa551eba552ec +a553eda554e2a548e332e4a54de5a54e +e8a54f032aa54948324e3a5012616ced +a54c126174f2a54a126261f4a54b6aa2 +686ba2836ca2c46da4196e0019ee2df4 +17f70cf7a513f8a514f9a515faa516f4 +a510f5a511f6a512f109f1a50df2a50e +f3a50feea50aefa50bf0a50ce717ea0c +eaa506eba507eca508eda509e7a503e8 +a504e9a505e409e4a500e5a501e6a502 +e1a3fde2a3fee3a3ff08f00ff0a3b5f4 +a35af5a3b6f7a3b7faa3b8e1a3b1e7a3 +b2e9a3b3eea3b40013ef20f40ff4a3c9 +f5a3caf6a3cbf7a3ccfaa3cdefa3c4f0 +a3c5f1a3c6f2a3c7f3a3c8e70fe7a3bf +e8a3c0e9a3c1eba3c2eca3c3e2a3bae3 +a3bbe4a3bce5a3bde6a3be0017ee2af4 +14f809f8a3e2f9a3e3faa3e4f4a3dff5 +a3e0f7a3e1f109f1a3ddf2a3def3a3cf +eea3daefa3dbf0a3dce814eb09eba3d7 +eca3d8eda3d9e8a3d4e9a3d5eaa3d6e4 +09e4a3d1e5a3d2e6a3d3e1a3cee2a3cf +e3a3d00016ef2af514f809f8a3f9f9a3 +fafaa3fbf5a3f6f6a3f7f7a3f8f209f2 +a3f3f3a3f4f4a3f5efa3f0f0a3f1f1a3 +f2e714eb09eba3ededa3eeeea3efe7a3 +ebe9a3aceaa3ece1a3e6e2a3e7e3a3e8 +e5a3e9e6a3ea65c14365a25866a28367 +a2ab68a406690015ed25f214f709f7a3 +aef8a3aff9a3b0f2a3abf3a3acf4a3ad +eda3a6eea3a7efa3a8f0a3a9f1a3aae6 +14ea09eaa3a3eba3a4eca3a5e6a3a0e7 +a3a1e9a3a2e1a39be2a39ce3a39de4a3 +9ee5a39f0ced17f50cf5a362f7a363f9 +a364faa365eda35ff1a360f2a361e509 +e5a35ceba35deca35ee1a359e2a35ae3 +a35b0bee14f309f3a370f5a371faa372 +eea36defa36ef0a36fe809e8a36ae9a3 +6beba36ce2a367e4a368e5a3690019ee +2df417f70cf7a389f8a38af9a38bfaa3 +8cf4a386f5a387f6a388f109f1a383f2 +a384f3a385eea380efa381f0a382e717 +ea0ceaa37ceba37deca37eeda37fe7a3 +79e8a37ae9a37be409e4a376e5a377e6 +a378e1a373e2a374e3a3750ded17f00c +f0a397f2a398f3a399f4a39aeda394ee +a395efa396e80ce8a390e9a391eba392 +eca393e1a38de2a38ee7a38f61a25062 +a28563a2be640014ee25f414f809f8a3 +55f9a356faa357f4a352f5a353f7a354 +eea34defa34ef0a34ff1a350f2a351e7 +0fe7a348e8a349e9a34aeaa34beca34c +e1a343e2a344e4a345e5a346e6a34700 +15ed1af30ef706f74bf84dfa4ff33df4 +47f549ed3dee3fef41f043f145e60ee9 +06e937eb39ec3be631e733e835e127e2 +29e32be42de52f0016ee1ef50ef806f8 +7bf97dfa7ff575f677f779f206f26ff3 +71f473ee69ef6bf06de60ee906e963ec +65ed67e65de75fe861e153e255e357e4 +59e55b0012f118f60cf69df79ff8a1f9 +a341faa342f193f295f397f499f59be6 +0ae689e88bed8dee8ff091e181e283e4 +85e587 } } match{ diff --git a/icu4c/source/data/misc/supplementalData.txt b/icu4c/source/data/misc/supplementalData.txt index 8038f0d46ac..990b27518cf 100644 --- a/icu4c/source/data/misc/supplementalData.txt +++ b/icu4c/source/data/misc/supplementalData.txt @@ -13324,6 +13324,11 @@ supplementalData:table(nofallback){ scripts{"Latn"} } } + ecy{ + secondary{ + scripts{"Cprt"} + } + } ee{ primary{ scripts{"Latn"} @@ -13983,6 +13988,11 @@ supplementalData:table(nofallback){ scripts{"Latn"} } } + gmy{ + secondary{ + scripts{"Linb"} + } + } gn{ primary{ scripts{"Latn"} @@ -14030,11 +14040,7 @@ supplementalData:table(nofallback){ } grc{ secondary{ - scripts{ - "Cprt", - "Grek", - "Linb", - } + scripts{"Grek"} } } grt{ @@ -14572,6 +14578,15 @@ supplementalData:table(nofallback){ scripts{"Latn"} } } + kaw{ + secondary{ + scripts{ + "Bali", + "Java", + "Kawi", + } + } + } kbd{ primary{ scripts{"Cyrl"} @@ -28522,6 +28537,9 @@ supplementalData:table(nofallback){ ar{ populationShareF:int{46980000} } + ecy{ + populationShareF:int{44100000} + } el{ officialStatus{"official"} populationShareF:int{49950000} @@ -29490,6 +29508,12 @@ supplementalData:table(nofallback){ fr{ populationShareF:int{48900000} } + gmy{ + populationShareF:int{0} + } + grc{ + populationShareF:int{0} + } mk{ populationShareF:int{48160000} } @@ -29721,6 +29745,9 @@ supplementalData:table(nofallback){ literacyShareF:int{49100000} populationShareF:int{48180000} } + ban_Bali{ + populationShareF:int{0} + } bbc{ populationShareF:int{47920000} } @@ -29749,6 +29776,9 @@ supplementalData:table(nofallback){ literacyShareF:int{49100000} populationShareF:int{49340000} } + kaw{ + populationShareF:int{0} + } kge{ populationShareF:int{47320000} } diff --git a/icu4c/source/data/translit/Arab_Latn.txt b/icu4c/source/data/translit/Arab_Latn.txt index 8ce3d48a58e..76a6cd6fcd3 100644 --- a/icu4c/source/data/translit/Arab_Latn.txt +++ b/icu4c/source/data/translit/Arab_Latn.txt @@ -18,7 +18,7 @@ # Does *not* do assimilation of "al", nor hyphenation. # While it could be done, we need to determine whether a prefix "al" could # occur other than as the definite article (since no space is used). -:: [[:Arabic:][:block=ARABIC:][‎ⁿ،؛؟ـ\u064B-\u0655٠-٬۰-۹﷼ښ][\u0611\u0670]] ; +:: [[:Arabic:][:Block=Arabic:][‎ⁿ،؛؟ـ\u064B-\u0655٠-٬۰-۹﷼ښ][\u0611\u0670]] ; :: NFKD (NFC); $disambig = \u0331 ; $disambig2 = \u0330 ; diff --git a/icu4c/source/data/translit/Beng_Latn.txt b/icu4c/source/data/translit/Beng_Latn.txt index d5cc47b4d89..10b33710c1e 100644 --- a/icu4c/source/data/translit/Beng_Latn.txt +++ b/icu4c/source/data/translit/Beng_Latn.txt @@ -6,7 +6,7 @@ # Generated from CLDR # -::[[:script=bengali:][।-॥\u0981-ঃঅ-ঌএ-ঐও-নপ-রলশ-হ\u09BC-\u09C4ে-ৈো-\u09CDৗড়-ঢ়য়-\u09E3০-৺ৎ]]; +::[[:Script=Bengali:][।-॥\u0981-ঃঅ-ঌএ-ঐও-নপ-রলশ-হ\u09BC-\u09C4ে-ৈো-\u09CDৗড়-ঢ়য়-\u09E3০-৺ৎ]]; ::NFD; ::Bengali-InterIndic; ::InterIndic-Latin; diff --git a/icu4c/source/data/translit/Cyrl_Latn.txt b/icu4c/source/data/translit/Cyrl_Latn.txt index 420191f7ef2..b60971c7851 100644 --- a/icu4c/source/data/translit/Cyrl_Latn.txt +++ b/icu4c/source/data/translit/Cyrl_Latn.txt @@ -10,7 +10,7 @@ # Should add variants for Russian-English, Russian-German # Those can use this as a base, and then remap cases # like a $hat to ya or ja. -# :: [\u0000-\u007E ʹ ʺ [:Cyrillic:] [:Latin:] [:nonspacing mark:]] ; +# :: [\u0000-\u007E ʹ ʺ [:Cyrillic:] [:Latin:] [:Nonspacing_Mark:]] ; ### WARNING, \u0308 must be added to the generated filters, in both directions ### # MINIMAL FILTER # Cyrillic-Latin @@ -275,13 +275,13 @@ $ignore = [[:Mark:]''] * ; | K ← Q ; | u ← w ; | U ← W ; -| KS ← X } $ignore [:UppercaseLetter:] ; -| KS ← [:UppercaseLetter:] $ignore { X ; +| KS ← X } $ignore [:Uppercase_Letter:] ; +| KS ← [:Uppercase_Letter:] $ignore { X ; | Ks ← X ; | ks ← x ; :: NFC (NFD) ; # note: a global filter is more efficient, but MUST include all source chars!! -# :: ([\u0000-\u007E ʹ ʺ [:Cyrillic:] [:Latin:] [:nonspacing mark:] ‧]); +# :: ([\u0000-\u007E ʹ ʺ [:Cyrillic:] [:Latin:] [:Nonspacing_Mark:] ‧]); # MINIMAL FILTER: Latin-Cyrillic :: ( [ḫḪhH‧ˌ\u0308A-Za-zÀ-ÏÑ-ÖÙ-Ýà-ïñ-öù-ýÿ-ĥĨ-İĴ-ķĹ-ľŃ-ňŌ-őŔ-ťŨ-žƏƠ-ơƯ-ưǍ-ǜǞ-ǣǦ-ǰǴ-ǵǸ-țȞ-ȟȦ-ȳəʹ-ʺ\u0300-\u0302\u0306-\u0307\u030C\u0326\u0331\u0340-\u0341\u0344ʹ΅-ΆΈ-ΊΌΎ-ΐά-ΰό-ώϓЀЃЌ-ЎЙйѐѓќ-ўӁ-ӂӐ-ӑӖ-ӗḀ-ẙẛẠ-ỹἂ-ἅἊ-Ἅἒ-ἕἚ-Ἕἢ-ἥἪ-Ἥἲ-ἵἺ-Ἵὂ-ὅὊ-Ὅὒ-ὕὛὝὢ-ὥὪ-Ὥὰ-ώᾂ-ᾅᾊ-ᾍᾒ-ᾕᾚ-ᾝᾢ-ᾥᾪ-ᾭᾰᾲᾴᾸᾺ-ΆῂῄῈ-Ή῍-῎ῐῒ-ΐῘῚ-Ί῝-῞ῠῢ-ΰῨῪ-Ύ῭-΅ῲῴῸ-ΏK-Å] ) ; diff --git a/icu4c/source/data/translit/Grek_Latn.txt b/icu4c/source/data/translit/Grek_Latn.txt index e287e74d3aa..5cfcae832b6 100644 --- a/icu4c/source/data/translit/Grek_Latn.txt +++ b/icu4c/source/data/translit/Grek_Latn.txt @@ -7,7 +7,7 @@ # # Rules are predicated on running NFD first, and NFC afterwards -# :: [\u0000-\u007F \u0370-Ͽ [:Greek:] [:nonspacing mark:]] ; +# :: [\u0000-\u007F \u0370-Ͽ [:Greek:] [:Nonspacing_Mark:]] ; # MINIMAL FILTER GENERATED FOR: Greek-Latin :: [΄´;µ·ÄËÏÖÜäëïöüÿ-āĒ-ēĪ-īŌ-ōŪ-ūŸǕ-ǜǞ-ǣǬ-ǭȪ-ȭȰ-ȳ\u0304\u0308\u0313-\u0314\u0342-\u0345ͺ;Ά-ΊΌΎ-ΡΣ-ώϐ-ϗϛϝϟϡϣϥϧϩϫϭϯ-ϵϷ-\u07FBЁЇёїӒ-ӓӚ-ӟӢ-ӧӪ-ӱӴ-ӵӸ-ӹḔ-ḗḠ-ḡḦ-ḧḮ-ḯḸ-ḹṎ-ṓṜ-ṝṺ-ṻẄ-ẅẌ-ẍẗἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼι῁-ῄῆ-ῌ῏-ΐῖ-Ί῟-Ῥῲ-ῴῶ-ῼΩϹ] ; :: NFD (NFC) ; @@ -20,9 +20,9 @@ # ὨΣ ὩΣ ὪΣ ὫΣ # Ạ, ạ, Ẹ, ẹ, Ọ, ọ # Useful variables -$lower = [[:latin:][:greek:] & [:Ll:]]; -$glower = [[:greek:] & [:Ll:]]; -$upper = [[:latin:][:greek:] & [:Lu:]] ; +$lower = [[:Latin:][:Greek:] & [:Ll:]]; +$glower = [[:Greek:] & [:Ll:]]; +$upper = [[:Latin:][:Greek:] & [:Lu:]] ; $accent = [:M:] ; # NOTE: restrict to just the Greek & Latin accents that we care about # TODO: broaden out once interation is fixed @@ -228,8 +228,8 @@ $ignore = [[:Mark:]''] * ; | B ← W } $vowel ; | U ← V ; | U ← W ; -$rough } $ignore [:UppercaseLetter:] → H ; -$ignore [:UppercaseLetter:] { $rough → H ; +$rough } $ignore [:Uppercase_Letter:] → H ; +$ignore [:Uppercase_Letter:] { $rough → H ; $rough ← H ; $rough ↔ h ; # Completeness for Greek @@ -251,8 +251,8 @@ $rough ↔ h ; ← [Ππ] { \' } [Ss] ; ← [Νν] { \' } $egammaLike ; ::NFC (NFD) ; -# ([\u0000-\u007F [:Latin:] [:Greek:] [:nonspacing mark:]]) ; -# ([\u0000-\u007F · [:Latin:] [:nonspacing mark:]]) ; +# ([\u0000-\u007F [:Latin:] [:Greek:] [:Nonspacing_Mark:]]) ; +# ([\u0000-\u007F · [:Latin:] [:Nonspacing_Mark:]]) ; # MINIMAL FILTER GENERATED FOR: Latin-Greek BACKWARD :: ( [':?A-Za-zÀ-ÅÇ-ÏÑ-ÖÙ-Ýà-åç-ïñ-öù-ýÿ-ďĒ-ĥĨ-İĴ-ķĹ-ľŃ-ňŌ-őŔ-ťŨ-žƠ-ơƯ-ưǍ-ǜǞ-ǣǦ-ǰǴ-ǵǸ-țȞ-ȟȦ-ȳ\u0300-\u0337\u0339-\u0345΅-ΆΈ-ΊΌΎ-ΐΪ-ΰϊ-ώϓ-ϔЀ-ЁЃЇЌ-ЎЙйѐ-ёѓїќ-ўѶ-ѷӁ-ӂӐ-ӓӖ-ӗӚ-ӟӢ-ӧӪ-ӵӸ-ӹḀ-ẙẛẠ-ỹἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼ῁-ῄῆ-ΐῖ-Ί῝-΅ῲ-ῴῶ-ῼK-Å] ) ; diff --git a/icu4c/source/data/translit/Grek_Latn_UNGEGN.txt b/icu4c/source/data/translit/Grek_Latn_UNGEGN.txt index 0e6dcc86a73..4c6374f642a 100644 --- a/icu4c/source/data/translit/Grek_Latn_UNGEGN.txt +++ b/icu4c/source/data/translit/Grek_Latn_UNGEGN.txt @@ -14,8 +14,8 @@ :: [[[:Greek:][:Mn:][:Me:]] [\:-;?·;·]] ; ::NFD (NFC) ; # Useful variables -$lower = [[:latin:][:greek:] & [:Ll:]] ; -$upper = [[:latin:][:greek:] & [:Lu:]] ; +$lower = [[:Latin:][:Greek:] & [:Ll:]] ; +$upper = [[:Latin:][:Greek:] & [:Lu:]] ; $accent = [[:Mn:][:Me:]] ; $macron = \u0304 ; $ddot = \u0308 ; diff --git a/icu4c/source/data/translit/Han_Latin_Names.txt b/icu4c/source/data/translit/Han_Latin_Names.txt index ca9c31e4eb7..2fdb44d472a 100644 --- a/icu4c/source/data/translit/Han_Latin_Names.txt +++ b/icu4c/source/data/translit/Han_Latin_Names.txt @@ -15,7 +15,7 @@ # Do this before ::Han-Spacedhan() to catch Han after space in original text, # and to apply before all other rules. $startOfHanMarker = \uFDD1; -[:^script=Han:] { ([:script=Han:]) → $startOfHanMarker $1; +[:^Script=Han:] { ([:Script=Han:]) → $startOfHanMarker $1; # Need Spacedhan so the name transliterations get spaced properly ::Han-Spacedhan(); # Convert special name readings that depend on next character diff --git a/icu4c/source/data/translit/Han_Spacedhan.txt b/icu4c/source/data/translit/Han_Spacedhan.txt index b88c1dd14c1..748e6413482 100644 --- a/icu4c/source/data/translit/Han_Spacedhan.txt +++ b/icu4c/source/data/translit/Han_Spacedhan.txt @@ -8,9 +8,9 @@ # Only intended for internal use # Make sure Han are normalized, including characters that contain them. -# The first set in the filter is computed with http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:tonfkd:/XXX/:]-[:ideographic:]-[:sc=han:] -# Where XXX is the resolved [:ideographic:][:sc=han:]. It needs updating with each Unicode release! -:: [[、。々《-』〜・㆒-㆟㈠-㉇㊀-㊰㋀-㋋ ㍘-㍰㍻-㍿㏠-㏾🈐-🈒🈔-🈺🉀-🉈🉐🉑][:ideographic:][:sc=han:]] nfkc; +# The first set in the filter is computed with http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:tonfkd:/XXX/:]-[:Ideographic:]-[:sc=Han:] +# Where XXX is the resolved [:Ideographic:][:sc=Han:]. It needs updating with each Unicode release! +:: [[、。々《-』〜・㆒-㆟㈠-㉇㊀-㊰㋀-㋋ ㍘-㍰㍻-㍿㏠-㏾🈐-🈒🈔-🈺🉀-🉈🉐🉑][:Ideographic:][:sc=Han:]] nfkc; :: fullwidth-halfwidth; 。 → '.'; 。→ '.'; @@ -31,7 +31,7 @@ 々→ '⓶'; 〜→ '~'; $terminalPunct = [\.\,\:\;\?\!.,:?!。、;[:Pe:][:Pf:]]; -$initialPunct = [:Ps:][:Pi:]; +$initialPunct = [[:Ps:][:Pi:]]; # add space between any Han or terminal punctuation and letters, and # between letters and Han or initial punct [[:Ideographic:] $terminalPunct] {} [:Letter:] → ' ' ; diff --git a/icu4c/source/data/translit/Hira_Kana.txt b/icu4c/source/data/translit/Hira_Kana.txt index fbcf7de5ba2..62a469bc1fe 100644 --- a/icu4c/source/data/translit/Hira_Kana.txt +++ b/icu4c/source/data/translit/Hira_Kana.txt @@ -7,7 +7,7 @@ # # note: a global filter is more efficient, but MUST include all source chars -:: [[\u0000-\u007E 、。 \u3099-゜ ァ-ー 。-゚ー[:Hiragana:] [:Katakana:] [:nonspacing mark:]]-[\u309B \u309C]]; +:: [[\u0000-\u007E 、。 \u3099-゜ ァ-ー 。-゚ー[:Hiragana:] [:Katakana:] [:Nonspacing_Mark:]]-[\u309B \u309C]]; :: NFKC (NFC); # Hiragana-Katakana # This is largely a one-to-one mapping, but it has a @@ -181,6 +181,6 @@ $xo = [ お ← $xo {ー}; :: NFC (NFKC) ; # note: a global filter is more efficient, but MUST include all source chars!! -:: ([[\u0000-\u007E 、。 \u3099-゜ ァ-ー 。-゚ー[:Hiragana:] [:Katakana:] [:nonspacing mark:]]-[\u309B \u309C]]); +:: ([[\u0000-\u007E 、。 \u3099-゜ ァ-ー 。-゚ー[:Hiragana:] [:Katakana:] [:Nonspacing_Mark:]]-[\u309B \u309C]]); # eof diff --git a/icu4c/source/data/translit/Latin_NumericPinyin.txt b/icu4c/source/data/translit/Latin_NumericPinyin.txt index 9f832fcad48..7bdad074cb2 100644 --- a/icu4c/source/data/translit/Latin_NumericPinyin.txt +++ b/icu4c/source/data/translit/Latin_NumericPinyin.txt @@ -31,6 +31,6 @@ $digit = [1-5]; $1 &NumericPinyin-Pinyin($3) $2 ← ([aAeE]) ($vowel* $consonant*) ($digit); $1 &NumericPinyin-Pinyin($3) $2 ← ([oO]) ([$vowel-[aeAE]]* $consonant*) ($digit); $1 &NumericPinyin-Pinyin($3) $2 ← ($vowel) ($consonant*) ($digit); -&NumericPinyin-Pinyin($1) ← [:letter:] {($digit)}; +&NumericPinyin-Pinyin($1) ← [:Letter:] {($digit)}; ::NFC (NFD); diff --git a/icu4c/source/data/translit/Latn_Jamo.txt b/icu4c/source/data/translit/Latn_Jamo.txt index feefb309361..f1591e25b7e 100644 --- a/icu4c/source/data/translit/Latn_Jamo.txt +++ b/icu4c/source/data/translit/Latn_Jamo.txt @@ -6,9 +6,9 @@ # Generated from CLDR # -::[[:script=Latin:][:M:]-]; +::[[:Script=Latin:][:M:]-]; ::NFD; ::Lower; ::Latin-ConjoiningJamo; -::[[:script=Latin:][:M:]] NFC; +::[[:Script=Latin:][:M:]] NFC; diff --git a/icu4c/source/data/translit/Latn_Kana.txt b/icu4c/source/data/translit/Latn_Kana.txt index 73224f8af73..d465e22f398 100644 --- a/icu4c/source/data/translit/Latn_Kana.txt +++ b/icu4c/source/data/translit/Latn_Kana.txt @@ -7,7 +7,7 @@ # # note: a global filter is more efficient, but MUST include all source chars -#:: [\u0000-\u007E 、。 \u3099-゜ ァ-ー 。-゚ [:Latin:][:Katakana:] [:nonspacing mark:]] ; +#:: [\u0000-\u007E 、。 \u3099-゜ ァ-ー 。-゚ [:Latin:][:Katakana:] [:Nonspacing_Mark:]] ; # MINIMAL FILTER GENERATED FOR: Latin-Katakana ### WARNING -- must add width filter, both here and below!!! ### :: [[ᄀ-ᄒᄚᄡ\u1160-ᅵᆪᆬ-ᆭᆰ-ᆵ←-↓│■○\u3000-。「-」\u3099-\u309Aァ-ロワヲ-ヴヷヺ-ー!-~¢-₩][',.A-Za-z~À-ÖØ-öø-ďĒ-ĥĨ-İĴ-ķĹ-ľŃ-ňŌ-őŔ-ťŨ-žƠ-ơƯ-ưǍ-ǜǞ-ǣǦ-ǭǰǴ-ǵǸ-țȞ-ȟȦ-ȳ\u0304Ӣ-ӣӮ-ӯḀ-ẙẠ-ỹᾱᾹῑῙῡῩK-Å]] ; @@ -378,11 +378,11 @@ x → | ks ; # Final cleanup '~' → ; # delete stray tildes between letters [:Katakana:] { '' } [:Latin:] → ; # delete stray quotes between letters -# [ʾ[:Nonspacing Mark:]-[\u3099-゜]] → ; # delete any non-spacing marks that we didn't use +# [ʾ[:Nonspacing_Mark:]-[\u3099-゜]] → ; # delete any non-spacing marks that we didn't use :: NFC (NFD) ; :: ([[:Katakana:][\u309B\u309C\u30A0\u30FC\uFF70\uFF9E\uFF9F]] halfwidth-fullwidth); # note: a global filter is more efficient, but MUST include all source chars!! -#:: ([\u0000-\u007E 、。 \u3099-゜ ァ-ー 。-゚ [:Latin:][:Katakana:] [:nonspacing mark:]]); +#:: ([\u0000-\u007E 、。 \u3099-゜ ァ-ー 。-゚ [:Latin:][:Katakana:] [:Nonspacing_Mark:]]); # MINIMAL FILTER GENERATED FOR: Latin-Katakana BACKWARD :: ( [[\ -~¢-£¥-¦¬\u0304₩。-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ│-○][~、-。がぎぐげござじずぜぞだぢづでどば-ぱび-ぴぶ-ぷべ-ぺぼ-ぽゔ\u3099-゛ゞァ-ヺー-ヾ][\u309B\u309C\u30A0\u30FC\uFF70\uFF9E\uFF9F]] ) ; # eof diff --git a/icu4c/source/data/translit/ThaiLogical_Latin.txt b/icu4c/source/data/translit/ThaiLogical_Latin.txt index 36dbe440174..264772ee7a7 100644 --- a/icu4c/source/data/translit/ThaiLogical_Latin.txt +++ b/icu4c/source/data/translit/ThaiLogical_Latin.txt @@ -26,8 +26,8 @@ #{ ( $consonant ) } [^$vowel \uE000] → | $1 \uE000 ; #\uE000 → o\u0323 ; # ← o\u0323 ; -$notAbove = [^\p{ccc=0}\p{ccc=above}] ; -$notBelow = [^\p{ccc=0}\p{ccc=below}] ; +$notAbove = [^\p{ccc=0}\p{ccc=Above}] ; +$notBelow = [^\p{ccc=0}\p{ccc=Below}] ; # Consonants # Warning: the 'h's need to be handled carefully! # What we really want to say is the following, but we can't diff --git a/icu4c/source/data/translit/Thai_Latn.txt b/icu4c/source/data/translit/Thai_Latn.txt index e3cd839e357..d25fe4797b3 100644 --- a/icu4c/source/data/translit/Thai_Latn.txt +++ b/icu4c/source/data/translit/Thai_Latn.txt @@ -6,7 +6,7 @@ # Generated from CLDR # -::[[:thai:] ก-\u0E3Aเ-๛]; +::[[:Thai:] ก-\u0E3Aเ-๛]; ::NFD; ::Thai-ThaiSemi; ::Any-BreakInternal; diff --git a/icu4c/source/data/translit/Thai_ThaiLogical.txt b/icu4c/source/data/translit/Thai_ThaiLogical.txt index c7a4b5f2c44..2c6c92f02ad 100644 --- a/icu4c/source/data/translit/Thai_ThaiLogical.txt +++ b/icu4c/source/data/translit/Thai_ThaiLogical.txt @@ -9,7 +9,7 @@ # This reverses the Thai LogicalOrderException vowels, and does (part of) spaces # The rules that convert space into semicolon are in another file; # since they have to come BEFORE the break iterator -$thai = [[:thai:] ก-\u0E3Aเ-๛] ; +$thai = [[:Thai:] ก-\u0E3Aเ-๛] ; # First convert the semicolon back ' ' ← $thai { '; ' } $thai; # Remove any other spaces between thai letters diff --git a/icu4c/source/data/translit/Thai_ThaiSemi.txt b/icu4c/source/data/translit/Thai_ThaiSemi.txt index c469faa0122..9690768ed44 100644 --- a/icu4c/source/data/translit/Thai_ThaiSemi.txt +++ b/icu4c/source/data/translit/Thai_ThaiSemi.txt @@ -8,6 +8,6 @@ # The rules that convert space into semicolon are in this file; # since they have to come BEFORE the break iterator. -$thai = [[:thai:] ก-\u0E3Aเ-๛] ; +$thai = [[:Thai:] ก-\u0E3Aเ-๛] ; $thai { ' ' } $thai → '; ' ; diff --git a/icu4c/source/data/translit/am_Ethi_d0_Morse.txt b/icu4c/source/data/translit/am_Ethi_d0_Morse.txt index 410a1348300..b0160dacd65 100644 --- a/icu4c/source/data/translit/am_Ethi_d0_Morse.txt +++ b/icu4c/source/data/translit/am_Ethi_d0_Morse.txt @@ -20,7 +20,7 @@ # # MINIMAL FILTER: Ethiopic-Morse Code # -:: [[:Zs:]0-9!\?\+/@()\[\]_:;,\.'"$=\-[:Ethiopic:]] ; +:: [[:Zs:]0-9!\?\+/@()\[\]_:;,\.'"\$=\-[:Ethiopic:]] ; ([:Lo:])([:Zs:]+)([:Lo:]) → | $1⁄⁂⁄$2$3 ; # ⁄⁂⁄ is assumed to be a sufficiently weird enough sequence that won't naturally appear in any normal content # ######################################################################## diff --git a/icu4c/source/data/translit/ar_ar_Latn_BGN.txt b/icu4c/source/data/translit/ar_ar_Latn_BGN.txt index 198e5112250..41aea4e4602 100644 --- a/icu4c/source/data/translit/ar_ar_Latn_BGN.txt +++ b/icu4c/source/data/translit/ar_ar_Latn_BGN.txt @@ -22,7 +22,7 @@ # # MINIMAL FILTER: Arabic-Latin # -:: [[:arabic:][:block=ARABIC:][ءآابةتثجحخدذرزسشصضطظعغفقكلمنهوىي\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652٠١٢٣٤٥٦٧٨٩ٱ]] ; +:: [[:Arabic:][:Block=Arabic:][ءآابةتثجحخدذرزسشصضطظعغفقكلمنهوىي\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652٠١٢٣٤٥٦٧٨٩ٱ]] ; :: NFKD (NFC) ; # # diff --git a/icu4c/source/data/translit/az_Title.txt b/icu4c/source/data/translit/az_Title.txt index 8dfa398ad21..dab4e4d48e1 100644 --- a/icu4c/source/data/translit/az_Title.txt +++ b/icu4c/source/data/translit/az_Title.txt @@ -8,9 +8,9 @@ # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri # Make any string of letters after a cased letter be lower, with rules for i -[:cased:] [:case-ignorable:]* { İ → i; -[:cased:] [:case-ignorable:]* { I → ı; -[:cased:] [:case-ignorable:]* { (.) → &Any-Lower($1) ; +[:Cased:] [:Case_Ignorable:]* { İ → i; +[:Cased:] [:Case_Ignorable:]* { I → ı; +[:Cased:] [:Case_Ignorable:]* { (.) → &Any-Lower($1) ; # Otherwise all lowercase go to upper (titlecase stay as is) i→İ ; ([:Lowercase:]) → &Any-Upper($1) ; diff --git a/icu4c/source/data/translit/de_ASCII.txt b/icu4c/source/data/translit/de_ASCII.txt index 637102157e7..846f3d09b3b 100644 --- a/icu4c/source/data/translit/de_ASCII.txt +++ b/icu4c/source/data/translit/de_ASCII.txt @@ -18,5 +18,5 @@ $UE = [Ü {U \u0308}]; $AE → AE; $OE → OE; $UE → UE; -::Any-ASCII; +::Latin-ASCII; diff --git a/icu4c/source/data/translit/dv_dv_Latn_BGN.txt b/icu4c/source/data/translit/dv_dv_Latn_BGN.txt index 4eec469ce5c..5b87293ef39 100644 --- a/icu4c/source/data/translit/dv_dv_Latn_BGN.txt +++ b/icu4c/source/data/translit/dv_dv_Latn_BGN.txt @@ -18,7 +18,7 @@ # In our rules, we also convert Arabic punctuation characters to Latin. # These appears to be used in Maldivian text, for example in the Universal # Declaration of Human Rights. -::[[:block=thaana:][،؛؟٪٫٬]\uFDF2] ; +::[[:Block=Thaana:][،؛؟٪٫٬]\uFDF2] ; ::NFD; $wordBoundary = [^[:L:][:M:][:N:]] ; $vowel = [\u07A6-\u07AF] ; diff --git a/icu4c/source/data/translit/el_Lower.txt b/icu4c/source/data/translit/el_Lower.txt index 54c6d113642..6ebb0b61fa9 100644 --- a/icu4c/source/data/translit/el_Lower.txt +++ b/icu4c/source/data/translit/el_Lower.txt @@ -12,8 +12,8 @@ # and C is not followed by a sequence consisting of zero or more case-ignorable characters and then a cased letter. # 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA # With translit rules, easiest is to handle the negative condition first, mapping in that case to the regular sigma. -Σ } [:case-ignorable:]* [:cased:] → σ; -[:cased:] [:case-ignorable:]* { Σ → ς; +Σ } [:Case_Ignorable:]* [:Cased:] → σ; +[:Cased:] [:Case_Ignorable:]* { Σ → ς; ::Any-Lower; ::NFC(); diff --git a/icu4c/source/data/translit/el_Title.txt b/icu4c/source/data/translit/el_Title.txt index f7fdd3a0914..ebe6baf7b59 100644 --- a/icu4c/source/data/translit/el_Title.txt +++ b/icu4c/source/data/translit/el_Title.txt @@ -10,9 +10,9 @@ # Remove \0301 following Greek, with possible intervening 0308 marks. # [[:Greek:] & [:Ll:]] [\u0308]? { \u0301 → ; # Make any string of letters after a cased letter be lower, with rules for sigma -[:cased:] [:case-ignorable:]* { Σ } [:case-ignorable:]* [:cased:] → σ; -[:cased:] [:case-ignorable:]* { Σ → ς; -[:cased:] [:case-ignorable:]* { (.) → &Any-Lower($1) ; +[:Cased:] [:Case_Ignorable:]* { Σ } [:Case_Ignorable:]* [:Cased:] → σ; +[:Cased:] [:Case_Ignorable:]* { Σ → ς; +[:Cased:] [:Case_Ignorable:]* { (.) → &Any-Lower($1) ; # Otherwise all lowercase go to upper (titlecase stay as is) ([:Lowercase:]) → &Any-Title($1) ; ::NFC(); diff --git a/icu4c/source/data/translit/fa_fa_Latn_BGN.txt b/icu4c/source/data/translit/fa_fa_Latn_BGN.txt index 6b47cd170bc..9b05e898637 100644 --- a/icu4c/source/data/translit/fa_fa_Latn_BGN.txt +++ b/icu4c/source/data/translit/fa_fa_Latn_BGN.txt @@ -19,7 +19,7 @@ # # MINIMAL FILTER: Persian-Latin # -:: [[:arabic:][:block=ARABIC:][ءآابةتثجحخدذرزسشصضطظعغفقكلمنهویي\u064E\u064F\u0650\u0651\u0652٠١٢٣٤٥٦٧٨٩پچژگی]] ; +:: [[:Arabic:][:Block=Arabic:][ءآابةتثجحخدذرزسشصضطظعغفقكلمنهویي\u064E\u064F\u0650\u0651\u0652٠١٢٣٤٥٦٧٨٩پچژگی]] ; :: NFKD (NFC) ; # # diff --git a/icu4c/source/data/translit/it_am.txt b/icu4c/source/data/translit/it_am.txt index cc5723dd21d..ddfda923b76 100644 --- a/icu4c/source/data/translit/it_am.txt +++ b/icu4c/source/data/translit/it_am.txt @@ -259,6 +259,6 @@ y → | i; z → ዝ; # # -[:nonspacing mark:] → ; +[:Nonspacing_Mark:] → ; ::NFC(NFD); diff --git a/icu4c/source/data/translit/it_ja.txt b/icu4c/source/data/translit/it_ja.txt index 017bdebb58f..5da4499064d 100644 --- a/icu4c/source/data/translit/it_ja.txt +++ b/icu4c/source/data/translit/it_ja.txt @@ -261,6 +261,6 @@ z → ツ; \- → =; # # -[:nonspacing mark:] → ; +[:Nonspacing_Mark:] → ; ::NFC(NFD); diff --git a/icu4c/source/data/translit/lt_Title.txt b/icu4c/source/data/translit/lt_Title.txt index 31c64191111..22a0115377b 100644 --- a/icu4c/source/data/translit/lt_Title.txt +++ b/icu4c/source/data/translit/lt_Title.txt @@ -8,13 +8,13 @@ # Make any string of letters after a cased letter be lower ::NFD(); -[:cased:] [:case-ignorable:]* {I } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0307; -[:cased:] [:case-ignorable:]* {J } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → j \u0307; -[:cased:] [:case-ignorable:]* {I \u0328 } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0328 \u0307; -[:cased:] [:case-ignorable:]* {I \u0300 → i \u0307 \u0300; -[:cased:] [:case-ignorable:]* {I \u0301 → i \u0307 \u0301; -[:cased:] [:case-ignorable:]* {I \u0303 → i \u0307 \u0303; -[:cased:] [:case-ignorable:]* { (.) → &Any-Lower($1) ; +[:Cased:] [:Case_Ignorable:]* {I } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0307; +[:Cased:] [:Case_Ignorable:]* {J } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → j \u0307; +[:Cased:] [:Case_Ignorable:]* {I \u0328 } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0328 \u0307; +[:Cased:] [:Case_Ignorable:]* {I \u0300 → i \u0307 \u0300; +[:Cased:] [:Case_Ignorable:]* {I \u0301 → i \u0307 \u0301; +[:Cased:] [:Case_Ignorable:]* {I \u0303 → i \u0307 \u0303; +[:Cased:] [:Case_Ignorable:]* { (.) → &Any-Lower($1) ; # Otherwise all lowercase go to upper (titlecase stay as is) [:Soft_Dotted:] [^[:ccc=Not_Reordered:][:ccc=Above:]]* { \u0307 → ; ([:Lowercase:]) → &Any-Upper($1) ; diff --git a/icu4c/source/data/translit/tr_Title.txt b/icu4c/source/data/translit/tr_Title.txt index bff96a6bf88..9560a41d682 100644 --- a/icu4c/source/data/translit/tr_Title.txt +++ b/icu4c/source/data/translit/tr_Title.txt @@ -8,9 +8,9 @@ # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri # Make any string of letters after a cased letter be lower, with rules for i -[:cased:] [:case-ignorable:]* { İ → i; -[:cased:] [:case-ignorable:]* { I → ı; -[:cased:] [:case-ignorable:]* { (.) → &Any-Lower($1) ; +[:Cased:] [:Case_Ignorable:]* { İ → i; +[:Cased:] [:Case_Ignorable:]* { I → ı; +[:Cased:] [:Case_Ignorable:]* { (.) → &Any-Lower($1) ; # Otherwise all lowercase go to upper (titlecase stay as is) i→İ ; ([:Lowercase:]) → &Any-Upper($1) ; diff --git a/icu4c/source/data/unidata/changes.txt b/icu4c/source/data/unidata/changes.txt index 4ceb4278af2..2f8ed7ad8e1 100644 --- a/icu4c/source/data/unidata/changes.txt +++ b/icu4c/source/data/unidata/changes.txt @@ -290,6 +290,8 @@ copying that version number into the $ICU_SRC/.bazeliskrc config file. - run Unicode Tools GenerateUnihanCollators & GenerateUnihanCollatorFiles, check CLDR diffs, copy to CLDR, test CLDR, ... as documented there - generate ICU zh collation data + WARNING: outdated, don't do this, follow the tools/cldr/cldr-to-icu/README.md file! + --- Old text from here: instructions inspired by https://github.com/unicode-org/icu/blob/main/tools/cldr/cldr-to-icu/README.txt and https://github.com/unicode-org/icu/blob/main/icu4c/source/data/cldr-icu-readme.txt diff --git a/icu4c/source/data/xml/brkitr/fi.xml b/icu4c/source/data/xml/brkitr/fi.xml deleted file mode 100644 index 5081e7cd4ed..00000000000 --- a/icu4c/source/data/xml/brkitr/fi.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - %icu; -] -> - - - - - - - - - - - - - - diff --git a/icu4c/source/data/xml/brkitr/sv.xml b/icu4c/source/data/xml/brkitr/sv.xml deleted file mode 100644 index 5f1566942d5..00000000000 --- a/icu4c/source/data/xml/brkitr/sv.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - %icu; -] -> - - - - - - - - - - - - - - diff --git a/icu4c/source/i18n/basictz.cpp b/icu4c/source/i18n/basictz.cpp index a2c1ec7fb91..610a31ad5dc 100644 --- a/icu4c/source/i18n/basictz.cpp +++ b/icu4c/source/i18n/basictz.cpp @@ -160,12 +160,13 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, || (tr.getFrom()->getDSTSavings() != 0 && tr.getTo()->getDSTSavings() == 0)) && (date + MILLIS_PER_YEAR > nextTransitionTime)) { - int32_t year, month, dom, dow, doy, mid; + int32_t year, mid; + int8_t month, dom, dow; UDate d; // Get local wall time for the next transition time Grego::timeToFields(nextTransitionTime + initialRaw + initialDst, - year, month, dom, dow, doy, mid, status); + year, month, dom, dow, mid, status); if (U_FAILURE(status)) return; int32_t weekInMonth = Grego::dayOfWeekInMonth(year, month, dom); // Create DOW rule @@ -193,7 +194,7 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, // Get local wall time for the next transition time Grego::timeToFields(tr.getTime() + tr.getFrom()->getRawOffset() + tr.getFrom()->getDSTSavings(), - year, month, dom, dow, doy, mid, status); + year, month, dom, dow, mid, status); if (U_FAILURE(status)) return; weekInMonth = Grego::dayOfWeekInMonth(year, month, dom); // Generate another DOW rule @@ -225,7 +226,7 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, // Generate another DOW rule Grego::timeToFields(tr.getTime() + tr.getFrom()->getRawOffset() + tr.getFrom()->getDSTSavings(), - year, month, dom, dow, doy, mid, status); + year, month, dom, dow, mid, status); if (U_FAILURE(status)) return; weekInMonth = Grego::dayOfWeekInMonth(year, month, dom); dtr = new DateTimeRule(month, weekInMonth, dow, mid, DateTimeRule::WALL_TIME); @@ -486,8 +487,7 @@ BasicTimeZone::getTimeZoneRulesAfter(UDate start, InitialTimeZoneRule*& initial, } } else { // Calculate the transition year - int32_t year, month, dom, dow, doy, mid; - Grego::timeToFields(tzt.getTime(), year, month, dom, dow, doy, mid, status); + int32_t year = Grego::timeToYear(tzt.getTime(), status); if (U_FAILURE(status)) { return; } diff --git a/icu4c/source/i18n/buddhcal.cpp b/icu4c/source/i18n/buddhcal.cpp index 7723ade105d..c99b97e2671 100644 --- a/icu4c/source/i18n/buddhcal.cpp +++ b/icu4c/source/i18n/buddhcal.cpp @@ -36,7 +36,6 @@ static const int32_t kGregorianEpoch = 1970; // used as the default value of BuddhistCalendar::BuddhistCalendar(const Locale& aLocale, UErrorCode& success) : GregorianCalendar(aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } BuddhistCalendar::~BuddhistCalendar() @@ -48,12 +47,6 @@ BuddhistCalendar::BuddhistCalendar(const BuddhistCalendar& source) { } -BuddhistCalendar& BuddhistCalendar::operator= ( const BuddhistCalendar& right) -{ - GregorianCalendar::operator=(right); - return *this; -} - BuddhistCalendar* BuddhistCalendar::clone() const { return new BuddhistCalendar(*this); diff --git a/icu4c/source/i18n/buddhcal.h b/icu4c/source/i18n/buddhcal.h index 1fa8395b35b..196b21311fd 100644 --- a/icu4c/source/i18n/buddhcal.h +++ b/icu4c/source/i18n/buddhcal.h @@ -82,13 +82,6 @@ public: */ BuddhistCalendar(const BuddhistCalendar& source); - /** - * Default assignment operator - * @param right the object to be copied. - * @internal - */ - BuddhistCalendar& operator=(const BuddhistCalendar& right); - /** * Create and return a polymorphic copy of this calendar. * @return return a polymorphic copy of this calendar. diff --git a/icu4c/source/i18n/calendar.cpp b/icu4c/source/i18n/calendar.cpp index e713fb0195e..167d8644827 100644 --- a/icu4c/source/i18n/calendar.cpp +++ b/icu4c/source/i18n/calendar.cpp @@ -156,7 +156,7 @@ U_CFUNC void ucal_dump(UCalendar* cal) { #endif /* Max value for stamp allowable before recalculation */ -#define STAMP_MAX 10000 +#define STAMP_MAX 127 static const char * const gCalTypes[] = { "gregorian", @@ -700,15 +700,10 @@ fIsTimeSet(false), fAreFieldsSet(false), fAreAllFieldsSet(false), fAreFieldsVirtuallySet(false), -fNextStamp(static_cast(kMinimumUserStamp)), -fTime(0), fLenient(true), -fZone(nullptr), fRepeatedWallTime(UCAL_WALLTIME_LAST), fSkippedWallTime(UCAL_WALLTIME_LAST) { - validLocale[0] = 0; - actualLocale[0] = 0; clear(); if (U_FAILURE(success)) { return; @@ -722,26 +717,21 @@ fSkippedWallTime(UCAL_WALLTIME_LAST) // ------------------------------------- -Calendar::Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success) +Calendar::Calendar(TimeZone* adoptZone, const Locale& aLocale, UErrorCode& success) : UObject(), fIsTimeSet(false), fAreFieldsSet(false), fAreAllFieldsSet(false), fAreFieldsVirtuallySet(false), -fNextStamp(static_cast(kMinimumUserStamp)), -fTime(0), fLenient(true), -fZone(nullptr), fRepeatedWallTime(UCAL_WALLTIME_LAST), fSkippedWallTime(UCAL_WALLTIME_LAST) { - validLocale[0] = 0; - actualLocale[0] = 0; + LocalPointer zone(adoptZone, success); if (U_FAILURE(success)) { - delete zone; return; } - if (zone == nullptr) { + if (zone.isNull()) { #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: ILLEGAL ARG because timezone cannot be 0\n", __FILE__, __LINE__); @@ -751,7 +741,7 @@ fSkippedWallTime(UCAL_WALLTIME_LAST) } clear(); - fZone = zone; + fZone = zone.orphan(); setWeekData(aLocale, nullptr, success); } @@ -763,15 +753,10 @@ fIsTimeSet(false), fAreFieldsSet(false), fAreAllFieldsSet(false), fAreFieldsVirtuallySet(false), -fNextStamp(static_cast(kMinimumUserStamp)), -fTime(0), fLenient(true), -fZone(nullptr), fRepeatedWallTime(UCAL_WALLTIME_LAST), fSkippedWallTime(UCAL_WALLTIME_LAST) { - validLocale[0] = 0; - actualLocale[0] = 0; if (U_FAILURE(success)) { return; } @@ -779,6 +764,7 @@ fSkippedWallTime(UCAL_WALLTIME_LAST) fZone = zone.clone(); if (fZone == nullptr) { success = U_MEMORY_ALLOCATION_ERROR; + return; } setWeekData(aLocale, nullptr, success); } @@ -788,6 +774,8 @@ fSkippedWallTime(UCAL_WALLTIME_LAST) Calendar::~Calendar() { delete fZone; + delete actualLocale; + delete validLocale; } // ------------------------------------- @@ -795,7 +783,6 @@ Calendar::~Calendar() Calendar::Calendar(const Calendar &source) : UObject(source) { - fZone = nullptr; *this = source; } @@ -806,7 +793,6 @@ Calendar::operator=(const Calendar &right) { if (this != &right) { uprv_arrayCopy(right.fFields, fFields, UCAL_FIELD_COUNT); - uprv_arrayCopy(right.fIsSet, fIsSet, UCAL_FIELD_COUNT); uprv_arrayCopy(right.fStamp, fStamp, UCAL_FIELD_COUNT); fTime = right.fTime; fIsTimeSet = right.fIsTimeSet; @@ -828,10 +814,10 @@ Calendar::operator=(const Calendar &right) fWeekendCease = right.fWeekendCease; fWeekendCeaseMillis = right.fWeekendCeaseMillis; fNextStamp = right.fNextStamp; - uprv_strncpy(validLocale, right.validLocale, sizeof(validLocale)-1); - validLocale[sizeof(validLocale)-1] = 0; - uprv_strncpy(actualLocale, right.actualLocale, sizeof(actualLocale)-1); - actualLocale[sizeof(validLocale)-1] = 0; + UErrorCode status = U_ZERO_ERROR; + U_LOCALE_BASED(locBased, *this); + locBased.setLocaleIDs(right.validLocale, right.actualLocale, status); + U_ASSERT(U_SUCCESS(status)); } return *this; @@ -1167,13 +1153,9 @@ Calendar::setTimeInMillis( double millis, UErrorCode& status ) { fAreFieldsSet = fAreAllFieldsSet = false; fIsTimeSet = fAreFieldsVirtuallySet = true; - for (int32_t i=0; i>= 1; } @@ -1467,7 +1442,7 @@ void Calendar::computeFields(UErrorCode &ec) //__FILE__, __LINE__, fFields[UCAL_JULIAN_DAY], localMillis); #endif - computeGregorianAndDOWFields(fFields[UCAL_JULIAN_DAY], ec); + computeGregorianFields(fFields[UCAL_JULIAN_DAY], ec); // Call framework method to have subclass compute its fields. // These must include, at a minimum, MONTH, DAY_OF_MONTH, @@ -1538,32 +1513,6 @@ uint8_t Calendar::julianDayToDayOfWeek(int32_t julian) return result; } -/** -* Compute the Gregorian calendar year, month, and day of month from -* the given Julian day. These values are not stored in fields, but in -* member variables gregorianXxx. Also compute the DAY_OF_WEEK and -* DOW_LOCAL fields. -*/ -void Calendar::computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec) -{ - computeGregorianFields(julianDay, ec); - if (U_FAILURE(ec)) { - return; - } - - // Compute day of week: JD 0 = Monday - int32_t dow = julianDayToDayOfWeek(julianDay); - internalSet(UCAL_DAY_OF_WEEK,dow); - - // Calculate 1-based localized day of week - int32_t dowLocal = dow - getFirstDayOfWeek() + 1; - if (dowLocal < 1) { - dowLocal += 7; - } - internalSet(UCAL_DOW_LOCAL,dowLocal); - fFields[UCAL_DOW_LOCAL] = dowLocal; -} - /** * Compute the Gregorian calendar year, month, and day of month from the * Julian day. These values are not stored in fields, but in member @@ -1575,14 +1524,13 @@ void Calendar::computeGregorianFields(int32_t julianDay, UErrorCode& ec) { if (U_FAILURE(ec)) { return; } - int32_t gregorianDayOfWeekUnused; if (uprv_add32_overflow( julianDay, -kEpochStartAsJulianDay, &julianDay)) { ec = U_ILLEGAL_ARGUMENT_ERROR; return; } Grego::dayToFields(julianDay, fGregorianYear, fGregorianMonth, - fGregorianDayOfMonth, gregorianDayOfWeekUnused, + fGregorianDayOfMonth, fGregorianDayOfYear, ec); } @@ -1610,8 +1558,19 @@ void Calendar::computeWeekFields(UErrorCode &ec) { if(U_FAILURE(ec)) { return; } + + // Compute day of week: JD 0 = Monday + int32_t dayOfWeek = julianDayToDayOfWeek(fFields[UCAL_JULIAN_DAY]); + internalSet(UCAL_DAY_OF_WEEK, dayOfWeek); + int32_t firstDayOfWeek = getFirstDayOfWeek(); + // Calculate 1-based localized day of week + int32_t dowLocal = dayOfWeek - firstDayOfWeek + 1; + if (dowLocal < 1) { + dowLocal += 7; + } + internalSet(UCAL_DOW_LOCAL,dowLocal); + int32_t eyear = fFields[UCAL_EXTENDED_YEAR]; - int32_t dayOfWeek = fFields[UCAL_DAY_OF_WEEK]; int32_t dayOfYear = fFields[UCAL_DAY_OF_YEAR]; // WEEK_OF_YEAR start @@ -1624,10 +1583,11 @@ void Calendar::computeWeekFields(UErrorCode &ec) { // first week of the next year. ASSUME that the year length is less than // 7000 days. int32_t yearOfWeekOfYear = eyear; - int32_t relDow = (dayOfWeek + 7 - getFirstDayOfWeek()) % 7; // 0..6 - int32_t relDowJan1 = (dayOfWeek - dayOfYear + 7001 - getFirstDayOfWeek()) % 7; // 0..6 + int32_t relDow = (dayOfWeek + 7 - firstDayOfWeek) % 7; // 0..6 + int32_t relDowJan1 = (dayOfWeek - dayOfYear + 7001 - firstDayOfWeek) % 7; // 0..6 int32_t woy = (dayOfYear - 1 + relDowJan1) / 7; // 0..53 - if ((7 - relDowJan1) >= getMinimalDaysInFirstWeek()) { + int32_t minimalDaysInFirstWeek = getMinimalDaysInFirstWeek(); + if ((7 - relDowJan1) >= minimalDaysInFirstWeek) { ++woy; } @@ -1655,7 +1615,7 @@ void Calendar::computeWeekFields(UErrorCode &ec) { if (lastRelDow < 0) { lastRelDow += 7; } - if (((6 - lastRelDow) >= getMinimalDaysInFirstWeek()) && + if (((6 - lastRelDow) >= minimalDaysInFirstWeek) && ((dayOfYear + 7 - relDow) > lastDoy)) { woy = 1; yearOfWeekOfYear++; @@ -3607,9 +3567,19 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField, UErrorCo fprintf(stderr, "%s:%d - y=%d, y-1=%d doy%d, njd%d (C.F. %d)\n", __FILE__, __LINE__, year, year-1, testDate, julianDay+testDate, nextJulianDay); #endif - if(julianDay+testDate > nextJulianDay) { // is it past Dec 31? (nextJulianDay is day BEFORE year+1's Jan 1) + if (uprv_add32_overflow(julianDay, testDate, &testDate)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(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, status); // jd before Jan 1 of previous year + int32_t prevYear; + if (uprv_add32_overflow(year, -1, &prevYear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + julianDay = handleComputeMonthStart(prevYear, 0, false, status); // jd before Jan 1 of previous year if (U_FAILURE(status)) { return 0; } @@ -4141,7 +4111,7 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& if (U_SUCCESS(status)) { U_LOCALE_BASED(locBased,*this); locBased.setLocaleIDs(ures_getLocaleByType(monthNames.getAlias(), ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(monthNames.getAlias(), ULOC_ACTUAL_LOCALE, &status)); + ures_getLocaleByType(monthNames.getAlias(), ULOC_ACTUAL_LOCALE, &status), status); } else { status = U_USING_FALLBACK_WARNING; return; @@ -4229,14 +4199,12 @@ Calendar::updateTime(UErrorCode& status) Locale Calendar::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } const char * Calendar::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocaleID(type, status); + return LocaleBased::getLocaleID(validLocale, actualLocale, type, status); } void @@ -4245,7 +4213,7 @@ Calendar::recalculateStamp() { int32_t currentValue; int32_t j, i; - fNextStamp = 1; + fNextStamp = kInternallySet; for (j = 0; j < UCAL_FIELD_COUNT; j++) { currentValue = STAMP_MAX; diff --git a/icu4c/source/i18n/cecal.cpp b/icu4c/source/i18n/cecal.cpp index 7771c32efb3..33d32adab73 100644 --- a/icu4c/source/i18n/cecal.cpp +++ b/icu4c/source/i18n/cecal.cpp @@ -53,7 +53,6 @@ static const int32_t LIMITS[UCAL_FIELD_COUNT][4] = { CECalendar::CECalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); } CECalendar::CECalendar (const CECalendar& other) @@ -65,13 +64,6 @@ CECalendar::~CECalendar() { } -CECalendar& -CECalendar::operator=(const CECalendar& right) -{ - Calendar::operator=(right); - return *this; -} - //------------------------------------------------------------------------- // Calendar framework //------------------------------------------------------------------------- diff --git a/icu4c/source/i18n/cecal.h b/icu4c/source/i18n/cecal.h index 9c3332f3b84..e6514e18f85 100644 --- a/icu4c/source/i18n/cecal.h +++ b/icu4c/source/i18n/cecal.h @@ -82,13 +82,6 @@ protected: */ virtual ~CECalendar(); - /** - * Default assignment operator - * @param right Calendar object to be copied - * @internal - */ - CECalendar& operator=(const CECalendar& right); - protected: //------------------------------------------------------------------------- // Calendar framework diff --git a/icu4c/source/i18n/chnsecal.cpp b/icu4c/source/i18n/chnsecal.cpp index 050994fcbaf..8257bbafb67 100644 --- a/icu4c/source/i18n/chnsecal.cpp +++ b/icu4c/source/i18n/chnsecal.cpp @@ -130,7 +130,6 @@ ChineseCalendar::ChineseCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success), hasLeapMonthBetweenWinterSolstices(false) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } ChineseCalendar::ChineseCalendar(const ChineseCalendar& other) : Calendar(other) { @@ -219,7 +218,9 @@ int32_t ChineseCalendar::handleGetExtendedYear(UErrorCode& status) { } int32_t year; - if (newestStamp(UCAL_ERA, UCAL_YEAR, kUnset) <= fStamp[UCAL_EXTENDED_YEAR]) { + // if UCAL_EXTENDED_YEAR is not older than UCAL_ERA nor UCAL_YEAR + if (newerField(UCAL_EXTENDED_YEAR, newerField(UCAL_ERA, UCAL_YEAR)) == + UCAL_EXTENDED_YEAR) { year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } else { // adjust to the instance specific epoch @@ -368,13 +369,9 @@ int64_t ChineseCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, U isLeapMonth = internalGet(UCAL_IS_LEAP_MONTH) != 0; } - int32_t unusedMonth; - int32_t unusedDayOfWeek; - int32_t unusedDayOfMonth; - int32_t unusedDayOfYear; - Grego::dayToFields(newMoon, gyear, unusedMonth, unusedDayOfWeek, unusedDayOfMonth, unusedDayOfYear, status); + int32_t newMonthYear = Grego::dayToYear(newMoon, status); - struct MonthInfo monthInfo = computeMonthInfo(setting, gyear, newMoon, status); + struct MonthInfo monthInfo = computeMonthInfo(setting, newMonthYear, newMoon, status); if (U_FAILURE(status)) { return 0; } @@ -1043,7 +1040,12 @@ void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dayOfMonth, int32_t d } // Find the target dayOfMonth - int32_t jd = newMoon + kEpochStartAsJulianDay - 1 + dayOfMonth; + int32_t jd; + if (uprv_add32_overflow(newMoon, kEpochStartAsJulianDay - 1, &jd) || + uprv_add32_overflow(jd, dayOfMonth, &jd)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } // Pin the dayOfMonth. In this calendar all months are 29 or 30 days // so pinning just means handling dayOfMonth 30. diff --git a/icu4c/source/i18n/dcfmtsym.cpp b/icu4c/source/i18n/dcfmtsym.cpp index b4c90e6765a..b85f3ad134a 100644 --- a/icu4c/source/i18n/dcfmtsym.cpp +++ b/icu4c/source/i18n/dcfmtsym.cpp @@ -118,7 +118,6 @@ DecimalFormatSymbols::DecimalFormatSymbols(const Locale& loc, const NumberingSys DecimalFormatSymbols::DecimalFormatSymbols() : UObject(), locale(Locale::getRoot()) { - *validLocale = *actualLocale = 0; initialize(); } @@ -136,6 +135,8 @@ DecimalFormatSymbols::createWithLastResortData(UErrorCode& status) { DecimalFormatSymbols::~DecimalFormatSymbols() { + delete actualLocale; + delete validLocale; } // ------------------------------------- @@ -163,8 +164,12 @@ DecimalFormatSymbols::operator=(const DecimalFormatSymbols& rhs) currencySpcAfterSym[i].fastCopyFrom(rhs.currencySpcAfterSym[i]); } locale = rhs.locale; - uprv_strcpy(validLocale, rhs.validLocale); - uprv_strcpy(actualLocale, rhs.actualLocale); + + UErrorCode status = U_ZERO_ERROR; + U_LOCALE_BASED(locBased, *this); + locBased.setLocaleIDs(rhs.validLocale, rhs.actualLocale, status); + U_ASSERT(U_SUCCESS(status)); + fIsCustomCurrencySymbol = rhs.fIsCustomCurrencySymbol; fIsCustomIntlCurrencySymbol = rhs.fIsCustomIntlCurrencySymbol; fCodePointZero = rhs.fCodePointZero; @@ -203,8 +208,8 @@ DecimalFormatSymbols::operator==(const DecimalFormatSymbols& that) const } // No need to check fCodePointZero since it is based on fSymbols return locale == that.locale && - uprv_strcmp(validLocale, that.validLocale) == 0 && - uprv_strcmp(actualLocale, that.actualLocale) == 0; + LocaleBased::equalIDs(actualLocale, that.actualLocale) && + LocaleBased::equalIDs(validLocale, that.validLocale); } // ------------------------------------- @@ -353,7 +358,6 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool useLastResortData, const NumberingSystem* ns) { if (U_FAILURE(status)) { return; } - *validLocale = *actualLocale = 0; // First initialize all the symbols to the fallbacks for anything we can't find initialize(); @@ -409,7 +413,8 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, ULOC_VALID_LOCALE, &status), ures_getLocaleByType( numberElementsRes.getAlias(), - ULOC_ACTUAL_LOCALE, &status)); + ULOC_ACTUAL_LOCALE, &status), + status); // Now load the rest of the data from the data sink. // Start with loading this nsName if it is not Latin. @@ -568,8 +573,7 @@ void DecimalFormatSymbols::setCurrency(const char16_t* currency, UErrorCode& sta Locale DecimalFormatSymbols::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } const UnicodeString& diff --git a/icu4c/source/i18n/dtfmtsym.cpp b/icu4c/source/i18n/dtfmtsym.cpp index 23cea3eba20..339db48dba8 100644 --- a/icu4c/source/i18n/dtfmtsym.cpp +++ b/icu4c/source/i18n/dtfmtsym.cpp @@ -402,9 +402,8 @@ void DateFormatSymbols::copyData(const DateFormatSymbols& other) { UErrorCode status = U_ZERO_ERROR; U_LOCALE_BASED(locBased, *this); - locBased.setLocaleIDs( - other.getLocale(ULOC_VALID_LOCALE, status), - other.getLocale(ULOC_ACTUAL_LOCALE, status)); + locBased.setLocaleIDs(other.validLocale, other.actualLocale, status); + U_ASSERT(U_SUCCESS(status)); assignArray(fEras, fErasCount, other.fEras, other.fErasCount); assignArray(fEraNames, fEraNamesCount, other.fEraNames, other.fEraNamesCount); assignArray(fNarrowEras, fNarrowErasCount, other.fNarrowEras, other.fNarrowErasCount); @@ -497,6 +496,8 @@ DateFormatSymbols& DateFormatSymbols::operator=(const DateFormatSymbols& other) DateFormatSymbols::~DateFormatSymbols() { dispose(); + delete actualLocale; + delete validLocale; } void DateFormatSymbols::dispose() @@ -536,6 +537,10 @@ void DateFormatSymbols::dispose() delete[] fStandaloneWideDayPeriods; delete[] fStandaloneNarrowDayPeriods; + delete actualLocale; + actualLocale = nullptr; + delete validLocale; + validLocale = nullptr; disposeZoneStrings(); } @@ -2302,7 +2307,7 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // 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.getAlias(), ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(cb.getAlias(), ULOC_ACTUAL_LOCALE, &status)); + ures_getLocaleByType(cb.getAlias(), ULOC_ACTUAL_LOCALE, &status), status); // Load eras initField(&fEras, fErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesAbbrTag, status), status); @@ -2528,8 +2533,7 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError Locale DateFormatSymbols::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } U_NAMESPACE_END diff --git a/icu4c/source/i18n/erarules.cpp b/icu4c/source/i18n/erarules.cpp index 8ab6f00ae04..d23d7d516c7 100644 --- a/icu4c/source/i18n/erarules.cpp +++ b/icu4c/source/i18n/erarules.cpp @@ -305,8 +305,9 @@ void EraRules::initCurrentEra() { localMillis += (rawOffset + dstOffset); } - int year, month0, dom, dow, doy, mid; - Grego::timeToFields(localMillis, year, month0, dom, dow, doy, mid, ec); + int32_t year, mid; + int8_t month0, dom; + Grego::timeToFields(localMillis, year, month0, dom, mid, ec); if (U_FAILURE(ec)) return; int currentEncodedDate = encodeDate(year, month0 + 1 /* changes to 1-base */, dom); int eraIdx = numEras - 1; diff --git a/icu4c/source/i18n/format.cpp b/icu4c/source/i18n/format.cpp index 10856a4acba..b4aec1d9811 100644 --- a/icu4c/source/i18n/format.cpp +++ b/icu4c/source/i18n/format.cpp @@ -24,6 +24,7 @@ #include "utypeinfo.h" // for 'typeid' to work #include "unicode/utypes.h" +#include "charstr.h" #ifndef U_I18N_IMPLEMENTATION #error U_I18N_IMPLEMENTATION not set - must be set for all ICU source files in i18n/ - see https://unicode-org.github.io/icu/userguide/howtouseicu @@ -72,13 +73,14 @@ FieldPosition::clone() const { Format::Format() : UObject() { - *validLocale = *actualLocale = 0; } // ------------------------------------- Format::~Format() { + delete actualLocale; + delete validLocale; } // ------------------------------------- @@ -97,8 +99,10 @@ Format& Format::operator=(const Format& that) { if (this != &that) { - uprv_strcpy(validLocale, that.validLocale); - uprv_strcpy(actualLocale, that.actualLocale); + UErrorCode status = U_ZERO_ERROR; + U_LOCALE_BASED(locBased, *this); + locBased.setLocaleIDs(that.validLocale, that.actualLocale, status); + U_ASSERT(U_SUCCESS(status)); } return *this; } @@ -196,20 +200,20 @@ void Format::syntaxError(const UnicodeString& pattern, Locale Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } const char * Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocaleID(type, status); + return LocaleBased::getLocaleID(validLocale,actualLocale, type, status); } void Format::setLocaleIDs(const char* valid, const char* actual) { U_LOCALE_BASED(locBased, *this); - locBased.setLocaleIDs(valid, actual); + UErrorCode status = U_ZERO_ERROR; + locBased.setLocaleIDs(valid, actual, status); + U_ASSERT(U_SUCCESS(status)); } U_NAMESPACE_END diff --git a/icu4c/source/i18n/gregocal.cpp b/icu4c/source/i18n/gregocal.cpp index 23366c7ab7a..e012317c374 100644 --- a/icu4c/source/i18n/gregocal.cpp +++ b/icu4c/source/i18n/gregocal.cpp @@ -147,6 +147,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GregorianCalendar) // in Java, -12219292800000L //const UDate GregorianCalendar::kPapalCutover = -12219292800000L; static const uint32_t kCutoverJulianDay = 2299161; +static const int32_t kDefaultCutoverYear = 1582; static const UDate kPapalCutover = (2299161.0 - kEpochStartAsJulianDay) * U_MILLIS_PER_DAY; //static const UDate kPapalCutoverJulian = (2299161.0 - kEpochStartAsJulianDay); @@ -155,7 +156,7 @@ static const UDate kPapalCutover = (2299161.0 - kEpochStartAsJulianDay) * U_MILL GregorianCalendar::GregorianCalendar(UErrorCode& status) : Calendar(status), fGregorianCutover(kPapalCutover), -fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), +fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(kDefaultCutoverYear), fIsGregorian(true), fInvertGregorian(false) { setTimeInMillis(getNow(), status); @@ -164,34 +165,22 @@ fIsGregorian(true), fInvertGregorian(false) // ------------------------------------- GregorianCalendar::GregorianCalendar(TimeZone* zone, UErrorCode& status) -: Calendar(zone, Locale::getDefault(), status), -fGregorianCutover(kPapalCutover), -fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), -fIsGregorian(true), fInvertGregorian(false) +: GregorianCalendar(zone, Locale::getDefault(), status) { - setTimeInMillis(getNow(), status); } // ------------------------------------- GregorianCalendar::GregorianCalendar(const TimeZone& zone, UErrorCode& status) -: Calendar(zone, Locale::getDefault(), status), -fGregorianCutover(kPapalCutover), -fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), -fIsGregorian(true), fInvertGregorian(false) +: GregorianCalendar(zone, Locale::getDefault(), status) { - setTimeInMillis(getNow(), status); } // ------------------------------------- GregorianCalendar::GregorianCalendar(const Locale& aLocale, UErrorCode& status) -: Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, status), -fGregorianCutover(kPapalCutover), -fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), -fIsGregorian(true), fInvertGregorian(false) +: GregorianCalendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, status) { - setTimeInMillis(getNow(), status); } // ------------------------------------- @@ -200,7 +189,7 @@ GregorianCalendar::GregorianCalendar(TimeZone* zone, const Locale& aLocale, UErrorCode& status) : Calendar(zone, aLocale, status), fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(kDefaultCutoverYear), fIsGregorian(true), fInvertGregorian(false) { setTimeInMillis(getNow(), status); @@ -212,7 +201,7 @@ GregorianCalendar::GregorianCalendar(const TimeZone& zone, const Locale& aLocale UErrorCode& status) : Calendar(zone, aLocale, status), fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(kDefaultCutoverYear), fIsGregorian(true), fInvertGregorian(false) { setTimeInMillis(getNow(), status); @@ -224,7 +213,7 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, UErrorCode& status) : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(kDefaultCutoverYear), fIsGregorian(true), fInvertGregorian(false) { set(UCAL_ERA, AD); @@ -237,15 +226,8 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, UErrorCode& status) - : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), - fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), - fIsGregorian(true), fInvertGregorian(false) + : GregorianCalendar(year, month, date, status) { - set(UCAL_ERA, AD); - set(UCAL_YEAR, year); - set(UCAL_MONTH, month); - set(UCAL_DATE, date); set(UCAL_HOUR_OF_DAY, hour); set(UCAL_MINUTE, minute); } @@ -255,17 +237,8 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second, UErrorCode& status) - : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), - fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), - fIsGregorian(true), fInvertGregorian(false) + : GregorianCalendar(year, month, date, hour, minute, status) { - set(UCAL_ERA, AD); - set(UCAL_YEAR, year); - set(UCAL_MONTH, month); - set(UCAL_DATE, date); - set(UCAL_HOUR_OF_DAY, hour); - set(UCAL_MINUTE, minute); set(UCAL_SECOND, second); } @@ -1186,14 +1159,10 @@ int32_t GregorianCalendar::handleGetExtendedYear(UErrorCode& status) { int32_t year = kEpochYear; // year field to use - int32_t yearField = UCAL_EXTENDED_YEAR; - // There are three separate fields which could be used to // derive the proper year. Use the one most recently set. - if (fStamp[yearField] < fStamp[UCAL_YEAR]) - yearField = UCAL_YEAR; - if (fStamp[yearField] < fStamp[UCAL_YEAR_WOY]) - yearField = UCAL_YEAR_WOY; + UCalendarDateFields yearField = newerField( + newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR), UCAL_YEAR_WOY); // based on the "best" year field, get the year switch(yearField) { diff --git a/icu4c/source/i18n/gregoimp.cpp b/icu4c/source/i18n/gregoimp.cpp index d5c8437a9b8..161897b027a 100644 --- a/icu4c/source/i18n/gregoimp.cpp +++ b/icu4c/source/i18n/gregoimp.cpp @@ -117,50 +117,91 @@ int64_t Grego::fieldsToDay(int32_t year, int32_t month, int32_t dom) { return julian - JULIAN_1970_CE; // JD => epoch day } -void Grego::dayToFields(int32_t day, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, int32_t& doy, UErrorCode& status) { - +void Grego::dayToFields(int32_t day, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int16_t& doy, UErrorCode& status) { + year = dayToYear(day, doy, status); // one-based doy if (U_FAILURE(status)) return; + // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar) if (uprv_add32_overflow(day, JULIAN_1970_CE - JULIAN_1_CE, &day)) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } - // Convert from the day number to the multiple radix - // representation. We use 400-year, 100-year, and 4-year cycles. - // For example, the 4-year cycle has 4 years + 1 leap day; giving - // 1461 == 365*4 + 1 days. - int32_t n400 = ClockMath::floorDivide(day, 146097, &doy); // 400-year cycle length - int32_t n100 = ClockMath::floorDivide(doy, 36524, &doy); // 100-year cycle length - int32_t n4 = ClockMath::floorDivide(doy, 1461, &doy); // 4-year cycle length - int32_t n1 = ClockMath::floorDivide(doy, 365, &doy); - year = 400*n400 + 100*n100 + 4*n4 + n1; - if (n100 == 4 || n1 == 4) { - doy = 365; // Dec 31 at end of 4- or 400-year cycle - } else { - ++year; - } - - UBool isLeap = isLeapYear(year); - // Gregorian day zero is a Monday. dow = (day + 1) % 7; dow += (dow < 0) ? (UCAL_SUNDAY + 7) : UCAL_SUNDAY; // Common Julian/Gregorian calculation int32_t correction = 0; + bool isLeap = isLeapYear(year); int32_t march1 = isLeap ? 60 : 59; // zero-based DOY for March 1 - if (doy >= march1) { + if (doy > march1) { correction = isLeap ? 1 : 2; } - month = (12 * (doy + correction) + 6) / 367; // zero-based month - dom = doy - DAYS_BEFORE[month + (isLeap ? 12 : 0)] + 1; // one-based DOM - doy++; // one-based doy + month = (12 * (doy - 1 + correction) + 6) / 367; // zero-based month + dom = doy - DAYS_BEFORE[month + (isLeap ? 12 : 0)]; // one-based DOM } -void Grego::timeToFields(UDate time, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, int32_t& doy, int32_t& mid, UErrorCode& status) { +int32_t Grego::dayToYear(int32_t day, UErrorCode& status) { + int16_t unusedDOY; + return dayToYear(day, unusedDOY, status); +} + +int32_t Grego::dayToYear(int32_t day, int16_t& doy, UErrorCode& status) { + if (U_FAILURE(status)) return 0; + // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar) + if (uprv_add32_overflow(day, JULIAN_1970_CE - JULIAN_1_CE, &day)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + // Convert from the day number to the multiple radix + // representation. We use 400-year, 100-year, and 4-year cycles. + // For example, the 4-year cycle has 4 years + 1 leap day; giving + // 1461 == 365*4 + 1 days. + int32_t doy32; + int32_t n400 = ClockMath::floorDivide(day, 146097, &doy32); // 400-year cycle length + int32_t n100 = ClockMath::floorDivide(doy32, 36524, &doy32); // 100-year cycle length + int32_t n4 = ClockMath::floorDivide(doy32, 1461, &doy32); // 4-year cycle length + int32_t n1 = ClockMath::floorDivide(doy32, 365, &doy32); + int32_t year = 400*n400 + 100*n100 + 4*n4 + n1; + if (n100 == 4 || n1 == 4) { + doy = 365; // Dec 31 at end of 4- or 400-year cycle + } else { + doy = doy32; + ++year; + } + doy++; // one-based doy + return year; +} + +void Grego::dayToFields(int32_t day, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, UErrorCode& status) { + int16_t unusedDOY; + dayToFields(day, year, month, dom, dow, unusedDOY, status); +} + +void Grego::dayToFields(int32_t day, int32_t& year, int8_t& month, + int8_t& dom, int16_t& doy, UErrorCode& status) { + int8_t unusedDOW; + dayToFields(day, year, month, dom, unusedDOW, doy, status); +} + +void Grego::timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int32_t& mid, UErrorCode& status) { + int8_t unusedDOW; + timeToFields(time, year, month, dom, unusedDOW, mid, status); +} + +void Grego::timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int32_t& mid, UErrorCode& status) { + int16_t unusedDOY; + timeToFields(time, year, month, dom, dow, unusedDOY, mid, status); +} + +void Grego::timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int16_t& doy, int32_t& mid, UErrorCode& status) { if (U_FAILURE(status)) return; double millisInDay; double day = ClockMath::floorDivide(static_cast(time), static_cast(U_MILLIS_PER_DAY), &millisInDay); @@ -168,6 +209,13 @@ void Grego::timeToFields(UDate time, int32_t& year, int32_t& month, dayToFields(day, year, month, dom, dow, doy, status); } +int32_t Grego::timeToYear(UDate time, UErrorCode& status) { + if (U_FAILURE(status)) return 0; + double millisInDay; + int32_t day = ClockMath::floorDivide(static_cast(time), static_cast(U_MILLIS_PER_DAY), &millisInDay); + return Grego::dayToYear(day, status); +} + int32_t Grego::dayOfWeek(int32_t day) { int32_t dow; ClockMath::floorDivide(day + int{UCAL_THURSDAY}, 7, &dow); diff --git a/icu4c/source/i18n/gregoimp.h b/icu4c/source/i18n/gregoimp.h index e069fb60de7..39881c0eefb 100644 --- a/icu4c/source/i18n/gregoimp.h +++ b/icu4c/source/i18n/gregoimp.h @@ -210,8 +210,21 @@ class Grego { * @param doy output parameter to receive day-of-year (1-based) * @param status error code. */ - static void dayToFields(int32_t day, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, int32_t& doy, UErrorCode& status); + static void dayToFields(int32_t day, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int16_t& doy, UErrorCode& status); + + /** + * Convert a 1970-epoch day number to proleptic Gregorian year, + * month, day-of-month, and day-of-week. + * @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 doy output parameter to receive day-of-year (1-based) + * @param status error code. + */ + static void dayToFields(int32_t day, int32_t& year, int8_t& month, + int8_t& dom, int16_t& doy, UErrorCode& status); /** * Convert a 1970-epoch day number to proleptic Gregorian year, @@ -223,8 +236,24 @@ class Grego { * @param dow output parameter to receive day-of-week (1-based, 1==Sun) * @param status error code. */ - static inline void dayToFields(int32_t day, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, UErrorCode& status); + static void dayToFields(int32_t day, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, UErrorCode& status); + + /** + * Convert a 1970-epoch day number to proleptic Gregorian year. + * @param day 1970-epoch day + * @param status error code. + * @return year. + */ + static int32_t dayToYear(int32_t day, UErrorCode& status); + /** + * Convert a 1970-epoch day number to proleptic Gregorian year. + * @param day 1970-epoch day + * @param doy output parameter to receive day-of-year (1-based) + * @param status error code. + * @return year. + */ + static int32_t dayToYear(int32_t day, int16_t& doy, UErrorCode& status); /** * Convert a 1970-epoch milliseconds to proleptic Gregorian year, @@ -238,8 +267,43 @@ class Grego { * @param mid output parameter to receive millis-in-day * @param status error code. */ - static void timeToFields(UDate time, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, int32_t& doy, int32_t& mid, UErrorCode& status); + static void timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int16_t& doy, int32_t& mid, UErrorCode& status); + + /** + * Convert a 1970-epoch milliseconds to proleptic Gregorian year, + * month, day-of-month, and day-of-week, day of year and millis-in-day. + * @param time 1970-epoch milliseconds + * @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 mid output parameter to receive millis-in-day + * @param status error code. + */ + static void timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int32_t& mid, UErrorCode& status); + + /** + * Convert a 1970-epoch milliseconds to proleptic Gregorian year, + * month, day-of-month, and day-of-week, day of year and millis-in-day. + * @param time 1970-epoch milliseconds + * @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 mid output parameter to receive millis-in-day + * @param status error code. + */ + static void timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int32_t& mid, UErrorCode& status); + + /** + * Convert a 1970-epoch milliseconds to proleptic Gregorian year. + * @param time 1970-epoch milliseconds + * @param status error code. + * @return year. + */ + static int32_t timeToYear(UDate time, UErrorCode& status); /** * Return the day of week on the 1970-epoch day @@ -305,12 +369,6 @@ Grego::previousMonthLength(int y, int m) { return (m > 0) ? monthLength(y, m-1) : 31; } -inline void Grego::dayToFields(int32_t day, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, UErrorCode& status) { - int32_t doy_unused; - dayToFields(day,year,month,dom,dow,doy_unused, status); -} - inline double Grego::julianDayToMillis(int32_t julian) { return (static_cast(julian) - kEpochStartAsJulianDay) * kOneDay; diff --git a/icu4c/source/i18n/hebrwcal.cpp b/icu4c/source/i18n/hebrwcal.cpp index ef70a48f235..1f8a4bc341c 100644 --- a/icu4c/source/i18n/hebrwcal.cpp +++ b/icu4c/source/i18n/hebrwcal.cpp @@ -164,7 +164,6 @@ HebrewCalendar::HebrewCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } diff --git a/icu4c/source/i18n/indiancal.cpp b/icu4c/source/i18n/indiancal.cpp index b1fd39b9927..c10702351c9 100644 --- a/icu4c/source/i18n/indiancal.cpp +++ b/icu4c/source/i18n/indiancal.cpp @@ -41,7 +41,6 @@ IndianCalendar* IndianCalendar::clone() const { IndianCalendar::IndianCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } IndianCalendar::IndianCalendar(const IndianCalendar& other) : Calendar(other) { @@ -143,18 +142,6 @@ static double gregorianToJD(int32_t year, int32_t month, int32_t date) { return Grego::fieldsToDay(year, month, date) + kEpochStartAsJulianDay - 0.5; } -/* - * Returns the Gregorian Date corresponding to a given Julian Day - * Month is 0 based. - * @param jd The Julian Day - */ -static int32_t* jdToGregorian(double jd, int32_t gregorianDate[3], UErrorCode& status) { - int32_t gdow; - Grego::dayToFields(jd - kEpochStartAsJulianDay, - gregorianDate[0], gregorianDate[1], gregorianDate[2], gdow, status); - return gregorianDate; -} - //------------------------------------------------------------------------- // Functions for converting from field values to milliseconds.... @@ -266,10 +253,9 @@ int32_t IndianCalendar::handleGetExtendedYear(UErrorCode& status) { void IndianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { double jdAtStartOfGregYear; int32_t leapMonth, IndianYear, yday, IndianMonth, IndianDayOfMonth, mday; - int32_t gregorianYear; // Stores gregorian date corresponding to Julian day; - int32_t gd[3]; + // Stores gregorian date corresponding to Julian day; + int32_t gregorianYear = Grego::dayToYear(julianDay - kEpochStartAsJulianDay, status); - gregorianYear = jdToGregorian(julianDay, gd, status)[0]; // Gregorian date for Julian day if (U_FAILURE(status)) return; IndianYear = gregorianYear - INDIAN_ERA_START; // Year in Saka era jdAtStartOfGregYear = gregorianToJD(gregorianYear, 0, 1); // JD at start of Gregorian year diff --git a/icu4c/source/i18n/islamcal.cpp b/icu4c/source/i18n/islamcal.cpp index dfeac36a665..727141fa291 100644 --- a/icu4c/source/i18n/islamcal.cpp +++ b/icu4c/source/i18n/islamcal.cpp @@ -202,7 +202,6 @@ IslamicCalendar* IslamicCalendar::clone() const { IslamicCalendar::IslamicCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } IslamicCalendar::~IslamicCalendar() diff --git a/icu4c/source/i18n/japancal.cpp b/icu4c/source/i18n/japancal.cpp index c0dd9fad0dc..b389b4530b2 100644 --- a/icu4c/source/i18n/japancal.cpp +++ b/icu4c/source/i18n/japancal.cpp @@ -115,7 +115,6 @@ JapaneseCalendar::JapaneseCalendar(const Locale& aLocale, UErrorCode& success) : GregorianCalendar(aLocale, success) { init(success); - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } JapaneseCalendar::~JapaneseCalendar() @@ -130,12 +129,6 @@ JapaneseCalendar::JapaneseCalendar(const JapaneseCalendar& source) U_ASSERT(U_SUCCESS(status)); } -JapaneseCalendar& JapaneseCalendar::operator= ( const JapaneseCalendar& right) -{ - GregorianCalendar::operator=(right); - return *this; -} - JapaneseCalendar* JapaneseCalendar::clone() const { return new JapaneseCalendar(*this); diff --git a/icu4c/source/i18n/japancal.h b/icu4c/source/i18n/japancal.h index 627b12750b9..3271cbfb794 100644 --- a/icu4c/source/i18n/japancal.h +++ b/icu4c/source/i18n/japancal.h @@ -104,13 +104,6 @@ public: */ JapaneseCalendar(const JapaneseCalendar& source); - /** - * Default assignment operator - * @param right the object to be copied. - * @internal - */ - JapaneseCalendar& operator=(const JapaneseCalendar& right); - /** * Create and return a polymorphic copy of this calendar. * @return return a polymorphic copy of this calendar. diff --git a/icu4c/source/i18n/messageformat2.cpp b/icu4c/source/i18n/messageformat2.cpp index 73f7fa45e69..77ce62b658a 100644 --- a/icu4c/source/i18n/messageformat2.cpp +++ b/icu4c/source/i18n/messageformat2.cpp @@ -3,6 +3,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -11,8 +13,10 @@ #include "unicode/messageformat2_data_model.h" #include "unicode/messageformat2_formattable.h" #include "unicode/messageformat2.h" +#include "unicode/normalizer2.h" #include "unicode/unistr.h" #include "messageformat2_allocation.h" +#include "messageformat2_checker.h" #include "messageformat2_evaluation.h" #include "messageformat2_macros.h" @@ -37,7 +41,7 @@ static Formattable evalLiteral(const Literal& lit) { // The fallback for a variable name is itself. UnicodeString str(DOLLAR); str += var; - const Formattable* val = context.getGlobal(var, errorCode); + const Formattable* val = context.getGlobal(*this, var, errorCode); if (U_SUCCESS(errorCode)) { return (FormattedPlaceholder(*val, str)); } @@ -52,9 +56,9 @@ static Formattable evalLiteral(const Literal& lit) { } [[nodiscard]] FormattedPlaceholder MessageFormatter::formatOperand(const Environment& env, - const Operand& rand, - MessageContext& context, - UErrorCode &status) const { + const Operand& rand, + MessageContext& context, + UErrorCode &status) const { if (U_FAILURE(status)) { return {}; } @@ -71,15 +75,19 @@ static Formattable evalLiteral(const Literal& lit) { // Eager vs. lazy evaluation is an open issue: // see https://github.com/unicode-org/message-format-wg/issues/299 + // NFC-normalize the variable name. See + // https://github.com/unicode-org/message-format-wg/blob/main/spec/syntax.md#names-and-identifiers + const VariableName normalized = normalizeNFC(var); + // Look up the variable in the environment - if (env.has(var)) { + if (env.has(normalized)) { // `var` is a local -- look it up - const Closure& rhs = env.lookup(var); + const Closure& rhs = env.lookup(normalized); // 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); + FormattedPlaceholder result = evalArgument(normalized, context, status); if (status == U_ILLEGAL_ARGUMENT_ERROR) { status = U_ZERO_ERROR; // Unbound variable -- set a resolution error @@ -328,13 +336,13 @@ void MessageFormatter::resolveSelectors(MessageContext& context, const Environme CHECK_ERROR(status); U_ASSERT(!dataModel.hasPattern()); - const Expression* selectors = dataModel.getSelectorsInternal(); + const VariableName* 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); + ResolvedSelector rv = formatSelector(env, selectors[i], context, status); if (rv.hasSelector()) { // 2ii. If selection is supported for rv: // (True if this code has been reached) @@ -461,8 +469,8 @@ void MessageFormatter::resolvePreferences(MessageContext& context, UVector& res, 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)(b) Let `ks` be the resolved value of `key` in Unicode Normalization Form C. + ks = normalizeNFC(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); @@ -523,7 +531,7 @@ void MessageFormatter::filterVariants(const UVector& pref, UVector& vars, UError // 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(); + UnicodeString ks = normalizeNFC(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` @@ -585,7 +593,7 @@ void MessageFormatter::sortVariants(const UVector& pref, UVector& vars, UErrorCo // 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(); + UnicodeString ks = normalizeNFC(key.asLiteral().unquoted()); // 5iii(c)(c) Let matchpref be the integer position of ks in `matches`. matchpref = vectorFind(matches, ks); U_ASSERT(matchpref >= 0); @@ -606,7 +614,10 @@ void MessageFormatter::sortVariants(const UVector& pref, UVector& vars, UErrorCo // Evaluate the operand -ResolvedSelector MessageFormatter::resolveVariables(const Environment& env, const Operand& rand, MessageContext& context, UErrorCode &status) const { +ResolvedSelector MessageFormatter::resolveVariables(const Environment& env, + const Operand& rand, + MessageContext& context, + UErrorCode &status) const { if (U_FAILURE(status)) { return {}; } @@ -620,7 +631,13 @@ ResolvedSelector MessageFormatter::resolveVariables(const Environment& env, cons } // Must be variable - const VariableName& var = rand.asVariable(); + return resolveVariables(env, rand.asVariable(), context, status); +} + +ResolvedSelector MessageFormatter::resolveVariables(const Environment& env, + const VariableName& var, + MessageContext& context, + UErrorCode &status) const { // Resolve the variable if (env.has(var)) { const Closure& referent = env.lookup(var); @@ -683,13 +700,16 @@ ResolvedSelector MessageFormatter::resolveVariables(const Environment& env, } } -ResolvedSelector MessageFormatter::formatSelectorExpression(const Environment& globalEnv, const Expression& expr, MessageContext& context, UErrorCode &status) const { +ResolvedSelector MessageFormatter::formatSelector(const Environment& globalEnv, + const VariableName& var, + 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); + ResolvedSelector exprResult = resolveVariables(globalEnv, var, context, status); DynamicErrors& err = context.getErrors(); @@ -761,6 +781,7 @@ void MessageFormatter::formatSelectors(MessageContext& context, const Environmen 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 @@ -813,12 +834,14 @@ void MessageFormatter::check(MessageContext& context, const Environment& localEn // Check that variable is in scope const VariableName& var = rand.asVariable(); + UnicodeString normalized = normalizeNFC(var); + // Check local scope - if (localEnv.has(var)) { + if (localEnv.has(normalized)) { return; } // Check global scope - context.getGlobal(var, status); + context.getGlobal(*this, normalized, status); if (status == U_ILLEGAL_ARGUMENT_ERROR) { status = U_ZERO_ERROR; context.getErrors().setUnresolvedVariable(var, status); @@ -855,7 +878,10 @@ void MessageFormatter::checkDeclarations(MessageContext& context, 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); + env = Environment::create(normalizeNFC(decl.getVariable()), + Closure(rhs, *env), + env, + status); CHECK_ERROR(status); } } @@ -866,3 +892,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_allocation.h b/icu4c/source/i18n/messageformat2_allocation.h index 7be27e22252..5b06d085129 100644 --- a/icu4c/source/i18n/messageformat2_allocation.h +++ b/icu4c/source/i18n/messageformat2_allocation.h @@ -10,6 +10,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -139,6 +141,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_UTILS_H diff --git a/icu4c/source/i18n/messageformat2_arguments.cpp b/icu4c/source/i18n/messageformat2_arguments.cpp index ded3f4dda16..c43c600a2f4 100644 --- a/icu4c/source/i18n/messageformat2_arguments.cpp +++ b/icu4c/source/i18n/messageformat2_arguments.cpp @@ -3,12 +3,16 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 +#include "unicode/messageformat2.h" #include "unicode/messageformat2_arguments.h" #include "unicode/messageformat2_data_model_names.h" +#include "messageformat2_evaluation.h" #include "uvector.h" // U_ASSERT U_NAMESPACE_BEGIN @@ -22,11 +26,15 @@ namespace message2 { using Arguments = MessageArguments; - const Formattable* Arguments::getArgument(const VariableName& arg, UErrorCode& errorCode) const { + const Formattable* Arguments::getArgument(const MessageFormatter& context, + 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) { + UnicodeString normalized = context.normalizeNFC(argumentNames[i]); + // arg already assumed to be normalized + if (normalized == arg) { return &arguments[i]; } } @@ -57,3 +65,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_checker.cpp b/icu4c/source/i18n/messageformat2_checker.cpp index bdc5c383b6e..46b25ff389b 100644 --- a/icu4c/source/i18n/messageformat2_checker.cpp +++ b/icu4c/source/i18n/messageformat2_checker.cpp @@ -3,12 +3,16 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 +#include "unicode/messageformat2.h" #include "messageformat2_allocation.h" #include "messageformat2_checker.h" +#include "messageformat2_evaluation.h" #include "messageformat2_macros.h" #include "uvector.h" // U_ASSERT @@ -104,6 +108,14 @@ TypeEnvironment::~TypeEnvironment() {} // --------------------- +Key Checker::normalizeNFC(const Key& k) const { + if (k.isWildcard()) { + return k; + } + return Key(Literal(k.asLiteral().isQuoted(), + context.normalizeNFC(k.asLiteral().unquoted()))); +} + static bool areDefaultKeys(const Key* keys, int32_t len) { U_ASSERT(len > 0); for (int32_t i = 0; i < len; i++) { @@ -185,7 +197,7 @@ void Checker::checkVariants(UErrorCode& status) { // This variant was already checked, // so we know keys1.len == len for (int32_t kk = 0; kk < len; kk++) { - if (!(keys[kk] == keys1[kk])) { + if (!(normalizeNFC(keys[kk]) == normalizeNFC(keys1[kk]))) { allEqual = false; break; } @@ -205,18 +217,14 @@ void Checker::checkVariants(UErrorCode& status) { } } -void Checker::requireAnnotated(const TypeEnvironment& t, const Expression& selectorExpr, UErrorCode& status) { +void Checker::requireAnnotated(const TypeEnvironment& t, + const VariableName& selectorVar, + UErrorCode& status) { CHECK_ERROR(status); - if (selectorExpr.isFunctionCall()) { + if (t.get(selectorVar) == TypeEnvironment::Type::Annotated) { return; // No error } - 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); } @@ -226,7 +234,7 @@ void Checker::checkSelectors(const TypeEnvironment& t, UErrorCode& status) { // Check each selector; if it's not annotated, emit a // "missing selector annotation" error - const Expression* selectors = dataModel.getSelectorsInternal(); + const VariableName* selectors = dataModel.getSelectorsInternal(); for (int32_t i = 0; i < dataModel.numSelectors(); i++) { requireAnnotated(t, selectors[i], status); } @@ -312,3 +320,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_checker.h b/icu4c/source/i18n/messageformat2_checker.h index 4bb0498efb9..122f668f4b7 100644 --- a/icu4c/source/i18n/messageformat2_checker.h +++ b/icu4c/source/i18n/messageformat2_checker.h @@ -10,6 +10,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -56,15 +58,20 @@ namespace message2 { // an explicit declaration }; // class TypeEnvironment + class MessageFormatter; + // 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) {} + Checker(const MFDataModel& d, StaticErrors& e, const MessageFormatter& mf) + : dataModel(d), errors(e), context(mf) {} private: - void requireAnnotated(const TypeEnvironment&, const Expression&, UErrorCode&); + Key normalizeNFC(const Key&) const; + + void requireAnnotated(const TypeEnvironment&, const VariableName&, UErrorCode&); void addFreeVars(TypeEnvironment& t, const Operand&, UErrorCode&); void addFreeVars(TypeEnvironment& t, const Operator&, UErrorCode&); void addFreeVars(TypeEnvironment& t, const OptionMap&, UErrorCode&); @@ -78,6 +85,9 @@ namespace message2 { void check(const Pattern&); const MFDataModel& dataModel; StaticErrors& errors; + + // Used for NFC normalization + const MessageFormatter& context; }; // class Checker } // namespace message2 @@ -88,6 +98,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT_CHECKER_H diff --git a/icu4c/source/i18n/messageformat2_data_model.cpp b/icu4c/source/i18n/messageformat2_data_model.cpp index 3fe5f65b532..3406080695c 100644 --- a/icu4c/source/i18n/messageformat2_data_model.cpp +++ b/icu4c/source/i18n/messageformat2_data_model.cpp @@ -3,6 +3,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -691,9 +693,9 @@ Matcher::Matcher(const Matcher& other) { numSelectors = other.numSelectors; numVariants = other.numVariants; UErrorCode localErrorCode = U_ZERO_ERROR; - selectors.adoptInstead(copyArray(other.selectors.getAlias(), - numSelectors, - localErrorCode)); + selectors.adoptInstead(copyArray(other.selectors.getAlias(), + numSelectors, + localErrorCode)); variants.adoptInstead(copyArray(other.variants.getAlias(), numVariants, localErrorCode)); @@ -702,7 +704,7 @@ Matcher::Matcher(const Matcher& other) { } } -Matcher::Matcher(Expression* ss, int32_t ns, Variant* vs, int32_t nv) +Matcher::Matcher(VariableName* ss, int32_t ns, Variant* vs, int32_t nv) : selectors(ss), numSelectors(ns), variants(vs), numVariants(nv) {} Matcher::~Matcher() {} @@ -724,7 +726,7 @@ const Binding* MFDataModel::getLocalVariablesInternal() const { return bindings.getAlias(); } -const Expression* MFDataModel::getSelectorsInternal() const { +const VariableName* MFDataModel::getSelectorsInternal() const { U_ASSERT(!bogus); U_ASSERT(!hasPattern()); return std::get_if(&body)->selectors.getAlias(); @@ -786,15 +788,13 @@ MFDataModel::Builder& MFDataModel::Builder::addBinding(Binding&& b, UErrorCode& return *this; } -/* - selector must be non-null -*/ -MFDataModel::Builder& MFDataModel::Builder::addSelector(Expression&& selector, UErrorCode& status) noexcept { +MFDataModel::Builder& MFDataModel::Builder::addSelector(VariableName&& selector, + UErrorCode& status) { THIS_ON_ERROR(status); buildSelectorsMessage(status); U_ASSERT(selectors != nullptr); - selectors->adoptElement(create(std::move(selector), status), status); + selectors->adoptElement(create(std::move(selector), status), status); return *this; } @@ -830,11 +830,11 @@ MFDataModel::MFDataModel(const MFDataModel& other) : body(Pattern()) { if (other.hasPattern()) { body = *std::get_if(&other.body); } else { - const Expression* otherSelectors = other.getSelectorsInternal(); + const VariableName* otherSelectors = other.getSelectorsInternal(); const Variant* otherVariants = other.getVariantsInternal(); int32_t numSelectors = other.numSelectors(); int32_t numVariants = other.numVariants(); - Expression* copiedSelectors = copyArray(otherSelectors, numSelectors, localErrorCode); + VariableName* copiedSelectors = copyArray(otherSelectors, numSelectors, localErrorCode); Variant* copiedVariants = copyArray(otherVariants, numVariants, localErrorCode); if (U_FAILURE(localErrorCode)) { bogus = true; @@ -863,7 +863,9 @@ MFDataModel::MFDataModel(const MFDataModel::Builder& builder, UErrorCode& errorC int32_t numVariants = builder.variants->size(); int32_t numSelectors = builder.selectors->size(); LocalArray variants(copyVectorToArray(*builder.variants, errorCode), errorCode); - LocalArray selectors(copyVectorToArray(*builder.selectors, errorCode), errorCode); + LocalArray selectors(copyVectorToArray(*builder.selectors, + errorCode), + errorCode); if (U_FAILURE(errorCode)) { bogus = true; return; @@ -918,3 +920,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_errors.cpp b/icu4c/source/i18n/messageformat2_errors.cpp index 9d1d6bab81a..5d3d938f020 100644 --- a/icu4c/source/i18n/messageformat2_errors.cpp +++ b/icu4c/source/i18n/messageformat2_errors.cpp @@ -3,6 +3,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -290,3 +292,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_errors.h b/icu4c/source/i18n/messageformat2_errors.h index f84aa736283..085263e88b0 100644 --- a/icu4c/source/i18n/messageformat2_errors.h +++ b/icu4c/source/i18n/messageformat2_errors.h @@ -15,6 +15,8 @@ * \brief C++ API: Formats messages using the draft MessageFormat 2.0. */ +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -151,6 +153,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_ERRORS_H diff --git a/icu4c/source/i18n/messageformat2_evaluation.cpp b/icu4c/source/i18n/messageformat2_evaluation.cpp index 41e4c9a8020..3ba54c6b389 100644 --- a/icu4c/source/i18n/messageformat2_evaluation.cpp +++ b/icu4c/source/i18n/messageformat2_evaluation.cpp @@ -3,6 +3,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -190,13 +192,16 @@ PrioritizedVariant::~PrioritizedVariant() {} errors.checkErrors(status); } - const Formattable* MessageContext::getGlobal(const VariableName& v, UErrorCode& errorCode) const { - return arguments.getArgument(v, errorCode); + const Formattable* MessageContext::getGlobal(const MessageFormatter& context, + const VariableName& v, + UErrorCode& errorCode) const { + return arguments.getArgument(context, v, errorCode); } MessageContext::MessageContext(const MessageArguments& args, const StaticErrors& e, UErrorCode& status) : arguments(args), errors(e, status) {} + MessageContext::~MessageContext() {} } // namespace message2 @@ -205,3 +210,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_evaluation.h b/icu4c/source/i18n/messageformat2_evaluation.h index b8ae0242367..ae8b4a08a3b 100644 --- a/icu4c/source/i18n/messageformat2_evaluation.h +++ b/icu4c/source/i18n/messageformat2_evaluation.h @@ -14,6 +14,7 @@ * \file * \brief C++ API: Formats messages using the draft MessageFormat 2.0. */ +#if !UCONFIG_NO_NORMALIZATION #if !UCONFIG_NO_FORMATTING @@ -174,11 +175,15 @@ namespace message2 { // The context contains all the information needed to process // an entire message: arguments, formatter cache, and error list + class MessageFormatter; + class MessageContext : public UMemory { public: MessageContext(const MessageArguments&, const StaticErrors&, UErrorCode&); - const Formattable* getGlobal(const VariableName&, UErrorCode&) const; + const Formattable* getGlobal(const MessageFormatter&, + const VariableName&, + UErrorCode&) const; // If any errors were set, update `status` accordingly void checkErrors(UErrorCode& status) const; @@ -191,6 +196,7 @@ namespace message2 { const MessageArguments& arguments; // External message arguments // Errors accumulated during parsing/formatting DynamicErrors errors; + }; // class MessageContext } // namespace message2 @@ -201,6 +207,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_EVALUATION_H diff --git a/icu4c/source/i18n/messageformat2_formattable.cpp b/icu4c/source/i18n/messageformat2_formattable.cpp index 3152ccb44fd..4e2df49aecc 100644 --- a/icu4c/source/i18n/messageformat2_formattable.cpp +++ b/icu4c/source/i18n/messageformat2_formattable.cpp @@ -3,6 +3,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -336,3 +338,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_formatter.cpp b/icu4c/source/i18n/messageformat2_formatter.cpp index 8d17ae49b99..625d87de6de 100644 --- a/icu4c/source/i18n/messageformat2_formatter.cpp +++ b/icu4c/source/i18n/messageformat2_formatter.cpp @@ -3,6 +3,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -43,7 +45,8 @@ namespace message2 { // Parse the pattern MFDataModel::Builder tree(errorCode); - Parser(pat, tree, *errors, normalizedInput).parse(parseError, errorCode); + Parser(pat, tree, *errors, normalizedInput, errorCode) + .parse(parseError, errorCode); // Fail on syntax errors if (errors->hasSyntaxError()) { @@ -116,6 +119,24 @@ namespace message2 { // MessageFormatter + // Returns the NFC-normalized version of s, returning s itself + // if it's already normalized. + UnicodeString MessageFormatter::normalizeNFC(const UnicodeString& s) const { + UErrorCode status = U_ZERO_ERROR; + // Check if string is already normalized + UNormalizationCheckResult result = nfcNormalizer->quickCheck(s, status); + // If so, return it + if (U_SUCCESS(status) && result == UNORM_YES) { + return s; + } + // Otherwise, normalize it + UnicodeString normalized = nfcNormalizer->normalize(s, status); + if (U_FAILURE(status)) { + return {}; + } + return normalized; + } + MessageFormatter::MessageFormatter(const MessageFormatter::Builder& builder, UErrorCode &success) : locale(builder.locale), customMFFunctionRegistry(builder.customMFFunctionRegistry) { CHECK_ERROR(success); @@ -163,6 +184,8 @@ namespace message2 { errors = errorsNew.orphan(); } + nfcNormalizer = Normalizer2::getNFCInstance(success); + // Note: we currently evaluate variables lazily, // without memoization. This call is still necessary // to check out-of-scope uses of local variables in @@ -170,7 +193,7 @@ namespace message2 { // only be checked when arguments are known) // Check for resolution errors - Checker(dataModel, *errors).check(success); + Checker(dataModel, *errors, *this).check(success); } void MessageFormatter::cleanup() noexcept { @@ -191,6 +214,7 @@ namespace message2 { signalErrors = other.signalErrors; errors = other.errors; other.errors = nullptr; + nfcNormalizer = other.nfcNormalizer; return *this; } @@ -352,3 +376,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_function_registry.cpp b/icu4c/source/i18n/messageformat2_function_registry.cpp index 17955760ecf..b4c33544dc9 100644 --- a/icu4c/source/i18n/messageformat2_function_registry.cpp +++ b/icu4c/source/i18n/messageformat2_function_registry.cpp @@ -3,6 +3,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -1242,3 +1244,4 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_function_registry_internal.h b/icu4c/source/i18n/messageformat2_function_registry_internal.h index 733fc5e945d..46845976384 100644 --- a/icu4c/source/i18n/messageformat2_function_registry_internal.h +++ b/icu4c/source/i18n/messageformat2_function_registry_internal.h @@ -10,6 +10,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -226,6 +228,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_FUNCTION_REGISTRY_INTERNAL_H diff --git a/icu4c/source/i18n/messageformat2_macros.h b/icu4c/source/i18n/messageformat2_macros.h index f06ed1a5a97..20e81377d4d 100644 --- a/icu4c/source/i18n/messageformat2_macros.h +++ b/icu4c/source/i18n/messageformat2_macros.h @@ -10,6 +10,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -97,6 +99,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_MACROS_H diff --git a/icu4c/source/i18n/messageformat2_parser.cpp b/icu4c/source/i18n/messageformat2_parser.cpp index b4768756c5e..f61596e4f4a 100644 --- a/icu4c/source/i18n/messageformat2_parser.cpp +++ b/icu4c/source/i18n/messageformat2_parser.cpp @@ -3,13 +3,18 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 +#include "unicode/uniset.h" #include "messageformat2_errors.h" #include "messageformat2_macros.h" #include "messageformat2_parser.h" +#include "ucln_in.h" +#include "umutex.h" #include "uvector.h" // U_ASSERT U_NAMESPACE_BEGIN @@ -91,14 +96,235 @@ static void copyContext(const UChar in[U_PARSE_CONTEXT_LEN], UChar out[U_PARSE_C } // ------------------------------------- -// Predicates +// Initialization of UnicodeSets -// Returns true if `c` is in the interval [`first`, `last`] -static bool inRange(UChar32 c, UChar32 first, UChar32 last) { - U_ASSERT(first < last); - return c >= first && c <= last; +namespace unisets { + +UnicodeSet* gUnicodeSets[unisets::UNISETS_KEY_COUNT] = {}; + +inline UnicodeSet* getImpl(Key key) { + return gUnicodeSets[key]; } +icu::UInitOnce gMF2ParseUniSetsInitOnce {}; +} + +UnicodeSet* initContentChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(0x0001, 0x0008); // Omit NULL, HTAB and LF + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(0x000B, 0x000C); // Omit CR + result->add(0x000E, 0x001F); // Omit SP + result->add(0x0021, 0x002D); // Omit '.' + result->add(0x002F, 0x003F); // Omit '@' + result->add(0x0041, 0x005B); // Omit '\' + result->add(0x005D, 0x007A); // Omit { | } + result->add(0x007E, 0x2FFF); // Omit IDEOGRAPHIC_SPACE + result->add(0x3001, 0x10FFFF); // Allowing surrogates is intentional + result->freeze(); + return result; +} + +UnicodeSet* initWhitespace(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(SPACE); + result->add(HTAB); + result->add(CR); + result->add(LF); + result->add(IDEOGRAPHIC_SPACE); + result->freeze(); + return result; +} + +UnicodeSet* initBidiControls(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[\\u061C]"), status); + if (U_FAILURE(status)) { + return {}; + } + result->add(0x200E, 0x200F); + result->add(0x2066, 0x2069); + result->freeze(); + return result; +} + +UnicodeSet* initAlpha(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[:letter:]"), status); + if (U_FAILURE(status)) { + return {}; + } + result->freeze(); + return result; +} + +UnicodeSet* initDigits(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[:number:]"), status); + if (U_FAILURE(status)) { + return {}; + } + result->freeze(); + return result; +} + +UnicodeSet* initNameStartChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(*unisets::getImpl(unisets::ALPHA)); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->add(UNDERSCORE); + result->add(0x00C0, 0x00D6); + result->add(0x00D8, 0x00F6); + result->add(0x00F8, 0x02FF); + result->add(0x0370, 0x037D); + result->add(0x037F, 0x061B); + result->add(0x061D, 0x1FFF); + result->add(0x200C, 0x200D); + result->add(0x2070, 0x218F); + result->add(0x2C00, 0x2FEF); + result->add(0x3001, 0xD7FF); + result->add(0xF900, 0xFDCF); + result->add(0xFDF0, 0xFFFD); + result->add(0x100000, 0xEFFFF); + result->freeze(); + return result; +} + +UnicodeSet* initNameChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->addAll(*unisets::getImpl(unisets::NAME_START)); + result->addAll(*unisets::getImpl(unisets::DIGIT)); + result->add(HYPHEN); + result->add(PERIOD); + result->add(0x00B7); + result->add(0x0300, 0x036F); + result->add(0x203F, 0x2040); + result->freeze(); + return result; +} + +UnicodeSet* initTextChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->addAll(*unisets::getImpl(unisets::CONTENT)); + result->addAll(*unisets::getImpl(unisets::WHITESPACE)); + result->add(PERIOD); + result->add(AT); + result->add(PIPE); + result->freeze(); + return result; +} + +UnicodeSet* initQuotedChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->addAll(*unisets::getImpl(unisets::CONTENT)); + result->addAll(*unisets::getImpl(unisets::WHITESPACE)); + result->add(PERIOD); + result->add(AT); + result->add(LEFT_CURLY_BRACE); + result->add(RIGHT_CURLY_BRACE); + result->freeze(); + return result; +} + +UnicodeSet* initEscapableChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(PIPE); + result->add(BACKSLASH); + result->add(LEFT_CURLY_BRACE); + result->add(RIGHT_CURLY_BRACE); + result->freeze(); + return result; +} + +namespace unisets { + +UBool U_CALLCONV cleanupMF2ParseUniSets() { + for (int32_t i = 0; i < UNISETS_KEY_COUNT; i++) { + delete gUnicodeSets[i]; + gUnicodeSets[i] = nullptr; + } + gMF2ParseUniSetsInitOnce.reset(); + return true; +} + +void U_CALLCONV initMF2ParseUniSets(UErrorCode& status) { + ucln_i18n_registerCleanup(UCLN_I18N_MF2_UNISETS, cleanupMF2ParseUniSets); + + gUnicodeSets[unisets::CONTENT] = initContentChars(status); + gUnicodeSets[unisets::WHITESPACE] = initWhitespace(status); + gUnicodeSets[unisets::BIDI] = initBidiControls(status); + gUnicodeSets[unisets::ALPHA] = initAlpha(status); + gUnicodeSets[unisets::DIGIT] = initDigits(status); + gUnicodeSets[unisets::NAME_START] = initNameStartChars(status); + gUnicodeSets[unisets::NAME_CHAR] = initNameChars(status); + gUnicodeSets[unisets::TEXT] = initTextChars(status); + gUnicodeSets[unisets::QUOTED] = initQuotedChars(status); + gUnicodeSets[unisets::ESCAPABLE] = initEscapableChars(status); +} + +const UnicodeSet* get(Key key) { + UErrorCode localStatus = U_ZERO_ERROR; + umtx_initOnce(gMF2ParseUniSetsInitOnce, &initMF2ParseUniSets, localStatus); + if (U_FAILURE(localStatus)) { + return nullptr; + } + return getImpl(key); +} + +} + +// ------------------------------------- +// Predicates + /* The following helper predicates should exactly match nonterminals in the MessageFormat 2 grammar: @@ -113,76 +339,50 @@ static bool inRange(UChar32 c, UChar32 first, UChar32 last) { `isWhitespace()` : `s` */ -static bool isContentChar(UChar32 c) { - return inRange(c, 0x0001, 0x0008) // Omit NULL, HTAB and LF - || inRange(c, 0x000B, 0x000C) // Omit CR - || inRange(c, 0x000E, 0x001F) // Omit SP - || inRange(c, 0x0021, 0x002D) // Omit '.' - || inRange(c, 0x002F, 0x003F) // Omit '@' - || inRange(c, 0x0041, 0x005B) // Omit '\' - || inRange(c, 0x005D, 0x007A) // Omit { | } - || inRange(c, 0x007E, 0xD7FF) // Omit surrogates - || inRange(c, 0xE000, 0x10FFFF); +bool Parser::isContentChar(UChar32 c) const { + return contentChars->contains(c); } -// See `s` in the MessageFormat 2 grammar -inline bool isWhitespace(UChar32 c) { - switch (c) { - case SPACE: - case HTAB: - case CR: - case LF: - case IDEOGRAPHIC_SPACE: - return true; - default: - return false; - } +// See `bidi` in the MF2 grammar +bool Parser::isBidiControl(UChar32 c) const { + return bidiControlChars->contains(c); } -static bool isTextChar(UChar32 c) { - return isContentChar(c) - || isWhitespace(c) - || c == PERIOD - || c == AT - || c == PIPE; +// See `ws` in the MessageFormat 2 grammar +bool Parser::isWhitespace(UChar32 c) const { + return whitespaceChars->contains(c); } -static bool isAlpha(UChar32 c) { return inRange(c, 0x0041, 0x005A) || inRange(c, 0x0061, 0x007A); } - -static bool isDigit(UChar32 c) { return inRange(c, 0x0030, 0x0039); } - -static bool isNameStart(UChar32 c) { - return isAlpha(c) || c == UNDERSCORE || inRange(c, 0x00C0, 0x00D6) || inRange(c, 0x00D8, 0x00F6) || - inRange(c, 0x00F8, 0x02FF) || inRange(c, 0x0370, 0x037D) || inRange(c, 0x037F, 0x1FFF) || - inRange(c, 0x200C, 0x200D) || inRange(c, 0x2070, 0x218F) || inRange(c, 0x2C00, 0x2FEF) || - inRange(c, 0x3001, 0xD7FF) || inRange(c, 0xF900, 0xFDCF) || inRange(c, 0xFDF0, 0xFFFD) || - inRange(c, 0x10000, 0xEFFFF); +bool Parser::isTextChar(UChar32 c) const { + return textChars->contains(c); } -static bool isNameChar(UChar32 c) { - return isNameStart(c) || isDigit(c) || c == HYPHEN || c == PERIOD || c == 0x00B7 || - inRange(c, 0x0300, 0x036F) || inRange(c, 0x203F, 0x2040); +bool Parser::isAlpha(UChar32 c) const { + return alphaChars->contains(c); } -static bool isUnquotedStart(UChar32 c) { - return isNameStart(c) || isDigit(c) || c == HYPHEN || c == PERIOD || c == 0x00B7 || - inRange(c, 0x0300, 0x036F) || inRange(c, 0x203F, 0x2040); +bool Parser::isDigit(UChar32 c) const { + return digitChars->contains(c); } -static bool isQuotedChar(UChar32 c) { - return isContentChar(c) - || isWhitespace(c) - || c == PERIOD - || c == AT - || c == LEFT_CURLY_BRACE - || c == RIGHT_CURLY_BRACE; +bool Parser::isNameStart(UChar32 c) const { + return nameStartChars->contains(c); } -static bool isEscapableChar(UChar32 c) { - return c == PIPE - || c == BACKSLASH - || c == LEFT_CURLY_BRACE - || c == RIGHT_CURLY_BRACE; +bool Parser::isNameChar(UChar32 c) const { + return nameChars->contains(c); +} + +bool Parser::isUnquotedStart(UChar32 c) const { + return isNameChar(c); +} + +bool Parser::isQuotedChar(UChar32 c) const { + return quotedChars->contains(c); +} + +bool Parser::isEscapableChar(UChar32 c) const { + return escapableChars->contains(c); } // Returns true iff `c` can begin a `function` nonterminal @@ -203,12 +403,12 @@ static bool isAnnotationStart(UChar32 c) { } // Returns true iff `c` can begin a `literal` nonterminal -static bool isLiteralStart(UChar32 c) { +bool Parser::isLiteralStart(UChar32 c) const { return (c == PIPE || isNameStart(c) || c == HYPHEN || isDigit(c)); } // Returns true iff `c` can begin a `key` nonterminal -static bool isKeyStart(UChar32 c) { +bool Parser::isKeyStart(UChar32 c) const { return (c == ASTERISK || isLiteralStart(c)); } @@ -347,7 +547,7 @@ option, or the optional space before an attribute. No pre, no post. A message may end with whitespace, so `index` may equal `len()` on exit. */ -void Parser::parseWhitespaceMaybeRequired(bool required, UErrorCode& errorCode) { +void Parser::parseRequiredWS(UErrorCode& errorCode) { bool sawWhitespace = false; // The loop exits either when we consume all the input, @@ -358,7 +558,7 @@ void Parser::parseWhitespaceMaybeRequired(bool required, UErrorCode& errorCode) // If whitespace isn't required -- or if we saw it already -- // then the caller is responsible for checking this case and // setting an error if necessary. - if (!required || sawWhitespace) { + if (sawWhitespace) { // Not an error. return; } @@ -380,24 +580,51 @@ void Parser::parseWhitespaceMaybeRequired(bool required, UErrorCode& errorCode) } } - if (!sawWhitespace && required) { + if (!sawWhitespace) { ERROR(errorCode); } } +void Parser::parseOptionalBidi() { + while (true) { + if (!inBounds()) { + return; + } + if (isBidiControl(peek())) { + next(); + } else { + break; + } + } +} + /* - No pre, no post, for the same reason as `parseWhitespaceMaybeRequired()`. + No pre, no post, because a message may end with whitespace + Matches `s` in the MF2 grammar */ void Parser::parseRequiredWhitespace(UErrorCode& errorCode) { - parseWhitespaceMaybeRequired(true, errorCode); + parseOptionalBidi(); + parseRequiredWS(errorCode); + parseOptionalWhitespace(); normalizedInput += SPACE; } /* No pre, no post, for the same reason as `parseWhitespaceMaybeRequired()`. */ -void Parser::parseOptionalWhitespace(UErrorCode& errorCode) { - parseWhitespaceMaybeRequired(false, errorCode); +void Parser::parseOptionalWhitespace() { + while (true) { + if (!inBounds()) { + return; + } + auto cp = peek(); + if (isWhitespace(cp) || isBidiControl(cp)) { + maybeAdvanceLine(); + next(); + } else { + break; + } + } } // Consumes a single character, signaling an error if `peek()` != `c` @@ -442,11 +669,11 @@ void Parser::parseToken(const std::u16string_view& token, UErrorCode& errorCode) */ void Parser::parseTokenWithWhitespace(const std::u16string_view& token, UErrorCode& errorCode) { // No need for error check or bounds check before parseOptionalWhitespace - parseOptionalWhitespace(errorCode); + parseOptionalWhitespace(); // Establish precondition CHECK_BOUNDS(errorCode); parseToken(token, errorCode); - parseOptionalWhitespace(errorCode); + parseOptionalWhitespace(); // Guarantee postcondition CHECK_BOUNDS(errorCode); } @@ -458,12 +685,12 @@ void Parser::parseTokenWithWhitespace(const std::u16string_view& token, UErrorCo then consumes optional whitespace again */ void Parser::parseTokenWithWhitespace(UChar32 c, UErrorCode& errorCode) { - // No need for error check or bounds check before parseOptionalWhitespace(errorCode) - parseOptionalWhitespace(errorCode); + // No need for error check or bounds check before parseOptionalWhitespace() + parseOptionalWhitespace(); // Establish precondition CHECK_BOUNDS(errorCode); parseToken(c, errorCode); - parseOptionalWhitespace(errorCode); + parseOptionalWhitespace(); // Guarantee postcondition CHECK_BOUNDS(errorCode); } @@ -482,11 +709,17 @@ UnicodeString Parser::parseName(UErrorCode& errorCode) { U_ASSERT(inBounds()); - if (!isNameStart(peek())) { + if (!(isNameStart(peek()) || isBidiControl(peek()))) { ERROR(errorCode); return name; } + // name = [bidi] name-start *name-char [bidi] + + // [bidi] + parseOptionalBidi(); + + // name-start *name-char while (isNameChar(peek())) { UChar32 c = peek(); name += c; @@ -497,6 +730,10 @@ UnicodeString Parser::parseName(UErrorCode& errorCode) { break; } } + + // [bidi] + parseOptionalBidi(); + return name; } @@ -510,21 +747,13 @@ VariableName Parser::parseVariableName(UErrorCode& errorCode) { VariableName result; U_ASSERT(inBounds()); - // If the '$' is missing, we don't want a binding - // for this variable to be created. - bool valid = peek() == DOLLAR; + parseToken(DOLLAR, errorCode); if (!inBounds()) { ERROR(errorCode); return result; } - UnicodeString varName = parseName(errorCode); - // Set the name to "" if the variable wasn't - // declared correctly - if (!valid) { - varName.remove(); - } - return VariableName(varName); + return VariableName(parseName(errorCode)); } /* @@ -853,7 +1082,7 @@ void Parser::parseAttribute(AttributeAdder& attrAdder, UErrorCode& errorCode) // about whether whitespace precedes another // attribute, or the '=' sign int32_t savedIndex = index; - parseOptionalWhitespace(errorCode); + parseOptionalWhitespace(); Operand rand; if (peek() == EQUALS) { @@ -861,19 +1090,9 @@ void Parser::parseAttribute(AttributeAdder& attrAdder, UErrorCode& errorCode) parseTokenWithWhitespace(EQUALS, errorCode); UnicodeString rhsStr; - // Parse RHS, which is either a literal or variable - switch (peek()) { - case DOLLAR: { - rand = Operand(parseVariableName(errorCode)); - break; - } - default: { - // Must be a literal - rand = Operand(parseLiteral(errorCode)); - break; - } - } - U_ASSERT(!rand.isNull()); + // Parse RHS, which must be a literal + // attribute = "@" identifier [o "=" o literal] + rand = Operand(parseLiteral(errorCode)); } else { // attribute -> "@" identifier [[s] "=" [s]] // Use null operand, which `rand` is already set to @@ -881,7 +1100,7 @@ void Parser::parseAttribute(AttributeAdder& attrAdder, UErrorCode& errorCode) index = savedIndex; } - attrAdder.addAttribute(lhs, std::move(rand), errorCode); + attrAdder.addAttribute(lhs, std::move(Operand(rand)), errorCode); } /* @@ -1149,7 +1368,7 @@ the comment in `parseOptions()` for details. // (the character is either the required space before an annotation, or optional // trailing space after the literal or variable). It's still ambiguous which // one does apply. - parseOptionalWhitespace(status); + parseOptionalWhitespace(); // Restore precondition CHECK_BOUNDS(status); @@ -1220,7 +1439,7 @@ Expression Parser::parseExpression(UErrorCode& status) { // Parse opening brace parseToken(LEFT_CURLY_BRACE, status); // Optional whitespace after opening brace - parseOptionalWhitespace(status); + parseOptionalWhitespace(); Expression::Builder exprBuilder(status); // Restore precondition @@ -1263,7 +1482,7 @@ Expression Parser::parseExpression(UErrorCode& status) { // Parse optional space // (the last [s] in e.g. "{" [s] literal [s annotation] *(s attribute) [s] "}") - parseOptionalWhitespace(status); + parseOptionalWhitespace(); // Either an operand or operator (or both) must have been set already, // so there can't be an error @@ -1339,7 +1558,7 @@ void Parser::parseInputDeclaration(UErrorCode& status) { CHECK_BOUNDS(status); parseToken(ID_INPUT, status); - parseOptionalWhitespace(status); + parseOptionalWhitespace(); // Restore precondition before calling parseExpression() CHECK_BOUNDS(status); @@ -1400,7 +1619,7 @@ void Parser::parseDeclarations(UErrorCode& status) { // Avoid looping infinitely CHECK_ERROR(status); - parseOptionalWhitespace(status); + parseOptionalWhitespace(); // Restore precondition CHECK_BOUNDS(status); } @@ -1510,8 +1729,8 @@ This is addressed using "backtracking" (similarly to `parseOptions()`). // We've seen at least one whitespace-key pair, so now we can parse // *(s key) [s] - while (peek() != LEFT_CURLY_BRACE || isWhitespace(peek())) { // Try to recover from errors - bool wasWhitespace = isWhitespace(peek()); + while (peek() != LEFT_CURLY_BRACE || isWhitespace(peek()) || isBidiControl(peek())) { + bool wasWhitespace = isWhitespace(peek()) || isBidiControl(peek()); parseRequiredWhitespace(status); if (!wasWhitespace) { // Avoid infinite loop when parsing something like: @@ -1569,7 +1788,7 @@ Markup Parser::parseMarkup(UErrorCode& status) { // Consume the '{' next(); normalizedInput += LEFT_CURLY_BRACE; - parseOptionalWhitespace(status); + parseOptionalWhitespace(); bool closing = false; switch (peek()) { case NUMBER_SIGN: { @@ -1596,19 +1815,19 @@ Markup Parser::parseMarkup(UErrorCode& status) { // Parse the options, which must begin with a ' ' // if present - if (inBounds() && isWhitespace(peek())) { + if (inBounds() && (isWhitespace(peek()) || isBidiControl(peek()))) { OptionAdder optionAdder(builder); parseOptions(optionAdder, status); } // Parse the attributes, which also must begin // with a ' ' - if (inBounds() && isWhitespace(peek())) { + if (inBounds() && (isWhitespace(peek()) || isBidiControl(peek()))) { AttributeAdder attrAdder(builder); parseAttributes(attrAdder, status); } - parseOptionalWhitespace(status); + parseOptionalWhitespace(); bool standalone = false; // Check if this is a standalone or not @@ -1656,7 +1875,7 @@ std::variant Parser::parsePlaceholder(UErrorCode& status) { isMarkup = true; break; } - if (!isWhitespace(c)){ + if (!(isWhitespace(c) || isBidiControl(c))) { break; } tempIndex++; @@ -1712,7 +1931,7 @@ Pattern Parser::parseSimpleMessage(UErrorCode& status) { break; } // Don't loop infinitely - if (errors.hasSyntaxError()) { + if (errors.hasSyntaxError() || U_FAILURE(status)) { break; } } @@ -1720,6 +1939,22 @@ Pattern Parser::parseSimpleMessage(UErrorCode& status) { return result.build(status); } +void Parser::parseVariant(UErrorCode& status) { + CHECK_ERROR(status); + + // At least one key is required + SelectorKeys keyList(parseNonEmptyKeys(status)); + + // parseNonEmptyKeys() consumes any trailing whitespace, + // so the pattern can be consumed next. + + // Restore precondition before calling parsePattern() + // (which must return a non-null value) + CHECK_BOUNDS(status); + Pattern rhs = parseQuotedPattern(status); + + dataModel.addVariant(std::move(keyList), std::move(rhs), status); +} /* Consume a `selectors` (matching the nonterminal in the grammar), @@ -1739,22 +1974,25 @@ void Parser::parseSelectors(UErrorCode& status) { // Parse selectors // "Backtracking" is required here. It's not clear if whitespace is // (`[s]` selector) or (`[s]` variant) - while (isWhitespace(peek()) || peek() == LEFT_CURLY_BRACE) { - parseOptionalWhitespace(status); + while (isWhitespace(peek()) || peek() == DOLLAR) { + int32_t whitespaceStart = index; + parseRequiredWhitespace(status); // Restore precondition CHECK_BOUNDS(status); - if (peek() != LEFT_CURLY_BRACE) { + if (peek() != DOLLAR) { // This is not necessarily an error, but rather, // means the whitespace we parsed was the optional // whitespace preceding the first variant, not the - // optional whitespace preceding a subsequent expression. + // required whitespace preceding a subsequent variable. + // In that case, "push back" the whitespace. + normalizedInput.truncate(normalizedInput.length() - 1); + index = whitespaceStart; break; } - Expression expression; - expression = parseExpression(status); + VariableName var = parseVariableName(status); empty = false; - dataModel.addSelector(std::move(expression), status); + dataModel.addSelector(std::move(var), status); CHECK_ERROR(status); } @@ -1770,27 +2008,29 @@ void Parser::parseSelectors(UErrorCode& status) { } \ // Parse variants - while (isWhitespace(peek()) || isKeyStart(peek())) { - // Trailing whitespace is allowed - parseOptionalWhitespace(status); + // matcher = match-statement s variant *(o variant) + + // Parse first variant + parseRequiredWhitespace(status); + if (!inBounds()) { + ERROR(status); + return; + } + parseVariant(status); + if (!inBounds()) { + // Not an error; there might be only one variant + return; + } + + while (isWhitespace(peek()) || isBidiControl(peek()) || isKeyStart(peek())) { + parseOptionalWhitespace(); + // Restore the precondition. + // Trailing whitespace is allowed. if (!inBounds()) { return; } - // At least one key is required - SelectorKeys keyList(parseNonEmptyKeys(status)); - - CHECK_ERROR(status); - - // parseNonEmptyKeys() consumes any trailing whitespace, - // so the pattern can be consumed next. - - // Restore precondition before calling parsePattern() - // (which must return a non-null value) - CHECK_BOUNDS(status); - Pattern rhs = parseQuotedPattern(status); - - dataModel.addVariant(std::move(keyList), std::move(rhs), status); + parseVariant(status); // Restore the precondition, *without* erroring out if we've // reached the end of input. That's because it's valid for the @@ -1799,6 +2039,10 @@ void Parser::parseSelectors(UErrorCode& status) { // Because if we don't check it here, the `isWhitespace()` call in // the loop head will read off the end of the input string. CHECK_END_OF_INPUT + + if (errors.hasSyntaxError() || U_FAILURE(status)) { + break; + } } } @@ -1871,7 +2115,7 @@ void Parser::parse(UParseError &parseErrorResult, UErrorCode& status) { bool complex = false; // First, "look ahead" to determine if this is a simple or complex // message. To do that, check the first non-whitespace character. - while (inBounds(index) && isWhitespace(peek())) { + while (inBounds(index) && (isWhitespace(peek()) || isBidiControl(peek()))) { next(); } @@ -1891,10 +2135,10 @@ void Parser::parse(UParseError &parseErrorResult, UErrorCode& status) { // Message can be empty, so we need to only look ahead // if we know it's non-empty if (complex) { - parseOptionalWhitespace(status); + parseOptionalWhitespace(); parseDeclarations(status); parseBody(status); - parseOptionalWhitespace(status); + parseOptionalWhitespace(); } else { // Simple message // For normalization, quote the pattern @@ -1926,3 +2170,4 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_parser.h b/icu4c/source/i18n/messageformat2_parser.h index b62cbe9200b..7b6dfa3b382 100644 --- a/icu4c/source/i18n/messageformat2_parser.h +++ b/icu4c/source/i18n/messageformat2_parser.h @@ -10,12 +10,15 @@ #include "unicode/messageformat2_data_model.h" #include "unicode/parseerr.h" +#include "unicode/uniset.h" #include "messageformat2_allocation.h" #include "messageformat2_errors.h" #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -54,6 +57,26 @@ namespace message2 { } }; + + // Initialization of UnicodeSets + namespace unisets { + enum Key { + CONTENT, + WHITESPACE, + BIDI, + ALPHA, + DIGIT, + NAME_START, + NAME_CHAR, + TEXT, + QUOTED, + ESCAPABLE, + UNISETS_KEY_COUNT + }; + + U_I18N_API const UnicodeSet* get(Key key); + } + // Parser class (private) class Parser : public UMemory { public: @@ -82,8 +105,23 @@ namespace message2 { UChar postContext[U_PARSE_CONTEXT_LEN]; } MessageParseError; - Parser(const UnicodeString &input, MFDataModel::Builder& dataModelBuilder, StaticErrors& e, UnicodeString& normalizedInputRef) - : source(input), index(0), errors(e), normalizedInput(normalizedInputRef), dataModel(dataModelBuilder) { + Parser(const UnicodeString &input, + MFDataModel::Builder& dataModelBuilder, + StaticErrors& e, + UnicodeString& normalizedInputRef, + UErrorCode& status) + : contentChars(unisets::get(unisets::CONTENT)), + whitespaceChars(unisets::get(unisets::WHITESPACE)), + bidiControlChars(unisets::get(unisets::BIDI)), + alphaChars(unisets::get(unisets::ALPHA)), + digitChars(unisets::get(unisets::DIGIT)), + nameStartChars(unisets::get(unisets::NAME_START)), + nameChars(unisets::get(unisets::NAME_CHAR)), + textChars(unisets::get(unisets::TEXT)), + quotedChars(unisets::get(unisets::QUOTED)), + escapableChars(unisets::get(unisets::ESCAPABLE)), + source(input), index(0), errors(e), normalizedInput(normalizedInputRef), dataModel(dataModelBuilder) { + (void) status; parseError.line = 0; parseError.offset = 0; parseError.lengthBeforeCurrentLine = 0; @@ -91,6 +129,31 @@ namespace message2 { parseError.postContext[0] = '\0'; } + UnicodeSet initContentChars(UErrorCode& status); + UnicodeSet initWhitespace(UErrorCode& status); + UnicodeSet initBidiControls(UErrorCode& status); + UnicodeSet initAlpha(UErrorCode& status); + UnicodeSet initDigits(UErrorCode& status); + UnicodeSet initNameStartChars(UErrorCode& status); + UnicodeSet initNameChars(UErrorCode& status); + UnicodeSet initTextChars(UErrorCode& status); + UnicodeSet initQuotedChars(UErrorCode& status); + UnicodeSet initEscapableChars(UErrorCode& status); + + bool isContentChar(UChar32) const; + bool isBidiControl(UChar32) const; + bool isWhitespace(UChar32) const; + bool isTextChar(UChar32) const; + bool isQuotedChar(UChar32) const; + bool isEscapableChar(UChar32) const; + bool isAlpha(UChar32) const; + bool isDigit(UChar32) const; + bool isNameStart(UChar32) const; + bool isNameChar(UChar32) const; + bool isUnquotedStart(UChar32) const; + bool isLiteralStart(UChar32) const; + bool isKeyStart(UChar32) const; + static void translateParseError(const MessageParseError&, UParseError&); static void setParseError(MessageParseError&, uint32_t); void maybeAdvanceLine(); @@ -100,11 +163,13 @@ namespace message2 { void parseUnsupportedStatement(UErrorCode&); void parseLocalDeclaration(UErrorCode&); void parseInputDeclaration(UErrorCode&); - void parseSelectors(UErrorCode&); + void parseSelectors(UErrorCode&); + void parseVariant(UErrorCode&); - void parseWhitespaceMaybeRequired(bool, UErrorCode&); + void parseRequiredWS(UErrorCode&); void parseRequiredWhitespace(UErrorCode&); - void parseOptionalWhitespace(UErrorCode&); + void parseOptionalBidi(); + void parseOptionalWhitespace(); void parseToken(UChar32, UErrorCode&); void parseTokenWithWhitespace(UChar32, UErrorCode&); void parseToken(const std::u16string_view&, UErrorCode&); @@ -149,6 +214,18 @@ namespace message2 { bool inBounds(uint32_t i) const { return source.moveIndex32(index, i) < source.length(); } bool allConsumed() const { return (int32_t) index == source.length(); } + // UnicodeSets for checking character ranges + const UnicodeSet* contentChars; + const UnicodeSet* whitespaceChars; + const UnicodeSet* bidiControlChars; + const UnicodeSet* alphaChars; + const UnicodeSet* digitChars; + const UnicodeSet* nameStartChars; + const UnicodeSet* nameChars; + const UnicodeSet* textChars; + const UnicodeSet* quotedChars; + const UnicodeSet* escapableChars; + // The input string const UnicodeString &source; // The current position within the input string -- counting in UChar32 @@ -165,8 +242,8 @@ namespace message2 { // The parent builder MFDataModel::Builder &dataModel; - }; // class Parser + }; // class Parser } // namespace message2 U_NAMESPACE_END @@ -175,6 +252,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT_PARSER_H diff --git a/icu4c/source/i18n/messageformat2_serializer.cpp b/icu4c/source/i18n/messageformat2_serializer.cpp index b2765f5acf4..dfae0083392 100644 --- a/icu4c/source/i18n/messageformat2_serializer.cpp +++ b/icu4c/source/i18n/messageformat2_serializer.cpp @@ -3,6 +3,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -244,11 +246,12 @@ void Serializer::serializeDeclarations() { void Serializer::serializeSelectors() { U_ASSERT(!dataModel.hasPattern()); - const Expression* selectors = dataModel.getSelectorsInternal(); + const VariableName* selectors = dataModel.getSelectorsInternal(); emit(ID_MATCH); for (int32_t i = 0; i < dataModel.numSelectors(); i++) { - // No whitespace needed here -- see `selectors` in the grammar + whitespace(); + emit(DOLLAR); emit(selectors[i]); } } @@ -256,6 +259,7 @@ void Serializer::serializeSelectors() { void Serializer::serializeVariants() { U_ASSERT(!dataModel.hasPattern()); const Variant* variants = dataModel.getVariantsInternal(); + whitespace(); for (int32_t i = 0; i < dataModel.numVariants(); i++) { const Variant& v = variants[i]; emit(v.getKeys()); @@ -285,3 +289,4 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/i18n/messageformat2_serializer.h b/icu4c/source/i18n/messageformat2_serializer.h index 1b97b3b9300..f190b255f0d 100644 --- a/icu4c/source/i18n/messageformat2_serializer.h +++ b/icu4c/source/i18n/messageformat2_serializer.h @@ -10,6 +10,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -63,6 +65,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT_SERIALIZER_H diff --git a/icu4c/source/i18n/nfrule.cpp b/icu4c/source/i18n/nfrule.cpp index 264e8d79e2d..a2400a6421b 100644 --- a/icu4c/source/i18n/nfrule.cpp +++ b/icu4c/source/i18n/nfrule.cpp @@ -19,7 +19,6 @@ #if U_HAVE_RBNF -#include #include "unicode/localpointer.h" #include "unicode/rbnf.h" #include "unicode/tblcoll.h" @@ -286,18 +285,17 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) // into "tempValue", skip periods, commas, and spaces, // stop on a slash or > sign (or at the end of the string), // and throw an exception on any other character - int64_t ll_10 = 10; while (p < descriptorLength) { c = descriptor.charAt(p); if (c >= gZero && c <= gNine) { - int32_t single_digit = static_cast(c - gZero); - if ((val > 0 && val > (std::numeric_limits::max() - single_digit) / 10) || - (val < 0 && val < (std::numeric_limits::min() - single_digit) / 10)) { + int64_t digit = static_cast(c - gZero); + if ((val > 0 && val > (INT64_MAX - digit) / 10) || + (val < 0 && val < (INT64_MIN - digit) / 10)) { // out of int64_t range status = U_PARSE_ERROR; return; } - val = val * ll_10 + single_digit; + val = val * 10 + digit; } else if (c == gSlash || c == gGreaterThan) { break; @@ -322,11 +320,17 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) if (c == gSlash) { val = 0; ++p; - ll_10 = 10; while (p < descriptorLength) { c = descriptor.charAt(p); if (c >= gZero && c <= gNine) { - val = val * ll_10 + static_cast(c - gZero); + int64_t digit = static_cast(c - gZero); + if ((val > 0 && val > (INT64_MAX - digit) / 10) || + (val < 0 && val < (INT64_MIN - digit) / 10)) { + // out of int64_t range + status = U_PARSE_ERROR; + return; + } + val = val * 10 + digit; } else if (c == gGreaterThan) { break; diff --git a/icu4c/source/i18n/number_decimalquantity.cpp b/icu4c/source/i18n/number_decimalquantity.cpp index f9350d5d5cc..ca1dacd3579 100644 --- a/icu4c/source/i18n/number_decimalquantity.cpp +++ b/icu4c/source/i18n/number_decimalquantity.cpp @@ -1133,7 +1133,7 @@ void DecimalQuantity::setDigitPos(int32_t position, int8_t value) { } void DecimalQuantity::shiftLeft(int32_t numDigits) { - if (!usingBytes && precision + numDigits > 16) { + if (!usingBytes && precision + numDigits >= 16) { switchStorage(); } if (usingBytes) { diff --git a/icu4c/source/i18n/olsontz.cpp b/icu4c/source/i18n/olsontz.cpp index 9d9770dd422..c795e9a38fe 100644 --- a/icu4c/source/i18n/olsontz.cpp +++ b/icu4c/source/i18n/olsontz.cpp @@ -568,9 +568,8 @@ UBool OlsonTimeZone::useDaylightTime() const { return finalZone->useDaylightTime(); } - int32_t year, month, dom, dow, doy, mid; UErrorCode status = U_ZERO_ERROR; - Grego::timeToFields(current, year, month, dom, dow, doy, mid, status); + int32_t year = Grego::timeToYear(current, status); U_ASSERT(U_SUCCESS(status)); if (U_FAILURE(status)) return false; // If error, just return false. diff --git a/icu4c/source/i18n/persncal.cpp b/icu4c/source/i18n/persncal.cpp index 31f7ae252b5..6675cf414c2 100644 --- a/icu4c/source/i18n/persncal.cpp +++ b/icu4c/source/i18n/persncal.cpp @@ -25,6 +25,9 @@ #include "umutex.h" #include "gregoimp.h" // Math #include +#include "cmemory.h" +#include "ucln_in.h" +#include "unicode/uniset.h" static const int16_t kPersianNumDays[] = {0,31,62,93,124,155,186,216,246,276,306,336}; // 0-based, for day-in-year @@ -62,6 +65,45 @@ static const int32_t kPersianCalendarLimits[UCAL_FIELD_COUNT][4] = { { 0, 0, 11, 11}, // ORDINAL_MONTH }; +namespace { // anonymous + +static const icu::UnicodeSet *gLeapCorrection = nullptr; +static icu::UInitOnce gCorrectionInitOnce {}; +static int32_t gMinCorrection; +} // namespace +U_CDECL_BEGIN +static UBool calendar_persian_cleanup() { + if (gLeapCorrection) { + delete gLeapCorrection; + gLeapCorrection = nullptr; + } + gCorrectionInitOnce.reset(); + return true; +} +U_CDECL_END + +namespace { // anonymous +static void U_CALLCONV initLeapCorrection() { + static int16_t nonLeapYears[] = { + 1502, 1601, 1634, 1667, 1700, 1733, 1766, 1799, 1832, 1865, 1898, 1931, 1964, 1997, 2030, 2059, + 2063, 2096, 2129, 2158, 2162, 2191, 2195, 2224, 2228, 2257, 2261, 2290, 2294, 2323, 2327, 2356, + 2360, 2389, 2393, 2422, 2426, 2455, 2459, 2488, 2492, 2521, 2525, 2554, 2558, 2587, 2591, 2620, + 2624, 2653, 2657, 2686, 2690, 2719, 2723, 2748, 2752, 2756, 2781, 2785, 2789, 2818, 2822, 2847, + 2851, 2855, 2880, 2884, 2888, 2913, 2917, 2921, 2946, 2950, 2954, 2979, 2983, 2987, + }; + gMinCorrection = nonLeapYears[0]; + icu::UnicodeSet prefab; + for (auto year : nonLeapYears) { + prefab.add(year); + } + gLeapCorrection = prefab.cloneAsThawed()->freeze(); + ucln_i18n_registerCleanup(UCLN_I18N_PERSIAN_CALENDAR, calendar_persian_cleanup); +} +const icu::UnicodeSet* getLeapCorrection() { + umtx_initOnce(gCorrectionInitOnce, &initLeapCorrection); + return gLeapCorrection; +} +} // namespace anonymous U_NAMESPACE_BEGIN static const int32_t PERSIAN_EPOCH = 1948320; @@ -83,7 +125,6 @@ PersianCalendar* PersianCalendar::clone() const { PersianCalendar::PersianCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } PersianCalendar::PersianCalendar(const PersianCalendar& other) : Calendar(other) { @@ -111,8 +152,15 @@ int32_t PersianCalendar::handleGetLimit(UCalendarDateFields field, ELimitType li */ UBool PersianCalendar::isLeapYear(int32_t year) { + if (year >= gMinCorrection && getLeapCorrection()->contains(year)) { + return false; + } + if (year > gMinCorrection && getLeapCorrection()->contains(year-1)) { + return true; + } int64_t y = static_cast(year) * 25LL + 11LL; - return (y % 33L < 8); + bool res = (y % 33L < 8); + return res; } /** @@ -165,6 +213,15 @@ int32_t PersianCalendar::handleGetYearLength(int32_t extendedYear) const { // Functions for converting from field values to milliseconds.... //------------------------------------------------------------------------- +static int64_t firstJulianOfYear(int64_t year) { + int64_t julianDay = 365LL * (year - 1LL) + ClockMath::floorDivide(8LL * year + 21, 33); + if (year > gMinCorrection && getLeapCorrection()->contains(year-1)) { + julianDay--; + } + return julianDay; +} + + // Return JD of start of given month/year int64_t PersianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /*useMonth*/, UErrorCode& status) const { if (U_FAILURE(status)) { @@ -179,7 +236,7 @@ int64_t PersianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, U } } - int64_t julianDay = PERSIAN_EPOCH - 1LL + 365LL * (eyear - 1LL) + ClockMath::floorDivide(8LL * eyear + 21, 33); + int64_t julianDay = PERSIAN_EPOCH - 1LL + firstJulianOfYear(eyear); if (month != 0) { julianDay += kPersianNumDays[month]; @@ -219,6 +276,7 @@ int32_t PersianCalendar::handleGetExtendedYear(UErrorCode& status) { void PersianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { int64_t daysSinceEpoch = julianDay; daysSinceEpoch -= PERSIAN_EPOCH; + int64_t year = ClockMath::floorDivideInt64( 33LL * daysSinceEpoch + 3LL, 12053LL) + 1LL; if (year > INT32_MAX || year < INT32_MIN) { @@ -226,11 +284,16 @@ void PersianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) return; } - int64_t farvardin1 = 365LL * (year - 1) + ClockMath::floorDivide(8LL * year + 21, 33); + int64_t farvardin1 = firstJulianOfYear(year); + int32_t dayOfYear = daysSinceEpoch - farvardin1; // 0-based U_ASSERT(dayOfYear >= 0); U_ASSERT(dayOfYear < 366); - // + + if (dayOfYear == 365 && year >= gMinCorrection && getLeapCorrection()->contains(year)) { + year++; + dayOfYear = 0; + } int32_t month; if (dayOfYear < 216) { // Compute 0-based month month = dayOfYear / 31; @@ -240,11 +303,11 @@ void PersianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) U_ASSERT(month >= 0); U_ASSERT(month < 12); - int32_t dayOfMonth = dayOfYear - kPersianNumDays[month] + 1; + ++dayOfYear; // Make it 1-based now + int32_t dayOfMonth = dayOfYear - kPersianNumDays[month]; U_ASSERT(dayOfMonth > 0); U_ASSERT(dayOfMonth <= 31); - ++dayOfYear; // Make it 1-based now internalSet(UCAL_ERA, 0); internalSet(UCAL_YEAR, year); diff --git a/icu4c/source/i18n/scriptset.cpp b/icu4c/source/i18n/scriptset.cpp index eec1eeb37da..576917e81c4 100644 --- a/icu4c/source/i18n/scriptset.cpp +++ b/icu4c/source/i18n/scriptset.cpp @@ -285,19 +285,19 @@ uhash_equalsScriptSet(const UElement key1, const UElement key2) { return (*s1 == *s2); } -U_CAPI int8_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_compareScriptSet(UElement key0, UElement key1) { icu::ScriptSet *s0 = static_cast(key0.pointer); icu::ScriptSet *s1 = static_cast(key1.pointer); int32_t diff = s0->countMembers() - s1->countMembers(); - if (diff != 0) return static_cast(diff); + if (diff != 0) return diff; int32_t i0 = s0->nextSetBit(0); int32_t i1 = s1->nextSetBit(0); while ((diff = i0-i1) == 0 && i0 > 0) { i0 = s0->nextSetBit(i0+1); i1 = s1->nextSetBit(i1+1); } - return (int8_t)diff; + return diff; } U_CAPI int32_t U_EXPORT2 diff --git a/icu4c/source/i18n/scriptset.h b/icu4c/source/i18n/scriptset.h index df5cfdc7486..d21d0db8a01 100644 --- a/icu4c/source/i18n/scriptset.h +++ b/icu4c/source/i18n/scriptset.h @@ -74,7 +74,7 @@ class U_I18N_API ScriptSet: public UMemory { U_NAMESPACE_END -U_CAPI UBool U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_compareScriptSet(const UElement key1, const UElement key2); U_CAPI int32_t U_EXPORT2 diff --git a/icu4c/source/i18n/simpletz.cpp b/icu4c/source/i18n/simpletz.cpp index cbefc29830f..ec80db44093 100644 --- a/icu4c/source/i18n/simpletz.cpp +++ b/icu4c/source/i18n/simpletz.cpp @@ -518,7 +518,8 @@ SimpleTimeZone::getOffsetFromLocal(UDate date, UTimeZoneLocalOption nonExistingT } rawOffsetGMT = getRawOffset(); - int32_t year, month, dom, dow, millis; + int32_t year, millis; + int8_t month, dom, dow; double dday = ClockMath::floorDivide(date, U_MILLIS_PER_DAY, &millis); if (dday > INT32_MAX || dday < INT32_MIN) { status = U_ILLEGAL_ARGUMENT_ERROR; diff --git a/icu4c/source/i18n/taiwncal.cpp b/icu4c/source/i18n/taiwncal.cpp index e6ffd71ba30..1f948031002 100644 --- a/icu4c/source/i18n/taiwncal.cpp +++ b/icu4c/source/i18n/taiwncal.cpp @@ -36,7 +36,6 @@ static const int32_t kGregorianEpoch = 1970; TaiwanCalendar::TaiwanCalendar(const Locale& aLocale, UErrorCode& success) : GregorianCalendar(aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } TaiwanCalendar::~TaiwanCalendar() @@ -48,12 +47,6 @@ TaiwanCalendar::TaiwanCalendar(const TaiwanCalendar& source) { } -TaiwanCalendar& TaiwanCalendar::operator= ( const TaiwanCalendar& right) -{ - GregorianCalendar::operator=(right); - return *this; -} - TaiwanCalendar* TaiwanCalendar::clone() const { return new TaiwanCalendar(*this); diff --git a/icu4c/source/i18n/taiwncal.h b/icu4c/source/i18n/taiwncal.h index a8fa3d1829e..d12ab1c4a2e 100644 --- a/icu4c/source/i18n/taiwncal.h +++ b/icu4c/source/i18n/taiwncal.h @@ -79,13 +79,6 @@ public: */ TaiwanCalendar(const TaiwanCalendar& source); - /** - * Default assignment operator - * @param right the object to be copied. - * @internal - */ - TaiwanCalendar& operator=(const TaiwanCalendar& right); - /** * Create and return a polymorphic copy of this calendar. * @return return a polymorphic copy of this calendar. diff --git a/icu4c/source/i18n/timezone.cpp b/icu4c/source/i18n/timezone.cpp index 118dfe2f2af..e2cf35992f4 100644 --- a/icu4c/source/i18n/timezone.cpp +++ b/icu4c/source/i18n/timezone.cpp @@ -730,7 +730,8 @@ void TimeZone::getOffset(UDate date, UBool local, int32_t& rawOffset, // (with 7 args) twice when local == true and DST is // detected in the initial call. for (int32_t pass=0; ; ++pass) { - int32_t year, month, dom, dow, millis; + int32_t year, millis; + int8_t month, dom, dow; double day = ClockMath::floorDivide(date, U_MILLIS_PER_DAY, &millis); // out of the range diff --git a/icu4c/source/i18n/tzgnames.cpp b/icu4c/source/i18n/tzgnames.cpp index 57ee984ee9b..e7b09efd01a 100644 --- a/icu4c/source/i18n/tzgnames.cpp +++ b/icu4c/source/i18n/tzgnames.cpp @@ -406,7 +406,7 @@ TZGNCore::initialize(const Locale& locale, UErrorCode& status) { int32_t regionLen = static_cast(uprv_strlen(region)); if (regionLen == 0) { CharString loc = ulocimp_addLikelySubtags(fLocale.getName(), status); - ulocimp_getSubtags(loc.data(), nullptr, nullptr, &fTargetRegion, nullptr, nullptr, status); + ulocimp_getSubtags(loc.toStringPiece(), nullptr, nullptr, &fTargetRegion, nullptr, nullptr, status); if (U_FAILURE(status)) { cleanup(); return; diff --git a/icu4c/source/i18n/tznames_impl.cpp b/icu4c/source/i18n/tznames_impl.cpp index 9b7ade7f0bb..769c9a6526c 100644 --- a/icu4c/source/i18n/tznames_impl.cpp +++ b/icu4c/source/i18n/tznames_impl.cpp @@ -2149,7 +2149,7 @@ TZDBTimeZoneNames::TZDBTimeZoneNames(const Locale& locale) if (regionLen == 0) { UErrorCode status = U_ZERO_ERROR; CharString loc = ulocimp_addLikelySubtags(fLocale.getName(), status); - ulocimp_getSubtags(loc.data(), nullptr, nullptr, &fRegion, nullptr, nullptr, status); + ulocimp_getSubtags(loc.toStringPiece(), nullptr, nullptr, &fRegion, nullptr, nullptr, status); if (U_SUCCESS(status)) { useWorld = false; } diff --git a/icu4c/source/i18n/tzrule.cpp b/icu4c/source/i18n/tzrule.cpp index 7507068c880..8d6a37a844c 100644 --- a/icu4c/source/i18n/tzrule.cpp +++ b/icu4c/source/i18n/tzrule.cpp @@ -355,9 +355,8 @@ AnnualTimeZoneRule::getNextStart(UDate base, int32_t prevDSTSavings, UBool inclusive, UDate& result) const { - int32_t year, month, dom, dow, doy, mid; UErrorCode status = U_ZERO_ERROR; - Grego::timeToFields(base, year, month, dom, dow, doy, mid, status); + int32_t year = Grego::timeToYear(base, status); U_ASSERT(U_SUCCESS(status)); if (year < fStartYear) { return getFirstStart(prevRawOffset, prevDSTSavings, result); @@ -381,9 +380,8 @@ AnnualTimeZoneRule::getPreviousStart(UDate base, int32_t prevDSTSavings, UBool inclusive, UDate& result) const { - int32_t year, month, dom, dow, doy, mid; UErrorCode status = U_ZERO_ERROR; - Grego::timeToFields(base, year, month, dom, dow, doy, mid, status); + int32_t year = Grego::timeToYear(base, status); U_ASSERT(U_SUCCESS(status)); if (year > fEndYear) { return getFinalStart(prevRawOffset, prevDSTSavings, result); diff --git a/icu4c/source/i18n/ucln_in.h b/icu4c/source/i18n/ucln_in.h index 765cdd559fb..74868891c83 100644 --- a/icu4c/source/i18n/ucln_in.h +++ b/icu4c/source/i18n/ucln_in.h @@ -39,6 +39,7 @@ typedef enum ECleanupI18NType { UCLN_I18N_HEBREW_CALENDAR, UCLN_I18N_ASTRO_CALENDAR, UCLN_I18N_DANGI_CALENDAR, + UCLN_I18N_PERSIAN_CALENDAR, UCLN_I18N_CALENDAR, UCLN_I18N_TIMEZONEFORMAT, UCLN_I18N_TZDBTIMEZONENAMES, @@ -62,6 +63,7 @@ typedef enum ECleanupI18NType { UCLN_I18N_REGION, UCLN_I18N_LIST_FORMATTER, UCLN_I18N_NUMSYS, + UCLN_I18N_MF2_UNISETS, UCLN_I18N_COUNT /* This must be last */ } ECleanupI18NType; diff --git a/icu4c/source/i18n/unicode/calendar.h b/icu4c/source/i18n/unicode/calendar.h index a04f5b65bd5..208ab7643ee 100644 --- a/icu4c/source/i18n/unicode/calendar.h +++ b/icu4c/source/i18n/unicode/calendar.h @@ -55,6 +55,7 @@ class ICUServiceFactory; typedef int32_t UFieldResolutionTable[12][8]; class BasicTimeZone; +class CharString; /** * `Calendar` is an abstract base class for converting between * a `UDate` object and a set of integer fields such as @@ -1881,42 +1882,7 @@ private: */ int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const; - protected: - /** - * The flag which indicates if the current time is set in the calendar. - * @stable ICU 2.0 - */ - UBool fIsTimeSet; - - /** - * True if the fields are in sync with the currently set time of this Calendar. - * If false, then the next attempt to get the value of a field will - * force a recomputation of all fields from the current value of the time - * field. - *

- * This should really be named areFieldsInSync, but the old name is retained - * for backward compatibility. - * @stable ICU 2.0 - */ - UBool fAreFieldsSet; - - /** - * True if all of the fields have been set. This is initially false, and set to - * true by computeFields(). - * @stable ICU 2.0 - */ - UBool fAreAllFieldsSet; - - /** - * True if all fields have been virtually set, but have not yet been - * computed. This occurs only in setTimeInMillis(). A calendar set - * to this state will compute all fields from the time if it becomes - * necessary, but otherwise will delay such computation. - * @stable ICU 3.0 - */ - UBool fAreFieldsVirtuallySet; - /** * Get the current time without recomputing. * @@ -1940,14 +1906,7 @@ protected: */ int32_t fFields[UCAL_FIELD_COUNT]; -#ifndef U_FORCE_HIDE_DEPRECATED_API - /** - * The flags which tell if a specified time field for the calendar is set. - * @deprecated ICU 2.8 use (fStamp[n]!=kUnset) - */ - UBool fIsSet[UCAL_FIELD_COUNT]; -#endif // U_FORCE_HIDE_DEPRECATED_API - +protected: /** Special values of stamp[] * @stable ICU 2.0 */ @@ -1957,14 +1916,15 @@ protected: kMinimumUserStamp }; +private: /** * Pseudo-time-stamps which specify when each field was set. There * are two special values, UNSET and INTERNALLY_SET. Values from - * MINIMUM_USER_SET to Integer.MAX_VALUE are legal user set values. - * @stable ICU 2.0 + * MINIMUM_USER_SET to STAMP_MAX are legal user set values. */ - int32_t fStamp[UCAL_FIELD_COUNT]; + int8_t fStamp[UCAL_FIELD_COUNT]; +protected: /** * Subclasses may override this method to compute several fields * specific to each calendar system. These are: @@ -2178,7 +2138,7 @@ private: /** * The next available value for fStamp[] */ - int32_t fNextStamp;// = MINIMUM_USER_STAMP; + int8_t fNextStamp = kMinimumUserStamp; /** * Recalculates the time stamp array (fStamp). @@ -2189,30 +2149,60 @@ private: /** * The current time set for the calendar. */ - UDate fTime; - - /** - * @see #setLenient - */ - UBool fLenient; + UDate fTime = 0; /** * Time zone affects the time calculation done by Calendar. Calendar subclasses use * the time zone data to produce the local time. Always set; never nullptr. */ - TimeZone* fZone; + TimeZone* fZone = nullptr; + + /** + * The flag which indicates if the current time is set in the calendar. + */ + bool fIsTimeSet:1; + + /** + * True if the fields are in sync with the currently set time of this Calendar. + * If false, then the next attempt to get the value of a field will + * force a recomputation of all fields from the current value of the time + * field. + *

+ * This should really be named areFieldsInSync, but the old name is retained + * for backward compatibility. + */ + bool fAreFieldsSet:1; + + /** + * True if all of the fields have been set. This is initially false, and set to + * true by computeFields(). + */ + bool fAreAllFieldsSet:1; + + /** + * True if all fields have been virtually set, but have not yet been + * computed. This occurs only in setTimeInMillis(). A calendar set + * to this state will compute all fields from the time if it becomes + * necessary, but otherwise will delay such computation. + */ + bool fAreFieldsVirtuallySet:1; + + /** + * @see #setLenient + */ + bool fLenient:1; /** * Option for repeated wall time * @see #setRepeatedWallTimeOption */ - UCalendarWallTimeOption fRepeatedWallTime; + UCalendarWallTimeOption fRepeatedWallTime:3; // Somehow MSVC need 3 bits for UCalendarWallTimeOption /** * Option for skipped wall time * @see #setSkippedWallTimeOption */ - UCalendarWallTimeOption fSkippedWallTime; + UCalendarWallTimeOption fSkippedWallTime:3; // Somehow MSVC need 3 bits for UCalendarWallTimeOption /** * Both firstDayOfWeek and minimalDaysInFirstWeek are locale-dependent. They are @@ -2222,11 +2212,14 @@ private: * out the week count for a specific date for a given locale. These must be set when * a Calendar is constructed. */ - UCalendarDaysOfWeek fFirstDayOfWeek; - uint8_t fMinimalDaysInFirstWeek; - UCalendarDaysOfWeek fWeekendOnset; + UCalendarDaysOfWeek fFirstDayOfWeek:4; // Somehow MSVC need 4 bits for + // UCalendarDaysOfWeek + UCalendarDaysOfWeek fWeekendOnset:4; // Somehow MSVC need 4 bits for + // UCalendarDaysOfWeek + UCalendarDaysOfWeek fWeekendCease:4; // Somehow MSVC need 4 bits for + // UCalendarDaysOfWeek + uint8_t fMinimalDaysInFirstWeek; int32_t fWeekendOnsetMillis; - UCalendarDaysOfWeek fWeekendCease; int32_t fWeekendCeaseMillis; /** @@ -2264,31 +2257,23 @@ private: * returned by getGregorianMonth(). * @see #computeGregorianFields */ - int32_t fGregorianMonth; - - /** - * The Gregorian day of the year, as computed by - * computeGregorianFields() and returned by getGregorianDayOfYear(). - * @see #computeGregorianFields - */ - int32_t fGregorianDayOfYear; + int8_t fGregorianMonth; /** * The Gregorian day of the month, as computed by * computeGregorianFields() and returned by getGregorianDayOfMonth(). * @see #computeGregorianFields */ - int32_t fGregorianDayOfMonth; - - /* calculations */ + int8_t fGregorianDayOfMonth; /** - * Compute the Gregorian calendar year, month, and day of month from - * the given Julian day. These values are not stored in fields, but in - * member variables gregorianXxx. Also compute the DAY_OF_WEEK and - * DOW_LOCAL fields. + * The Gregorian day of the year, as computed by + * computeGregorianFields() and returned by getGregorianDayOfYear(). + * @see #computeGregorianFields */ - void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec); + int16_t fGregorianDayOfYear; + + /* calculations */ protected: @@ -2359,8 +2344,8 @@ private: #endif /* U_HIDE_INTERNAL_API */ private: - char validLocale[ULOC_FULLNAME_CAPACITY]; - char actualLocale[ULOC_FULLNAME_CAPACITY]; + CharString* validLocale = nullptr; + CharString* actualLocale = nullptr; public: #if !UCONFIG_NO_SERVICE @@ -2563,7 +2548,6 @@ Calendar::internalSet(UCalendarDateFields field, int32_t value) { fFields[field] = value; fStamp[field] = kInternallySet; - fIsSet[field] = true; // Remove later } /** diff --git a/icu4c/source/i18n/unicode/dcfmtsym.h b/icu4c/source/i18n/unicode/dcfmtsym.h index 02e12f9c39b..3aecceda03a 100644 --- a/icu4c/source/i18n/unicode/dcfmtsym.h +++ b/icu4c/source/i18n/unicode/dcfmtsym.h @@ -48,6 +48,7 @@ U_NAMESPACE_BEGIN +class CharString; /** * This class represents the set of symbols needed by DecimalFormat * to format numbers. DecimalFormat creates for itself an instance of @@ -504,8 +505,8 @@ private: Locale locale; - char actualLocale[ULOC_FULLNAME_CAPACITY]; - char validLocale[ULOC_FULLNAME_CAPACITY]; + CharString* actualLocale = nullptr; + CharString* validLocale = nullptr; const char16_t* currPattern = nullptr; UnicodeString currencySpcBeforeSym[UNUM_CURRENCY_SPACING_COUNT]; diff --git a/icu4c/source/i18n/unicode/dtfmtsym.h b/icu4c/source/i18n/unicode/dtfmtsym.h index df8da36d815..18e2641b588 100644 --- a/icu4c/source/i18n/unicode/dtfmtsym.h +++ b/icu4c/source/i18n/unicode/dtfmtsym.h @@ -43,6 +43,7 @@ U_NAMESPACE_BEGIN /* forward declaration */ class SimpleDateFormat; class Hashtable; +class CharString; /** * DateFormatSymbols is a public class for encapsulating localizable date-time @@ -917,8 +918,8 @@ private: /** valid/actual locale information * these are always ICU locales, so the length should not be a problem */ - char validLocale[ULOC_FULLNAME_CAPACITY]; - char actualLocale[ULOC_FULLNAME_CAPACITY]; + CharString* validLocale = nullptr; + CharString* actualLocale = nullptr; DateFormatSymbols() = delete; // default constructor not implemented diff --git a/icu4c/source/i18n/unicode/format.h b/icu4c/source/i18n/unicode/format.h index a21e61ad56d..3d435f0de7e 100644 --- a/icu4c/source/i18n/unicode/format.h +++ b/icu4c/source/i18n/unicode/format.h @@ -45,6 +45,7 @@ U_NAMESPACE_BEGIN +class CharString; /** * Base class for all formats. This is an abstract base class which * specifies the protocol for classes which convert other objects or @@ -297,8 +298,8 @@ protected: UParseError& parseError); private: - char actualLocale[ULOC_FULLNAME_CAPACITY]; - char validLocale[ULOC_FULLNAME_CAPACITY]; + CharString* actualLocale = nullptr; + CharString* validLocale = nullptr; }; U_NAMESPACE_END diff --git a/icu4c/source/i18n/unicode/messageformat2.h b/icu4c/source/i18n/unicode/messageformat2.h index c5459f042f4..ea0401e6d9e 100644 --- a/icu4c/source/i18n/unicode/messageformat2.h +++ b/icu4c/source/i18n/unicode/messageformat2.h @@ -8,6 +8,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -20,6 +22,7 @@ #include "unicode/messageformat2_arguments.h" #include "unicode/messageformat2_data_model.h" #include "unicode/messageformat2_function_registry.h" +#include "unicode/normalizer2.h" #include "unicode/unistr.h" #ifndef U_HIDE_DEPRECATED_API @@ -325,6 +328,8 @@ namespace message2 { private: friend class Builder; + friend class Checker; + friend class MessageArguments; friend class MessageContext; MessageFormatter(const MessageFormatter::Builder& builder, UErrorCode &status); @@ -334,8 +339,18 @@ namespace message2 { // 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; + ResolvedSelector resolveVariables(const Environment& env, + const data_model::VariableName&, + MessageContext&, + UErrorCode &) const; + 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 @@ -352,6 +367,9 @@ namespace message2 { void resolvePreferences(MessageContext&, UVector&, UVector&, UErrorCode&) const; // Formatting methods + + // Used for normalizing variable names and keys for comparison + UnicodeString normalizeNFC(const UnicodeString&) const; [[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 @@ -365,8 +383,11 @@ namespace message2 { 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 a variableName that appears as a selector + ResolvedSelector formatSelector(const Environment& env, + const data_model::VariableName&, + 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; @@ -445,6 +466,10 @@ namespace message2 { // formatting methods return best-effort output. // The default is false. bool signalErrors = false; + + // Used for implementing normalizeNFC() + const Normalizer2* nfcNormalizer = nullptr; + }; // class MessageFormatter } // namespace message2 @@ -457,6 +482,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_H diff --git a/icu4c/source/i18n/unicode/messageformat2_arguments.h b/icu4c/source/i18n/unicode/messageformat2_arguments.h index c43d96191f1..07c96f892bc 100644 --- a/icu4c/source/i18n/unicode/messageformat2_arguments.h +++ b/icu4c/source/i18n/unicode/messageformat2_arguments.h @@ -8,6 +8,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -43,7 +45,7 @@ template class U_I18N_API LocalArray; namespace message2 { - class MessageContext; + class MessageFormatter; // Arguments // ---------- @@ -112,7 +114,9 @@ namespace message2 { private: friend class MessageContext; - const Formattable* getArgument(const data_model::VariableName&, UErrorCode&) const; + const Formattable* getArgument(const MessageFormatter&, + const data_model::VariableName&, + UErrorCode&) const; // Avoids using Hashtable so that code constructing a Hashtable // doesn't have to appear in this header file @@ -131,6 +135,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_ARGUMENTS_H diff --git a/icu4c/source/i18n/unicode/messageformat2_data_model.h b/icu4c/source/i18n/unicode/messageformat2_data_model.h index 0c836af1bdf..aaef4da077b 100644 --- a/icu4c/source/i18n/unicode/messageformat2_data_model.h +++ b/icu4c/source/i18n/unicode/messageformat2_data_model.h @@ -8,6 +8,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -2211,7 +2213,7 @@ namespace message2 { friend class MFDataModel; - Matcher(Expression* ss, int32_t ns, Variant* vs, int32_t nv); + Matcher(VariableName* ss, int32_t ns, Variant* vs, int32_t nv); Matcher() {} // A Matcher may have numSelectors=0 and numVariants=0 @@ -2219,8 +2221,8 @@ namespace message2 { // So we have to keep a separate flag to track failed copies. bool bogus = false; - // The expressions that are being matched on. - LocalArray selectors; + // The variables that are being matched on. + LocalArray selectors; // The number of selectors int32_t numSelectors = 0; // The list of `when` clauses (case arms). @@ -2328,13 +2330,13 @@ namespace message2 { * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - const std::vector getSelectors() const { + const std::vector getSelectors() const { if (std::holds_alternative(body)) { return {}; } const Matcher* match = std::get_if(&body); // match must be non-null, given the previous check - return toStdVector(match->selectors.getAlias(), match->numSelectors); + return toStdVector(match->selectors.getAlias(), match->numSelectors); } /** * Accesses the variants. Returns an empty vector if this is a pattern message. @@ -2462,17 +2464,17 @@ namespace message2 { */ Builder& addBinding(Binding&& b, UErrorCode& status); /** - * Adds a selector expression. Copies `expression`. + * Adds a selector variable. * If a pattern was previously set, clears the pattern. * - * @param selector Expression to add as a selector. Passed by move. + * @param selector Variable to add as a selector. Passed by move. * @param errorCode Input/output error code * @return A reference to the builder. * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - Builder& addSelector(Expression&& selector, UErrorCode& errorCode) noexcept; + Builder& addSelector(VariableName&& selector, UErrorCode& errorCode); /** * Adds a single variant. * If a pattern was previously set using `setPattern()`, clears the pattern. @@ -2564,7 +2566,7 @@ namespace message2 { int32_t bindingsLen = 0; const Binding* getLocalVariablesInternal() const; - const Expression* getSelectorsInternal() const; + const VariableName* getSelectorsInternal() const; const Variant* getVariantsInternal() const; int32_t numSelectors() const { @@ -2592,6 +2594,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT_DATA_MODEL_H diff --git a/icu4c/source/i18n/unicode/messageformat2_formattable.h b/icu4c/source/i18n/unicode/messageformat2_formattable.h index 8a779adb9ab..53c500dac2f 100644 --- a/icu4c/source/i18n/unicode/messageformat2_formattable.h +++ b/icu4c/source/i18n/unicode/messageformat2_formattable.h @@ -8,6 +8,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -1010,6 +1012,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_FORMATTABLE_H diff --git a/icu4c/source/i18n/unicode/messageformat2_function_registry.h b/icu4c/source/i18n/unicode/messageformat2_function_registry.h index b8429e3b83a..37690d5e04a 100644 --- a/icu4c/source/i18n/unicode/messageformat2_function_registry.h +++ b/icu4c/source/i18n/unicode/messageformat2_function_registry.h @@ -8,6 +8,8 @@ #if U_SHOW_CPLUSPLUS_API +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -422,6 +424,8 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif /* U_SHOW_CPLUSPLUS_API */ #endif // MESSAGEFORMAT2_FUNCTION_REGISTRY_H diff --git a/icu4c/source/i18n/vtzone.cpp b/icu4c/source/i18n/vtzone.cpp index 6067c5490e8..8c0295bdcbe 100644 --- a/icu4c/source/i18n/vtzone.cpp +++ b/icu4c/source/i18n/vtzone.cpp @@ -182,8 +182,9 @@ static UnicodeString& appendMillis(UDate date, UnicodeString& str) { */ static UnicodeString& getDateTimeString(UDate time, UnicodeString& str, UErrorCode& status) { if (U_FAILURE(status)) {return str;} - int32_t year, month, dom, dow, doy, mid; - Grego::timeToFields(time, year, month, dom, dow, doy, mid, status); + int32_t year, mid; + int8_t month, dom, dow; + Grego::timeToFields(time, year, month, dom, dow, mid, status); if (U_FAILURE(status)) {return str;} str.remove(); @@ -675,9 +676,10 @@ static TimeZoneRule* createRuleByRRULE(const UnicodeString& zonename, int rawOff } // Calculate start/end year and missing fields - int32_t startYear, startMonth, startDOM, startDOW, startDOY, startMID; + int32_t startYear, startMID; + int8_t startMonth, startDOM; Grego::timeToFields(start + fromOffset, startYear, startMonth, startDOM, - startDOW, startDOY, startMID, status); + startMID, status); if (U_FAILURE(status)) { return nullptr; } @@ -692,8 +694,7 @@ static TimeZoneRule* createRuleByRRULE(const UnicodeString& zonename, int rawOff int32_t endYear; if (until != MIN_MILLIS) { - int32_t endMonth, endDOM, endDOW, endDOY, endMID; - Grego::timeToFields(until, endYear, endMonth, endDOM, endDOW, endDOY, endMID, status); + endYear = Grego::timeToYear(until, status); if (U_FAILURE(status)) return nullptr; } else { endYear = AnnualTimeZoneRule::MAX_YEAR; @@ -1674,8 +1675,7 @@ VTimeZone::parse(UErrorCode& status) { status); } else { // Update the end year - int32_t y, m, d, dow, doy, mid; - Grego::timeToFields(start, y, m, d, dow, doy, mid, status); + int32_t y = Grego::timeToYear(start, status); if (U_FAILURE(status)) return; newRule.adoptInsteadAndCheckErrorCode( new AnnualTimeZoneRule( @@ -1902,7 +1902,8 @@ VTimeZone::writeZone(VTZWriter& w, BasicTimeZone& basictz, int32_t stdCount = 0; AnnualTimeZoneRule *finalStdRule = nullptr; - int32_t year, month, dom, dow, doy, mid; + int32_t year, mid; + int8_t month, dom, dow; UBool hasTransitions = false; TimeZoneTransition tzt; UBool tztAvail; @@ -1922,7 +1923,7 @@ VTimeZone::writeZone(VTZWriter& w, BasicTimeZone& basictz, int32_t fromOffset = tzt.getFrom()->getRawOffset() + tzt.getFrom()->getDSTSavings(); int32_t fromDSTSavings = tzt.getFrom()->getDSTSavings(); int32_t toOffset = tzt.getTo()->getRawOffset() + tzt.getTo()->getDSTSavings(); - Grego::timeToFields(tzt.getTime() + fromOffset, year, month, dom, dow, doy, mid, status); + Grego::timeToFields(tzt.getTime() + fromOffset, year, month, dom, dow, mid, status); if (U_FAILURE(status)) return; int32_t weekInMonth = Grego::dayOfWeekInMonth(year, month, dom); UBool sameRule = false; diff --git a/icu4c/source/test/cintltst/cloctst.c b/icu4c/source/test/cintltst/cloctst.c index a032753839f..8dbf04572da 100644 --- a/icu4c/source/test/cintltst/cloctst.c +++ b/icu4c/source/test/cintltst/cloctst.c @@ -2879,7 +2879,7 @@ static void TestDisplayNameWarning(void) { * starts with `prefix' plus an additional element, that is, string == * prefix + '_' + x, then return 1. Otherwise return a value < 0. */ -static UBool _loccmp(const char* string, const char* prefix) { +static int32_t _loccmp(const char* string, const char* prefix) { int32_t slen = (int32_t)uprv_strlen(string), plen = (int32_t)uprv_strlen(prefix); int32_t c = uprv_strncmp(string, prefix, plen); @@ -3924,6 +3924,13 @@ const char* const basic_maximize_data[][2] = { // ICU-22545 & ICU-22742 "ru_XC", "ru_Cyrl_XC" + }, { + // ICU-22765 + "und@x=private", + "en_Latn_US@x=private", + }, { + "th@x=private", + "th_Thai_TH@x=private", } }; diff --git a/icu4c/source/test/cintltst/creststn.c b/icu4c/source/test/cintltst/creststn.c index d5b0bb4febf..c500b99f5ea 100644 --- a/icu4c/source/test/cintltst/creststn.c +++ b/icu4c/source/test/cintltst/creststn.c @@ -3035,7 +3035,6 @@ tres_getString(const UResourceBundle *resB, const char *s8; UChar32 c16, c8; int32_t length16, length8, i16, i8; - UBool forceCopy; if(length == NULL) { length = &length16; @@ -3053,7 +3052,7 @@ tres_getString(const UResourceBundle *resB, length16 = *length; /* try the UTF-8 variant of ures_getStringXYZ() */ - for(forceCopy = false; forceCopy <= true; ++forceCopy) { + for (int8_t forceCopy = 0; forceCopy <= 1; ++forceCopy) { p8 = buffer8; length8 = (int32_t)sizeof(buffer8); if(idx >= 0) { diff --git a/icu4c/source/test/cintltst/cucdtst.c b/icu4c/source/test/cintltst/cucdtst.c index 8ea805f93c2..e278622dd29 100644 --- a/icu4c/source/test/cintltst/cucdtst.c +++ b/icu4c/source/test/cintltst/cucdtst.c @@ -431,12 +431,12 @@ compareUSets(const USet *a, const USet *b, const char *a_name, const char *b_name, UBool diffIsError) { /* - * Use an arithmetic & not a logical && so that both branches + * Use temporary variables so that both branches * are always taken and all differences are shown. */ - return - showAMinusB(a, b, a_name, b_name, diffIsError) & - showAMinusB(b, a, b_name, a_name, diffIsError); + UBool ab = showAMinusB(a, b, a_name, b_name, diffIsError); + UBool ba = showAMinusB(b, a, b_name, a_name, diffIsError); + return ab && ba; } /* test isLetter(u_isapha()) and isDigit(u_isdigit()) */ diff --git a/icu4c/source/test/cintltst/currtest.c b/icu4c/source/test/cintltst/currtest.c index e75c1743e58..0a50af43b4f 100644 --- a/icu4c/source/test/cintltst/currtest.c +++ b/icu4c/source/test/cintltst/currtest.c @@ -116,6 +116,9 @@ static void TestEnumList(void) { // CLDR 45 and ICU-22726 expectInList("XCG", UCURR_ALL, true); + + // CLDR 46 and ICU-22935 + expectInList("ZWG", UCURR_ALL, true); } static void TestEnumListReset(void) { diff --git a/icu4c/source/test/cintltst/udatatst.c b/icu4c/source/test/cintltst/udatatst.c index fc1ab786ad3..003d7d43c31 100644 --- a/icu4c/source/test/cintltst/udatatst.c +++ b/icu4c/source/test/cintltst/udatatst.c @@ -1139,18 +1139,7 @@ static void TestICUDataName(void) switch(U_CHARSET_FAMILY) { case U_ASCII_FAMILY: - switch((int)U_IS_BIG_ENDIAN) - { - case 1: - typeChar = 'b'; - break; - case 0: - typeChar = 'l'; - break; - default: - log_err("Expected 1 or 0 for U_IS_BIG_ENDIAN, got %d!\n", U_IS_BIG_ENDIAN); - /* return; */ - } + typeChar = U_IS_BIG_ENDIAN ? 'b' : 'l'; break; case U_EBCDIC_FAMILY: typeChar = 'e'; diff --git a/icu4c/source/test/intltest/Makefile.in b/icu4c/source/test/intltest/Makefile.in index 66956355c84..81ad5557807 100644 --- a/icu4c/source/test/intltest/Makefile.in +++ b/icu4c/source/test/intltest/Makefile.in @@ -75,7 +75,7 @@ numbertest_parse.o numbertest_doubleconversion.o numbertest_skeletons.o \ static_unisets_test.o numfmtdatadriventest.o numbertest_range.o erarulestest.o \ formattedvaluetest.o formatted_string_builder_test.o numbertest_permutation.o \ units_data_test.o units_router_test.o units_test.o displayoptions_test.o \ -numbertest_simple.o uchar_type_build_test.o +numbertest_simple.o uchar_type_build_test.o usetheaderonlytest.o DEPS = $(OBJECTS:.o=.d) diff --git a/icu4c/source/test/intltest/caltest.cpp b/icu4c/source/test/intltest/caltest.cpp index 6d019086e53..12117085779 100644 --- a/icu4c/source/test/intltest/caltest.cpp +++ b/icu4c/source/test/intltest/caltest.cpp @@ -192,6 +192,8 @@ void CalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &name, TESTCASE_AUTO(TestFirstDayOfWeek); TESTCASE_AUTO(Test22633ChineseOverflow); + TESTCASE_AUTO(Test22962ChineseOverflow); + TESTCASE_AUTO(Test22962BuddhistOverflow); TESTCASE_AUTO(Test22633IndianOverflow); TESTCASE_AUTO(Test22633IslamicUmalquraOverflow); TESTCASE_AUTO(Test22633PersianOverflow); @@ -207,6 +209,7 @@ void CalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &name, TESTCASE_AUTO(Test22633HebrewLargeNegativeDay); TESTCASE_AUTO(Test22730JapaneseOverflow); TESTCASE_AUTO(Test22730CopticOverflow); + TESTCASE_AUTO(Test22962ComputeJulianDayOverflow); TESTCASE_AUTO(TestAddOverflow); @@ -3918,7 +3921,7 @@ void CalendarTest::TestClearMonth() { if (failure(status, "Calendar::get(UCAL_MONTH)")) return; cal->clear(UCAL_MONTH); assertEquals("Calendar::isSet(UCAL_MONTH) after clear(UCAL_MONTH)", false, !!cal->isSet(UCAL_MONTH)); - assertEquals("Calendar::get(UCAL_MONTH after clear(UCAL_MONTH))", UCAL_JANUARY, !!cal->get(UCAL_MONTH, status)); + assertEquals("Calendar::get(UCAL_MONTH after clear(UCAL_MONTH))", UCAL_JANUARY, cal->get(UCAL_MONTH, status)); if (failure(status, "Calendar::get(UCAL_MONTH)")) return; cal->set(UCAL_ORDINAL_MONTH, 7); @@ -5662,6 +5665,30 @@ void CalendarTest::Test22633ChineseOverflow() { cal->add(UCAL_YEAR, 1935762034, status); assertTrue("Should return falure", U_FAILURE(status)); } + +void CalendarTest::Test22962BuddhistOverflow() { + UErrorCode status = U_ZERO_ERROR; + LocalPointer cal(Calendar::createInstance(Locale("en@calendar=uddhist"), status), status); + U_ASSERT(U_SUCCESS(status)); + cal->clear(); + cal->set(UCAL_WEEK_OF_YEAR, 1666136); + cal->set(UCAL_YEAR, -1887379272); + cal->fieldDifference( + 261830011167902373443927125260580558779842815957727840993886210772873194951140935848493861585917165011373697198856398176256.000000, + UCAL_YEAR_WOY, status); + assertTrue("Should return falure", U_FAILURE(status)); +} + +void CalendarTest::Test22962ChineseOverflow() { + UErrorCode status = U_ZERO_ERROR; + LocalPointer cal(Calendar::createInstance(Locale("en@calendar=chinese"), status), status); + U_ASSERT(U_SUCCESS(status)); + cal->add(UCAL_DAY_OF_WEEK_IN_MONTH, 1661092210, status); + cal->add(UCAL_MINUTE, -1330638081, status); + cal->add(UCAL_MONTH, 643194, status); + assertTrue("Should return falure", U_FAILURE(status)); +} + void CalendarTest::Test22633IndianOverflow() { UErrorCode status = U_ZERO_ERROR; LocalPointer cal(Calendar::createInstance(Locale("en@calendar=indian"), status), status); @@ -5898,6 +5925,17 @@ void CalendarTest::Test22730CopticOverflow() { assertEquals("status return without overflow", status, U_ILLEGAL_ARGUMENT_ERROR); } +void CalendarTest::Test22962ComputeJulianDayOverflow() { + UErrorCode status = U_ZERO_ERROR; + LocalPointer calendar( + Calendar::createInstance(Locale("nds-NL-u-ca-islamic-umalqura"), status), + status); + calendar->clear(); + calendar->set(UCAL_YEAR, -2147483648); + calendar->set(UCAL_WEEK_OF_YEAR, 33816240); + calendar->get(UCAL_ERA, status); + assertEquals("status return without overflow", status, U_ILLEGAL_ARGUMENT_ERROR); +} void CalendarTest::TestAddOverflow() { UErrorCode status = U_ZERO_ERROR; diff --git a/icu4c/source/test/intltest/caltest.h b/icu4c/source/test/intltest/caltest.h index defb40508cc..068db75b56f 100644 --- a/icu4c/source/test/intltest/caltest.h +++ b/icu4c/source/test/intltest/caltest.h @@ -335,6 +335,8 @@ public: // package void TestAddOverflow(); void TestRollWeekOfYear(); void Test22633ChineseOverflow(); + void Test22962ChineseOverflow(); + void Test22962BuddhistOverflow(); void Test22633IndianOverflow(); void Test22633IslamicUmalquraOverflow(); void Test22633PersianOverflow(); @@ -348,6 +350,7 @@ public: // package void Test22633RollTwiceGetTimeOverflow(); void Test22730JapaneseOverflow(); void Test22730CopticOverflow(); + void Test22962ComputeJulianDayOverflow(); void Test22750Roll(); diff --git a/icu4c/source/test/intltest/collationtest.cpp b/icu4c/source/test/intltest/collationtest.cpp index 8308d7ea073..25da189344e 100644 --- a/icu4c/source/test/intltest/collationtest.cpp +++ b/icu4c/source/test/intltest/collationtest.cpp @@ -1754,10 +1754,10 @@ UBool CollationTest::checkCompareTwo(const char *norm, const UnicodeString &prev // sortkey(str1 + "\uFFFE" + str2) == mergeSortkeys(sortkey(str1), sortkey(str2)) // only that those two methods yield the same order. // - // Use bit-wise OR so that getMergedCollationKey() is always called for both strings. - if((getMergedCollationKey(prevString.getBuffer(), prevString.length(), prevKey, errorCode) | - getMergedCollationKey(s.getBuffer(), s.length(), key, errorCode)) || - errorCode.isFailure()) { + // Use two variables so that getMergedCollationKey() is always called for both strings. + if (UBool prev = getMergedCollationKey(prevString.getBuffer(), prevString.length(), prevKey, errorCode), + curr = getMergedCollationKey(s.getBuffer(), s.length(), key, errorCode); + prev || curr || errorCode.isFailure()) { order = prevKey.compareTo(key, errorCode); if(order != expectedOrder || errorCode.isFailure()) { infoln(fileTestName); diff --git a/icu4c/source/test/intltest/dtptngts.cpp b/icu4c/source/test/intltest/dtptngts.cpp index 25ab05de33b..ee0dcfd4e72 100644 --- a/icu4c/source/test/intltest/dtptngts.cpp +++ b/icu4c/source/test/intltest/dtptngts.cpp @@ -53,7 +53,7 @@ void IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index, UBool e } } -#define MAX_LOCALE 12 +#define MAX_LOCALE 11 /** * Test various generic API methods of DateTimePatternGenerator for API coverage. @@ -93,7 +93,6 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) {"zh", "TW", "", "calendar=roc"}, // 8 {"ru", "", "", ""}, // 9 {"zh", "", "", "calendar=chinese"}, // 10 - {"ja", "JP", "TRADITIONAL", ""}, // 11 }; // For Weds, Jan 13, 1999, 23:58:59 @@ -328,28 +327,7 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) UnicodeString("23:58"), // 16: JJmm }; - UnicodeString patternResults_ja_jp_traditional[] = { - // ja_JP_TRADITIONAL // 11 ja_JP_TRADITIONAL - u"AD1999/1", // 00: yM - u"西暦1999年1月", // 01: yMMM - u"1999年1月13日", // 02: yMd - u"西暦1999年1月13日", // 03: yMMMd - u"1/13", // 04: Md - u"1月13日", // 05: MMMd - u"1月13日", // 06: MMMMd - u"西暦1999/Q1", // 07: yQQQ - u"午後11:58", // 08: hhmm - u"23:58", // 09: HHmm - u"23:58", // 10: jjmm - u"58:59", // 11: mmss - u"西暦1999年1月", // 12: yyyyMMMM - u"1月13日(水)", // 13: MMMEd - u"13日(水)", // 14: Ed - u"23:58:59.123", // 15: jmmssSSS - u"23:58", // 16: JJmm - }; - - UnicodeString* patternResults[] = { + UnicodeString* patternResults[MAX_LOCALE] = { patternResults_en_US, // 0 patternResults_en_US_japanese, // 1 patternResults_de_DE, // 2 @@ -361,7 +339,6 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) patternResults_zh_TW_roc, // 8 patternResults_ru, // 9 patternResults_zh_chinese, // 10 - patternResults_ja_jp_traditional, // 11 }; UnicodeString patternTests2[] = { @@ -1391,10 +1368,6 @@ void IntlTestDateTimePatternGeneratorAPI::testJjMapping() { continue; } // Now check that shortPattern and jPattern use the same hour cycle - if ((uprv_strncmp(localeID, "yue_Hant_CN", 11) == 0) - && logKnownIssue("CLDR-17979", "Need timeFormats with h for yue_Hant_CN")) { - continue; - } UnicodeString jPatSkeleton = DateTimePatternGenerator::staticGetSkeleton(jPattern, status); UnicodeString shortPatSkeleton = DateTimePatternGenerator::staticGetSkeleton(shortPattern, status); if (U_FAILURE(status)) { diff --git a/icu4c/source/test/intltest/incaltst.cpp b/icu4c/source/test/intltest/incaltst.cpp index d7d052bde24..4b825fda06c 100644 --- a/icu4c/source/test/intltest/incaltst.cpp +++ b/icu4c/source/test/intltest/incaltst.cpp @@ -86,6 +86,10 @@ void IntlCalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &n TESTCASE_AUTO(TestJapanese3860); TESTCASE_AUTO(TestForceGannenNumbering); TESTCASE_AUTO(TestPersian); + TESTCASE_AUTO(TestPersianJulianDayToYMD); + TESTCASE_AUTO(TestPersianYMDToJulianDay); + TESTCASE_AUTO(TestPersianJan1ToGregorian); + TESTCASE_AUTO(TestGregorianToPersian); TESTCASE_AUTO(TestPersianFormat); TESTCASE_AUTO(TestTaiwan); TESTCASE_AUTO(TestConsistencyGregorian); @@ -896,6 +900,433 @@ void IntlCalendarTest::TestPersian() { delete grego; } +// Test data copy from +// https://github.com/unicode-org/icu4x/blob/main/components/calendar/src/persian.rs#L299 +static struct PersianTestCase1 { + int32_t rd; + int32_t year; + int32_t month; + int32_t day; + } persianTestCases1[]{ + {656786, 1178, 1, 1}, + {664224, 1198, 5, 10}, + {671401, 1218, 1, 7}, + {694799, 1282, 1, 29}, + {702806, 1304, 1, 1}, + {704424, 1308, 6, 3}, + {708842, 1320, 7, 7}, + {709409, 1322, 1, 29}, + {709580, 1322, 7, 14}, + {727274, 1370, 12, 27}, + {728714, 1374, 12, 6}, + {739330, 1403, 12, 30}, + {739331, 1404, 1, 1}, + {744313, 1417, 8, 19}, + {763436, 1469, 12, 30}, + {763437, 1470, 1, 1}, + {764652, 1473, 4, 28}, + {775123, 1501, 12, 29}, + {775488, 1502, 12, 29}, + {775487, 1502, 12, 28}, + {775488, 1502, 12, 29}, + {775489, 1503, 1, 1}, + {775490, 1503, 1, 2}, + {1317873, 2987, 12, 29}, + {1317874, 2988, 1, 1}, + {1317875, 2988, 1, 2}, + }; + +void IntlCalendarTest::TestPersianJulianDayToYMD() { + UErrorCode status = U_ZERO_ERROR; + std::unique_ptr cal(Calendar::createInstance(TimeZone::createTimeZone("Asia/Tehran"), "fa_IR@calendar=persian", status)); + + for (const auto &testCase : persianTestCases1) { + status = U_ZERO_ERROR; + int32_t jday = testCase.rd + 1721425; + cal->clear(); + cal->set(UCAL_JULIAN_DAY, jday); + int32_t actualYear = cal->get(UCAL_YEAR, status); + int32_t actualMonth = cal->get(UCAL_MONTH, status)+1; + int32_t actualDay = cal->get(UCAL_DAY_OF_MONTH, status); + if (actualYear != testCase.year || actualMonth != testCase.month || actualDay != testCase.day) { + errln(UnicodeString("rd ") + testCase.rd + " = jday " + jday + " -> expect Persian(" + + testCase.year + "/" + testCase.month + "/" + testCase.day + ") " + + "actual Persian(" + actualYear + "/" + actualMonth + "/" + actualDay + ")"); + } + } +} + +void IntlCalendarTest::TestPersianYMDToJulianDay() { + UErrorCode status = U_ZERO_ERROR; + std::unique_ptr cal(Calendar::createInstance(TimeZone::createTimeZone("Asia/Tehran"), "fa_IR@calendar=persian", status)); + + for (const auto &testCase : persianTestCases1) { + status = U_ZERO_ERROR; + cal->clear(); + cal->set(UCAL_YEAR, testCase.year); + cal->set(UCAL_MONTH, testCase.month-1); + cal->set(UCAL_DAY_OF_MONTH, testCase.day); + int32_t actualJday = cal->get(UCAL_JULIAN_DAY, status); + int32_t actualRD = actualJday - 1721425; + if (actualRD != testCase.rd) { + errln(UnicodeString("Persian(") + testCase.year + "/" + testCase.month + "/" + testCase.day + ") => "+ + "expect rd " + testCase.rd + " but actual jd: " + actualJday + " = rd " + actualRD); + } + } +} + +// Test data copy from +// https://github.com/unicode-org/icu4x/blob/main/components/calendar/src/persian.rs#L534 +// From https://calendar.ut.ac.ir/Fa/News/Data/Doc/KabiseShamsi1206-1498-new.pdf +// Plain text version at https://github.com/roozbehp/persiancalendar/blob/main/kabise.txt +static struct PersianTestCase2 { + int32_t pYear; + bool pLeap; + int32_t year; + int32_t month; + int32_t day; + } persianTestCases2[]{ + {1206, false, 1827, 3, 22}, + {1207, false, 1828, 3, 21}, + {1208, false, 1829, 3, 21}, + {1209, false, 1830, 3, 21}, + {1210, true, 1831, 3, 21}, + {1211, false, 1832, 3, 21}, + {1212, false, 1833, 3, 21}, + {1213, false, 1834, 3, 21}, + {1214, true, 1835, 3, 21}, + {1215, false, 1836, 3, 21}, + {1216, false, 1837, 3, 21}, + {1217, false, 1838, 3, 21}, + {1218, true, 1839, 3, 21}, + {1219, false, 1840, 3, 21}, + {1220, false, 1841, 3, 21}, + {1221, false, 1842, 3, 21}, + {1222, true, 1843, 3, 21}, + {1223, false, 1844, 3, 21}, + {1224, false, 1845, 3, 21}, + {1225, false, 1846, 3, 21}, + {1226, true, 1847, 3, 21}, + {1227, false, 1848, 3, 21}, + {1228, false, 1849, 3, 21}, + {1229, false, 1850, 3, 21}, + {1230, true, 1851, 3, 21}, + {1231, false, 1852, 3, 21}, + {1232, false, 1853, 3, 21}, + {1233, false, 1854, 3, 21}, + {1234, true, 1855, 3, 21}, + {1235, false, 1856, 3, 21}, + {1236, false, 1857, 3, 21}, + {1237, false, 1858, 3, 21}, + {1238, true, 1859, 3, 21}, + {1239, false, 1860, 3, 21}, + {1240, false, 1861, 3, 21}, + {1241, false, 1862, 3, 21}, + {1242, false, 1863, 3, 21}, + {1243, true, 1864, 3, 20}, + {1244, false, 1865, 3, 21}, + {1245, false, 1866, 3, 21}, + {1246, false, 1867, 3, 21}, + {1247, true, 1868, 3, 20}, + {1248, false, 1869, 3, 21}, + {1249, false, 1870, 3, 21}, + {1250, false, 1871, 3, 21}, + {1251, true, 1872, 3, 20}, + {1252, false, 1873, 3, 21}, + {1253, false, 1874, 3, 21}, + {1254, false, 1875, 3, 21}, + {1255, true, 1876, 3, 20}, + {1256, false, 1877, 3, 21}, + {1257, false, 1878, 3, 21}, + {1258, false, 1879, 3, 21}, + {1259, true, 1880, 3, 20}, + {1260, false, 1881, 3, 21}, + {1261, false, 1882, 3, 21}, + {1262, false, 1883, 3, 21}, + {1263, true, 1884, 3, 20}, + {1264, false, 1885, 3, 21}, + {1265, false, 1886, 3, 21}, + {1266, false, 1887, 3, 21}, + {1267, true, 1888, 3, 20}, + {1268, false, 1889, 3, 21}, + {1269, false, 1890, 3, 21}, + {1270, false, 1891, 3, 21}, + {1271, true, 1892, 3, 20}, + {1272, false, 1893, 3, 21}, + {1273, false, 1894, 3, 21}, + {1274, false, 1895, 3, 21}, + {1275, false, 1896, 3, 20}, + {1276, true, 1897, 3, 20}, + {1277, false, 1898, 3, 21}, + {1278, false, 1899, 3, 21}, + {1279, false, 1900, 3, 21}, + {1280, true, 1901, 3, 21}, + {1281, false, 1902, 3, 22}, + {1282, false, 1903, 3, 22}, + {1283, false, 1904, 3, 21}, + {1284, true, 1905, 3, 21}, + {1285, false, 1906, 3, 22}, + {1286, false, 1907, 3, 22}, + {1287, false, 1908, 3, 21}, + {1288, true, 1909, 3, 21}, + {1289, false, 1910, 3, 22}, + {1290, false, 1911, 3, 22}, + {1291, false, 1912, 3, 21}, + {1292, true, 1913, 3, 21}, + {1293, false, 1914, 3, 22}, + {1294, false, 1915, 3, 22}, + {1295, false, 1916, 3, 21}, + {1296, true, 1917, 3, 21}, + {1297, false, 1918, 3, 22}, + {1298, false, 1919, 3, 22}, + {1299, false, 1920, 3, 21}, + {1300, true, 1921, 3, 21}, + {1301, false, 1922, 3, 22}, + {1302, false, 1923, 3, 22}, + {1303, false, 1924, 3, 21}, + {1304, true, 1925, 3, 21}, + {1305, false, 1926, 3, 22}, + {1306, false, 1927, 3, 22}, + {1307, false, 1928, 3, 21}, + {1308, false, 1929, 3, 21}, + {1309, true, 1930, 3, 21}, + {1310, false, 1931, 3, 22}, + {1311, false, 1932, 3, 21}, + {1312, false, 1933, 3, 21}, + {1313, true, 1934, 3, 21}, + {1314, false, 1935, 3, 22}, + {1315, false, 1936, 3, 21}, + {1316, false, 1937, 3, 21}, + {1317, true, 1938, 3, 21}, + {1318, false, 1939, 3, 22}, + {1319, false, 1940, 3, 21}, + {1320, false, 1941, 3, 21}, + {1321, true, 1942, 3, 21}, + {1322, false, 1943, 3, 22}, + {1323, false, 1944, 3, 21}, + {1324, false, 1945, 3, 21}, + {1325, true, 1946, 3, 21}, + {1326, false, 1947, 3, 22}, + {1327, false, 1948, 3, 21}, + {1328, false, 1949, 3, 21}, + {1329, true, 1950, 3, 21}, + {1330, false, 1951, 3, 22}, + {1331, false, 1952, 3, 21}, + {1332, false, 1953, 3, 21}, + {1333, true, 1954, 3, 21}, + {1334, false, 1955, 3, 22}, + {1335, false, 1956, 3, 21}, + {1336, false, 1957, 3, 21}, + {1337, true, 1958, 3, 21}, + {1338, false, 1959, 3, 22}, + {1339, false, 1960, 3, 21}, + {1340, false, 1961, 3, 21}, + {1341, false, 1962, 3, 21}, + {1342, true, 1963, 3, 21}, + {1343, false, 1964, 3, 21}, + {1344, false, 1965, 3, 21}, + {1345, false, 1966, 3, 21}, + {1346, true, 1967, 3, 21}, + {1347, false, 1968, 3, 21}, + {1348, false, 1969, 3, 21}, + {1349, false, 1970, 3, 21}, + {1350, true, 1971, 3, 21}, + {1351, false, 1972, 3, 21}, + {1352, false, 1973, 3, 21}, + {1353, false, 1974, 3, 21}, + {1354, true, 1975, 3, 21}, + {1355, false, 1976, 3, 21}, + {1356, false, 1977, 3, 21}, + {1357, false, 1978, 3, 21}, + {1358, true, 1979, 3, 21}, + {1359, false, 1980, 3, 21}, + {1360, false, 1981, 3, 21}, + {1361, false, 1982, 3, 21}, + {1362, true, 1983, 3, 21}, + {1363, false, 1984, 3, 21}, + {1364, false, 1985, 3, 21}, + {1365, false, 1986, 3, 21}, + {1366, true, 1987, 3, 21}, + {1367, false, 1988, 3, 21}, + {1368, false, 1989, 3, 21}, + {1369, false, 1990, 3, 21}, + {1370, true, 1991, 3, 21}, + {1371, false, 1992, 3, 21}, + {1372, false, 1993, 3, 21}, + {1373, false, 1994, 3, 21}, + {1374, false, 1995, 3, 21}, + {1375, true, 1996, 3, 20}, + {1376, false, 1997, 3, 21}, + {1377, false, 1998, 3, 21}, + {1378, false, 1999, 3, 21}, + {1379, true, 2000, 3, 20}, + {1380, false, 2001, 3, 21}, + {1381, false, 2002, 3, 21}, + {1382, false, 2003, 3, 21}, + {1383, true, 2004, 3, 20}, + {1384, false, 2005, 3, 21}, + {1385, false, 2006, 3, 21}, + {1386, false, 2007, 3, 21}, + {1387, true, 2008, 3, 20}, + {1388, false, 2009, 3, 21}, + {1389, false, 2010, 3, 21}, + {1390, false, 2011, 3, 21}, + {1391, true, 2012, 3, 20}, + {1392, false, 2013, 3, 21}, + {1393, false, 2014, 3, 21}, + {1394, false, 2015, 3, 21}, + {1395, true, 2016, 3, 20}, + {1396, false, 2017, 3, 21}, + {1397, false, 2018, 3, 21}, + {1398, false, 2019, 3, 21}, + {1399, true, 2020, 3, 20}, + {1400, false, 2021, 3, 21}, + {1401, false, 2022, 3, 21}, + {1402, false, 2023, 3, 21}, + {1403, true, 2024, 3, 20}, + {1404, false, 2025, 3, 21}, + {1405, false, 2026, 3, 21}, + {1406, false, 2027, 3, 21}, + {1407, false, 2028, 3, 20}, + {1408, true, 2029, 3, 20}, + {1409, false, 2030, 3, 21}, + {1410, false, 2031, 3, 21}, + {1411, false, 2032, 3, 20}, + {1412, true, 2033, 3, 20}, + {1413, false, 2034, 3, 21}, + {1414, false, 2035, 3, 21}, + {1415, false, 2036, 3, 20}, + {1416, true, 2037, 3, 20}, + {1417, false, 2038, 3, 21}, + {1418, false, 2039, 3, 21}, + {1419, false, 2040, 3, 20}, + {1420, true, 2041, 3, 20}, + {1421, false, 2042, 3, 21}, + {1422, false, 2043, 3, 21}, + {1423, false, 2044, 3, 20}, + {1424, true, 2045, 3, 20}, + {1425, false, 2046, 3, 21}, + {1426, false, 2047, 3, 21}, + {1427, false, 2048, 3, 20}, + {1428, true, 2049, 3, 20}, + {1429, false, 2050, 3, 21}, + {1430, false, 2051, 3, 21}, + {1431, false, 2052, 3, 20}, + {1432, true, 2053, 3, 20}, + {1433, false, 2054, 3, 21}, + {1434, false, 2055, 3, 21}, + {1435, false, 2056, 3, 20}, + {1436, true, 2057, 3, 20}, + {1437, false, 2058, 3, 21}, + {1438, false, 2059, 3, 21}, + {1439, false, 2060, 3, 20}, + {1440, false, 2061, 3, 20}, + {1441, true, 2062, 3, 20}, + {1442, false, 2063, 3, 21}, + {1443, false, 2064, 3, 20}, + {1444, false, 2065, 3, 20}, + {1445, true, 2066, 3, 20}, + {1446, false, 2067, 3, 21}, + {1447, false, 2068, 3, 20}, + {1448, false, 2069, 3, 20}, + {1449, true, 2070, 3, 20}, + {1450, false, 2071, 3, 21}, + {1451, false, 2072, 3, 20}, + {1452, false, 2073, 3, 20}, + {1453, true, 2074, 3, 20}, + {1454, false, 2075, 3, 21}, + {1455, false, 2076, 3, 20}, + {1456, false, 2077, 3, 20}, + {1457, true, 2078, 3, 20}, + {1458, false, 2079, 3, 21}, + {1459, false, 2080, 3, 20}, + {1460, false, 2081, 3, 20}, + {1461, true, 2082, 3, 20}, + {1462, false, 2083, 3, 21}, + {1463, false, 2084, 3, 20}, + {1464, false, 2085, 3, 20}, + {1465, true, 2086, 3, 20}, + {1466, false, 2087, 3, 21}, + {1467, false, 2088, 3, 20}, + {1468, false, 2089, 3, 20}, + {1469, true, 2090, 3, 20}, + {1470, false, 2091, 3, 21}, + {1471, false, 2092, 3, 20}, + {1472, false, 2093, 3, 20}, + {1473, false, 2094, 3, 20}, + {1474, true, 2095, 3, 20}, + {1475, false, 2096, 3, 20}, + {1476, false, 2097, 3, 20}, + {1477, false, 2098, 3, 20}, + {1478, true, 2099, 3, 20}, + {1479, false, 2100, 3, 21}, + {1480, false, 2101, 3, 21}, + {1481, false, 2102, 3, 21}, + {1482, true, 2103, 3, 21}, + {1483, false, 2104, 3, 21}, + {1484, false, 2105, 3, 21}, + {1485, false, 2106, 3, 21}, + {1486, true, 2107, 3, 21}, + {1487, false, 2108, 3, 21}, + {1488, false, 2109, 3, 21}, + {1489, false, 2110, 3, 21}, + {1490, true, 2111, 3, 21}, + {1491, false, 2112, 3, 21}, + {1492, false, 2113, 3, 21}, + {1493, false, 2114, 3, 21}, + {1494, true, 2115, 3, 21}, + {1495, false, 2116, 3, 21}, + {1496, false, 2117, 3, 21}, + {1497, false, 2118, 3, 21}, + {1498, true, 2119, 3, 21}, + }; + +void IntlCalendarTest::TestPersianJan1ToGregorian() { + UErrorCode status = U_ZERO_ERROR; + std::unique_ptr gcal(Calendar::createInstance(TimeZone::createTimeZone("Asia/Tehran"), "en", status)); + std::unique_ptr cal(Calendar::createInstance(TimeZone::createTimeZone("Asia/Tehran"), "fa_IR@calendar=persian", status)); + + for (const auto &testCase : persianTestCases2) { + status = U_ZERO_ERROR; + cal->clear(); + cal->set(UCAL_YEAR, testCase.pYear); + cal->set(UCAL_MONTH, 0); + cal->set(UCAL_DAY_OF_MONTH, 1); + gcal->setTime(cal->getTime(status), status); + int32_t actualYear = gcal->get(UCAL_YEAR, status); + int32_t actualMonth = gcal->get(UCAL_MONTH, status)+1; + int32_t actualDay = gcal->get(UCAL_DAY_OF_MONTH, status); + if (actualYear != testCase.year || actualMonth != testCase.month || actualDay != testCase.day) { + errln(UnicodeString("Persian(") + testCase.pYear + ", 1, 1) => " + + "expect Gregorian(" + testCase.year + "/" + testCase.month + "/" + testCase.day + ") " + + "actual Gregorian(" + actualYear + "/" + actualMonth + "/" + actualDay + ")"); + } + } +} + +void IntlCalendarTest::TestGregorianToPersian() { + UErrorCode status = U_ZERO_ERROR; + std::unique_ptr gcal(Calendar::createInstance(TimeZone::createTimeZone("Asia/Tehran"), "en", status)); + std::unique_ptr cal(Calendar::createInstance(TimeZone::createTimeZone("Asia/Tehran"), "fa_IR@calendar=persian", status)); + + for (const auto &testCase : persianTestCases2) { + status = U_ZERO_ERROR; + gcal->clear(); + gcal->set(UCAL_YEAR, testCase.year); + gcal->set(UCAL_MONTH, testCase.month-1); + gcal->set(UCAL_DAY_OF_MONTH, testCase.day); + cal->setTime(gcal->getTime(status), status); + int32_t persianYear = cal->get(UCAL_YEAR, status); + int32_t persianMonth = cal->get(UCAL_MONTH, status)+1; + int32_t persianDay = cal->get(UCAL_DAY_OF_MONTH, status); + if (persianYear != testCase.pYear || persianMonth != 1 || persianDay != 1) { + errln(UnicodeString("Gregorian(") + testCase.year + "/" + testCase.month + "/" + testCase.day + ") "+ + " => expect Persian(" + testCase.pYear + "/1/1) actual " + + "Persian(" + persianYear + "/" + persianMonth + "/" + persianDay + ")"); + } + } +} + void IntlCalendarTest::TestPersianFormat() { UErrorCode status = U_ZERO_ERROR; SimpleDateFormat fmt(UnicodeString("MMMM d, yyyy G"), Locale(" en_US@calendar=persian"), status); diff --git a/icu4c/source/test/intltest/incaltst.h b/icu4c/source/test/intltest/incaltst.h index 8f8ca430096..a1f7d11bfc4 100644 --- a/icu4c/source/test/intltest/incaltst.h +++ b/icu4c/source/test/intltest/incaltst.h @@ -41,6 +41,10 @@ public: void TestForceGannenNumbering(); void TestPersian(); + void TestPersianJulianDayToYMD(); + void TestPersianYMDToJulianDay(); + void TestPersianJan1ToGregorian(); + void TestGregorianToPersian(); void TestPersianFormat(); void TestConsistencyGregorian(); diff --git a/icu4c/source/test/intltest/intltest.cpp b/icu4c/source/test/intltest/intltest.cpp index e46eaafca32..3806d0ff529 100644 --- a/icu4c/source/test/intltest/intltest.cpp +++ b/icu4c/source/test/intltest/intltest.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "unicode/ctest.h" // for str_timeDelta #include "unicode/curramt.h" @@ -501,13 +502,13 @@ IntlTest* IntlTest::gTest = nullptr; static int32_t execCount = 0; -void it_log( UnicodeString message ) +void it_log(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->log( message ); } -void it_logln( UnicodeString message ) +void it_logln(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->logln( message ); @@ -519,13 +520,13 @@ void it_logln() IntlTest::gTest->logln(); } -void it_info( UnicodeString message ) +void it_info(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->info( message ); } -void it_infoln( UnicodeString message ) +void it_infoln(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->infoln( message ); @@ -543,30 +544,47 @@ void it_err() IntlTest::gTest->err(); } -void it_err( UnicodeString message ) +void it_err(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->err( message ); } -void it_errln( UnicodeString message ) +void it_errln(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->errln( message ); } -void it_dataerr( UnicodeString message ) +void it_dataerr(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->dataerr( message ); } -void it_dataerrln( UnicodeString message ) +void it_dataerrln(std::u16string_view message) { if (IntlTest::gTest) IntlTest::gTest->dataerrln( message ); } +void it_logln(const char* message) { + it_logln(UnicodeString(message)); +} + +void it_err(const char* message) { + it_err(UnicodeString(message)); +} + +void it_errln(const char* message) { + it_errln(UnicodeString(message)); +} + +void it_dataerrln(const char* message) { + it_dataerrln(UnicodeString(message)); +} + + IntlTest::IntlTest() { caller = nullptr; @@ -784,7 +802,7 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName ) execCount++; char msg[256]; snprintf(msg, sizeof(msg), "%s {", name); - LL_message(msg, true); + LL_message(UnicodeString(msg), true); UDate timeStart = uprv_getRawUTCtime(); strcpy(saveBaseLoc,name); strcat(saveBaseLoc,"/"); @@ -828,11 +846,11 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName ) } LL_indentlevel -= 3; if (lastTestFailed) { - LL_message( "", true); + LL_message({}, true); } - LL_message( msg, true); + LL_message(UnicodeString(msg), true); if (lastTestFailed) { - LL_message( "", true); + LL_message({}, true); } LL_indentlevel += 3; } @@ -849,7 +867,7 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName ) /** * Adds given string to the log if we are in verbose mode. */ -void IntlTest::log( const UnicodeString &message ) +void IntlTest::log(std::u16string_view message) { if( verbose ) { LL_message( message, false ); @@ -860,7 +878,7 @@ void IntlTest::log( const UnicodeString &message ) * Adds given string to the log if we are in verbose mode. Adds a new line to * the given message. */ -void IntlTest::logln( const UnicodeString &message ) +void IntlTest::logln(std::u16string_view message) { if( verbose ) { LL_message( message, true ); @@ -870,14 +888,14 @@ void IntlTest::logln( const UnicodeString &message ) void IntlTest::logln() { if( verbose ) { - LL_message( "", true ); + LL_message({}, true ); } } /** * Unconditionally adds given string to the log. */ -void IntlTest::info( const UnicodeString &message ) +void IntlTest::info(std::u16string_view message) { LL_message( message, false ); } @@ -886,14 +904,14 @@ void IntlTest::info( const UnicodeString &message ) * Unconditionally adds given string to the log. Adds a new line to * the given message. */ -void IntlTest::infoln( const UnicodeString &message ) +void IntlTest::infoln(std::u16string_view message) { LL_message( message, true ); } void IntlTest::infoln() { - LL_message( "", true ); + LL_message({}, true ); } int32_t IntlTest::IncErrorCount() @@ -915,19 +933,19 @@ void IntlTest::err() IncErrorCount(); } -void IntlTest::err( const UnicodeString &message ) +void IntlTest::err(std::u16string_view message) { IncErrorCount(); if (!no_err_msg) LL_message( message, false ); } -void IntlTest::errln( const UnicodeString &message ) +void IntlTest::errln(std::u16string_view message) { IncErrorCount(); if (!no_err_msg) LL_message( message, true ); } -void IntlTest::dataerr( const UnicodeString &message ) +void IntlTest::dataerr(std::u16string_view message) { IncDataErrorCount(); @@ -938,7 +956,7 @@ void IntlTest::dataerr( const UnicodeString &message ) if (!no_err_msg) LL_message( message, false ); } -void IntlTest::dataerrln( const UnicodeString &message ) +void IntlTest::dataerrln(std::u16string_view message) { int32_t errCount = IncDataErrorCount(); UnicodeString msg; @@ -958,7 +976,7 @@ void IntlTest::dataerrln( const UnicodeString &message ) } } -void IntlTest::errcheckln(UErrorCode status, const UnicodeString &message ) { +void IntlTest::errcheckln(UErrorCode status, std::u16string_view message) { if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) { dataerrln(message); } else { @@ -1011,7 +1029,7 @@ UBool IntlTest::logKnownIssue(const char *ticket) { return logKnownIssue(ticket, UnicodeString()); } -UBool IntlTest::logKnownIssue(const char *ticket, const UnicodeString &msg) { +UBool IntlTest::logKnownIssue(const char *ticket, std::u16string_view msg) { if(noKnownIssues) return false; char fullpath[2048]; @@ -1123,7 +1141,7 @@ UBool IntlTest::printKnownIssues() } -void IntlTest::LL_message( UnicodeString message, UBool newline ) +void IntlTest::LL_message(std::u16string_view message, UBool newline) { // Synchronize this function. // All error messages generated by tests funnel through here. @@ -1160,10 +1178,11 @@ void IntlTest::LL_message( UnicodeString message, UBool newline ) } // replace each LineFeed by the indentation string - message.findAndReplace(UnicodeString(static_cast('\n')), indent); + UnicodeString us(message); + us.findAndReplace(UnicodeString(static_cast('\n')), indent); // stream out the message - length = message.extract(0, message.length(), buffer, sizeof(buffer)); + length = us.extract(0, us.length(), buffer, sizeof(buffer)); if (length > 0) { length = length > 30000 ? 30000 : length; fwrite(buffer, sizeof(*buffer), length, static_cast(testoutfp)); @@ -1938,8 +1957,8 @@ static inline char16_t toHex(int32_t i) { return static_cast(i + (i < 10 ? 0x30 : (0x41 - 10))); } -static UnicodeString& escape(const UnicodeString& s, UnicodeString& result) { - for (int32_t i=0; i(s.length()); ++i) { char16_t c = s[i]; if (c <= static_cast(0x7F)) { result += c; @@ -2014,8 +2033,8 @@ UBool IntlTest::assertSuccess(const char* message, UErrorCode ec, UBool possible } UBool IntlTest::assertEquals(const char* message, - const UnicodeString& expected, - const UnicodeString& actual, + std::u16string_view expected, + std::u16string_view actual, UBool possibleDataError) { if (expected != actual) { if (possibleDataError) { @@ -2056,6 +2075,22 @@ UBool IntlTest::assertEquals(const char* message, return true; } +UBool IntlTest::assertEquals(const char* message, const char* expected, + std::u16string_view actual, UBool possibleDataError) { + return assertEquals( + message, + UnicodeString(expected), actual, + possibleDataError); +} + +UBool IntlTest::assertEquals(const char* message, std::u16string_view expected, + const char* actual, UBool possibleDataError) { + return assertEquals( + message, + expected, UnicodeString(actual), + possibleDataError); +} + UBool IntlTest::assertEquals(const char* message, int32_t expected, int32_t actual) { @@ -2163,10 +2198,10 @@ UBool IntlTest::assertEquals(const char* message, #if !UCONFIG_NO_FORMATTING -UBool IntlTest::assertEquals(const char* message, - const Formattable& expected, - const Formattable& actual, - UBool possibleDataError) { +UBool IntlTest::assertEqualFormattables(const char* message, + const Formattable& expected, + const Formattable& actual, + UBool possibleDataError) { if (expected != actual) { if (possibleDataError) { dataerrln(UnicodeString("FAIL: ") + message + "; got " + @@ -2273,7 +2308,7 @@ UBool IntlTest::assertEqualsNear(const char* message, static char ASSERT_BUF[256]; -static const char* extractToAssertBuf(const UnicodeString& message) { +static const char* extractToAssertBuf(std::u16string_view message) { UnicodeString buf; escape(message, buf); buf.extract(0, 0x7FFFFFFF, ASSERT_BUF, sizeof(ASSERT_BUF) - 1, nullptr); @@ -2281,82 +2316,87 @@ static const char* extractToAssertBuf(const UnicodeString& message) { return ASSERT_BUF; } -UBool IntlTest::assertTrue(const UnicodeString& message, UBool condition, UBool quiet, UBool possibleDataError) { +UBool IntlTest::assertTrue(std::u16string_view message, UBool condition, UBool quiet, UBool possibleDataError) { return assertTrue(extractToAssertBuf(message), condition, quiet, possibleDataError); } -UBool IntlTest::assertFalse(const UnicodeString& message, UBool condition, UBool quiet, UBool possibleDataError) { +UBool IntlTest::assertFalse(std::u16string_view message, UBool condition, UBool quiet, UBool possibleDataError) { return assertFalse(extractToAssertBuf(message), condition, quiet, possibleDataError); } -UBool IntlTest::assertSuccess(const UnicodeString& message, UErrorCode ec) { +UBool IntlTest::assertSuccess(std::u16string_view message, UErrorCode ec) { return assertSuccess(extractToAssertBuf(message), ec); } -UBool IntlTest::assertEquals(const UnicodeString& message, - const UnicodeString& expected, - const UnicodeString& actual, +UBool IntlTest::assertEquals(std::u16string_view message, + std::u16string_view expected, + std::u16string_view actual, UBool possibleDataError) { return assertEquals(extractToAssertBuf(message), expected, actual, possibleDataError); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, const char* expected, const char* actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, UBool expected, UBool actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, int32_t expected, int32_t actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, int64_t expected, int64_t actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, double expected, double actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, UErrorCode expected, UErrorCode actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, const UnicodeSet& expected, const UnicodeSet& actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertEquals(const UnicodeString& message, +UBool IntlTest::assertEquals(std::u16string_view message, const std::vector& expected, const std::vector& actual) { return assertEquals(extractToAssertBuf(message), expected, actual); } -UBool IntlTest::assertNotEquals(const UnicodeString &message, +UBool IntlTest::assertNotEquals(std::u16string_view message, int32_t expectedNot, int32_t actual) { return assertNotEquals(extractToAssertBuf(message), expectedNot, actual); } -UBool IntlTest::assertEqualsNear(const UnicodeString& message, +UBool IntlTest::assertEqualsNear(std::u16string_view message, double expected, double actual, double delta) { return assertEqualsNear(extractToAssertBuf(message), expected, actual, delta); } +UBool IntlTest::assertEquals(std::u16string_view message, const char* expected, + std::u16string_view actual, UBool possibleDataError) { + return assertEquals(message, UnicodeString(expected), actual, possibleDataError); +} + #if !UCONFIG_NO_FORMATTING -UBool IntlTest::assertEquals(const UnicodeString& message, - const Formattable& expected, - const Formattable& actual) { - return assertEquals(extractToAssertBuf(message), expected, actual); +UBool IntlTest::assertEqualFormattables(std::u16string_view message, + const Formattable& expected, + const Formattable& actual) { + return assertEqualFormattables(extractToAssertBuf(message), expected, actual); } #endif diff --git a/icu4c/source/test/intltest/intltest.h b/icu4c/source/test/intltest/intltest.h index 8fb825f6de6..d4ecb9c0353 100644 --- a/icu4c/source/test/intltest/intltest.h +++ b/icu4c/source/test/intltest/intltest.h @@ -13,16 +13,22 @@ #ifndef _INTLTEST #define _INTLTEST -// The following includes utypes.h, uobject.h and unistr.h -#include "unicode/fmtable.h" -#include "unicode/testlog.h" -#include "unicode/uniset.h" - #include #include +#include + +#include "unicode/utypes.h" +#include "unicode/testlog.h" + +#if U_SHOW_CPLUSPLUS_API +#include "unicode/fmtable.h" +#include "unicode/uniset.h" +#include "unicode/unistr.h" +#endif U_NAMESPACE_USE +#if U_SHOW_CPLUSPLUS_API //----------------------------------------------------------------------------- //convenience classes to ease porting code that uses the Java @@ -47,6 +53,8 @@ UnicodeString toString(int32_t n); #endif UnicodeString toString(UBool b); +#endif // U_SHOW_CPLUSPLUS_API + //----------------------------------------------------------------------------- // Use the TESTCASE macro in subclasses of IntlTest. Define the @@ -154,9 +162,9 @@ public: virtual void setCaller( IntlTest* callingTest ); // for internal use only virtual void setPath( char* path ); // for internal use only - virtual void log( const UnicodeString &message ); + virtual void log(std::u16string_view message); - virtual void logln( const UnicodeString &message ) override; + virtual void logln(std::u16string_view message) override; virtual void logln(); @@ -168,7 +176,7 @@ public: * @param message optional message string * @return true if test should be skipped */ - UBool logKnownIssue( const char *ticket, const UnicodeString &message ); + UBool logKnownIssue( const char *ticket, std::u16string_view message); /** * Logs that an issue is known. Can be called multiple times. * Usually used this way: @@ -192,23 +200,23 @@ public: UBool skipLSTMTest(); #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ - virtual void info( const UnicodeString &message ); + virtual void info(std::u16string_view message); - virtual void infoln( const UnicodeString &message ); + virtual void infoln(std::u16string_view message); virtual void infoln(); virtual void err(); - virtual void err( const UnicodeString &message ); + virtual void err(std::u16string_view message); - virtual void errln( const UnicodeString &message ) override; + virtual void errln(std::u16string_view message) override; - virtual void dataerr( const UnicodeString &message ); + virtual void dataerr(std::u16string_view message); - virtual void dataerrln( const UnicodeString &message ) override; + virtual void dataerrln(std::u16string_view message) override; - void errcheckln(UErrorCode status, const UnicodeString &message ); + void errcheckln(UErrorCode status, std::u16string_view message); // convenience functions: sprintf() + errln() etc. void log(const char *fmt, ...); @@ -289,13 +297,20 @@ public: * @return true on success, false on failure. */ UBool assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError=false, const char *file=nullptr, int line=0); - UBool assertEquals(const char* message, const UnicodeString& expected, - const UnicodeString& actual, UBool possibleDataError=false); + UBool assertEquals(const char* message, std::u16string_view expected, + std::u16string_view actual, UBool possibleDataError=false); UBool assertEquals(const char* message, const char* expected, const char* actual); UBool assertEquals(const char* message, UBool expected, UBool actual); UBool assertEquals(const char* message, int32_t expected, int32_t actual); UBool assertEquals(const char* message, int64_t expected, int64_t actual); UBool assertEquals(const char* message, double expected, double actual); + + // for disambiguation + UBool assertEquals(const char* message, const char* expected, + std::u16string_view actual, UBool possibleDataError=false); + UBool assertEquals(const char* message, std::u16string_view expected, + const char* actual, UBool possibleDataError=false); + /** * Asserts that two doubles are equal to within a positive delta. Returns * false if they are not. @@ -311,27 +326,36 @@ public: */ UBool assertEqualsNear(const char* message, double expected, double actual, double delta); UBool assertEquals(const char* message, UErrorCode expected, UErrorCode actual); +#if U_SHOW_CPLUSPLUS_API UBool assertEquals(const char* message, const UnicodeSet& expected, const UnicodeSet& actual); +#endif UBool assertEquals(const char* message, const std::vector& expected, const std::vector& actual); +#if U_SHOW_CPLUSPLUS_API #if !UCONFIG_NO_FORMATTING - UBool assertEquals(const char* message, const Formattable& expected, - const Formattable& actual, UBool possibleDataError=false); - UBool assertEquals(const UnicodeString& message, const Formattable& expected, - const Formattable& actual); + UBool assertEqualFormattables(const char* message, const Formattable& expected, + const Formattable& actual, UBool possibleDataError=false); + UBool assertEqualFormattables(std::u16string_view message, const Formattable& expected, + const Formattable& actual); +#endif #endif UBool assertNotEquals(const char* message, int32_t expectedNot, int32_t actual); - UBool assertTrue(const UnicodeString& message, UBool condition, UBool quiet=false, UBool possibleDataError=false); - UBool assertFalse(const UnicodeString& message, UBool condition, UBool quiet=false, UBool possibleDataError=false); - UBool assertSuccess(const UnicodeString& message, UErrorCode ec); - UBool assertEquals(const UnicodeString& message, const UnicodeString& expected, - const UnicodeString& actual, UBool possibleDataError=false); - UBool assertEquals(const UnicodeString& message, const char* expected, const char* actual); - UBool assertEquals(const UnicodeString& message, UBool expected, UBool actual); - UBool assertEquals(const UnicodeString& message, int32_t expected, int32_t actual); - UBool assertEquals(const UnicodeString& message, int64_t expected, int64_t actual); - UBool assertEquals(const UnicodeString& message, double expected, double actual); + UBool assertTrue(std::u16string_view message, UBool condition, UBool quiet=false, UBool possibleDataError=false); + UBool assertFalse(std::u16string_view message, UBool condition, UBool quiet=false, UBool possibleDataError=false); + UBool assertSuccess(std::u16string_view message, UErrorCode ec); + UBool assertEquals(std::u16string_view message, std::u16string_view expected, + std::u16string_view actual, UBool possibleDataError=false); + UBool assertEquals(std::u16string_view message, const char* expected, const char* actual); + UBool assertEquals(std::u16string_view message, UBool expected, UBool actual); + UBool assertEquals(std::u16string_view message, int32_t expected, int32_t actual); + UBool assertEquals(std::u16string_view message, int64_t expected, int64_t actual); + UBool assertEquals(std::u16string_view message, double expected, double actual); + + // for disambiguation + UBool assertEquals(std::u16string_view message, const char* expected, + std::u16string_view actual, UBool possibleDataError=false); + /** * Asserts that two doubles are equal to within a positive delta. Returns * false if they are not. @@ -345,12 +369,14 @@ public: * @param delta - the maximum delta between expected and actual for which * both numbers are still considered equal. */ - UBool assertEqualsNear(const UnicodeString& message, double expected, double actual, double delta); - UBool assertEquals(const UnicodeString& message, UErrorCode expected, UErrorCode actual); - UBool assertEquals(const UnicodeString& message, const UnicodeSet& expected, const UnicodeSet& actual); - UBool assertEquals(const UnicodeString& message, + UBool assertEqualsNear(std::u16string_view message, double expected, double actual, double delta); + UBool assertEquals(std::u16string_view message, UErrorCode expected, UErrorCode actual); +#if U_SHOW_CPLUSPLUS_API + UBool assertEquals(std::u16string_view message, const UnicodeSet& expected, const UnicodeSet& actual); +#endif + UBool assertEquals(std::u16string_view message, const std::vector& expected, const std::vector& actual); - UBool assertNotEquals(const UnicodeString& message, int32_t expectedNot, int32_t actual); + UBool assertNotEquals(std::u16string_view message, int32_t expectedNot, int32_t actual); virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = nullptr ); // override ! @@ -392,8 +418,9 @@ private: protected: - virtual void LL_message( UnicodeString message, UBool newline ); + virtual void LL_message(std::u16string_view message, UBool newline); +#if U_SHOW_CPLUSPLUS_API // used for collation result reporting, defined here for convenience static UnicodeString &prettify(const UnicodeString &source, UnicodeString &target); @@ -404,6 +431,7 @@ protected: static inline UnicodeString toHex(int32_t number, int32_t digits=-1) { return toHex(static_cast(number), digits); } +#endif public: static void setICU_DATA(); // Set up ICU_DATA if necessary. @@ -428,17 +456,24 @@ public: }; -void it_log( UnicodeString message ); -void it_logln( UnicodeString message ); +void it_log(std::u16string_view message); +void it_logln(std::u16string_view message); void it_logln(); -void it_info( UnicodeString message ); -void it_infoln( UnicodeString message ); +void it_info(std::u16string_view message); +void it_infoln(std::u16string_view message); void it_infoln(); void it_err(); -void it_err( UnicodeString message ); -void it_errln( UnicodeString message ); -void it_dataerr( UnicodeString message ); -void it_dataerrln( UnicodeString message ); +void it_err(std::u16string_view message); +void it_errln(std::u16string_view message); +void it_dataerr(std::u16string_view message); +void it_dataerrln(std::u16string_view message); + +void it_logln(const char* message); +void it_err(const char* message); +void it_errln(const char* message); +void it_dataerrln(const char* message); + +#if U_SHOW_CPLUSPLUS_API /** * This is a variant of cintltst/ccolltst.c:CharsToUChars(). @@ -450,4 +485,6 @@ extern UnicodeString CharsToUnicodeString(const char* chars); /* alias for CharsToUnicodeString */ extern UnicodeString ctou(const char* chars); +#endif + #endif // _INTLTEST diff --git a/icu4c/source/test/intltest/intltest.vcxproj b/icu4c/source/test/intltest/intltest.vcxproj index 9e6480aa4e1..b58b29b3d4e 100644 --- a/icu4c/source/test/intltest/intltest.vcxproj +++ b/icu4c/source/test/intltest/intltest.vcxproj @@ -242,6 +242,7 @@ + diff --git a/icu4c/source/test/intltest/intltest.vcxproj.filters b/icu4c/source/test/intltest/intltest.vcxproj.filters index f3dca92d191..d5c23d5e4cb 100644 --- a/icu4c/source/test/intltest/intltest.vcxproj.filters +++ b/icu4c/source/test/intltest/intltest.vcxproj.filters @@ -571,9 +571,18 @@ configuration - - - + + formatting + + + formatting + + + formatting + + + misc + diff --git a/icu4c/source/test/intltest/itformat.cpp b/icu4c/source/test/intltest/itformat.cpp index 074cb993b11..49fa62f9f5c 100644 --- a/icu4c/source/test/intltest/itformat.cpp +++ b/icu4c/source/test/intltest/itformat.cpp @@ -288,8 +288,10 @@ void IntlTestFormat::runIndexedTest( int32_t index, UBool exec, const char* &nam callTest(*test, par); } break; +#if !UCONFIG_NO_NORMALIZATION #if !UCONFIG_NO_MF2 TESTCLASS(60,TestMessageFormat2); +#endif #endif default: name = ""; break; //needed to end loop } diff --git a/icu4c/source/test/intltest/itrbnf.cpp b/icu4c/source/test/intltest/itrbnf.cpp index 293d8e41df9..8508c32e98a 100644 --- a/icu4c/source/test/intltest/itrbnf.cpp +++ b/icu4c/source/test/intltest/itrbnf.cpp @@ -82,6 +82,7 @@ void IntlTestRBNF::runIndexedTest(int32_t index, UBool exec, const char* &name, TESTCASE(30, TestDFRounding); TESTCASE(31, TestMemoryLeak22899); TESTCASE(32, TestInfiniteRecursion); + TESTCASE(33, TestParseRuleDescriptorOverflow23002); #else TESTCASE(0, TestRBNFDisabled); #endif @@ -2615,6 +2616,18 @@ IntlTestRBNF::TestNumberingSystem() { } } +void +IntlTestRBNF::TestParseRuleDescriptorOverflow23002() { + UParseError perror; + UErrorCode status = U_ZERO_ERROR; + // Test int64 overflow inside parseRuleDescriptor + UnicodeString testStr(u"0110110/300113001103000113001103000110i/3013033:"); + icu::RuleBasedNumberFormat rbfmt( + testStr, + Locale("as"), perror, status); + assertEquals("number too large", U_PARSE_ERROR, status); +} + void IntlTestRBNF::TestInfiniteRecursion() { UnicodeString badRules[] = { diff --git a/icu4c/source/test/intltest/itrbnf.h b/icu4c/source/test/intltest/itrbnf.h index d05aadd5397..3dfdc369ce1 100644 --- a/icu4c/source/test/intltest/itrbnf.h +++ b/icu4c/source/test/intltest/itrbnf.h @@ -163,6 +163,7 @@ class IntlTestRBNF : public IntlTest { void TestNumberingSystem(); void TestMemoryLeak22899(); void TestInfiniteRecursion(); + void TestParseRuleDescriptorOverflow23002(); protected: virtual void doTest(RuleBasedNumberFormat* formatter, const char* const testData[][2], UBool testParsing); diff --git a/icu4c/source/test/intltest/itutil.cpp b/icu4c/source/test/intltest/itutil.cpp index 398f68bc708..4585792126d 100644 --- a/icu4c/source/test/intltest/itutil.cpp +++ b/icu4c/source/test/intltest/itutil.cpp @@ -35,6 +35,7 @@ #include "usettest.h" extern IntlTest *createBytesTrieTest(); +extern IntlTest *createUSetHeaderOnlyTest(); extern IntlTest *createLocaleMatcherTest(); static IntlTest *createLocalPointerTest(); extern IntlTest *createUCharsTrieTest(); @@ -82,6 +83,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & TESTCASE_AUTO_CLASS(LocaleBuilderTest); TESTCASE_AUTO_CREATE_CLASS(LocaleMatcherTest); TESTCASE_AUTO_CREATE_CLASS(UHashTest); + TESTCASE_AUTO_CREATE_CLASS(USetHeaderOnlyTest); TESTCASE_AUTO_END; } @@ -204,19 +206,19 @@ void ErrorCodeTest::TestSubclass() { class IcuTestErrorCodeTestHelper : public IntlTest { public: - void errln( const UnicodeString &message ) override { + void errln(std::u16string_view message) override { test->assertFalse("Already saw an error", seenError); seenError = true; - test->assertEquals("Message for Error", expectedErrln, message); + test->assertEquals("Message for Error", std::u16string_view{expectedErrln}, message); if (expectedDataErr) { test->errln("Got non-data error, but expected data error"); } } - void dataerrln( const UnicodeString &message ) override { + void dataerrln(std::u16string_view message) override { test->assertFalse("Already saw an error", seenError); seenError = true; - test->assertEquals("Message for Error", expectedErrln, message); + test->assertEquals("Message for Error", std::u16string_view{expectedErrln}, message); if (!expectedDataErr) { test->errln("Got data error, but expected non-data error"); } diff --git a/icu4c/source/test/intltest/listformattertest.cpp b/icu4c/source/test/intltest/listformattertest.cpp index 592137e39dd..bd6210266b9 100644 --- a/icu4c/source/test/intltest/listformattertest.cpp +++ b/icu4c/source/test/intltest/listformattertest.cpp @@ -618,7 +618,7 @@ void ListFormatterTest::DoTheRealListStyleTesting( UListFormatterType type, UListFormatterWidth width, const char* expected, - IcuTestErrorCode status) { + IcuTestErrorCode& status) { LocalPointer formatter( ListFormatter::createInstance(locale, type, width, status)); diff --git a/icu4c/source/test/intltest/listformattertest.h b/icu4c/source/test/intltest/listformattertest.h index 2c6860c1610..65d8aedfe89 100644 --- a/icu4c/source/test/intltest/listformattertest.h +++ b/icu4c/source/test/intltest/listformattertest.h @@ -115,7 +115,7 @@ class ListFormatterTest : public IntlTestWithFieldPosition { UListFormatterType type, UListFormatterWidth width, const char* expected, - IcuTestErrorCode status); + IcuTestErrorCode& status); private: // Reused test data. diff --git a/icu4c/source/test/intltest/localematchertest.cpp b/icu4c/source/test/intltest/localematchertest.cpp index 2996f8aa706..639b5868220 100644 --- a/icu4c/source/test/intltest/localematchertest.cpp +++ b/icu4c/source/test/intltest/localematchertest.cpp @@ -457,7 +457,7 @@ void LocaleMatcherTest::testResolvedLocale() { namespace { -bool toInvariant(const UnicodeString &s, CharString &inv, ErrorCode &errorCode) { +bool toInvariant(const UnicodeString &s, CharString &inv, IcuTestErrorCode &errorCode) { if (errorCode.isSuccess()) { inv.clear().appendInvariantChars(s, errorCode); return errorCode.isSuccess(); @@ -477,7 +477,7 @@ bool getSuffixAfterPrefix(const UnicodeString &s, int32_t limit, bool getInvariantSuffixAfterPrefix(const UnicodeString &s, int32_t limit, const UnicodeString &prefix, CharString &suffix, - ErrorCode &errorCode) { + IcuTestErrorCode &errorCode) { UnicodeString u_suffix; return getSuffixAfterPrefix(s, limit, prefix, u_suffix) && toInvariant(u_suffix, suffix, errorCode); diff --git a/icu4c/source/test/intltest/loctest.cpp b/icu4c/source/test/intltest/loctest.cpp index d62e2548a24..f3e16d3fa0d 100644 --- a/icu4c/source/test/intltest/loctest.cpp +++ b/icu4c/source/test/intltest/loctest.cpp @@ -3518,8 +3518,8 @@ LocaleTest::TestAddLikelyAndMinimizeSubtags() { "zh_TW" }, { "und_Hant_CN", - "zh_Hant_CN", - "zh_Hant_CN" + "yue_Hant_CN", + "yue_Hant_CN" }, { "und_Hant_TW", "zh_Hant_TW", @@ -4124,16 +4124,21 @@ LocaleTest::TestAddLikelyAndMinimizeSubtags() { "en_PSCRACK", "en_Latn_US_PSCRACK", "en__PSCRACK" + }, { + // ICU-22765 + "th@x=private", + "th_Thai_TH@x=private", + "th@x=private", + }, { + "und@x=private", + "en_Latn_US@x=private", + "en@x=private", } }; for (const auto& item : full_data) { const char* const org = item.from; const char* const exp = item.add; - if (uprv_strcmp(org,"und_Hant_CN") == 0 && - logKnownIssue("CLDR-17981", "und_Hant_CN changed expected result for Likely Subtags")) { - continue; - } Locale res(org); res.addLikelySubtags(status); status.errIfFailureAndReset("\"%s\"", org); @@ -4147,10 +4152,6 @@ LocaleTest::TestAddLikelyAndMinimizeSubtags() { for (const auto& item : full_data) { const char* const org = item.from; const char* const exp = item.remove; - if (uprv_strcmp(org,"und_Hant_CN") == 0 && - logKnownIssue("CLDR-17981", "und_Hant_CN changed expected result for Likely Subtags")) { - continue; - } Locale res(org); res.minimizeSubtags(status); status.errIfFailureAndReset("\"%s\"", org); @@ -5718,10 +5719,6 @@ void LocaleTest::TestIsRightToLeft() { assertTrue("ckb RTL", Locale("ckb").isRightToLeft(), false, true); // Sorani Kurdish assertFalse("fil LTR", Locale("fil").isRightToLeft()); assertFalse("he-Zyxw LTR", Locale("he-Zyxw").isRightToLeft()); - - if (logKnownIssue("CLDR-17981", "und_Hant_CN changed expected result for Likely Subtags")) { - return; - } } void LocaleTest::TestBug11421() { @@ -5925,14 +5922,11 @@ testLikelySubtagsLineFn(void *context, *pErrorCode = U_ZERO_ERROR; return; } - - if ( (uprv_strcmp(source.c_str(), "und-Latn-MU") == 0 || uprv_strcmp(source.c_str(), "und-Latn-RS") == 0 || uprv_strcmp(source.c_str(), "und-Latn-SL") == 0 - || uprv_strcmp(source.c_str(), "und-Latn-TK") == 0 || uprv_strcmp(source.c_str(), "und-Latn-ZM") == 0 ) - && THIS->logKnownIssue("CLDR-17981", "und_Hant_CN changed expected result for Likely Subtags")) { - return; - } - - + + if ((uprv_strcmp(source.c_str(), "und-Latn-RS") == 0 ) + && THIS->logKnownIssue("ICU-22976", "unexpected likely subtags for und-Latn-RS")) { + return; + } Locale actualMax(l); actualMax.addLikelySubtags(*pErrorCode); diff --git a/icu4c/source/test/intltest/messageformat2test.cpp b/icu4c/source/test/intltest/messageformat2test.cpp index 353082ef5c9..5317d2c3585 100644 --- a/icu4c/source/test/intltest/messageformat2test.cpp +++ b/icu4c/source/test/intltest/messageformat2test.cpp @@ -2,6 +2,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -11,16 +13,6 @@ using namespace icu::message2; -/* - TODO: Tests need to be unified in a single format that - both ICU4C and ICU4J can use, rather than being embedded in code. - - Tests are included in their current state to give a sense of - how much test coverage has been achieved. Most of the testing is - of the parser/serializer; the formatter needs to be tested more - thoroughly. -*/ - void TestMessageFormat2::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) { @@ -33,6 +25,7 @@ TestMessageFormat2::runIndexedTest(int32_t index, UBool exec, TESTCASE_AUTO(testFormatterAPI); TESTCASE_AUTO(testHighLoneSurrogate); TESTCASE_AUTO(testLowLoneSurrogate); + TESTCASE_AUTO(testLoneSurrogateInQuotedLiteral); TESTCASE_AUTO(dataDrivenTests); TESTCASE_AUTO_END; } @@ -182,7 +175,8 @@ void TestMessageFormat2::testAPISimple() { argsBuilder["userName"] = message2::Formattable("Maria"); args = MessageArguments(argsBuilder, errorCode); - mf = builder.setPattern(".match {$photoCount :number} {$userGender :string}\n\ + mf = builder.setPattern(".input {$photoCount :number} .input {$userGender :string}\n\ + .match $photoCount $userGender\n \ 1 masculine {{{$userName} added a new photo to his album.}}\n \ 1 feminine {{{$userName} added a new photo to her album.}}\n \ 1 * {{{$userName} added a new photo to their album.}}\n \ @@ -226,7 +220,8 @@ void TestMessageFormat2::testAPI() { TestUtils::runTestCase(*this, test, errorCode); // Pattern matching - plural - UnicodeString pattern = ".match {$photoCount :string} {$userGender :string}\n\ + UnicodeString pattern = ".input {$photoCount :number} .input {$userGender :string}\n\ + .match $photoCount $userGender\n\ 1 masculine {{{$userName} added a new photo to his album.}}\n \ 1 feminine {{{$userName} added a new photo to her album.}}\n \ 1 * {{{$userName} added a new photo to their album.}}\n \ @@ -247,7 +242,8 @@ void TestMessageFormat2::testAPI() { TestUtils::runTestCase(*this, test, errorCode); // Built-in functions - pattern = ".match {$photoCount :number} {$userGender :string}\n\ + pattern = ".input {$photoCount :number} .input {$userGender :string}\n\ + .match $photoCount $userGender\n \ 1 masculine {{{$userName} added a new photo to his album.}}\n \ 1 feminine {{{$userName} added a new photo to her album.}}\n \ 1 * {{{$userName} added a new photo to their album.}}\n \ @@ -350,7 +346,8 @@ void TestMessageFormat2::testHighLoneSurrogate() { .setPattern(loneSurrogate, pe, errorCode) .build(errorCode); UnicodeString result = msgfmt1.formatToString({}, errorCode); - errorCode.expectErrorAndReset(U_MF_SYNTAX_ERROR, "testHighLoneSurrogate"); + assertEquals("testHighLoneSurrogate", loneSurrogate, result); + errorCode.errIfFailureAndReset("testHighLoneSurrogate"); } // ICU-22890 lone surrogate cause infinity loop @@ -364,7 +361,25 @@ void TestMessageFormat2::testLowLoneSurrogate() { .setPattern(loneSurrogate, pe, errorCode) .build(errorCode); UnicodeString result = msgfmt2.formatToString({}, errorCode); - errorCode.expectErrorAndReset(U_MF_SYNTAX_ERROR, "testLowLoneSurrogate"); + assertEquals("testLowLoneSurrogate", loneSurrogate, result); + errorCode.errIfFailureAndReset("testLowLoneSurrogate"); +} + +void TestMessageFormat2::testLoneSurrogateInQuotedLiteral() { + IcuTestErrorCode errorCode(*this, "testLoneSurrogateInQuotedLiteral"); + UParseError pe = { 0, 0, {0}, {0} }; + // |\udc02| + UnicodeString literal("{|"); + literal += 0xdc02; + literal += "|}"; + UnicodeString expectedResult({0xdc02, 0}); + icu::message2::MessageFormatter msgfmt2 = + icu::message2::MessageFormatter::Builder(errorCode) + .setPattern(literal, pe, errorCode) + .build(errorCode); + UnicodeString result = msgfmt2.formatToString({}, errorCode); + assertEquals("testLoneSurrogateInQuotedLiteral", expectedResult, result); + errorCode.errIfFailureAndReset("testLoneSurrogateInQuotedLiteral"); } void TestMessageFormat2::dataDrivenTests() { @@ -380,3 +395,4 @@ TestCase::Builder::~Builder() {} #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/test/intltest/messageformat2test.h b/icu4c/source/test/intltest/messageformat2test.h index 71dfb3916c9..9fd5d253831 100644 --- a/icu4c/source/test/intltest/messageformat2test.h +++ b/icu4c/source/test/intltest/messageformat2test.h @@ -7,6 +7,8 @@ #include "unicode/rep.h" #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -91,6 +93,7 @@ private: void testHighLoneSurrogate(void); void testLowLoneSurrogate(void); + void testLoneSurrogateInQuotedLiteral(void); }; // class TestMessageFormat2 U_NAMESPACE_BEGIN @@ -187,4 +190,6 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif diff --git a/icu4c/source/test/intltest/messageformat2test_custom.cpp b/icu4c/source/test/intltest/messageformat2test_custom.cpp index b498be791ca..c2fb69b0fa7 100644 --- a/icu4c/source/test/intltest/messageformat2test_custom.cpp +++ b/icu4c/source/test/intltest/messageformat2test_custom.cpp @@ -2,6 +2,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -115,7 +117,8 @@ void TestMessageFormat2::testCustomFunctionsComplexMessage(IcuTestErrorCode& err UnicodeString message = ".local $hostName = {$host :person length=long}\n\ .local $guestName = {$guest :person length=long}\n\ .input {$guestCount :number}\n\ - .match {$hostGender :string} {$guestCount :number}\n\ + .input {$hostGender :string}\n\ + .match $hostGender $guestCount\n\ female 0 {{{$hostName} does not give a party.}}\n\ female 1 {{{$hostName} invites {$guestName} to her party.}}\n\ female 2 {{{$hostName} invites {$guestName} and one other person to her party.}}\n\ @@ -538,9 +541,9 @@ void TestMessageFormat2::testListFormatter(IcuTestErrorCode& errorCode) { /* static */ Hashtable* message2::ResourceManager::properties(UErrorCode& errorCode) { NULL_ON_ERROR(errorCode); - UnicodeString* firefox = new UnicodeString(".match {$gcase :string} genitive {{Firefoxin}} * {{Firefox}}"); - UnicodeString* chrome = new UnicodeString(".match {$gcase :string} genitive {{Chromen}} * {{Chrome}}"); - UnicodeString* safari = new UnicodeString(".match {$gcase :string} genitive {{Safarin}} * {{Safari}}"); + UnicodeString* firefox = new UnicodeString(".input {$gcase :string} .match $gcase genitive {{Firefoxin}} * {{Firefox}}"); + UnicodeString* chrome = new UnicodeString(".input {$gcase :string} .match $gcase genitive {{Chromen}} * {{Chrome}}"); + UnicodeString* safari = new UnicodeString(".input {$gcase :string} .match $gcase genitive {{Safarin}} * {{Safari}}"); if (firefox != nullptr && chrome != nullptr && safari != nullptr) { Hashtable* result = new Hashtable(uhash_compareUnicodeString, nullptr, errorCode); @@ -730,3 +733,5 @@ void TestMessageFormat2::testMessageRefFormatter(IcuTestErrorCode& errorCode) { #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/test/intltest/messageformat2test_icu.cpp b/icu4c/source/test/intltest/messageformat2test_icu.cpp index d1dfa389ca8..57361e3ccf4 100644 --- a/icu4c/source/test/intltest/messageformat2test_icu.cpp +++ b/icu4c/source/test/intltest/messageformat2test_icu.cpp @@ -2,6 +2,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -157,3 +159,5 @@ void TestMessageFormat2::messageFormat1Tests() { #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/test/intltest/messageformat2test_read_json.cpp b/icu4c/source/test/intltest/messageformat2test_read_json.cpp index ddf93da632c..3e378d6b905 100644 --- a/icu4c/source/test/intltest/messageformat2test_read_json.cpp +++ b/icu4c/source/test/intltest/messageformat2test_read_json.cpp @@ -2,6 +2,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -300,6 +302,10 @@ void TestMessageFormat2::jsonTestsFromFiles(IcuTestErrorCode& errorCode) { // Do valid spec tests runTestsFromJsonFile(*this, "spec/syntax.json", errorCode); + // Uncomment when test functions are implemented in the registry + // See https://unicode-org.atlassian.net/browse/ICU-22907 + // runTestsFromJsonFile(*this, "spec/pattern-selection.json", errorCode); + // Do valid function tests runTestsFromJsonFile(*this, "spec/functions/date.json", errorCode); runTestsFromJsonFile(*this, "spec/functions/datetime.json", errorCode); @@ -309,12 +315,19 @@ void TestMessageFormat2::jsonTestsFromFiles(IcuTestErrorCode& errorCode) { runTestsFromJsonFile(*this, "spec/functions/time.json", errorCode); // Other tests (non-spec) + // TODO: Delete this file after https://github.com/unicode-org/message-format-wg/pull/904 + // lands and the tests here are updated from the spec repo + runTestsFromJsonFile(*this, "normalization.json", errorCode); + // TODO: https://github.com/unicode-org/message-format-wg/pull/902 will + // move the bidi tests into the spec + runTestsFromJsonFile(*this, "bidi.json", errorCode); runTestsFromJsonFile(*this, "more-functions.json", errorCode); runTestsFromJsonFile(*this, "valid-tests.json", errorCode); runTestsFromJsonFile(*this, "resolution-errors.json", errorCode); runTestsFromJsonFile(*this, "matches-whitespace.json", errorCode); runTestsFromJsonFile(*this, "alias-selector-annotations.json", errorCode); runTestsFromJsonFile(*this, "runtime-errors.json", errorCode); + runTestsFromJsonFile(*this, "more-syntax-errors.json", errorCode); // Re: the expected output for the first test in this file: // Note: the more "correct" fallback output seems like it should be "1.000 3" (ignoring the @@ -358,3 +371,5 @@ void TestMessageFormat2::jsonTestsFromFiles(IcuTestErrorCode& errorCode) { #endif /* #if !UCONFIG_NO_MF2 */ #endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icu4c/source/test/intltest/messageformat2test_utils.h b/icu4c/source/test/intltest/messageformat2test_utils.h index c4ad251c7f4..7eacab9998d 100644 --- a/icu4c/source/test/intltest/messageformat2test_utils.h +++ b/icu4c/source/test/intltest/messageformat2test_utils.h @@ -6,6 +6,8 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_NORMALIZATION + #if !UCONFIG_NO_FORMATTING #if !UCONFIG_NO_MF2 @@ -252,7 +254,8 @@ class TestUtils { if (!roundTrip(in, mf.getDataModel(), out) // For now, don't round-trip messages with these errors, // since duplicate options are dropped - && testCase.expectedErrorCode() != U_MF_DUPLICATE_OPTION_NAME_ERROR) { + && (testCase.expectSuccess() || + (testCase.expectedErrorCode() != U_MF_DUPLICATE_OPTION_NAME_ERROR))) { failRoundTrip(tmsg, testCase, in, out); } @@ -291,10 +294,10 @@ class TestUtils { } // Re-run the formatter result = mf.formatToString(MessageArguments(testCase.getArguments(), errorCode), errorCode); - if (!testCase.outputMatches(result)) { - failWrongOutput(tmsg, testCase, result); - return; - } + } + if (!testCase.outputMatches(result)) { + failWrongOutput(tmsg, testCase, result); + return; } errorCode.reset(); } @@ -344,4 +347,6 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + #endif diff --git a/icu4c/source/test/intltest/numfmtst.cpp b/icu4c/source/test/intltest/numfmtst.cpp index a37111a8540..c855e3e2927 100644 --- a/icu4c/source/test/intltest/numfmtst.cpp +++ b/icu4c/source/test/intltest/numfmtst.cpp @@ -253,6 +253,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n TESTCASE_AUTO(Test10997_FormatCurrency); TESTCASE_AUTO(Test21556_CurrencyAsDecimal); TESTCASE_AUTO(Test22088_Ethiopic); + TESTCASE_AUTO(Test22983_LongFraction); TESTCASE_AUTO_END; } @@ -2515,7 +2516,7 @@ void NumberFormatTest::TestPerMill() { if (!assertSuccess("setup", ec)) return; str.truncate(0); assertEquals("0.4857 x ###.###m", - "485.7m", fmt2.format(0.4857, str)); + u"485.7m", fmt2.format(0.4857, str)); } /** @@ -2676,8 +2677,8 @@ void NumberFormatTest::TestCases() { Formattable m; fmt->parse(str, m, ec); assertSuccess("parse", ec); - assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", - n, m); + assertEqualFormattables( + where + "\"" + pat + "\".parse(\"" + str + "\")", n, m); } } // p: @@ -2690,8 +2691,7 @@ void NumberFormatTest::TestCases() { assertSuccess("parse", ec); fmt->parse(str, n, ec); assertSuccess("parse", ec); - assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", - exp, n); + assertEqualFormattables(where + "\"" + pat + "\".parse(\"" + str + "\")", exp, n); } break; case 8: // fpc: @@ -2733,8 +2733,8 @@ void NumberFormatTest::TestCases() { mfmt->parseObject(str, m, ec); if (assertSuccess("parseCurrency", ec)) { - assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", - n, m); + assertEqualFormattables( + where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", n, m); } else { errln("FAIL: source " + str); } @@ -3766,7 +3766,7 @@ void NumberFormatTest::TestMismatchedCurrencyFormatFail() { df->setLenient(false); { Formattable result; - ErrorCode failStatus; + UErrorCode failStatus = U_ZERO_ERROR; df->parse(u"1.23\u20AC", result, failStatus); assertEquals("Should fail to parse", U_INVALID_FORMAT_ERROR, failStatus); } @@ -6899,7 +6899,7 @@ void NumberFormatTest::TestDecimal() { StringPiece num("244444444444444444444444444444444444446.4"); fmtr->format(num, formattedResult, nullptr, status); ASSERT_SUCCESS(status); - ASSERT_EQUALS("244,444,444,444,444,444,444,444,444,444,444,444,446.4", formattedResult); + ASSERT_EQUALS(u"244,444,444,444,444,444,444,444,444,444,444,444,446.4", formattedResult); //std::string ss; std::cout << formattedResult.toUTF8String(ss); delete fmtr; } @@ -6920,7 +6920,7 @@ void NumberFormatTest::TestDecimal() { ASSERT_SUCCESS(status); fmtr->format(dl, formattedResult, nullptr, status); ASSERT_SUCCESS(status); - ASSERT_EQUALS("1,234,566,666,666,666,666,666,666,666,666,666,666,621,000", formattedResult); + ASSERT_EQUALS(u"1,234,566,666,666,666,666,666,666,666,666,666,666,621,000", formattedResult); status = U_ZERO_ERROR; num.set("666.666"); @@ -6930,7 +6930,7 @@ void NumberFormatTest::TestDecimal() { formattedResult.remove(); fmtr->format(dl, formattedResult, pos, status); ASSERT_SUCCESS(status); - ASSERT_EQUALS("666.666", formattedResult); + ASSERT_EQUALS(u"666.666", formattedResult); ASSERT_EQUALS(4, pos.getBeginIndex()); ASSERT_EQUALS(7, pos.getEndIndex()); delete fmtr; @@ -8787,7 +8787,7 @@ void NumberFormatTest::Test13391_chakmaParsing() { Formattable result; df->parse(expected, result, status); assertSuccess("Should not fail when parsing in ccp", status); - assertEquals("Should parse to 12345 in ccp", 12345, result); + assertEqualFormattables("Should parse to 12345 in ccp", 12345, result); const char16_t* expectedScientific = u"\U00011137.\U00011139E\U00011138"; UnicodeString actualScientific; @@ -8801,7 +8801,7 @@ void NumberFormatTest::Test13391_chakmaParsing() { Formattable resultScientific; df->parse(expectedScientific, resultScientific, status); assertSuccess("Should not fail when parsing scientific in ccp", status); - assertEquals("Should parse scientific to 130 in ccp", 130, resultScientific); + assertEqualFormattables("Should parse scientific to 130 in ccp", 130, resultScientific); } @@ -9591,7 +9591,7 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { StringPiece sp = result.getDecimalNumber(status); assertEquals(u"Should snap to zero", u"0", - {sp.data(), sp.length(), US_INV}); + UnicodeString(sp.data(), sp.length(), US_INV)); // Test edge case overflow of exponent result = Formattable(); @@ -9599,7 +9599,7 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { sp = result.getDecimalNumber(status); assertEquals(u"Should not overflow and should parse only the first exponent", u"1E-2147483647", - {sp.data(), sp.length(), US_INV}); + UnicodeString(sp.data(), sp.length(), US_INV)); // Test edge case overflow of exponent result = Formattable(); @@ -9607,7 +9607,7 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { sp = result.getDecimalNumber(status); assertEquals(u"Should not overflow", u"3E-2147483648", - {sp.data(), sp.length(), US_INV}); + UnicodeString(sp.data(), sp.length(), US_INV)); // Test largest parseable exponent result = Formattable(); @@ -9615,7 +9615,7 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { sp = result.getDecimalNumber(status); assertEquals(u"Should not overflow", u"9.876E+2147483646", - {sp.data(), sp.length(), US_INV}); + UnicodeString(sp.data(), sp.length(), US_INV)); // Test max value as well const char16_t* infinityInputs[] = { @@ -9631,8 +9631,8 @@ void NumberFormatTest::Test20037_ScientificIntegerOverflow() { nf->parse(input, result, status); sp = result.getDecimalNumber(status); assertEquals(UnicodeString("Should become Infinity: ") + input, - u"Infinity", - {sp.data(), sp.length(), US_INV}); + u"Infinity", + UnicodeString(sp.data(), sp.length(), US_INV)); } } @@ -10161,5 +10161,9 @@ void NumberFormatTest::Test22088_Ethiopic() { assertEquals("Wrong result with UNUM_NUMBERING_SYSTEM and English", u"123", nf3->format(123, result)); } } +void NumberFormatTest::Test22983_LongFraction() { + IcuTestErrorCode status(*this, "Test22983_LongFraction"); + DecimalFormat df(u"0.0000000000000001", status); +} #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/test/intltest/numfmtst.h b/icu4c/source/test/intltest/numfmtst.h index 5bdbc131cda..10dd3386d4c 100644 --- a/icu4c/source/test/intltest/numfmtst.h +++ b/icu4c/source/test/intltest/numfmtst.h @@ -309,6 +309,7 @@ class NumberFormatTest: public CalendarTimeZoneTest { void Test10997_FormatCurrency(); void Test21556_CurrencyAsDecimal(); void Test22088_Ethiopic(); + void Test22983_LongFraction(); private: UBool testFormattableAsUFormattable(const char *file, int line, Formattable &f); diff --git a/icu4c/source/test/intltest/rbbitst.cpp b/icu4c/source/test/intltest/rbbitst.cpp index 1fe1cadcfb4..fd72c8e4afd 100644 --- a/icu4c/source/test/intltest/rbbitst.cpp +++ b/icu4c/source/test/intltest/rbbitst.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -1267,42 +1268,6 @@ UBool RBBITest::testCaseIsKnownIssue(const UnicodeString &testCase, const char * const char16_t *fString; } badTestCases[] = { {"10666", "GraphemeBreakTest.txt", u"\u0020\u0020\u0033"}, // Fake example, for illustration. - // The following tests were originally for - // Issue 8151, move the Finnish tailoring of the line break of hyphens to root. - // However, that ticket has been closed as fixed but these tests still fail, so - // ICU-21097 has been created to investigate and address these remaining issues. - {"21097", "LineBreakTest.txt", u"-#"}, - {"21097", "LineBreakTest.txt", u"\u002d\u0308\u0023"}, - {"21097", "LineBreakTest.txt", u"\u002d\u00a7"}, - {"21097", "LineBreakTest.txt", u"\u002d\u0308\u00a7"}, - {"21097", "LineBreakTest.txt", u"\u002d\U00050005"}, - {"21097", "LineBreakTest.txt", u"\u002d\u0308\U00050005"}, - {"21097", "LineBreakTest.txt", u"\u002d\u0e01"}, - {"21097", "LineBreakTest.txt", u"\u002d\u0308\u0e01"}, - - // The following tests were originally for - // Issue ICU-12017 Improve line break around numbers. - // However, that ticket has been closed as fixed but these tests still fail, so - // ICU-21097 has been created to investigate and address these remaining issues. - {"21097", "LineBreakTest.txt", u"\u002C\u0030"}, // ",0" - {"21097", "LineBreakTest.txt", u"\u002C\u0308\u0030"}, - {"21097", "LineBreakTest.txt", u"equals .35 cents"}, - {"21097", "LineBreakTest.txt", u"a.2 "}, - {"21097", "LineBreakTest.txt", u"a.2 \u0915"}, - {"21097", "LineBreakTest.txt", u"a.2 \u672C"}, - {"21097", "LineBreakTest.txt", u"a.2\u3000\u672C"}, - {"21097", "LineBreakTest.txt", u"a.2\u3000\u307E"}, - {"21097", "LineBreakTest.txt", u"a.2\u3000\u0033"}, - {"21097", "LineBreakTest.txt", u"A.1 \uBABB"}, - {"21097", "LineBreakTest.txt", u"\uBD24\uC5B4\u002E\u0020\u0041\u002E\u0032\u0020\uBCFC"}, - {"21097", "LineBreakTest.txt", u"\uBD10\uC694\u002E\u0020\u0041\u002E\u0033\u0020\uBABB"}, - {"21097", "LineBreakTest.txt", u"\uC694\u002E\u0020\u0041\u002E\u0034\u0020\uBABB"}, - {"21097", "LineBreakTest.txt", u"a.2\u3000\u300C"}, - - // ICU-22127 until UAX #29 wordbreak is update for the colon changes in ICU-22112, - // need to skip some tests in WordBreakTest.txt - {"22127", "WordBreakTest.txt", u"a:"}, - {"22127", "WordBreakTest.txt", u"A:"}, }; for (int n=0; n indexInRemapped; + const SegmentationRule *appliedRule = nullptr; + }; + + SegmentationRule(std::u16string_view name) { UnicodeString(name).toUTF8String(name_); } + virtual ~SegmentationRule() = default; + + virtual void apply(UnicodeString &remapped, std::vector &resolved) const = 0; + virtual Resolution resolution() const = 0; + const std::string &name() const { return name_; } + + std::chrono::steady_clock::duration timeSpent() const { return timeSpent_; } + + private: + std::string name_; + + protected: + mutable std::chrono::steady_clock::duration timeSpent_{}; +}; + +class RemapRule : public SegmentationRule { + public: + RemapRule(const std::u16string_view name, const std::u16string_view pattern, + const std::u16string_view replacement) + : SegmentationRule(name), replacement_(replacement) { + UParseError parseError; + UErrorCode status = U_ZERO_ERROR; + pattern_.reset( + RegexPattern::compile(pattern, UREGEX_COMMENTS | UREGEX_DOTALL, parseError, status)); + U_ASSERT(U_SUCCESS(status)); + } + + virtual void apply(UnicodeString &remapped, std::vector &resolved) const override { + auto const start = std::chrono::steady_clock::now(); + UErrorCode status = U_ZERO_ERROR; + UnicodeString result; + int32_t i = 0; + int32_t offset = 0; + // We find all matches of the `pattern_` and replace them according to + // the `replacement_`, producing the new remapped string `result`. + // For every position i in the original string, + // `resolved[i].indexInRemapped` is nullopt if i lies within a replaced + // match, and is set to the new index in `result` otherwise, by adding + // the accumulated difference `offset` between match lengths and + // replacement lengths. + // Consider a 4-codepoint, 6 code unit string s = ⟨ 𒀀, ◌́, ␠, ◌𝅲 ⟩, where + // ␠ stands for U+0020 and U+12000 𒀀 and U+1D172 ◌𝅲 each require two code + // units, and apply the following two rules: + // 1. (?\P{lb=SP}) \p{lb=CM}* → ${X} + // 2. \p{lb=CM} → A + // The string remapped and the indexInRemapped values change as follows: + // indexInRemapped remapped string rule final + // (aligned on the initial string) applied offset + // 𒀀 ◌́ ␠ ◌𝅲 + // 0 1 2 3 4 5 6 ⟨ 𒀀, ◌́, ␠, ◌𝅲 ⟩ (none) + // 0 - - 2 3 4 5 ⟨ 𒀀, ␠, ◌𝅲 ⟩ 1 -1 + // 0 - - 2 3 - 4 ⟨ 𒀀, ␠, A ⟩ 2 -1 + // + // Note that the last indexInRemapped is always equal to the length of + // the remapped string. + std::unique_ptr matcher(pattern_->matcher(remapped, status)); + while (matcher->find()) { + for (;; ++i) { + if (!resolved[i].indexInRemapped.has_value()) { + continue; + } + if (*resolved[i].indexInRemapped > matcher->start(status)) { + break; + } + *resolved[i].indexInRemapped += offset; + } + for (;; ++i) { + if (!resolved[i].indexInRemapped.has_value()) { + continue; + } + // Note that + // `*resolved[i].indexInRemapped > matcher->end(status)` should + // never happen with ordinary rules, but could in principle + // happen with rules that remap to code point sequences, e.g., + // 1. BC → TYZ + // 2. AT → X + // applied to ⟨ A, B, C ⟩: + // indexInRemapped remapped rule + // A B C + // 0 1 2 3 ⟨ A, B, C ⟩ (none) + // 0 1 - 4 ⟨ A, T, Y, Z ⟩ 1 + // 0 - - 3 ⟨ X, Y, Z ⟩ 2 + // Where for the application of rule 2, the match ends at + // position 2 in remapped, which does not correspond to a + // position in the original string. + if (*resolved[i].indexInRemapped >= matcher->end(status)) { + break; + } + if (resolved[i].appliedRule != nullptr && + resolved[i].appliedRule->resolution() == BREAK) { + printf("Replacement rule at remapped indices %d sqq. spans a break", + matcher->start(status)); + std::terminate(); + } + resolved[i].appliedRule = this; + resolved[i].indexInRemapped.reset(); + } + // While replacing, we need to check that we are not creating + // surrogate pairs. Since appendReplacement performs two + // concatenations (the unreplaced segment and the replacement), we + // need to check in two places: whether the unreplaced segment + // starts with a trailing surrogate that ends up after a leading + // surrogate, and whether the replaced segment starts with a leading + // surrogate that ends up after a trailing surrogate. + // We break the pair by replacing one of the surrogates with U+FFFF, + // which has the same properties for all but line breaking, and the + // same behaviour in line breaking (lb=SG and lb=XX are both treated + // as lb=AL). + std::optional trailingLead; + if (result.length() > 0 && U16_IS_LEAD(result[result.length() - 1])) { + trailingLead = result.length() - 1; + } + + matcher->appendReplacement(result, replacement_, status); + + if (trailingLead && *trailingLead + 1 < result.length() && + U16_IS_TRAIL(result[*trailingLead + 1])) { + result.setCharAt(*trailingLead, u'\uFFFF'); + } + + if (matcher->start(status) + offset > 0 && + U16_IS_LEAD(result[matcher->start(status) + offset - 1]) && + U16_IS_TRAIL(result[matcher->start(status) + offset])) { + result.setCharAt(matcher->start(status) + offset, u'\uFFFF'); + } + offset = result.length() - *resolved[i].indexInRemapped; + } + for (; i < static_cast(resolved.size()); ++i) { + if (!resolved[i].indexInRemapped.has_value()) { + continue; + } + *resolved[i].indexInRemapped += offset; + } + + std::optional trailingLead; + if (result.length() > 0 && U16_IS_LEAD(result[result.length() - 1])) { + trailingLead = result.length() - 1; + } + matcher->appendTail(result); + if (trailingLead && *trailingLead + 1 < result.length() && + U16_IS_TRAIL(result[*trailingLead + 1])) { + result.setCharAt(*trailingLead, u'\uFFFF'); + } + + if (resolved.back().indexInRemapped != result.length()) { + std::string indices; + for (const auto r : resolved) { + indices += r.indexInRemapped.has_value() ? std::to_string(*r.indexInRemapped) : "null"; + indices += ","; + } + std::string s; + puts(("Inconsistent indexInRemapped " + indices + " for new remapped string " + + result.toUTF8String(s)) + .c_str()); + std::terminate(); + } + remapped = result; + if (U_FAILURE(status)) { + puts(("Failed to apply rule " + name()).c_str()); + std::terminate(); + } + timeSpent_ += std::chrono::steady_clock::now() - start; + } + + virtual Resolution resolution() const override { return NO_BREAK; } + + private: + std::unique_ptr pattern_; + UnicodeString replacement_; +}; + +class RegexRule : public SegmentationRule { + public: + template >> + RegexRule(const std::u16string_view name, const std::u16string_view before, T resolution, + const std::u16string_view after) + : SegmentationRule(name), resolution_(static_cast(resolution)) { + UParseError parseError; + UErrorCode status = U_ZERO_ERROR; + before_.reset( + RegexPattern::compile(before, UREGEX_COMMENTS | UREGEX_DOTALL, parseError, status)); + endsWithBefore_.reset(RegexPattern::compile( + ".*(" + before + ")", UREGEX_COMMENTS | UREGEX_DOTALL, parseError, status)); + after_.reset(RegexPattern::compile(after, UREGEX_COMMENTS | UREGEX_DOTALL, parseError, status)); + if (U_FAILURE(status)) { + puts(("Failed to compile regular expressions for rule " + this->name()).c_str()); + std::terminate(); + } + } + + virtual void apply(UnicodeString &remapped, std::vector &resolved) const override { + auto const start = std::chrono::steady_clock::now(); + UErrorCode status = U_ZERO_ERROR; + // The unicodetools implementation simply tries, for each index, to + // match the string up to the index against /.*(before)/ (with + // `matches`) and the beginning of the string after the index against + // /after/ (with `lookingAt`), but that is very slow, especially for + // nonempty /before/. While the old monkeys are not a production + // implementation, we still do not want them to be too slow, since we + // need to test millions of sample strings. Instead we search for + // /before/ and /after/, and check resulting candidates. This speeds + // things up by a factor of ~40. + // We need to be careful about greedy matching: The first position where + // the rule matches may be before the end of the first /before/ match. + // However, it is both: + // 1. within a /before/ match or at its bounds, + // 2. at the beginning of an /after/ match. + // Further, the /before/ context of the rule matches within the + // aforementioned /before/ match. Note that we need to look for + // overlapping matches, thus calls to `find` are always preceded by a + // reset via `region`. + std::unique_ptr beforeSearch(before_->matcher(remapped, status)); + std::unique_ptr afterSearch(after_->matcher(remapped, status)); + beforeSearch->useAnchoringBounds(false); + afterSearch->useAnchoringBounds(false); + U_ASSERT(U_SUCCESS(status)); + if (beforeSearch->find() && afterSearch->find()) { + for (;;) { + if (afterSearch->start(status) < beforeSearch->start(status)) { + afterSearch->region(beforeSearch->start(status), remapped.length(), status); + if (!afterSearch->find()) { + break; + } + } else if (afterSearch->start(status) > beforeSearch->end(status)) { + if (beforeSearch->start(status) == remapped.length()) { + break; + } + beforeSearch->region(remapped.moveIndex32(beforeSearch->start(status), 1), + remapped.length(), status); + if (!beforeSearch->find()) { + break; + } + } else { + auto const it = std::find_if(resolved.begin(), resolved.end(), [&](auto r) { + return r.indexInRemapped == afterSearch->start(status); + }); + if (it == resolved.end()) { + puts(("Rule " + name() + + " found a break at a position which does not correspond to an index in " + "the original string") + .c_str()); + std::terminate(); + } + U_ASSERT(U_SUCCESS(status)); + if (it->appliedRule == nullptr && + std::unique_ptr(endsWithBefore_->matcher(remapped, status)) + ->useAnchoringBounds(false) + .region(beforeSearch->start(status), afterSearch->start(status), status) + .matches(status)) { + it->appliedRule = this; + } + if (afterSearch->start(status) == remapped.length()) { + break; + } + afterSearch->region(remapped.moveIndex32(afterSearch->start(status), 1), + remapped.length(), status); + if (!afterSearch->find()) { + break; + } + } + U_ASSERT(U_SUCCESS(status)); + } + } + if (U_FAILURE(status)) { + puts(("Failed to apply rule " + name()).c_str()); + std::terminate(); + } + timeSpent_ += std::chrono::steady_clock::now() - start; + } + + virtual Resolution resolution() const override { return resolution_; } + + private: + std::unique_ptr before_; + std::unique_ptr endsWithBefore_; + std::unique_ptr after_; + const Resolution resolution_; +}; + +} // namespace + //---------------------------------------------------------------------------------------- // // Random Numbers. We need a long cycle length since we run overnight tests over @@ -1686,9 +1947,9 @@ private: UnicodeSet *fLVTSet; UnicodeSet *fHangulSet; UnicodeSet *fExtendedPictSet; - UnicodeSet *fViramaSet; - UnicodeSet *fLinkingConsonantSet; - UnicodeSet *fExtCccZwjSet; + UnicodeSet *fInCBLinkerSet; + UnicodeSet *fInCBConsonantSet; + UnicodeSet *fInCBExtendSet; UnicodeSet *fAnySet; const UnicodeString *fText; @@ -1721,11 +1982,9 @@ RBBICharMonkey::RBBICharMonkey() { fHangulSet->addAll(*fLVTSet); fExtendedPictSet = new UnicodeSet(u"[:Extended_Pictographic:]", status); - fViramaSet = new UnicodeSet(u"[\\p{Gujr}\\p{sc=Telu}\\p{sc=Mlym}\\p{sc=Orya}\\p{sc=Beng}\\p{sc=Deva}&" - "\\p{Indic_Syllabic_Category=Virama}]", status); - fLinkingConsonantSet = new UnicodeSet(u"[\\p{Gujr}\\p{sc=Telu}\\p{sc=Mlym}\\p{sc=Orya}\\p{sc=Beng}\\p{sc=Deva}&" - "\\p{Indic_Syllabic_Category=Consonant}]", status); - fExtCccZwjSet = new UnicodeSet(u"[[\\p{gcb=Extend}-\\p{ccc=0}] \\p{gcb=ZWJ}]", status); + fInCBLinkerSet = new UnicodeSet(u"[\\p{InCB=Linker}]", status); + fInCBConsonantSet = new UnicodeSet(u"[\\p{InCB=Consonant}]", status); + fInCBExtendSet = new UnicodeSet(u"[\\p{InCB=Extend}]", status); fAnySet = new UnicodeSet(0, 0x10ffff); // Create sets of characters, and add the names of the above character sets. @@ -1744,9 +2003,9 @@ RBBICharMonkey::RBBICharMonkey() { sets.emplace_back(*fHangulSet); classNames.emplace_back("Hangul"); sets.emplace_back(*fZWJSet); classNames.emplace_back("ZWJ"); sets.emplace_back(*fExtendedPictSet); classNames.emplace_back("ExtendedPict"); - sets.emplace_back(*fViramaSet); classNames.emplace_back("Virama"); - sets.emplace_back(*fLinkingConsonantSet); classNames.emplace_back("LinkingConsonant"); - sets.emplace_back(*fExtCccZwjSet); classNames.emplace_back("ExtCcccZwj"); + sets.emplace_back(*fInCBLinkerSet); classNames.emplace_back("InCB=Linker"); + sets.emplace_back(*fInCBConsonantSet); classNames.emplace_back("InCB=Consonant"); + sets.emplace_back(*fInCBExtendSet); classNames.emplace_back("InCB=Extend"); sets.emplace_back(*fAnySet); classNames.emplace_back("Any"); if (U_FAILURE(status)) { @@ -1869,19 +2128,20 @@ int32_t RBBICharMonkey::next(int32_t prevPos) { continue; } - // Note: Viramas are also included in the ExtCccZwj class. - if (fLinkingConsonantSet->contains(c2)) { + if (fInCBConsonantSet->contains(c2)) { int pi = p1; bool sawVirama = false; - while (pi > 0 && fExtCccZwjSet->contains(fText->char32At(pi))) { - if (fViramaSet->contains(fText->char32At(pi))) { + while (pi > 0 && (fInCBExtendSet->contains(fText->char32At(pi)) || + fInCBLinkerSet->contains(fText->char32At(pi)))) { + if (fInCBLinkerSet->contains(fText->char32At(pi))) { sawVirama = true; } pi = fText->moveIndex32(pi, -1); } - if (sawVirama && fLinkingConsonantSet->contains(fText->char32At(pi))) { - setAppliedRule(p2, "GB9.3 LinkingConsonant ExtCccZwj* Virama ExtCccZwj* x LinkingConsonant"); - continue; + if (sawVirama && fInCBConsonantSet->contains(fText->char32At(pi))) { + setAppliedRule( + p2, R"(GB9c \p{InCB=Consonant} [ \p{InCB=Extend} \p{InCB=Linker} ]* \p{InCB=Linker} [ \p{InCB=Extend} \p{InCB=Linker} ]* x \p{InCB=Consonant})"); + continue; } } @@ -1934,9 +2194,9 @@ RBBICharMonkey::~RBBICharMonkey() { delete fAnySet; delete fZWJSet; delete fExtendedPictSet; - delete fViramaSet; - delete fLinkingConsonantSet; - delete fExtCccZwjSet; + delete fInCBLinkerSet; + delete fInCBConsonantSet; + delete fInCBExtendSet; } //------------------------------------------------------------------------------------------ @@ -1995,7 +2255,7 @@ RBBIWordMonkey::RBBIWordMonkey() fSingle_QuoteSet = new UnicodeSet(u"[\\p{Word_Break = Single_Quote}]", status); fDouble_QuoteSet = new UnicodeSet(u"[\\p{Word_Break = Double_Quote}]", status); fMidNumLetSet = new UnicodeSet(u"[\\p{Word_Break = MidNumLet}]", status); - fMidLetterSet = new UnicodeSet(u"[\\p{Word_Break = MidLetter} - [\\: \\uFE55 \\uFF1A]]", status); + fMidLetterSet = new UnicodeSet(u"[\\p{Word_Break = MidLetter}]", status); fMidNumSet = new UnicodeSet(u"[\\p{Word_Break = MidNum}]", status); fNumericSet = new UnicodeSet(u"[\\p{Word_Break = Numeric}]", status); fFormatSet = new UnicodeSet(u"[\\p{Word_Break = Format}]", status); @@ -2641,8 +2901,6 @@ RBBISentMonkey::~RBBISentMonkey() { delete fExtendSet; } - - //------------------------------------------------------------------------------------------- // // RBBILineMonkey @@ -2656,64 +2914,10 @@ public: virtual const std::vector& charClasses() override; virtual void setText(const UnicodeString &s) override; virtual int32_t next(int32_t i) override; - virtual void rule9Adjust(int32_t pos, UChar32 *posChar, int32_t *nextPos, UChar32 *nextChar); private: std::vector sets; - - UnicodeSet *fBK; - UnicodeSet *fCR; - UnicodeSet *fLF; - UnicodeSet *fCM; - UnicodeSet *fNL; - UnicodeSet *fSG; - UnicodeSet *fWJ; - UnicodeSet *fZW; - UnicodeSet *fGL; - UnicodeSet *fCB; - UnicodeSet *fSP; - UnicodeSet *fB2; - UnicodeSet *fBA; - UnicodeSet *fBB; - UnicodeSet *fHH; - UnicodeSet *fHY; - UnicodeSet *fH2; - UnicodeSet *fH3; - UnicodeSet *fCL; - UnicodeSet *fCP; - UnicodeSet *fEX; - UnicodeSet *fIN; - UnicodeSet *fJL; - UnicodeSet *fJV; - UnicodeSet *fJT; - UnicodeSet *fNS; - UnicodeSet *fOP; - UnicodeSet *fQU; - UnicodeSet *fIS; - UnicodeSet *fNU; - UnicodeSet *fPO; - UnicodeSet *fPR; - UnicodeSet *fSY; - UnicodeSet *fAI; - UnicodeSet *fAL; - UnicodeSet *fCJ; - UnicodeSet *fHL; - UnicodeSet *fID; - UnicodeSet *fRI; - UnicodeSet *fXX; - UnicodeSet *fEB; - UnicodeSet *fEM; - UnicodeSet *fZWJ; - UnicodeSet *fOP30; - UnicodeSet *fCP30; - UnicodeSet *fExtPictUnassigned; - UnicodeSet *fAK; - UnicodeSet *fAP; - UnicodeSet *fAS; - UnicodeSet *fVF; - UnicodeSet *fVI; - UnicodeSet *fPi; - UnicodeSet *fPf; - UnicodeSet *feaFWH; + std::vector> rules; + std::vector resolved; BreakIterator *fCharBI; const UnicodeString *fText; @@ -2732,109 +2936,193 @@ RBBILineMonkey::RBBILineMonkey() : UErrorCode status = U_ZERO_ERROR; - fBK = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_Break=BK}]"), status); - fCR = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=CR}]"), status); - fLF = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=LF}]"), status); - fCM = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=CM}]"), status); - fNL = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=NL}]"), status); - fWJ = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=WJ}]"), status); - fZW = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=ZW}]"), status); - fGL = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=GL}]"), status); - fCB = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=CB}]"), status); - fSP = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=SP}]"), status); - fB2 = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=B2}]"), status); - fBA = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=BA}]"), status); - fBB = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=BB}]"), status); - fHH = new UnicodeSet(); - fHY = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=HY}]"), status); - fH2 = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=H2}]"), status); - fH3 = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=H3}]"), status); - fCL = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=CL}]"), status); - fCP = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=CP}]"), status); - fEX = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=EX}]"), status); - fIN = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=IN}]"), status); - fJL = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=JL}]"), status); - fJV = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=JV}]"), status); - fJT = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=JT}]"), status); - fNS = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=NS}]"), status); - fOP = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=OP}]"), status); - fQU = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=QU}]"), status); - fIS = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=IS}]"), status); - fNU = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=NU}]"), status); - fPO = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=PO}]"), status); - fPR = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=PR}]"), status); - fSY = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=SY}]"), status); - fAI = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=AI}]"), status); - fAL = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=AL}]"), status); - fCJ = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=CJ}]"), status); - fHL = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=HL}]"), status); - fID = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=ID}]"), status); - fRI = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=RI}]"), status); - fSG = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\ud800-\\udfff]"), status); - fXX = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=XX}]"), status); - fEB = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=EB}]"), status); - fEM = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=EM}]"), status); - fZWJ = new UnicodeSet(UNICODE_STRING_SIMPLE("[\\p{Line_break=ZWJ}]"), status); - fOP30 = new UnicodeSet(u"[\\p{Line_break=OP}-[\\p{ea=F}\\p{ea=W}\\p{ea=H}]]", status); - fCP30 = new UnicodeSet(u"[\\p{Line_break=CP}-[\\p{ea=F}\\p{ea=W}\\p{ea=H}]]", status); - fExtPictUnassigned = new UnicodeSet(u"[\\p{Extended_Pictographic}&\\p{Cn}]", status); - - fAK = new UnicodeSet(uR"([\p{Line_Break=AK}])", status); - fAP = new UnicodeSet(uR"([\p{Line_Break=AP}])", status); - fAS = new UnicodeSet(uR"([\p{Line_Break=AS}])", status); - fVF = new UnicodeSet(uR"([\p{Line_Break=VF}])", status); - fVI = new UnicodeSet(uR"([\p{Line_Break=VI}])", status); - - fPi = new UnicodeSet(uR"([\p{Pi}])", status); - fPf = new UnicodeSet(uR"([\p{Pf}])", status); - - feaFWH = new UnicodeSet(uR"([\p{ea=F}\p{ea=W}\p{ea=H}])", status); - if (U_FAILURE(status)) { deferredStatus = status; return; } - fAL->addAll(*fXX); // Default behavior for XX is identical to AL - fAL->addAll(*fAI); // Default behavior for AI is identical to AL - fAL->addAll(*fSG); // Default behavior for SG is identical to AL. - - fNS->addAll(*fCJ); // Default behavior for CJ is identical to NS. - fCM->addAll(*fZWJ); // ZWJ behaves as a CM. - - fHH->add(u'\u2010'); // Hyphen, '‐' - - const std::vector> interestingSets{ - {"eastAsian", {uR"([\p{ea=F}\p{ea=W}\p{ea=H}])", status}}, - {"Pi", {uR"(\p{Pi})", status}}, - {"Pf", {uR"(\p{Pf})", status}}, - {"DOTTEDC.", {uR"([◌])", status}}, - {"HYPHEN", {uR"([\u2010])", status}}, - {"ExtPictCn", {uR"([\p{Extended_Pictographic}&\p{Cn}])", status}}, - }; std::list> partition; - for (int lb = 0; lb < U_LB_COUNT; ++lb) { - const std::string lbValueShortName = u_getPropertyValueName(UCHAR_LINE_BREAK, lb, U_SHORT_PROPERTY_NAME); - if (lbValueShortName == "SA") { - continue; + + rules.push_back(std::make_unique(uR"(sot ÷ contra LB2)", uR"(^)", u'÷', uR"()")); + // This one could be part of the rules. + // Note that /$/ matches ( BK | CR | LF | NL ) eot, so we use (?!.) instead. + // The generated rules use the same (?!.). + rules.push_back(std::make_unique(uR"(LB3 ÷ eot)", uR"()", u'÷', uR"((?!.))")); + + // --- NOLI ME TANGERE --- + // Generated by GenerateBreakTest.java in the Unicode tools. + partition.emplace_back("AI_EastAsian", UnicodeSet(uR"([\p{Line_Break=Ambiguous}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("AImEastAsian", UnicodeSet(uR"([\p{Line_Break=Ambiguous}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("AK", UnicodeSet(uR"([\p{Line_Break=Aksara}])", status)); + partition.emplace_back("ALorig_EastAsian", UnicodeSet(uR"([\p{Line_Break=Alphabetic}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("ALorig_DottedCircle", UnicodeSet(uR"([\p{Line_Break=Alphabetic}&[◌]])", status)); + partition.emplace_back("ALorigmEastAsianmDottedCircle", UnicodeSet(uR"([\p{Line_Break=Alphabetic}-[\p{ea=F}\p{ea=W}\p{ea=H}]-[◌]])", status)); + partition.emplace_back("AP", UnicodeSet(uR"([\p{Line_Break=Aksara_Prebase}])", status)); + partition.emplace_back("AS", UnicodeSet(uR"([\p{Line_Break=Aksara_Start}])", status)); + partition.emplace_back("B2", UnicodeSet(uR"([\p{Line_Break=Break_Both}])", status)); + partition.emplace_back("BA_EastAsian", UnicodeSet(uR"([\p{Line_Break=Break_After}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("BA_Hyphen", UnicodeSet(uR"([\p{Line_Break=Break_After}&[\u2010]])", status)); + partition.emplace_back("BAmEastAsianmHyphen", UnicodeSet(uR"([\p{Line_Break=Break_After}-[\p{ea=F}\p{ea=W}\p{ea=H}]-[\u2010]])", status)); + partition.emplace_back("BB", UnicodeSet(uR"([\p{Line_Break=Break_Before}])", status)); + partition.emplace_back("BK", UnicodeSet(uR"([\p{Line_Break=Mandatory_Break}])", status)); + partition.emplace_back("CB", UnicodeSet(uR"([\p{Line_Break=Contingent_Break}])", status)); + partition.emplace_back("CL_EastAsian", UnicodeSet(uR"([\p{Line_Break=Close_Punctuation}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("CLmEastAsian", UnicodeSet(uR"([\p{Line_Break=Close_Punctuation}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("CP", UnicodeSet(uR"([\p{Line_Break=CP}])", status)); + partition.emplace_back("CMorig_EastAsian", UnicodeSet(uR"([\p{Line_Break=Combining_Mark}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("CMorigmEastAsian", UnicodeSet(uR"([\p{Line_Break=Combining_Mark}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("CR", UnicodeSet(uR"([\p{Line_Break=Carriage_Return}])", status)); + partition.emplace_back("EX_EastAsian", UnicodeSet(uR"([\p{Line_Break=Exclamation}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("EXmEastAsian", UnicodeSet(uR"([\p{Line_Break=Exclamation}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("GL_EastAsian", UnicodeSet(uR"([\p{Line_Break=Glue}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("GLmEastAsian", UnicodeSet(uR"([\p{Line_Break=Glue}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("H2", UnicodeSet(uR"([\p{Line_Break=H2}])", status)); + partition.emplace_back("H3", UnicodeSet(uR"([\p{Line_Break=H3}])", status)); + partition.emplace_back("HL", UnicodeSet(uR"([\p{Line_Break=HL}])", status)); + partition.emplace_back("HY", UnicodeSet(uR"([\p{Line_Break=Hyphen}])", status)); + partition.emplace_back("ID_EastAsian", UnicodeSet(uR"([\p{Line_Break=Ideographic}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("ID_ExtPictUnassigned", UnicodeSet(uR"([\p{Line_Break=Ideographic}&[\p{Extended_Pictographic}&\p{gc=Cn}]])", status)); + partition.emplace_back("IDmEastAsianmExtPictUnassigned", UnicodeSet(uR"([\p{Line_Break=Ideographic}-[\p{ea=F}\p{ea=W}\p{ea=H}]-[\p{Extended_Pictographic}&\p{gc=Cn}]])", status)); + partition.emplace_back("IN_EastAsian", UnicodeSet(uR"([\p{Line_Break=Inseparable}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("INmEastAsian", UnicodeSet(uR"([\p{Line_Break=Inseparable}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("IS", UnicodeSet(uR"([\p{Line_Break=Infix_Numeric}])", status)); + partition.emplace_back("JL", UnicodeSet(uR"([\p{Line_Break=JL}])", status)); + partition.emplace_back("JT", UnicodeSet(uR"([\p{Line_Break=JT}])", status)); + partition.emplace_back("JV", UnicodeSet(uR"([\p{Line_Break=JV}])", status)); + partition.emplace_back("LF", UnicodeSet(uR"([\p{Line_Break=Line_Feed}])", status)); + partition.emplace_back("NL", UnicodeSet(uR"([\p{Line_Break=Next_Line}])", status)); + partition.emplace_back("NSorig_EastAsian", UnicodeSet(uR"([\p{Line_Break=Nonstarter}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("NSorigmEastAsian", UnicodeSet(uR"([\p{Line_Break=Nonstarter}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("NU", UnicodeSet(uR"([\p{Line_Break=Numeric}])", status)); + partition.emplace_back("OP_EastAsian", UnicodeSet(uR"([\p{Line_Break=Open_Punctuation}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("OPmEastAsian", UnicodeSet(uR"([\p{Line_Break=Open_Punctuation}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("PO_EastAsian", UnicodeSet(uR"([\p{Line_Break=Postfix_Numeric}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("POmEastAsian", UnicodeSet(uR"([\p{Line_Break=Postfix_Numeric}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("PR_EastAsian", UnicodeSet(uR"([\p{Line_Break=Prefix_Numeric}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("PRmEastAsian", UnicodeSet(uR"([\p{Line_Break=Prefix_Numeric}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("QU_Pi", UnicodeSet(uR"([\p{Line_Break=Quotation}&\p{gc=Pi}])", status)); + partition.emplace_back("QU_Pf", UnicodeSet(uR"([\p{Line_Break=Quotation}&\p{gc=Pf}])", status)); + partition.emplace_back("QUmPimPf", UnicodeSet(uR"([\p{Line_Break=Quotation}-\p{gc=Pi}-\p{gc=Pf}])", status)); + partition.emplace_back("SA_Mn", UnicodeSet(uR"([[\p{Line_Break=Complex_Context}&\p{gc=Mn}]])", status)); + partition.emplace_back("SA_Mc", UnicodeSet(uR"([[\p{Line_Break=Complex_Context}&\p{gc=Mc}]])", status)); + partition.emplace_back("SAmMnmMc", UnicodeSet(uR"([[\p{Line_Break=Complex_Context}-\p{gc=Mn}-\p{gc=Mc}]])", status)); + partition.emplace_back("SG", UnicodeSet(uR"([\p{Line_Break=Surrogate}])", status)); + partition.emplace_back("SP", UnicodeSet(uR"([\p{Line_Break=Space}])", status)); + partition.emplace_back("SY", UnicodeSet(uR"([\p{Line_Break=Break_Symbols}])", status)); + partition.emplace_back("VF", UnicodeSet(uR"([\p{Line_Break=Virama_Final}])", status)); + partition.emplace_back("VI", UnicodeSet(uR"([\p{Line_Break=Virama}])", status)); + partition.emplace_back("WJ", UnicodeSet(uR"([\p{Line_Break=Word_Joiner}])", status)); + partition.emplace_back("XX_ExtPictUnassigned", UnicodeSet(uR"([\p{Line_Break=Unknown}&[\p{Extended_Pictographic}&\p{gc=Cn}]])", status)); + partition.emplace_back("XXmExtPictUnassigned", UnicodeSet(uR"([\p{Line_Break=Unknown}-[\p{Extended_Pictographic}&\p{gc=Cn}]])", status)); + partition.emplace_back("ZW", UnicodeSet(uR"([\p{Line_Break=ZWSpace}])", status)); + partition.emplace_back("CJ", UnicodeSet(uR"([\p{Line_Break=Conditional_Japanese_Starter}])", status)); + partition.emplace_back("RI", UnicodeSet(uR"([\p{Line_Break=Regional_Indicator}])", status)); + partition.emplace_back("EB_EastAsian", UnicodeSet(uR"([\p{Line_Break=E_Base}&[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("EBmEastAsian", UnicodeSet(uR"([\p{Line_Break=E_Base}-[\p{ea=F}\p{ea=W}\p{ea=H}]])", status)); + partition.emplace_back("EM", UnicodeSet(uR"([\p{Line_Break=E_Modifier}])", status)); + partition.emplace_back("ZWJ", UnicodeSet(uR"([\p{Line_Break=ZWJ}])", status)); + + rules.push_back(std::make_unique(uR"($BK ÷)", uR"(\p{Line_Break=Mandatory_Break})", u'÷', uR"()")); + rules.push_back(std::make_unique(uR"($CR × $LF)", uR"(\p{Line_Break=Carriage_Return})", u'×', uR"(\p{Line_Break=Line_Feed})")); + rules.push_back(std::make_unique(uR"($CR ÷)", uR"(\p{Line_Break=Carriage_Return})", u'÷', uR"()")); + rules.push_back(std::make_unique(uR"($LF ÷)", uR"(\p{Line_Break=Line_Feed})", u'÷', uR"()")); + rules.push_back(std::make_unique(uR"($NL ÷)", uR"(\p{Line_Break=Next_Line})", u'÷', uR"()")); + rules.push_back(std::make_unique(uR"(× ( $BK | $CR | $LF | $NL ))", uR"()", u'×', uR"(( \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} ))")); + rules.push_back(std::make_unique(uR"(× $SP)", uR"()", u'×', uR"(\p{Line_Break=Space})")); + rules.push_back(std::make_unique(uR"(× $ZW)", uR"()", u'×', uR"(\p{Line_Break=ZWSpace})")); + rules.push_back(std::make_unique(uR"($ZW $SP* ÷)", uR"(\p{Line_Break=ZWSpace} \p{Line_Break=Space}*)", u'÷', uR"()")); + rules.push_back(std::make_unique(uR"($ZWJ ×)", uR"(\p{Line_Break=ZWJ})", u'×', uR"()")); + rules.push_back(std::make_unique(uR"((?[^$BK $CR $LF $NL $SP $ZW]) ( $CM | $ZWJ )* → ${X})", uR"((?[^\p{Line_Break=Mandatory_Break} \p{Line_Break=Carriage_Return} \p{Line_Break=Line_Feed} \p{Line_Break=Next_Line} \p{Line_Break=Space} \p{Line_Break=ZWSpace}]) ( [\p{Line_Break=Combining_Mark} [\p{Line_Break=Complex_Context}&&\p{gc=Mn}] [\p{Line_Break=Complex_Context}&&\p{gc=Mc}]] | \p{Line_Break=ZWJ} )*)", uR"(${X})")); + rules.push_back(std::make_unique(uR"(( $CM | $ZWJ ) → A)", uR"(( [\p{Line_Break=Combining_Mark} [\p{Line_Break=Complex_Context}&&\p{gc=Mn}] [\p{Line_Break=Complex_Context}&&\p{gc=Mc}]] | \p{Line_Break=ZWJ} ))", uR"(A)")); + rules.push_back(std::make_unique(uR"(× $WJ)", uR"()", u'×', uR"(\p{Line_Break=Word_Joiner})")); + rules.push_back(std::make_unique(uR"($WJ ×)", uR"(\p{Line_Break=Word_Joiner})", u'×', uR"()")); + rules.push_back(std::make_unique(uR"($GL ×)", uR"(\p{Line_Break=Glue})", u'×', uR"()")); + rules.push_back(std::make_unique(uR"([^ $SP $BA $HY] × $GL)", uR"([^ \p{Line_Break=Space} \p{Line_Break=Break_After} \p{Line_Break=Hyphen}])", u'×', uR"(\p{Line_Break=Glue})")); + rules.push_back(std::make_unique(uR"(× $EX)", uR"()", u'×', uR"(\p{Line_Break=Exclamation})")); + rules.push_back(std::make_unique(uR"(× $CL)", uR"()", u'×', uR"(\p{Line_Break=Close_Punctuation})")); + rules.push_back(std::make_unique(uR"(× $CP)", uR"()", u'×', uR"(\p{Line_Break=CP})")); + rules.push_back(std::make_unique(uR"(× $SY)", uR"()", u'×', uR"(\p{Line_Break=Break_Symbols})")); + rules.push_back(std::make_unique(uR"($OP $SP* ×)", uR"(\p{Line_Break=Open_Punctuation} \p{Line_Break=Space}*)", u'×', uR"()")); + rules.push_back(std::make_unique(uR"(( $BK | $CR | $LF | $NL | $OP | $QU | $GL | $SP | $ZW | $sot ) $QU_Pi $SP* ×)", uR"(( \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Open_Punctuation} | \p{Line_Break=Quotation} | \p{Line_Break=Glue} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} | ^ ) [\p{Line_Break=Quotation} && \p{gc=Pi}] \p{Line_Break=Space}*)", u'×', uR"()")); + rules.push_back(std::make_unique(uR"(× $QU_Pf ( $SP | $GL | $WJ | $CL | $QU | $CP | $EX | $IS | $SY | $BK | $CR | $LF | $NL | $ZW | $eot ))", uR"()", u'×', uR"([\p{Line_Break=Quotation} && \p{gc=Pf}] ( \p{Line_Break=Space} | \p{Line_Break=Glue} | \p{Line_Break=Word_Joiner} | \p{Line_Break=Close_Punctuation} | \p{Line_Break=Quotation} | \p{Line_Break=CP} | \p{Line_Break=Exclamation} | \p{Line_Break=Infix_Numeric} | \p{Line_Break=Break_Symbols} | \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=ZWSpace} | (?!.) ))")); + rules.push_back(std::make_unique(uR"($SP ÷ $IS $NU)", uR"(\p{Line_Break=Space})", u'÷', uR"(\p{Line_Break=Infix_Numeric} \p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"(× $IS)", uR"()", u'×', uR"(\p{Line_Break=Infix_Numeric})")); + rules.push_back(std::make_unique(uR"(($CL | $CP) $SP* × $NS)", uR"((\p{Line_Break=Close_Punctuation} | \p{Line_Break=CP}) \p{Line_Break=Space}*)", u'×', uR"([\p{Line_Break=Nonstarter} \p{Line_Break=Conditional_Japanese_Starter}])")); + rules.push_back(std::make_unique(uR"($B2 $SP* × $B2)", uR"(\p{Line_Break=Break_Both} \p{Line_Break=Space}*)", u'×', uR"(\p{Line_Break=Break_Both})")); + rules.push_back(std::make_unique(uR"($SP ÷)", uR"(\p{Line_Break=Space})", u'÷', uR"()")); + rules.push_back(std::make_unique(uR"(× $QUmPi)", uR"()", u'×', uR"([\p{Line_Break=Quotation} -- \p{gc=Pi}])")); + rules.push_back(std::make_unique(uR"($QUmPf ×)", uR"([\p{Line_Break=Quotation} -- \p{gc=Pf}])", u'×', uR"()")); + rules.push_back(std::make_unique(uR"([^$EastAsian] × $QU)", uR"([^[\p{ea=F}\p{ea=W}\p{ea=H}]])", u'×', uR"(\p{Line_Break=Quotation})")); + rules.push_back(std::make_unique(uR"(× $QU ( [^$EastAsian] | $eot ))", uR"()", u'×', uR"(\p{Line_Break=Quotation} ( [^[\p{ea=F}\p{ea=W}\p{ea=H}]] | (?!.) ))")); + rules.push_back(std::make_unique(uR"($QU × [^$EastAsian])", uR"(\p{Line_Break=Quotation})", u'×', uR"([^[\p{ea=F}\p{ea=W}\p{ea=H}]])")); + rules.push_back(std::make_unique(uR"(( [^$EastAsian] | $sot ) $QU ×)", uR"(( [^[\p{ea=F}\p{ea=W}\p{ea=H}]] | ^ ) \p{Line_Break=Quotation})", u'×', uR"()")); + rules.push_back(std::make_unique(uR"(÷ $CB)", uR"()", u'÷', uR"(\p{Line_Break=Contingent_Break})")); + rules.push_back(std::make_unique(uR"($CB ÷)", uR"(\p{Line_Break=Contingent_Break})", u'÷', uR"()")); + rules.push_back(std::make_unique(uR"(( $BK | $CR | $LF | $NL | $SP | $ZW | $CB | $GL | $sot ) ( $HY | $Hyphen ) × $AL)", uR"(( \p{Line_Break=Mandatory_Break} | \p{Line_Break=Carriage_Return} | \p{Line_Break=Line_Feed} | \p{Line_Break=Next_Line} | \p{Line_Break=Space} | \p{Line_Break=ZWSpace} | \p{Line_Break=Contingent_Break} | \p{Line_Break=Glue} | ^ ) ( \p{Line_Break=Hyphen} | [\u2010] ))", u'×', uR"([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]])")); + rules.push_back(std::make_unique(uR"(× $BA)", uR"()", u'×', uR"(\p{Line_Break=Break_After})")); + rules.push_back(std::make_unique(uR"(× $HY)", uR"()", u'×', uR"(\p{Line_Break=Hyphen})")); + rules.push_back(std::make_unique(uR"(× $NS)", uR"()", u'×', uR"([\p{Line_Break=Nonstarter} \p{Line_Break=Conditional_Japanese_Starter}])")); + rules.push_back(std::make_unique(uR"($BB ×)", uR"(\p{Line_Break=Break_Before})", u'×', uR"()")); + rules.push_back(std::make_unique(uR"($HL ($HY | $NonEastAsianBA) × [^$HL])", uR"(\p{Line_Break=HL} (\p{Line_Break=Hyphen} | [\p{Line_Break=Break_After} && [^[\p{ea=F}\p{ea=W}\p{ea=H}]]]))", u'×', uR"([^\p{Line_Break=HL}])")); + rules.push_back(std::make_unique(uR"($SY × $HL)", uR"(\p{Line_Break=Break_Symbols})", u'×', uR"(\p{Line_Break=HL})")); + rules.push_back(std::make_unique(uR"(× $IN)", uR"()", u'×', uR"(\p{Line_Break=Inseparable})")); + rules.push_back(std::make_unique(uR"(($AL | $HL) × $NU)", uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL}))", u'×', uR"(\p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($NU × ($AL | $HL))", uR"(\p{Line_Break=Numeric})", u'×', uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL}))")); + rules.push_back(std::make_unique(uR"($PR × ($ID | $EB | $EM))", uR"(\p{Line_Break=Prefix_Numeric})", u'×', uR"((\p{Line_Break=Ideographic} | \p{Line_Break=E_Base} | \p{Line_Break=E_Modifier}))")); + rules.push_back(std::make_unique(uR"(($ID | $EB | $EM) × $PO)", uR"((\p{Line_Break=Ideographic} | \p{Line_Break=E_Base} | \p{Line_Break=E_Modifier}))", u'×', uR"(\p{Line_Break=Postfix_Numeric})")); + rules.push_back(std::make_unique(uR"(($PR | $PO) × ($AL | $HL))", uR"((\p{Line_Break=Prefix_Numeric} | \p{Line_Break=Postfix_Numeric}))", u'×', uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL}))")); + rules.push_back(std::make_unique(uR"(($AL | $HL) × ($PR | $PO))", uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL}))", u'×', uR"((\p{Line_Break=Prefix_Numeric} | \p{Line_Break=Postfix_Numeric}))")); + rules.push_back(std::make_unique(uR"($NU ( $SY | $IS )* $CL × $PO)", uR"(\p{Line_Break=Numeric} ( \p{Line_Break=Break_Symbols} | \p{Line_Break=Infix_Numeric} )* \p{Line_Break=Close_Punctuation})", u'×', uR"(\p{Line_Break=Postfix_Numeric})")); + rules.push_back(std::make_unique(uR"($NU ( $SY | $IS )* $CP × $PO)", uR"(\p{Line_Break=Numeric} ( \p{Line_Break=Break_Symbols} | \p{Line_Break=Infix_Numeric} )* \p{Line_Break=CP})", u'×', uR"(\p{Line_Break=Postfix_Numeric})")); + rules.push_back(std::make_unique(uR"($NU ( $SY | $IS )* $CL × $PR)", uR"(\p{Line_Break=Numeric} ( \p{Line_Break=Break_Symbols} | \p{Line_Break=Infix_Numeric} )* \p{Line_Break=Close_Punctuation})", u'×', uR"(\p{Line_Break=Prefix_Numeric})")); + rules.push_back(std::make_unique(uR"($NU ( $SY | $IS )* $CP × $PR)", uR"(\p{Line_Break=Numeric} ( \p{Line_Break=Break_Symbols} | \p{Line_Break=Infix_Numeric} )* \p{Line_Break=CP})", u'×', uR"(\p{Line_Break=Prefix_Numeric})")); + rules.push_back(std::make_unique(uR"($NU ( $SY | $IS )* × $PO)", uR"(\p{Line_Break=Numeric} ( \p{Line_Break=Break_Symbols} | \p{Line_Break=Infix_Numeric} )*)", u'×', uR"(\p{Line_Break=Postfix_Numeric})")); + rules.push_back(std::make_unique(uR"($NU ( $SY | $IS )* × $PR)", uR"(\p{Line_Break=Numeric} ( \p{Line_Break=Break_Symbols} | \p{Line_Break=Infix_Numeric} )*)", u'×', uR"(\p{Line_Break=Prefix_Numeric})")); + rules.push_back(std::make_unique(uR"($PO × $OP $NU)", uR"(\p{Line_Break=Postfix_Numeric})", u'×', uR"(\p{Line_Break=Open_Punctuation} \p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($PO × $OP $IS $NU)", uR"(\p{Line_Break=Postfix_Numeric})", u'×', uR"(\p{Line_Break=Open_Punctuation} \p{Line_Break=Infix_Numeric} \p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($PO × $NU)", uR"(\p{Line_Break=Postfix_Numeric})", u'×', uR"(\p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($PR × $OP $NU)", uR"(\p{Line_Break=Prefix_Numeric})", u'×', uR"(\p{Line_Break=Open_Punctuation} \p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($PR × $OP $IS $NU)", uR"(\p{Line_Break=Prefix_Numeric})", u'×', uR"(\p{Line_Break=Open_Punctuation} \p{Line_Break=Infix_Numeric} \p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($PR × $NU)", uR"(\p{Line_Break=Prefix_Numeric})", u'×', uR"(\p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($HY × $NU)", uR"(\p{Line_Break=Hyphen})", u'×', uR"(\p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($IS × $NU)", uR"(\p{Line_Break=Infix_Numeric})", u'×', uR"(\p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($NU ( $SY | $IS )* × $NU)", uR"(\p{Line_Break=Numeric} ( \p{Line_Break=Break_Symbols} | \p{Line_Break=Infix_Numeric} )*)", u'×', uR"(\p{Line_Break=Numeric})")); + rules.push_back(std::make_unique(uR"($JL × $JL | $JV | $H2 | $H3)", uR"(\p{Line_Break=JL})", u'×', uR"(\p{Line_Break=JL} | \p{Line_Break=JV} | \p{Line_Break=H2} | \p{Line_Break=H3})")); + rules.push_back(std::make_unique(uR"($JV | $H2 × $JV | $JT)", uR"(\p{Line_Break=JV} | \p{Line_Break=H2})", u'×', uR"(\p{Line_Break=JV} | \p{Line_Break=JT})")); + rules.push_back(std::make_unique(uR"($JT | $H3 × $JT)", uR"(\p{Line_Break=JT} | \p{Line_Break=H3})", u'×', uR"(\p{Line_Break=JT})")); + rules.push_back(std::make_unique(uR"($JL | $JV | $JT | $H2 | $H3 × $PO)", uR"(\p{Line_Break=JL} | \p{Line_Break=JV} | \p{Line_Break=JT} | \p{Line_Break=H2} | \p{Line_Break=H3})", u'×', uR"(\p{Line_Break=Postfix_Numeric})")); + rules.push_back(std::make_unique(uR"($PR × $JL | $JV | $JT | $H2 | $H3)", uR"(\p{Line_Break=Prefix_Numeric})", u'×', uR"(\p{Line_Break=JL} | \p{Line_Break=JV} | \p{Line_Break=JT} | \p{Line_Break=H2} | \p{Line_Break=H3})")); + rules.push_back(std::make_unique(uR"(($AL | $HL) × ($AL | $HL))", uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL}))", u'×', uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL}))")); + rules.push_back(std::make_unique(uR"($AP × ($AK | $DottedCircle | $AS))", uR"(\p{Line_Break=Aksara_Prebase})", u'×', uR"((\p{Line_Break=Aksara} | [◌] | \p{Line_Break=Aksara_Start}))")); + rules.push_back(std::make_unique(uR"(($AK | $DottedCircle | $AS) × ($VF | $VI))", uR"((\p{Line_Break=Aksara} | [◌] | \p{Line_Break=Aksara_Start}))", u'×', uR"((\p{Line_Break=Virama_Final} | \p{Line_Break=Virama}))")); + rules.push_back(std::make_unique(uR"(($AK | $DottedCircle | $AS) $VI × ($AK | $DottedCircle))", uR"((\p{Line_Break=Aksara} | [◌] | \p{Line_Break=Aksara_Start}) \p{Line_Break=Virama})", u'×', uR"((\p{Line_Break=Aksara} | [◌]))")); + rules.push_back(std::make_unique(uR"(($AK | $DottedCircle | $AS) × ($AK | $DottedCircle | $AS) $VF)", uR"((\p{Line_Break=Aksara} | [◌] | \p{Line_Break=Aksara_Start}))", u'×', uR"((\p{Line_Break=Aksara} | [◌] | \p{Line_Break=Aksara_Start}) \p{Line_Break=Virama_Final})")); + rules.push_back(std::make_unique(uR"($IS × ($AL | $HL))", uR"(\p{Line_Break=Infix_Numeric})", u'×', uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL}))")); + rules.push_back(std::make_unique(uR"(($AL | $HL | $NU) × $OPmEastAsian)", uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL} | \p{Line_Break=Numeric}))", u'×', uR"([\p{Line_Break=Open_Punctuation}--[\p{ea=F}\p{ea=W}\p{ea=H}]])")); + rules.push_back(std::make_unique(uR"($CPmEastAsian × ($AL | $HL | $NU))", uR"([\p{Line_Break=CP}--[\p{ea=F}\p{ea=W}\p{ea=H}]])", u'×', uR"(([\p{Line_Break=Ambiguous} \p{Line_Break=Alphabetic} \p{Line_Break=Surrogate} \p{Line_Break=Unknown} [\p{Line_Break=Complex_Context}--\p{gc=Mn}--\p{gc=Mc}]] | \p{Line_Break=HL} | \p{Line_Break=Numeric}))")); + rules.push_back(std::make_unique(uR"($sot ($RI $RI)* $RI × $RI)", uR"(^ (\p{Line_Break=Regional_Indicator} \p{Line_Break=Regional_Indicator})* \p{Line_Break=Regional_Indicator})", u'×', uR"(\p{Line_Break=Regional_Indicator})")); + rules.push_back(std::make_unique(uR"([^$RI] ($RI $RI)* $RI × $RI)", uR"([^\p{Line_Break=Regional_Indicator}] (\p{Line_Break=Regional_Indicator} \p{Line_Break=Regional_Indicator})* \p{Line_Break=Regional_Indicator})", u'×', uR"(\p{Line_Break=Regional_Indicator})")); + rules.push_back(std::make_unique(uR"($RI ÷ $RI)", uR"(\p{Line_Break=Regional_Indicator})", u'÷', uR"(\p{Line_Break=Regional_Indicator})")); + rules.push_back(std::make_unique(uR"($EB × $EM)", uR"(\p{Line_Break=E_Base})", u'×', uR"(\p{Line_Break=E_Modifier})")); + rules.push_back(std::make_unique(uR"($ExtPictUnassigned × $EM)", uR"([\p{Extended_Pictographic}&&\p{gc=Cn}])", u'×', uR"(\p{Line_Break=E_Modifier})")); + // --- End of generated code. --- + + + + // TODO(egg): This could just as well be part of the rules… + rules.push_back(std::make_unique(uR"(ALL ÷ / ÷ ALL)", + uR"()", u'÷', + uR"()")); + + const UnicodeSet lbSA(uR"(\p{lb=SA})", status); + for (auto it = partition.begin(); it != partition.end();) { + if (lbSA.containsAll(it->second)) { + it = partition.erase(it); + } else { + ++it; } - partition.emplace_back(lbValueShortName, UnicodeSet((R"(\p{lb=)" + lbValueShortName + "}").c_str(), status)); } - for (const auto &[name, refinementSet] : interestingSets) { - for (auto it = partition.begin(); it != partition.end();) { - const UnicodeSet& set = it->second; - const UnicodeSet intersection = UnicodeSet(set).retainAll(refinementSet); - const UnicodeSet complement = UnicodeSet(set).removeAll(refinementSet); - if (!intersection.isEmpty() && !complement.isEmpty()) { - partition.emplace(it, it->first, complement); - partition.emplace(it, it->first + "&" + name, intersection); - it = partition.erase(it); - } else { - ++it; - } - } - }; for (const auto &[name, set] : partition) { sets.push_back(set); classNames.push_back(name); @@ -2848,768 +3136,42 @@ RBBILineMonkey::RBBILineMonkey() : } - void RBBILineMonkey::setText(const UnicodeString &s) { fText = &s; fCharBI->setText(s); prepareAppliedRules(s.length()); -} - -// -// rule9Adjust -// Line Break TR rules 9 and 10 implementation. -// This deals with combining marks and other sequences that -// that must be treated as if they were something other than what they actually are. -// -// This is factored out into a separate function because it must be applied twice for -// each potential break, once to the chars before the position being checked, then -// again to the text following the possible break. -// -void RBBILineMonkey::rule9Adjust(int32_t pos, UChar32 *posChar, int32_t *nextPos, UChar32 *nextChar) { - if (pos == -1) { - // Invalid initial position. Happens during the warmup iteration of the - // main loop in next(). - return; + UnicodeString remapped = s; + resolved.clear(); + resolved.reserve(s.length() + 1); + for (int i = 0; i < s.length() + 1; ++i) { + resolved.emplace_back(i); } - - int32_t nPos = *nextPos; - - // LB 9 Keep combining sequences together. - // advance over any CM class chars. Note that Line Break CM is different - // from the normal Grapheme Extend property. - if (!(fSP->contains(*posChar) || fBK->contains(*posChar) || *posChar==0x0d || - *posChar==0x0a ||fNL->contains(*posChar) || fZW->contains(*posChar))) { - for (;;) { - *nextChar = fText->char32At(nPos); - if (!fCM->contains(*nextChar)) { - break; + for (const auto& rule : rules) { + rule->apply(remapped, resolved); + } + for (std::size_t i = 0; i < resolved.size(); ++i) { + if (resolved[i].appliedRule == nullptr) { + printf("Failed to resolve at %zu between U+%04X and U+%04X ", i, s.char32At(i-1), s.char32At(i)); + if (resolved[i].indexInRemapped.has_value()) { + printf("which is remapped %d between U+%04X and U+%04X", *resolved[i].indexInRemapped, + remapped.char32At(*resolved[i].indexInRemapped - 1), + remapped.char32At(*resolved[i].indexInRemapped)); } - nPos = fText->moveIndex32(nPos, 1); + std::terminate(); + } else { + setAppliedRule(i, resolved[i].appliedRule->name().c_str()); } } - - - // LB 9 Treat X CM* as if it were x. - // No explicit action required. - - // LB 10 Treat any remaining combining mark as lb=AL, ea=Na. - if (fCM->contains(*posChar)) { - *posChar = u'A'; - } - - // Push the updated nextPos and nextChar back to our caller. - // This only makes a difference if posChar got bigger by consuming a - // combining sequence. - *nextPos = nPos; - *nextChar = fText->char32At(nPos); } - - int32_t RBBILineMonkey::next(int32_t startPos) { - int32_t pos; // Index of the char following a potential break position - UChar32 thisChar; // Character at above position "pos" - - int32_t prevPos; // Index of the char preceding a potential break position - UChar32 prevChar; // Character at above position. Note that prevChar - // and thisChar may not be adjacent because combining - // characters between them will be ignored. - - int32_t prevPosX2; // Second previous character. Wider context for LB21a. - UChar32 prevCharX2; - - int32_t nextPos; // Index of the next character following pos. - // Usually skips over combining marks. - int32_t nextCPPos; // Index of the code point following "pos." - // May point to a combining mark. - int32_t tPos; // temp value. - UChar32 c; - - if (U_FAILURE(deferredStatus)) { - return -1; + for (std::size_t i = startPos + 1; i < resolved.size(); ++i) { + if (resolved[i].appliedRule != nullptr && + resolved[i].appliedRule->resolution() == SegmentationRule::BREAK) { + return i; + } } - - if (startPos >= fText->length()) { - return -1; - } - - - // Initial values for loop. Loop will run the first time without finding breaks, - // while the invalid values shift out and the "this" and - // "prev" positions are filled in with good values. - pos = prevPos = prevPosX2 = -1; // Invalid value, serves as flag for initial loop iteration. - thisChar = prevChar = prevCharX2 = 0; - nextPos = nextCPPos = startPos; - - - // Loop runs once per position in the test text, until a break position - // is found. - for (;;) { - prevPosX2 = prevPos; - prevCharX2 = prevChar; - - prevPos = pos; - prevChar = thisChar; - - pos = nextPos; - thisChar = fText->char32At(pos); - - nextCPPos = fText->moveIndex32(pos, 1); - nextPos = nextCPPos; - - - if (pos >= fText->length()) { - setAppliedRule(pos, "LB2 - Break at end of text."); - break; - } - - - // We do this one out-of-order because the adjustment does not change anything - // that would match rules LB 3 - LB 6, but after the adjustment, LB 3-6 do need to - // be applied. - rule9Adjust(prevPos, &prevChar, &pos, &thisChar); - nextCPPos = nextPos = fText->moveIndex32(pos, 1); - c = fText->char32At(nextPos); - rule9Adjust(pos, &thisChar, &nextPos, &c); - - // If the loop is still warming up - if we haven't shifted the initial - // -1 positions out of prevPos yet - loop back to advance the - // position in the input without any further looking for breaks. - if (prevPos == -1) { - setAppliedRule(pos, "LB 9 - adjust for combining sequences."); - continue; - } - - - if (fBK->contains(prevChar)) { - setAppliedRule(pos, "LB 4 Always break after hard line breaks"); - break; - } - - - if (prevChar == 0x0d && thisChar == 0x0a) { - setAppliedRule(pos, "LB 5 Break after CR, LF, NL, but not inside CR LF"); - continue; - } - if (prevChar == 0x0d || - prevChar == 0x0a || - prevChar == 0x85) { - setAppliedRule(pos, "LB 5 Break after CR, LF, NL, but not inside CR LF"); - break; - } - - - if (thisChar == 0x0d || thisChar == 0x0a || thisChar == 0x85 || - fBK->contains(thisChar)) { - setAppliedRule(pos, "LB 6 Don't break before hard line breaks"); - continue; - } - - - if (fSP->contains(thisChar)) { - setAppliedRule(pos, "LB 7 Don't break before spaces or zero-width space."); - continue; - } - - // !!! ??? Is this the right text for the applied rule? - if (fZW->contains(thisChar)) { - setAppliedRule(pos, "LB 7 Don't break before spaces or zero-width space."); - continue; - } - - - // ZW SP* ÷ - // Scan backwards from prevChar for SP* ZW - tPos = prevPos; - while (tPos>0 && fSP->contains(fText->char32At(tPos))) { - tPos = fText->moveIndex32(tPos, -1); - } - if (fZW->contains(fText->char32At(tPos))) { - setAppliedRule(pos, "LB 8 Break after zero width space"); - break; - } - - - // The monkey test's way of ignoring combining characters doesn't work - // for this rule. ZJ is also a CM. Need to get the actual character - // preceding "thisChar", not ignoring combining marks, possibly ZJ. - { - int32_t prevIdx = fText->moveIndex32(pos, -1); - UChar32 prevC = fText->char32At(prevIdx); - if (fZWJ->contains(prevC)) { - setAppliedRule(pos, "LB 8a ZWJ x"); - continue; - } - } - - - // appliedRule: "LB 9, 10"; // Already done, at top of loop."; - // - - - // x WJ - // WJ x - // - if (fWJ->contains(thisChar) || fWJ->contains(prevChar)) { - setAppliedRule(pos, "LB 11 Do not break before or after WORD JOINER and related characters."); - continue; - } - - - if (fGL->contains(prevChar)) { - setAppliedRule(pos, "LB 12 GL x"); - continue; - } - - - if (!(fSP->contains(prevChar) || - fBA->contains(prevChar) || - fHY->contains(prevChar) ) && fGL->contains(thisChar)) { - setAppliedRule(pos, "LB 12a [^SP BA HY] x GL"); - continue; - } - - - if (fCL->contains(thisChar) || - fCP->contains(thisChar) || - fEX->contains(thisChar) || - fSY->contains(thisChar)) { - setAppliedRule(pos, "LB 13 Don't break before closings."); - continue; - } - - - // Scan backwards, checking for this sequence. - // The OP char could include combining marks, so we actually check for - // OP CM* SP* - // Another Twist: The Rule 9 fixes may have changed a SP CM - // sequence into a ID char, so before scanning back through spaces, - // verify that prevChar is indeed a space. The prevChar variable - // may differ from fText[prevPos] - tPos = prevPos; - if (fSP->contains(prevChar)) { - while (tPos > 0 && fSP->contains(fText->char32At(tPos))) { - tPos=fText->moveIndex32(tPos, -1); - } - } - while (tPos > 0 && fCM->contains(fText->char32At(tPos))) { - tPos=fText->moveIndex32(tPos, -1); - } - if (fOP->contains(fText->char32At(tPos))) { - setAppliedRule(pos, "LB 14 Don't break after OP SP*"); - continue; - } - - // Same as LB 14, scan backward for - // (sot | BK | CR | LF | NL | OP CM*| QU CM* | GL CM* | SP) [\p{Pi}&QU] CM* SP*. - tPos = prevPos; - // SP* (with the aforementioned Twist). - if (fSP->contains(prevChar)) { - while (tPos > 0 && fSP->contains(fText->char32At(tPos))) { - tPos = fText->moveIndex32(tPos, -1); - } - } - // CM*. - while (tPos > 0 && fCM->contains(fText->char32At(tPos))) { - tPos = fText->moveIndex32(tPos, -1); - } - // [\p{Pi}&QU]. - if (fPi->contains(fText->char32At(tPos)) && fQU->contains(fText->char32At(tPos))) { - if (tPos == 0) { - setAppliedRule(pos, "LB 15a sot [\\p{Pi}&QU] SP* x"); - continue; - } else { - tPos = fText->moveIndex32(tPos, -1); - if (fBK->contains(fText->char32At(tPos)) || fCR->contains(fText->char32At(tPos)) || - fLF->contains(fText->char32At(tPos)) || fNL->contains(fText->char32At(tPos)) || - fSP->contains(fText->char32At(tPos)) || fZW->contains(fText->char32At(tPos))) { - setAppliedRule(pos, "LB 15a (BK | CR | LF | NL | SP | ZW) [\\p{Pi}&QU] SP* x"); - continue; - } - } - // CM*. - while (tPos > 0 && fCM->contains(fText->char32At(tPos))) { - tPos = fText->moveIndex32(tPos, -1); - } - if (fOP->contains(fText->char32At(tPos)) || fQU->contains(fText->char32At(tPos)) || - fGL->contains(fText->char32At(tPos))) { - setAppliedRule(pos, "LB 15a (OP | QU | GL) [\\p{Pi}&QU] SP* x"); - continue; - } - } - - if (fPf->contains(thisChar) && fQU->contains(thisChar)) { - UChar32 nextChar = fText->char32At(nextPos); - if (nextPos == fText->length() || fSP->contains(nextChar) || fGL->contains(nextChar) || - fWJ->contains(nextChar) || fCL->contains(nextChar) || fQU->contains(nextChar) || - fCP->contains(nextChar) || fEX->contains(nextChar) || fIS->contains(nextChar) || - fSY->contains(nextChar) || fBK->contains(nextChar) || fCR->contains(nextChar) || - fLF->contains(nextChar) || fNL->contains(nextChar) || fZW->contains(nextChar)) { - setAppliedRule(pos, "LB 15b x [\\p{Pf}&QU] ( SP | GL | WJ | CL | QU | CP | EX | IS | SY " - "| BK | CR | LF | NL | ZW | eot)"); - continue; - } - } - - if (nextPos < fText->length()) { - // note: UnicodeString::char32At(length) returns ffff, not distinguishable - // from a legit ffff noncharacter. So test length separately. - UChar32 nextChar = fText->char32At(nextPos); - if (fSP->contains(prevChar) && fIS->contains(thisChar) && fNU->contains(nextChar)) { - setAppliedRule(pos, - "LB 15c Break before an IS that begins a number and follows a space"); - break; - } - } - - if (fIS->contains(thisChar)) { - setAppliedRule(pos, "LB 15d Do not break before numeric separators, even after spaces."); - continue; - } - - // Scan backwards for SP* CM* (CL | CP) - if (fNS->contains(thisChar)) { - int tPos = prevPos; - while (tPos>0 && fSP->contains(fText->char32At(tPos))) { - tPos = fText->moveIndex32(tPos, -1); - } - while (tPos>0 && fCM->contains(fText->char32At(tPos))) { - tPos = fText->moveIndex32(tPos, -1); - } - if (fCL->contains(fText->char32At(tPos)) || fCP->contains(fText->char32At(tPos))) { - setAppliedRule(pos, "LB 16 (CL | CP) SP* x NS"); - continue; - } - } - - - if (fB2->contains(thisChar)) { - // Scan backwards, checking for the B2 CM* SP* sequence. - tPos = prevPos; - if (fSP->contains(prevChar)) { - while (tPos > 0 && fSP->contains(fText->char32At(tPos))) { - tPos=fText->moveIndex32(tPos, -1); - } - } - while (tPos > 0 && fCM->contains(fText->char32At(tPos))) { - tPos=fText->moveIndex32(tPos, -1); - } - if (fB2->contains(fText->char32At(tPos))) { - setAppliedRule(pos, "LB 17 B2 SP* x B2"); - continue; - } - } - - - if (fSP->contains(prevChar)) { - setAppliedRule(pos, "LB 18 break after space"); - break; - } - - // LB 19 - // × [QU-\p{Pi}] - if (fQU->contains(thisChar) && !fPi->contains(thisChar)) { - setAppliedRule(pos, "LB 19 × [QU-\\p{Pi}]"); - continue; - } - - // [QU-\p{Pf}] × - if (fQU->contains(prevChar) && !fPf->contains(prevChar)) { - setAppliedRule(pos, "LB 19 [QU-\\p{Pf}] ×"); - continue; - } - - // LB 19a - // [^\p{ea=F}\p{ea=W}\p{ea=H}] × QU - if (!feaFWH->contains(prevChar) && fQU->contains(thisChar)) { - setAppliedRule(pos, "LB 19a [^\\p{ea=F}\\p{ea=W}\\p{ea=H}] × QU"); - continue; - } - // × QU ( [^\p{ea=F}\p{ea=W}\p{ea=H}] | eot ) - if (fQU->contains(thisChar)) { - if (nextPos < fText->length()) { - UChar32 nextChar = fText->char32At(nextPos); - if (!feaFWH->contains(nextChar)) { - setAppliedRule(pos, "LB 19a × QU [^\\p{ea=F}\\p{ea=W}\\p{ea=H}]"); - continue; - } - } else { - setAppliedRule(pos, "LB 19 × QU eot"); - continue; - } - } - // QU × [^\p{ea=F}\p{ea=W}\p{ea=H}] - if (fQU->contains(prevChar) && !feaFWH->contains(thisChar)) { - setAppliedRule(pos, "LB 19a QU × [^\\p{ea=F}\\p{ea=W}\\p{ea=H}]"); - continue; - } - // ( sot | [^\p{ea=F}\p{ea=W}\p{ea=H}] ) QU × - if (fQU->contains(prevChar)) { - if (prevPos == 0) { - setAppliedRule(pos, "LB 19a sot QU ×"); - continue; - } - // prevPosX2 is -1 if there was a break, and prevCharX2 is 0; but the UAX #14 rules can - // look through breaks. - int breakObliviousPrevPosX2 = fText->moveIndex32(prevPos, -1); - while (fCM->contains(fText->char32At(breakObliviousPrevPosX2))) { - if (breakObliviousPrevPosX2 == 0) { - break; - } - int beforeCM = fText->moveIndex32(breakObliviousPrevPosX2, -1); - if (fBK->contains(fText->char32At(beforeCM)) || - fCR->contains(fText->char32At(beforeCM)) || - fLF->contains(fText->char32At(beforeCM)) || - fNL->contains(fText->char32At(beforeCM)) || - fSP->contains(fText->char32At(beforeCM)) || - fZW->contains(fText->char32At(beforeCM))) { - break; - } - breakObliviousPrevPosX2 = beforeCM; - } - if (!feaFWH->contains(fText->char32At(breakObliviousPrevPosX2)) || - fCM->contains(fText->char32At(breakObliviousPrevPosX2))) { - setAppliedRule(pos, "LB 19a [^\\p{ea=F}\\p{ea=W}\\p{ea=H}] QU ×"); - continue; - } - } - - if (fCB->contains(thisChar) || fCB->contains(prevChar)) { - setAppliedRule(pos, "LB 20 Break around a CB"); - break; - } - - // Don't break between Hyphens and letters if a break or a space precedes the hyphen. - // Formerly this was a Finnish tailoring. - // (sot | BK | CR | LF | NL | SP | ZW | CB | GL) ( HY | [\u2010] ) × AL - if (fAL->contains(thisChar) && (fHY->contains(prevChar) || fHH->contains(prevChar))) { - // sot ( HY | [\u2010] ) × AL. - if (prevPos == 0) { - setAppliedRule(pos, "LB 20a"); - continue; - } - // prevPosX2 is -1 if there was a break; but the UAX #14 rules can - // look through breaks. - int breakObliviousPrevPosX2 = fText->moveIndex32(prevPos, -1); - if (fBK->contains(fText->char32At(breakObliviousPrevPosX2)) || - fCR->contains(fText->char32At(breakObliviousPrevPosX2)) || - fLF->contains(fText->char32At(breakObliviousPrevPosX2)) || - fNL->contains(fText->char32At(breakObliviousPrevPosX2)) || - fSP->contains(fText->char32At(breakObliviousPrevPosX2)) || - fGL->contains(fText->char32At(breakObliviousPrevPosX2)) || - fZW->contains(fText->char32At(breakObliviousPrevPosX2))) { - setAppliedRule(pos, "LB 20a"); - continue; - } - while (breakObliviousPrevPosX2 > 0 && - fCM->contains(fText->char32At(breakObliviousPrevPosX2))) { - breakObliviousPrevPosX2 = fText->moveIndex32(breakObliviousPrevPosX2, -1); - } - if (fCB->contains(fText->char32At(breakObliviousPrevPosX2))) { - setAppliedRule(pos, "LB 20a"); - continue; - } - } - - if (fBA->contains(thisChar) || - fHY->contains(thisChar) || - fNS->contains(thisChar) || - fBB->contains(prevChar) ) { - setAppliedRule(pos, "LB 21"); - continue; - } - - if (fHL->contains(prevCharX2) && - (fHY->contains(prevChar) || (fBA->contains(prevChar) && !feaFWH->contains(prevChar))) && - !fHL->contains(thisChar)) { - setAppliedRule(pos, "LB 21a HL (HY | BA) x [^HL]"); - continue; - } - - if (fSY->contains(prevChar) && fHL->contains(thisChar)) { - setAppliedRule(pos, "LB 21b SY x HL"); - continue; - } - - if (fIN->contains(thisChar)) { - setAppliedRule(pos, "LB 22"); - continue; - } - - - // (AL | HL) x NU - // NU x (AL | HL) - if ((fAL->contains(prevChar) || fHL->contains(prevChar)) && fNU->contains(thisChar)) { - setAppliedRule(pos, "LB 23"); - continue; - } - if (fNU->contains(prevChar) && (fAL->contains(thisChar) || fHL->contains(thisChar))) { - setAppliedRule(pos, "LB 23"); - continue; - } - - // Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes. - // PR x (ID | EB | EM) - // (ID | EB | EM) x PO - if (fPR->contains(prevChar) && - (fID->contains(thisChar) || fEB->contains(thisChar) || fEM->contains(thisChar))) { - setAppliedRule(pos, "LB 23a"); - continue; - } - if ((fID->contains(prevChar) || fEB->contains(prevChar) || fEM->contains(prevChar)) && - fPO->contains(thisChar)) { - setAppliedRule(pos, "LB 23a"); - continue; - } - - // Do not break between prefix and letters or ideographs. - // (PR | PO) x (AL | HL) - // (AL | HL) x (PR | PO) - if ((fPR->contains(prevChar) || fPO->contains(prevChar)) && - (fAL->contains(thisChar) || fHL->contains(thisChar))) { - setAppliedRule(pos, "LB 24 no break between prefix and letters or ideographs"); - continue; - } - if ((fAL->contains(prevChar) || fHL->contains(prevChar)) && - (fPR->contains(thisChar) || fPO->contains(thisChar))) { - setAppliedRule(pos, "LB 24 no break between prefix and letters or ideographs"); - continue; - } - - bool continueToNextPosition = false; - // LB 25. - for (const auto& [left, right] : { - std::pair{fCL, fPO}, // 1. NU (SY | IS)* CL × PO - std::pair{fCP, fPO}, // 2. NU (SY | IS)* CP × PO - std::pair{fCL, fPR}, // 3. NU (SY | IS)* CL × PR - std::pair{fCP, fPR}, // 4. NU (SY | IS)* CP × PR - }) { - if (left->contains(prevChar) && right->contains(thisChar)) { - // Check for the NU (SY | IS)* part. - bool leftHandSideMatches = false; - tPos = fText->moveIndex32(prevPos, -1); - for (;;) { - while (tPos > 0 && fCM->contains(fText->char32At(tPos))) { - tPos = fText->moveIndex32(tPos, -1); - } - const UChar32 tChar = fText->char32At(tPos); - if (fSY->contains(tChar) || fIS->contains(tChar)) { - if (tPos == 0) { - leftHandSideMatches = false; - break; - } - tPos = fText->moveIndex32(tPos, -1); - } else if (fNU->contains(tChar)) { - leftHandSideMatches = true; - break; - } else { - leftHandSideMatches = false; - break; - } - } - if (leftHandSideMatches) { - setAppliedRule(pos, "LB 25/1..4"); - continueToNextPosition = true; - break; - } - } - } - if (continueToNextPosition) { - continue; - } - // 5. NU (SY | IS)* × PO - // 6. NU (SY | IS)* × PR - // 13. NU (SY | IS)* × NU - bool leftHandSideMatches; - tPos = prevPos; - for (;;) { - while (tPos > 0 && fCM->contains(fText->char32At(tPos))) { - tPos = fText->moveIndex32(tPos, -1); - } - const UChar32 tChar = fText->char32At(tPos); - if (fSY->contains(tChar) || fIS->contains(tChar)) { - if (tPos == 0) { - leftHandSideMatches = false; - break; - } - tPos = fText->moveIndex32(tPos, -1); - } else if (fNU->contains(tChar)) { - leftHandSideMatches = true; - break; - } else { - leftHandSideMatches = false; - break; - } - } - if (leftHandSideMatches && - (fPO->contains(thisChar) || fPR->contains(thisChar) || fNU->contains(thisChar))) { - setAppliedRule(pos, "LB 25/5,6,13,14"); - continue; - } - if (nextPos < fText->length()) { - const UChar32 nextChar = fText->char32At(nextPos); - // 7. PO × OP NU - if (fPO->contains(prevChar) && fOP->contains(thisChar) && fNU->contains(nextChar)) { - setAppliedRule(pos, "LB 25/7"); - continue; - } - // 9. PR × OP NU - if (fPR->contains(prevChar) && fOP->contains(thisChar) && fNU->contains(nextChar)) { - setAppliedRule(pos, "LB 25/9"); - continue; - } - int nextPosX2 = fText->moveIndex32(nextPos, 1); - while (nextPosX2 < fText->length() && fCM->contains(fText->char32At(nextPosX2))) { - nextPosX2 = fText->moveIndex32(nextPosX2, 1); - } - - if (nextPosX2 < fText->length()) { - const UChar32 nextCharX2 = fText->char32At(nextPosX2); - // 7bis. PO × OP IS NU - if (fPO->contains(prevChar) && fOP->contains(thisChar) && fIS->contains(nextChar) && - fNU->contains(nextCharX2)) { - setAppliedRule(pos, "LB 25/7bis"); - continue; - } - // 9bis. PR × OP IS NU - if (fPR->contains(prevChar) && fOP->contains(thisChar) && fIS->contains(nextChar) && - fNU->contains(nextCharX2)) { - setAppliedRule(pos, "LB 25/9bis"); - continue; - } - } - } - for (const auto& [left, right] : { - std::pair{fPO, fNU}, // 8. PO × NU - std::pair{fPR, fNU}, // 10. PR × NU - std::pair{fHY, fNU}, // 11. HY × NU - std::pair{fIS, fNU}, // 12. IS × NU - }) { - if (left->contains(prevChar) && right->contains(thisChar)) { - continueToNextPosition = true; - break; - } - } - if (continueToNextPosition) { - continue; - } - - - if (fJL->contains(prevChar) && (fJL->contains(thisChar) || - fJV->contains(thisChar) || - fH2->contains(thisChar) || - fH3->contains(thisChar))) { - setAppliedRule(pos, "LB 26 Do not break a Korean syllable."); - continue; - } - - if ((fJV->contains(prevChar) || fH2->contains(prevChar)) && - (fJV->contains(thisChar) || fJT->contains(thisChar))) { - setAppliedRule(pos, "LB 26 Do not break a Korean syllable."); - continue; - } - - if ((fJT->contains(prevChar) || fH3->contains(prevChar)) && - fJT->contains(thisChar)) { - setAppliedRule(pos, "LB 26 Do not break a Korean syllable."); - continue; - } - - if ((fJL->contains(prevChar) || fJV->contains(prevChar) || - fJT->contains(prevChar) || fH2->contains(prevChar) || fH3->contains(prevChar)) && - fPO->contains(thisChar)) { - setAppliedRule(pos, "LB 27 Treat a Korean Syllable Block the same as ID."); - continue; - } - if (fPR->contains(prevChar) && (fJL->contains(thisChar) || fJV->contains(thisChar) || - fJT->contains(thisChar) || fH2->contains(thisChar) || fH3->contains(thisChar))) { - setAppliedRule(pos, "LB 27 Treat a Korean Syllable Block the same as ID."); - continue; - } - - - if ((fAL->contains(prevChar) || fHL->contains(prevChar)) && (fAL->contains(thisChar) || fHL->contains(thisChar))) { - setAppliedRule(pos, "LB 28 Do not break between alphabetics (\"at\")."); - continue; - } - - if (fAP->contains(prevChar) && - (fAK->contains(thisChar) || thisChar == U'◌' || fAS->contains(thisChar))) { - setAppliedRule(pos, "LB 28a.1 AP x (AK | ◌ | AS)"); - continue; - } - - if ((fAK->contains(prevChar) || prevChar == U'◌' || fAS->contains(prevChar)) && - (fVF->contains(thisChar) || fVI->contains(thisChar))) { - setAppliedRule(pos, "LB 28a.2 (AK | ◌ | AS) x (VF | VI)"); - continue; - } - - if ((fAK->contains(prevCharX2) || prevCharX2 == U'◌' || fAS->contains(prevCharX2)) && - fVI->contains(prevChar) && - (fAK->contains(thisChar) || thisChar == U'◌')) { - setAppliedRule(pos, "LB 28a.3 (AK | ◌ | AS) VI x (AK | ◌)"); - continue; - } - - if (nextPos < fText->length()) { - // note: UnicodeString::char32At(length) returns ffff, not distinguishable - // from a legit ffff noncharacter. So test length separately. - UChar32 nextChar = fText->char32At(nextPos); - if ((fAK->contains(prevChar) || prevChar == U'◌' || fAS->contains(prevChar)) && - (fAK->contains(thisChar) || thisChar == U'◌' || fAS->contains(thisChar)) && - fVF->contains(nextChar)) { - setAppliedRule(pos, "LB 28a.4 (AK | ◌ | AS) x (AK | ◌ | AS) VF"); - continue; - } - } - - if (fIS->contains(prevChar) && (fAL->contains(thisChar) || fHL->contains(thisChar))) { - setAppliedRule(pos, "LB 29 Do not break between numeric punctuation and alphabetics (\"e.g.\")."); - continue; - } - - // (AL | NU) x OP - // CP x (AL | NU) - if ((fAL->contains(prevChar) || fHL->contains(prevChar) || fNU->contains(prevChar)) && fOP30->contains(thisChar)) { - setAppliedRule(pos, "LB 30 No break in letters, numbers, or ordinary symbols, opening/closing punctuation."); - continue; - } - if (fCP30->contains(prevChar) && (fAL->contains(thisChar) || fHL->contains(thisChar) || fNU->contains(thisChar))) { - setAppliedRule(pos, "LB 30 No break in letters, numbers, or ordinary symbols, opening/closing punctuation."); - continue; - } - - // RI x RI - if (fRI->contains(prevCharX2) && fRI->contains(prevChar) && fRI->contains(thisChar)) { - setAppliedRule(pos, "LB30a RI RI : RI"); - break; - } - if (fRI->contains(prevChar) && fRI->contains(thisChar)) { - // Two Regional Indicators have been paired. - // Over-write the trailing one (thisChar) to prevent it from forming another pair with a - // following RI. This is a hack. - thisChar = -1; - setAppliedRule(pos, "LB30a RI RI : RI"); - continue; - } - - // LB30b Do not break between an emoji base (or potential emoji) and an emoji modifier. - if (fEB->contains(prevChar) && fEM->contains(thisChar)) { - setAppliedRule(pos, "LB30b Emoji Base x Emoji Modifier"); - continue; - } - - if (fExtPictUnassigned->contains(prevChar) && fEM->contains(thisChar)) { - setAppliedRule(pos, "LB30b [\\p{Extended_Pictographic}&\\p{Cn}] x EM"); - continue; - } - - setAppliedRule(pos, "LB 31 Break everywhere else"); - break; - } - - return pos; + return -1; } @@ -3619,60 +3181,13 @@ const std::vector& RBBILineMonkey::charClasses() { RBBILineMonkey::~RBBILineMonkey() { - delete fBK; - delete fCR; - delete fLF; - delete fCM; - delete fNL; - delete fWJ; - delete fZW; - delete fGL; - delete fCB; - delete fSP; - delete fB2; - delete fBA; - delete fBB; - delete fHH; - delete fHY; - delete fH2; - delete fH3; - delete fCL; - delete fCP; - delete fEX; - delete fIN; - delete fJL; - delete fJV; - delete fJT; - delete fNS; - delete fOP; - delete fQU; - delete fIS; - delete fNU; - delete fPO; - delete fPR; - delete fSY; - delete fAI; - delete fAL; - delete fCJ; - delete fHL; - delete fID; - delete fRI; - delete fSG; - delete fXX; - delete fEB; - delete fEM; - delete fZWJ; - delete fOP30; - delete fCP30; - delete fExtPictUnassigned; - delete fAK; - delete fAP; - delete fAS; - delete fVF; - delete fVI; - delete fPi; - delete fPf; - delete feaFWH; + constexpr bool debuggingOldMonkeyPerformance = false; + if (debuggingOldMonkeyPerformance) { + for (auto const &rule : rules) { + puts((rule->name() + " : " + std::to_string(rule->timeSpent() / std::chrono::milliseconds(1)) + + " ms").c_str()); + } + } delete fCharBI; } diff --git a/icu4c/source/test/intltest/usetheaderonlytest.cpp b/icu4c/source/test/intltest/usetheaderonlytest.cpp new file mode 100644 index 00000000000..49fe420a418 --- /dev/null +++ b/icu4c/source/test/intltest/usetheaderonlytest.cpp @@ -0,0 +1,224 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// usetheaderonlytest.cpp +// created: 2024dec11 Markus W. Scherer + +#include +#include + +// Test header-only ICU C++ APIs. Do not use other ICU C++ APIs. +// Non-default configuration: +#define U_SHOW_CPLUSPLUS_API 0 +// Default configuration: +// #define U_SHOW_CPLUSPLUS_HEADER_API 1 + +#include "unicode/utypes.h" +#include "unicode/uset.h" +#include "unicode/utf.h" +#include "unicode/utf16.h" +#include "intltest.h" + +class USetHeaderOnlyTest : public IntlTest { +public: + USetHeaderOnlyTest() = default; + + void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=nullptr) override; + + void TestUSetCodePointIterator(); + void TestUSetRangeIterator(); + void TestUSetStringIterator(); + void TestUSetElementIterator(); +}; + +extern IntlTest *createUSetHeaderOnlyTest() { + return new USetHeaderOnlyTest(); +} + +void USetHeaderOnlyTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) { + if(exec) { + logln("TestSuite USetHeaderOnlyTest: "); + } + TESTCASE_AUTO_BEGIN; + TESTCASE_AUTO(TestUSetCodePointIterator); + TESTCASE_AUTO(TestUSetRangeIterator); + TESTCASE_AUTO(TestUSetStringIterator); + TESTCASE_AUTO(TestUSetElementIterator); + TESTCASE_AUTO_END; +} + +std::u16string cpString(UChar32 c) { + if (U_IS_BMP(c)) { + return {static_cast(c)}; + } else { + return {U16_LEAD(c), U16_TRAIL(c)}; + } +} + +void USetHeaderOnlyTest::TestUSetCodePointIterator() { + IcuTestErrorCode errorCode(*this, "TestUSetCodePointIterator"); + using U_HEADER_NESTED_NAMESPACE::USetCodePoints; + std::unique_ptr uset( + uset_openPattern(u"[abcçカ🚴]", -1, errorCode), &uset_close); + std::u16string result; + for (UChar32 c : USetCodePoints(uset.get())) { + // Commented-out sample code for pasting into the API docs. + // printf("uset.codePoint U+%04lx\n", (long)c); + result.append(u" ").append(cpString(c)); + } + assertEquals(WHERE, u" a b c ç カ 🚴", result); + + USetCodePoints range1(uset.get()); + auto range2(range1); // copy constructor + auto iter = range1.begin(); + auto limit = range2.end(); + // operator* with pre- and post-increment + assertEquals(WHERE, u'a', *iter); + ++iter; + assertEquals(WHERE, u'b', *iter); + assertEquals(WHERE, u'c', *++iter); + auto iter2(iter); // copy constructor + assertEquals(WHERE, u'c', *iter2++); + assertEquals(WHERE, u'ç', *iter2++); + assertEquals(WHERE, u'カ', *iter2); + assertTrue(WHERE, ++iter2 != limit); + auto iter3(iter2++); + assertEquals(WHERE, U'🚴', *iter3); + assertTrue(WHERE, iter2 == limit); +} + +void USetHeaderOnlyTest::TestUSetRangeIterator() { + IcuTestErrorCode errorCode(*this, "TestUSetRangeIterator"); + using U_HEADER_NESTED_NAMESPACE::USetRanges; + using U_HEADER_NESTED_NAMESPACE::CodePointRange; + std::unique_ptr uset( + uset_openPattern(u"[abcçカ🚴]", -1, errorCode), &uset_close); + std::u16string result; + for (auto [start, end] : USetRanges(uset.get())) { + // Commented-out sample code for pasting into the API docs. + // printf("uset.range U+%04lx..U+%04lx\n", (long)start, (long)end); + result.append(u" ").append(cpString(start)).append(u"-").append(cpString(end)); + } + assertEquals(WHERE, u" a-c ç-ç カ-カ 🚴-🚴", result); + result.clear(); + for (auto range : USetRanges(uset.get())) { + for (UChar32 c : range) { + // Commented-out sample code for pasting into the API docs. + // printf("uset.range.c U+%04lx\n", (long)c); + result.append(u" ").append(cpString(c)); + } + result.append(u" |"); + } + assertEquals(WHERE, u" a b c | ç | カ | 🚴 |", result); + + USetRanges range1(uset.get()); + auto range2(range1); // copy constructor + auto iter = range1.begin(); + auto limit = range2.end(); + // operator* with pre- and post-increment + { + auto cpRange = *iter; + assertEquals(WHERE, u'a', cpRange.rangeStart); + assertEquals(WHERE, u'c', cpRange.rangeEnd); + assertEquals(WHERE, 3, cpRange.size()); + auto cpRange2(cpRange); + auto cpIter = cpRange.begin(); + auto cpLimit = cpRange2.end(); + assertEquals(WHERE, u'a', *cpIter++); + assertEquals(WHERE, u'b', *cpIter); + assertTrue(WHERE, cpIter != cpLimit); + CodePointRange::iterator cpIter2(u'b'); // public constructor + assertTrue(WHERE, cpIter == cpIter2); + assertEquals(WHERE, u'c', *++cpIter); + assertTrue(WHERE, cpIter != cpIter2); + assertTrue(WHERE, ++cpIter == cpLimit); + } + ++iter; + auto iter2(iter); // copy constructor + assertEquals(WHERE, u'ç', (*iter2).rangeStart); + assertEquals(WHERE, u'ç', (*iter2).rangeEnd); + assertEquals(WHERE, 1, (*iter2).size()); + assertEquals(WHERE, u'ç', (*iter2++).rangeStart); + assertEquals(WHERE, u'カ', (*iter2).rangeStart); + assertTrue(WHERE, ++iter2 != limit); + auto iter3(iter2++); + assertEquals(WHERE, U'🚴', (*iter3).rangeStart); + assertTrue(WHERE, iter2 == limit); + + { + CodePointRange cpRange(u'h', u'k'); // public constructor + // FYI: currently no operator== + assertEquals(WHERE, u'h', cpRange.rangeStart); + assertEquals(WHERE, u'k', cpRange.rangeEnd); + assertEquals(WHERE, 4, cpRange.size()); + assertEquals(WHERE, u'i', *++(cpRange.begin())); + } +} + +void USetHeaderOnlyTest::TestUSetStringIterator() { + IcuTestErrorCode errorCode(*this, "TestUSetStringIterator"); + using U_HEADER_NESTED_NAMESPACE::USetStrings; + std::unique_ptr uset( + uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode), &uset_close); + std::u16string result; + for (auto s : USetStrings(uset.get())) { + // Commented-out sample code for pasting into the API docs. + // Needs U_SHOW_CPLUSPLUS_API=1 for UnicodeString. + // UnicodeString us(s); + // std::string u8; + // printf("uset.string length %ld \"%s\"\n", (long)s.length(), us.toUTF8String(u8).c_str()); + result.append(u" \"").append(s).append(u"\""); + } + assertEquals(WHERE, uR"( "" "abc" "de")", result); + + USetStrings range1(uset.get()); + auto range2(range1); // copy constructor + auto iter = range1.begin(); + auto limit = range2.end(); + // operator* with pre- and post-increment + assertEquals(WHERE, u"", *iter); + assertEquals(WHERE, u"abc", *++iter); + auto iter2(iter); // copy constructor + assertEquals(WHERE, u"abc", *iter2++); + assertTrue(WHERE, iter2 != limit); + auto iter3(iter2++); + assertEquals(WHERE, u"de", *iter3); + assertTrue(WHERE, iter2 == limit); +} + +void USetHeaderOnlyTest::TestUSetElementIterator() { + IcuTestErrorCode errorCode(*this, "TestUSetElementIterator"); + using U_HEADER_NESTED_NAMESPACE::USetElements; + std::unique_ptr uset( + uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode), &uset_close); + std::u16string result; + for (auto el : USetElements(uset.get())) { + // Commented-out sample code for pasting into the API docs. + // Needs U_SHOW_CPLUSPLUS_API=1 for UnicodeString. + // UnicodeString us(el); + // std::string u8; + // printf("uset.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); + result.append(u" \"").append(el).append(u"\""); + } + assertEquals(WHERE, uR"( "a" "b" "c" "ç" "カ" "🚴" "" "abc" "de")", result); + + USetElements range1(uset.get()); + auto range2(range1); // copy constructor + auto iter = range1.begin(); + auto limit = range2.end(); + // operator* with pre- and post-increment + assertEquals(WHERE, u"a", *iter); + ++iter; + assertEquals(WHERE, u"b", *iter); + assertEquals(WHERE, u"c", *++iter); + auto iter2(iter); // copy constructor + assertEquals(WHERE, u"c", *iter2++); + // skip çカ🚴 + ++++++iter2; + assertEquals(WHERE, u"", *iter2++); + assertEquals(WHERE, u"abc", *iter2); + assertTrue(WHERE, ++iter2 != limit); + auto iter3(iter2++); + assertEquals(WHERE, u"de", *iter3); + assertTrue(WHERE, iter2 == limit); +} diff --git a/icu4c/source/test/intltest/usettest.cpp b/icu4c/source/test/intltest/usettest.cpp index a53e813ad2f..9da0612b148 100644 --- a/icu4c/source/test/intltest/usettest.cpp +++ b/icu4c/source/test/intltest/usettest.cpp @@ -107,13 +107,9 @@ UnicodeSetTest::runIndexedTest(int32_t index, UBool exec, TESTCASE_AUTO(TestSkipToStrings); TESTCASE_AUTO(TestPatternCodePointComplement); TESTCASE_AUTO(TestCodePointIterator); - TESTCASE_AUTO(TestUSetCodePointIterator); TESTCASE_AUTO(TestRangeIterator); - TESTCASE_AUTO(TestUSetRangeIterator); TESTCASE_AUTO(TestStringIterator); - TESTCASE_AUTO(TestUSetStringIterator); TESTCASE_AUTO(TestElementIterator); - TESTCASE_AUTO(TestUSetElementIterator); TESTCASE_AUTO_END; } @@ -4280,37 +4276,8 @@ void UnicodeSetTest::TestCodePointIterator() { } assertEquals(WHERE, u" a b c ç カ 🚴", result); - // codePoints() returns USetCodePoints for which explicit APIs are tested via USet. -} - -void UnicodeSetTest::TestUSetCodePointIterator() { - IcuTestErrorCode errorCode(*this, "TestUSetCodePointIterator"); - using U_HEADER_NESTED_NAMESPACE::USetCodePoints; - LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴]", -1, errorCode)); - UnicodeString result; - for (UChar32 c : USetCodePoints(uset.getAlias())) { - // printf("uset.codePoint U+%04lx\n", (long)c); - result.append(u' ').append(c); - } - assertEquals(WHERE, u" a b c ç カ 🚴", result); - - USetCodePoints range1(uset.getAlias()); - auto range2(range1); // copy constructor - auto iter = range1.begin(); - auto limit = range2.end(); - // operator* with pre- and post-increment - assertEquals(WHERE, u'a', *iter); - ++iter; - assertEquals(WHERE, u'b', *iter); - assertEquals(WHERE, u'c', *++iter); - auto iter2(iter); // copy constructor - assertEquals(WHERE, u'c', *iter2++); - assertEquals(WHERE, u'ç', *iter2++); - assertEquals(WHERE, u'カ', *iter2); - assertTrue(WHERE, ++iter2 != limit); - auto iter3(iter2++); - assertEquals(WHERE, U'🚴', *iter3); - assertTrue(WHERE, iter2 == limit); + // codePoints() returns USetCodePoints for which explicit APIs are tested via USet + // in a header-only unit test file. } void UnicodeSetTest::TestRangeIterator() { @@ -4332,72 +4299,8 @@ void UnicodeSetTest::TestRangeIterator() { } assertEquals(WHERE, u" a b c | ç | カ | 🚴 |", result); - // ranges() returns USetRanges for which explicit APIs are tested via USet. -} - -void UnicodeSetTest::TestUSetRangeIterator() { - IcuTestErrorCode errorCode(*this, "TestUSetRangeIterator"); - using U_HEADER_NESTED_NAMESPACE::USetRanges; - using U_HEADER_NESTED_NAMESPACE::CodePointRange; - LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴]", -1, errorCode)); - UnicodeString result; - for (auto [start, end] : USetRanges(uset.getAlias())) { - // printf("uset.range U+%04lx..U+%04lx\n", (long)start, (long)end); - result.append(u' ').append(start).append(u'-').append(end); - } - assertEquals(WHERE, u" a-c ç-ç カ-カ 🚴-🚴", result); - result.remove(); - for (auto range : USetRanges(uset.getAlias())) { - for (UChar32 c : range) { - // printf("uset.range.c U+%04lx\n", (long)c); - result.append(u' ').append(c); - } - result.append(u" |"); - } - assertEquals(WHERE, u" a b c | ç | カ | 🚴 |", result); - - USetRanges range1(uset.getAlias()); - auto range2(range1); // copy constructor - auto iter = range1.begin(); - auto limit = range2.end(); - // operator* with pre- and post-increment - { - auto cpRange = *iter; - assertEquals(WHERE, u'a', cpRange.rangeStart); - assertEquals(WHERE, u'c', cpRange.rangeEnd); - assertEquals(WHERE, 3, cpRange.size()); - auto cpRange2(cpRange); - auto cpIter = cpRange.begin(); - auto cpLimit = cpRange2.end(); - assertEquals(WHERE, u'a', *cpIter++); - assertEquals(WHERE, u'b', *cpIter); - assertTrue(WHERE, cpIter != cpLimit); - CodePointRange::iterator cpIter2(u'b'); // public constructor - assertTrue(WHERE, cpIter == cpIter2); - assertEquals(WHERE, u'c', *++cpIter); - assertTrue(WHERE, cpIter != cpIter2); - assertTrue(WHERE, ++cpIter == cpLimit); - } - ++iter; - auto iter2(iter); // copy constructor - assertEquals(WHERE, u'ç', (*iter2).rangeStart); - assertEquals(WHERE, u'ç', (*iter2).rangeEnd); - assertEquals(WHERE, 1, (*iter2).size()); - assertEquals(WHERE, u'ç', (*iter2++).rangeStart); - assertEquals(WHERE, u'カ', (*iter2).rangeStart); - assertTrue(WHERE, ++iter2 != limit); - auto iter3(iter2++); - assertEquals(WHERE, U'🚴', (*iter3).rangeStart); - assertTrue(WHERE, iter2 == limit); - - { - CodePointRange cpRange(u'h', u'k'); // public constructor - // FYI: currently no operator== - assertEquals(WHERE, u'h', cpRange.rangeStart); - assertEquals(WHERE, u'k', cpRange.rangeEnd); - assertEquals(WHERE, 4, cpRange.size()); - assertEquals(WHERE, u'i', *++(cpRange.begin())); - } + // ranges() returns USetRanges for which explicit APIs are tested via USet + // in a header-only unit test file. } void UnicodeSetTest::TestStringIterator() { @@ -4412,35 +4315,8 @@ void UnicodeSetTest::TestStringIterator() { } assertEquals(WHERE, uR"( "" "abc" "de")", result); - // strings() returns USetStrins for which explicit APIs are tested via USet. -} - -void UnicodeSetTest::TestUSetStringIterator() { - IcuTestErrorCode errorCode(*this, "TestUSetStringIterator"); - using U_HEADER_NESTED_NAMESPACE::USetStrings; - LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode)); - UnicodeString result; - for (auto s : USetStrings(uset.getAlias())) { - // UnicodeString us(s); - // std::string u8; - // printf("uset.string length %ld \"%s\"\n", (long)s.length(), us.toUTF8String(u8).c_str()); - result.append(u" \"").append(s).append(u'"'); - } - assertEquals(WHERE, uR"( "" "abc" "de")", result); - - USetStrings range1(uset.getAlias()); - auto range2(range1); // copy constructor - auto iter = range1.begin(); - auto limit = range2.end(); - // operator* with pre- and post-increment - assertEquals(WHERE, UnicodeString(), UnicodeString(*iter)); - assertEquals(WHERE, u"abc", UnicodeString(*++iter)); - auto iter2(iter); // copy constructor - assertEquals(WHERE, u"abc", UnicodeString(*iter2++)); - assertTrue(WHERE, iter2 != limit); - auto iter3(iter2++); - assertEquals(WHERE, u"de", UnicodeString(*iter3)); - assertTrue(WHERE, iter2 == limit); + // strings() returns USetStrins for which explicit APIs are tested via USet + // in a header-only unit test file. } void UnicodeSetTest::TestElementIterator() { @@ -4448,44 +4324,13 @@ void UnicodeSetTest::TestElementIterator() { UnicodeSet set(u"[abcçカ🚴{}{abc}{de}]", errorCode); UnicodeString result; for (auto el : set) { + // UnicodeString us(el); // std::string u8; - // printf("set.string length %ld \"%s\"\n", (long)el.length(), el.toUTF8String(u8).c_str()); + // printf("set.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); result.append(u" \"").append(el).append(u'"'); } assertEquals(WHERE, uR"( "a" "b" "c" "ç" "カ" "🚴" "" "abc" "de")", result); - // begin() & end() return USetElementIterator for which explicit APIs are tested via USet. -} - -void UnicodeSetTest::TestUSetElementIterator() { - IcuTestErrorCode errorCode(*this, "TestUSetElementIterator"); - using U_HEADER_NESTED_NAMESPACE::USetElements; - LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, errorCode)); - UnicodeString result; - for (auto el : USetElements(uset.getAlias())) { - // std::string u8; - // printf("uset.string length %ld \"%s\"\n", (long)el.length(), el.toUTF8String(u8).c_str()); - result.append(u" \"").append(el).append(u'"'); - } - assertEquals(WHERE, uR"( "a" "b" "c" "ç" "カ" "🚴" "" "abc" "de")", result); - - USetElements range1(uset.getAlias()); - auto range2(range1); // copy constructor - auto iter = range1.begin(); - auto limit = range2.end(); - // operator* with pre- and post-increment - assertEquals(WHERE, u"a", *iter); - ++iter; - assertEquals(WHERE, u"b", *iter); - assertEquals(WHERE, u"c", *++iter); - auto iter2(iter); // copy constructor - assertEquals(WHERE, u"c", *iter2++); - // skip çカ🚴 - ++++++iter2; - assertEquals(WHERE, UnicodeString(), *iter2++); - assertEquals(WHERE, u"abc", *iter2); - assertTrue(WHERE, ++iter2 != limit); - auto iter3(iter2++); - assertEquals(WHERE, u"de", *iter3); - assertTrue(WHERE, iter2 == limit); + // begin() & end() return USetElementIterator for which explicit APIs are tested via USet + // in a header-only unit test file. } diff --git a/icu4c/source/test/intltest/usettest.h b/icu4c/source/test/intltest/usettest.h index 0127042c736..2ac22ba72e6 100644 --- a/icu4c/source/test/intltest/usettest.h +++ b/icu4c/source/test/intltest/usettest.h @@ -106,13 +106,9 @@ private: void TestPatternCodePointComplement(); void TestCodePointIterator(); - void TestUSetCodePointIterator(); void TestRangeIterator(); - void TestUSetRangeIterator(); void TestStringIterator(); - void TestUSetStringIterator(); void TestElementIterator(); - void TestUSetElementIterator(); private: diff --git a/icu4c/source/test/intltest/uvectest.cpp b/icu4c/source/test/intltest/uvectest.cpp index bb089bb3761..789065eb7bb 100644 --- a/icu4c/source/test/intltest/uvectest.cpp +++ b/icu4c/source/test/intltest/uvectest.cpp @@ -82,7 +82,7 @@ UVectorTest_compareInt32(UElement key1, UElement key2) { } U_CDECL_BEGIN -static int8_t U_CALLCONV +static UBool U_CALLCONV UVectorTest_compareCstrings(const UElement key1, const UElement key2) { return !strcmp((const char *)key1.pointer, (const char *)key2.pointer); } diff --git a/icu4c/source/test/iotest/iotest.cpp b/icu4c/source/test/iotest/iotest.cpp index 64ff66fec5d..bb10088fe53 100644 --- a/icu4c/source/test/iotest/iotest.cpp +++ b/icu4c/source/test/iotest/iotest.cpp @@ -14,6 +14,9 @@ * created by: George Rhoten */ +#include +#include +#include #include "unicode/ustdio.h" #include "unicode/uclean.h" @@ -28,9 +31,6 @@ #include "unicode/tstdtmod.h" #include "putilimp.h" -#include -#include - class DataDrivenLogger : public TestLog { static const char* fgDataDir; static char *fgTestDataPath; @@ -42,23 +42,26 @@ public: fgTestDataPath = nullptr; } } - virtual void errln( const UnicodeString &message ) override { + virtual void errln(std::u16string_view message) override { char buffer[4000]; - message.extract(0, message.length(), buffer, sizeof(buffer)); + UnicodeString us(message); + us.extract(0, us.length(), buffer, sizeof(buffer)); buffer[3999] = 0; /* NUL terminate */ log_err(buffer); } - virtual void logln( const UnicodeString &message ) override { + virtual void logln(std::u16string_view message) override { char buffer[4000]; - message.extract(0, message.length(), buffer, sizeof(buffer)); + UnicodeString us(message); + us.extract(0, us.length(), buffer, sizeof(buffer)); buffer[3999] = 0; /* NUL terminate */ log_info(buffer); } - virtual void dataerrln( const UnicodeString &message ) override { + virtual void dataerrln(std::u16string_view message) override { char buffer[4000]; - message.extract(0, message.length(), buffer, sizeof(buffer)); + UnicodeString us(message); + us.extract(0, us.length(), buffer, sizeof(buffer)); buffer[3999] = 0; /* NUL terminate */ log_data_err(buffer); } diff --git a/icu4c/source/test/letest/FontObject.cpp b/icu4c/source/test/letest/FontObject.cpp deleted file mode 100644 index fc1d229ee77..00000000000 --- a/icu4c/source/test/letest/FontObject.cpp +++ /dev/null @@ -1,244 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/*************************************************************************** -* -* Copyright (C) 1998-2002, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - -#include - -#include "layout/LETypes.h" -#include "FontObject.h" -#include "layout/LESwaps.h" - -using icu::LESwaps; - -FontObject::FontObject(char *fileName) - : directory(nullptr), numTables(0), searchRange(0),entrySelector(0), - cmapTable(nullptr), cmSegCount(0), cmSearchRange(0), cmEntrySelector(0), - cmEndCodes(nullptr), cmStartCodes(nullptr), cmIdDelta(nullptr), cmIdRangeOffset(nullptr), - headTable(nullptr), hmtxTable(nullptr), numGlyphs(0), numOfLongHorMetrics(0), file(nullptr) -{ - file = fopen(fileName, "rb"); - - if (file == nullptr) { - printf("?? Couldn't open %s", fileName); - return; - } - - SFNTDirectory tempDir; - - fread(&tempDir, sizeof tempDir, 1, file); - - numTables = SWAPW(tempDir.numTables); - searchRange = SWAPW(tempDir.searchRange) >> 4; - entrySelector = SWAPW(tempDir.entrySelector); - rangeShift = SWAPW(tempDir.rangeShift) >> 4; - - int dirSize = sizeof tempDir + ((numTables - ANY_NUMBER) * sizeof(DirectoryEntry)); - - directory = reinterpret_cast(new char[dirSize]); - - fseek(file, 0L, SEEK_SET); - fread(directory, sizeof(char), dirSize, file); - - initUnicodeCMAP(); -} - -FontObject::~FontObject() -{ - fclose(file); - delete[] directory; - delete[] cmapTable; - delete[] headTable; - delete[] hmtxTable; -} - -void FontObject::deleteTable(void* table) -{ - delete[] static_cast(table); -} - -DirectoryEntry *FontObject::findTable(LETag tag) -{ - le_uint16 table = 0; - le_uint16 probe = 1 << entrySelector; - - if (SWAPL(directory->tableDirectory[rangeShift].tag) <= tag) { - table = rangeShift; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPL(directory->tableDirectory[table + probe].tag) <= tag) { - table += probe; - } - } - - if (SWAPL(directory->tableDirectory[table].tag) == tag) { - return &directory->tableDirectory[table]; - } - - return nullptr; -} - -void *FontObject::readTable(LETag tag, le_uint32 *length) -{ - DirectoryEntry *entry = findTable(tag); - - if (entry == nullptr) { - *length = 0; - return nullptr; - } - - *length = SWAPL(entry->length); - - void *table = new char[*length]; - - fseek(file, SWAPL(entry->offset), SEEK_SET); - fread(table, sizeof(char), *length, file); - - return table; -} - -CMAPEncodingSubtable *FontObject::findCMAP(le_uint16 platformID, le_uint16 platformSpecificID) -{ - LETag cmapTag = 0x636D6170; // 'cmap' - - if (cmapTable == nullptr) { - le_uint32 length; - - cmapTable = static_cast(readTable(cmapTag, &length)); - } - - if (cmapTable != nullptr) { - le_uint16 i; - le_uint16 nSubtables = SWAPW(cmapTable->numberSubtables); - - - for (i = 0; i < nSubtables; i += 1) { - CMAPEncodingSubtableHeader *esh = &cmapTable->encodingSubtableHeaders[i]; - - if (SWAPW(esh->platformID) == platformID && - SWAPW(esh->platformSpecificID) == platformSpecificID) { - return reinterpret_cast(reinterpret_cast(cmapTable) + SWAPL(esh->encodingOffset)); - } - } - } - - return nullptr; -} - -void FontObject::initUnicodeCMAP() -{ - CMAPEncodingSubtable *encodingSubtable = findCMAP(3, 1); - - if (encodingSubtable == nullptr || - SWAPW(encodingSubtable->format) != 4) { - printf("Can't find unicode 'cmap'"); - return; - } - - CMAPFormat4Encoding *header = (CMAPFormat4Encoding *) encodingSubtable; - - cmSegCount = SWAPW(header->segCountX2) / 2; - cmSearchRange = SWAPW(header->searchRange); - cmEntrySelector = SWAPW(header->entrySelector); - cmRangeShift = SWAPW(header->rangeShift) / 2; - cmEndCodes = &header->endCodes[0]; - cmStartCodes = &header->endCodes[cmSegCount + 1]; // + 1 for reservedPad... - cmIdDelta = &cmStartCodes[cmSegCount]; - cmIdRangeOffset = &cmIdDelta[cmSegCount]; -} - -LEGlyphID FontObject::unicodeToGlyph(LEUnicode32 unicode32) -{ - if (unicode32 >= 0x10000) { - return 0; - } - - LEUnicode16 unicode = static_cast(unicode32); - le_uint16 index = 0; - le_uint16 probe = 1 << cmEntrySelector; - LEGlyphID result = 0; - - if (SWAPW(cmStartCodes[cmRangeShift]) <= unicode) { - index = cmRangeShift; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPW(cmStartCodes[index + probe]) <= unicode) { - index += probe; - } - } - - if (unicode >= SWAPW(cmStartCodes[index]) && unicode <= SWAPW(cmEndCodes[index])) { - if (cmIdRangeOffset[index] == 0) { - result = static_cast(unicode); - } else { - le_uint16 offset = unicode - SWAPW(cmStartCodes[index]); - le_uint16 rangeOffset = SWAPW(cmIdRangeOffset[index]); - le_uint16* glyphIndexTable = reinterpret_cast(reinterpret_cast(&cmIdRangeOffset[index]) + rangeOffset); - - result = SWAPW(glyphIndexTable[offset]); - } - - result += SWAPW(cmIdDelta[index]); - } else { - result = 0; - } - - return result; -} - -le_uint16 FontObject::getUnitsPerEM() -{ - if (headTable == nullptr) { - LETag headTag = 0x68656164; // 'head' - le_uint32 length; - - headTable = static_cast(readTable(headTag, &length)); - } - - return SWAPW(headTable->unitsPerEm); -} - -le_uint16 FontObject::getGlyphAdvance(LEGlyphID glyph) -{ - if (hmtxTable == nullptr) { - LETag maxpTag = 0x6D617870; // 'maxp' - LETag hheaTag = 0x68686561; // 'hhea' - LETag hmtxTag = 0x686D7478; // 'hmtx' - le_uint32 length; - HHEATable *hheaTable; - MAXPTable* maxpTable = static_cast(readTable(maxpTag, &length)); - - numGlyphs = SWAPW(maxpTable->numGlyphs); - deleteTable(maxpTable); - - hheaTable = static_cast(readTable(hheaTag, &length)); - numOfLongHorMetrics = SWAPW(hheaTable->numOfLongHorMetrics); - deleteTable(hheaTable); - - hmtxTable = static_cast(readTable(hmtxTag, &length)); - } - - le_uint16 index = glyph; - - if (glyph >= numGlyphs) { - return 0; - } - - if (glyph >= numOfLongHorMetrics) { - index = numOfLongHorMetrics - 1; - } - - return SWAPW(hmtxTable->hMetrics[index].advanceWidth); -} - - diff --git a/icu4c/source/test/letest/FontObject.h b/icu4c/source/test/letest/FontObject.h deleted file mode 100644 index 4a1569cceb2..00000000000 --- a/icu4c/source/test/letest/FontObject.h +++ /dev/null @@ -1,237 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/*************************************************************************** -* -* Copyright (C) 1998-2002, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - - -#ifndef __FONTOBJECT_H -#define __FONTOBJECT_H - -#include - -#include "layout/LETypes.h" - - -#ifndef ANY_NUMBER -#define ANY_NUMBER 1 -#endif - -struct DirectoryEntry -{ - le_uint32 tag; - le_uint32 checksum; - le_uint32 offset; - le_uint32 length; -}; - -struct SFNTDirectory -{ - le_uint32 scalerType; - le_uint16 numTables; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - DirectoryEntry tableDirectory[ANY_NUMBER]; -}; - - -struct CMAPEncodingSubtableHeader -{ - le_uint16 platformID; - le_uint16 platformSpecificID; - le_uint32 encodingOffset; -}; - -struct CMAPTable -{ - le_uint16 version; - le_uint16 numberSubtables; - CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; -}; - -struct CMAPEncodingSubtable -{ - le_uint16 format; - le_uint16 length; - le_uint16 language; -}; - -struct CMAPFormat0Encoding : CMAPEncodingSubtable -{ - le_uint8 glyphIndexArray[256]; -}; - -struct CMAPFormat2Subheader -{ - le_uint16 firstCode; - le_uint16 entryCount; - le_int16 idDelta; - le_uint16 idRangeOffset; -}; - -struct CMAPFormat2Encoding : CMAPEncodingSubtable -{ - le_uint16 subHeadKeys[256]; - CMAPFormat2Subheader subheaders[ANY_NUMBER]; -}; - -struct CMAPFormat4Encoding : CMAPEncodingSubtable -{ - le_uint16 segCountX2; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - le_uint16 endCodes[ANY_NUMBER]; -// le_uint16 reservedPad; -// le_uint16 startCodes[ANY_NUMBER]; -// le_uint16 idDelta[ANY_NUMBER]; -// le_uint16 idRangeOffset[ANY_NUMBER]; -// le_uint16 glyphIndexArray[ANY_NUMBER]; -}; - -struct CMAPFormat6Encoding : CMAPEncodingSubtable -{ - le_uint16 firstCode; - le_uint16 entryCount; - le_uint16 glyphIndexArray[ANY_NUMBER]; -}; - -typedef le_int32 fixed; - -struct BigDate -{ - le_uint32 bc; - le_uint32 ad; -}; - -struct HEADTable -{ - fixed version; - fixed fontRevision; - le_uint32 checksumAdjustment; - le_uint32 magicNumber; - le_uint16 flags; - le_uint16 unitsPerEm; - BigDate created; - BigDate modified; - le_int16 xMin; - le_int16 yMin; - le_int16 xMax; - le_int16 yMax; - le_int16 lowestRecPPEM; - le_int16 fontDirectionHint; - le_int16 indexToLocFormat; - le_int16 glyphDataFormat; -}; - -struct MAXPTable -{ - fixed version; - le_uint16 numGlyphs; - le_uint16 maxPoints; - le_uint16 maxContours; - le_uint16 maxComponentPoints; - le_uint16 maxComponentContours; - le_uint16 maxZones; - le_uint16 maxTwilightPoints; - le_uint16 maxStorage; - le_uint16 maxFunctionDefs; - le_uint16 maxInstructionDefs; - le_uint16 maxStackElements; - le_uint16 maxSizeOfInstructions; - le_uint16 maxComponentElements; - le_uint16 maxComponentDepth; -}; - -struct HHEATable -{ - fixed version; - le_int16 ascent; - le_int16 descent; - le_int16 lineGap; - le_uint16 advanceWidthMax; - le_int16 minLeftSideBearing; - le_int16 minRightSideBearing; - le_int16 xMaxExtent; - le_int16 caretSlopeRise; - le_int16 caretSlopeRun; - le_int16 caretOffset; - le_int16 reserved1; - le_int16 reserved2; - le_int16 reserved3; - le_int16 reserved4; - le_int16 metricDataFormat; - le_uint16 numOfLongHorMetrics; -}; - -struct LongHorMetric -{ - le_uint16 advanceWidth; - le_int16 leftSideBearing; -}; - -struct HMTXTable -{ - LongHorMetric hMetrics[ANY_NUMBER]; // ANY_NUMBER = numOfLongHorMetrics from hhea table -// le_int16 leftSideBearing[ANY_NUMBER]; // ANY_NUMBER = numGlyphs - numOfLongHorMetrics -}; - -class FontObject -{ -public: - FontObject(char *fontName); - ~FontObject(); - - void *readTable(LETag tag, le_uint32 *length); - void deleteTable(void *table); - - LEGlyphID unicodeToGlyph(LEUnicode32 unicode); - -#if 0 - le_uint32 unicodesToGlyphs(LEUnicode *chars, le_uint32 nChars, LEGlyphID *glyphs, - le_uint32 *charIndices, le_bool rightToLeft); -#endif - - le_uint16 getUnitsPerEM(); - - le_uint16 getGlyphAdvance(LEGlyphID glyph); - -private: - FontObject(); - - DirectoryEntry *findTable(LETag tag); - CMAPEncodingSubtable *findCMAP(le_uint16 platformID, le_uint16 platformSpecificID); - void initUnicodeCMAP(); - - SFNTDirectory *directory; - le_uint16 numTables; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - - CMAPTable *cmapTable; - le_uint16 cmSegCount; - le_uint16 cmSearchRange; - le_uint16 cmEntrySelector; - le_uint16 cmRangeShift; - le_uint16 *cmEndCodes; - le_uint16 *cmStartCodes; - le_uint16 *cmIdDelta; - le_uint16 *cmIdRangeOffset; - - HEADTable *headTable; - - HMTXTable *hmtxTable; - le_uint16 numGlyphs; - le_uint16 numOfLongHorMetrics; - - FILE *file; - -}; - -#endif - diff --git a/icu4c/source/test/letest/FontTableCache.cpp b/icu4c/source/test/letest/FontTableCache.cpp deleted file mode 100644 index dfc424fc594..00000000000 --- a/icu4c/source/test/letest/FontTableCache.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ********************************************************************** - * Copyright (C) 2003-2013, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#include "layout/LETypes.h" - -//#include "letest.h" -#include "FontTableCache.h" - -#define TABLE_CACHE_INIT 5 -#define TABLE_CACHE_GROW 5 - -struct FontTableCacheEntry -{ - LETag tag; - const void *table; - size_t length; -}; - -FontTableCache::FontTableCache() - : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT) -{ - fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize); - - if (fTableCache == nullptr) { - fTableCacheSize = 0; - return; - } - - for (int i = 0; i < fTableCacheSize; i += 1) { - fTableCache[i].tag = 0; - fTableCache[i].table = nullptr; - fTableCache[i].length = 0; - } -} - -FontTableCache::~FontTableCache() -{ - for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { - LE_DELETE_ARRAY(fTableCache[i].table); - - fTableCache[i].tag = 0; - fTableCache[i].table = nullptr; - fTableCache[i].length = 0; - } - - fTableCacheCurr = 0; - - LE_DELETE_ARRAY(fTableCache); -} - -void FontTableCache::freeFontTable(const void *table) const -{ - LE_DELETE_ARRAY(table); -} - -const void *FontTableCache::find(LETag tableTag, size_t &length) const -{ - for (int i = 0; i < fTableCacheCurr; i += 1) { - if (fTableCache[i].tag == tableTag) { - length = fTableCache[i].length; - return fTableCache[i].table; - } - } - - const void *table = readFontTable(tableTag, length); - - const_cast(this)->add(tableTag, table, length); - - return table; -} - -void FontTableCache::add(LETag tableTag, const void *table, size_t length) -{ - if (fTableCacheCurr >= fTableCacheSize) { - le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; - - fTableCache = static_cast(LE_GROW_ARRAY(fTableCache, newSize)); - - for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { - fTableCache[i].tag = 0; - fTableCache[i].table = nullptr; - fTableCache[i].length = 0; - } - - fTableCacheSize = newSize; - } - - fTableCache[fTableCacheCurr].tag = tableTag; - fTableCache[fTableCacheCurr].table = table; - fTableCache[fTableCacheCurr].length = length; - - fTableCacheCurr += 1; -} diff --git a/icu4c/source/test/letest/FontTableCache.h b/icu4c/source/test/letest/FontTableCache.h deleted file mode 100644 index b91a75da213..00000000000 --- a/icu4c/source/test/letest/FontTableCache.h +++ /dev/null @@ -1,43 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ********************************************************************** - * Copyright (C) 2003-2013, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#ifndef __FONTTABLECACHE_H - -#define __FONTTABLECACHE_H - -#include "layout/LETypes.h" - -U_NAMESPACE_USE - -struct FontTableCacheEntry; - -class FontTableCache -{ -public: - FontTableCache(); - - virtual ~FontTableCache(); - - const void *find(LETag tableTag, size_t &length) const; - -protected: - virtual const void *readFontTable(LETag tableTag, size_t &length) const = 0; - virtual void freeFontTable(const void *table) const; - -private: - - void add(LETag tableTag, const void *table, size_t length); - - FontTableCacheEntry *fTableCache; - le_int32 fTableCacheCurr; - le_int32 fTableCacheSize; -}; - -#endif - diff --git a/icu4c/source/test/letest/Makefile.in b/icu4c/source/test/letest/Makefile.in index 46802b91a11..156c86fc83a 100644 --- a/icu4c/source/test/letest/Makefile.in +++ b/icu4c/source/test/letest/Makefile.in @@ -20,7 +20,6 @@ CLEANFILES = *~ $(DEPS) ## Target information TESTTARGET = letest -GENTARGET = gendata BUILDDIR := $(CURR_SRCCODE_FULL_DIR)/../../ # Simplify the path for Unix @@ -34,12 +33,10 @@ CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ct DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"' LIBS = $(LIBICULX) $(LIBICUUC) $(LIBICUI18N) $(LIBCTESTFW) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) $(ICULEHB_LIBS) -COMMONOBJECTS = letsutil.o cmaps.o FontTableCache.o SimpleFontInstance.o PortableFontInstance.o +COMMONOBJECTS = SimpleFontInstance.o TESTOBJECTS = letest.o -CTESTOBJECTS = cfonts.o xmlreader.o cletest.o -GENOBJECTS = gendata.o -OBJECTS = $(COMMONOBJECTS) $(TESTOBJECTS) $(GENOBJECTS) +OBJECTS = $(COMMONOBJECTS) $(TESTOBJECTS) DEPS = $(OBJECTS:.o=.d) @@ -67,7 +64,7 @@ dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - $(RMV) $(COMMONOBJECTS) $(TESTOBJECTS) $(CTESTOBJECTS) $(GENOBJECTS) $(TARGET) + $(RMV) $(COMMONOBJECTS) $(TESTOBJECTS) $(TARGET) distclean-local: clean-local $(RMV) Makefile @@ -83,20 +80,13 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status -$(TESTTARGET) : $(COMMONOBJECTS) $(TESTOBJECTS) $(CTESTOBJECTS) - $(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) - $(POST_BUILD_STEP) - -$(GENTARGET) : $(COMMONOBJECTS) $(GENOBJECTS) +$(TESTTARGET) : $(COMMONOBJECTS) $(TESTOBJECTS) $(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) $(POST_BUILD_STEP) invoke: ICU_DATA=$${ICU_DATA:-$(top_builddir)/data/} TZ=PST8PDT $(INVOKE) $(INVOCATION) -gen-data: $(GENTARGET) - ICU_DATA=$${ICU_DATA:-$(top_builddir)/data/} TZ=PST8PDT $(INVOKE) ./$(GENTARGET) $(top_srcdir)/test/testdata/letest.xml $(srcdir)/gendata.xml - ifeq (,$(MAKECMDGOALS)) -include $(DEPS) else diff --git a/icu4c/source/test/letest/PortableFontInstance.cpp b/icu4c/source/test/letest/PortableFontInstance.cpp deleted file mode 100644 index 630a16d1e03..00000000000 --- a/icu4c/source/test/letest/PortableFontInstance.cpp +++ /dev/null @@ -1,476 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ******************************************************************************* - * - * Copyright (C) 1999-2015, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: PortableFontInstance.cpp - * - * created on: 11/22/1999 - * created by: Eric R. Mader - */ - -#include - -#include "layout/LETypes.h" -#include "layout/LEFontInstance.h" -#include "layout/LESwaps.h" - -#include "PortableFontInstance.h" - -//#include "letest.h" -#include "sfnt.h" - -#include -#include - -#if 0 -static const char *letagToStr(LETag tag, char *str) { - str[0]= 0xFF & (tag>>24); - str[1]= 0xFF & (tag>>16); - str[2]= 0xFF & (tag>>8); - str[3]= 0xFF & (tag>>0); - str[4]= 0; - return str; -} -#endif - -// -// Finds the high bit by binary searching -// through the bits in n. -// -le_int8 PortableFontInstance::highBit(le_int32 value) -{ - if (value <= 0) { - return -32; - } - - le_uint8 bit = 0; - - if (value >= 1 << 16) { - value >>= 16; - bit += 16; - } - - if (value >= 1 << 8) { - value >>= 8; - bit += 8; - } - - if (value >= 1 << 4) { - value >>= 4; - bit += 4; - } - - if (value >= 1 << 2) { - value >>= 2; - bit += 2; - } - - if (value >= 1 << 1) { - value >>= 1; - bit += 1; - } - - return bit; -} - -PortableFontInstance::PortableFontInstance(const char *fileName, float pointSize, LEErrorCode &status) - : fFile(nullptr), fPointSize(pointSize), fUnitsPerEM(0), fFontChecksum(0), fAscent(0), fDescent(0), fLeading(0), - fDirectory(nullptr), fNAMETable(nullptr), fNameCount(0), fNameStringOffset(0), fCMAPMapper(nullptr), fHMTXTable(nullptr), fNumGlyphs(0), fNumLongHorMetrics(0) -{ - if (LE_FAILURE(status)) { - return; - } - - // open the font file - fFile = fopen(fileName, "rb"); - //printf("Open Font: %s\n", fileName); - - if (fFile == nullptr) { - printf("%s:%d: %s: FNF\n", __FILE__, __LINE__, fileName); - status = LE_FONT_FILE_NOT_FOUND_ERROR; - return; - } - - // read in the directory - SFNTDirectory tempDir; - - size_t numRead = fread(&tempDir, sizeof tempDir, 1, fFile); - (void)numRead; - - le_int32 dirSize = sizeof tempDir + ((SWAPW(tempDir.numTables) - ANY_NUMBER) * sizeof(DirectoryEntry)); - const LETag headTag = LE_HEAD_TABLE_TAG; - const LETag hheaTag = LE_HHEA_TABLE_TAG; - const HEADTable *headTable = nullptr; - const HHEATable *hheaTable = nullptr; -// const NAMETable *nameTable = nullptr; - le_uint16 numTables = 0; - - fDirectory = reinterpret_cast(LE_NEW_ARRAY(char, dirSize)); - - if (fDirectory == nullptr) { - printf("%s:%d: %s: malloc err\n", __FILE__, __LINE__, fileName); - status = LE_MEMORY_ALLOCATION_ERROR; - goto error_exit; - } - - fseek(fFile, 0L, SEEK_SET); - numRead = fread((void *) fDirectory, sizeof(char), dirSize, fFile); - - // - // We calculate these numbers 'cause some fonts - // have bogus values for them in the directory header. - // - numTables = SWAPW(fDirectory->numTables); - fDirPower = 1 << highBit(numTables); - fDirExtra = numTables - fDirPower; - - // read unitsPerEm from 'head' table - headTable = static_cast(readFontTable(headTag)); - - if (headTable == nullptr) { - status = LE_MISSING_FONT_TABLE_ERROR; - printf("%s:%d: %s: missing head table\n", __FILE__, __LINE__, fileName); - goto error_exit; - } - - fUnitsPerEM = SWAPW(headTable->unitsPerEm); - fFontChecksum = SWAPL(headTable->checksumAdjustment); - freeFontTable(headTable); - - //nameTable = (NAMETable *) readFontTable(nameTag); - - //if (nameTable == nullptr) { - // status = LE_MISSING_FONT_TABLE_ERROR; - // goto error_exit; - //} - - //fFontVersionString = findName(nameTable, NAME_VERSION_STRING, PLATFORM_MACINTOSH, MACINTOSH_ROMAN, MACINTOSH_ENGLISH); - - //if (fFontVersionString == nullptr) { - // status = LE_MISSING_FONT_TABLE_ERROR; - // goto error_exit; - //} - - //freeFontTable(nameTable); - - hheaTable = (HHEATable *) readFontTable(hheaTag); - - if (hheaTable == nullptr) { - printf("%s:%d: %s: missing hhea table\n", __FILE__, __LINE__, fileName); - status = LE_MISSING_FONT_TABLE_ERROR; - goto error_exit; - } - - fAscent = static_cast(yUnitsToPoints(static_cast(SWAPW(hheaTable->ascent)))); - fDescent = static_cast(yUnitsToPoints(static_cast(SWAPW(hheaTable->descent)))); - fLeading = static_cast(yUnitsToPoints(static_cast(SWAPW(hheaTable->lineGap)))); - - fNumLongHorMetrics = SWAPW(hheaTable->numOfLongHorMetrics); - - freeFontTable((void *) hheaTable); - - fCMAPMapper = findUnicodeMapper(); - - if (fCMAPMapper == nullptr) { - printf("%s:%d: %s: can't load cmap\n", __FILE__, __LINE__, fileName); - status = LE_MISSING_FONT_TABLE_ERROR; - goto error_exit; - } - - return; - -error_exit: - fclose(fFile); - fFile = nullptr; -} - -PortableFontInstance::~PortableFontInstance() -{ - if (fFile != nullptr) { - fclose(fFile); - - freeFontTable(fHMTXTable); - freeFontTable(fNAMETable); - - delete fCMAPMapper; - - LE_DELETE_ARRAY(fDirectory); - } -} - -const DirectoryEntry *PortableFontInstance::findTable(LETag tag) const -{ - if (fDirectory != nullptr) { - le_uint16 table = 0; - le_uint16 probe = fDirPower; - - if (SWAPL(fDirectory->tableDirectory[fDirExtra].tag) <= tag) { - table = fDirExtra; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPL(fDirectory->tableDirectory[table + probe].tag) <= tag) { - table += probe; - } - } - - if (SWAPL(fDirectory->tableDirectory[table].tag) == tag) { - return &fDirectory->tableDirectory[table]; - } - } - - return nullptr; -} - -const void *PortableFontInstance::readTable(LETag tag, le_uint32 *length) const -{ - const DirectoryEntry *entry = findTable(tag); - - if (entry == nullptr) { - *length = 0; - return nullptr; - } - - *length = SWAPL(entry->length); - - void *table = LE_NEW_ARRAY(char, *length); - - if (table != nullptr) { - fseek(fFile, SWAPL(entry->offset), SEEK_SET); - size_t numRead = fread(table, sizeof(char), *length, fFile); - (void)numRead; - } - - return table; -} - -const void *PortableFontInstance::getFontTable(LETag tableTag, size_t &length) const -{ - return FontTableCache::find(tableTag, length); -} - -const void *PortableFontInstance::readFontTable(LETag tableTag, size_t &length) const -{ - le_uint32 len; - - const void *data= readTable(tableTag, &len); - length = len; - //char tag5[5]; - //printf("Read %s, result %p #%d\n", letagToStr(tableTag,tag5), data,len); - return data; -} - -CMAPMapper *PortableFontInstance::findUnicodeMapper() -{ - LETag cmapTag = LE_CMAP_TABLE_TAG; - const CMAPTable *cmap = (CMAPTable *) readFontTable(cmapTag); - - if (cmap == nullptr) { - return nullptr; - } - - return CMAPMapper::createUnicodeMapper(cmap); -} - -const char *PortableFontInstance::getNameString(le_uint16 nameID, le_uint16 platformID, le_uint16 encodingID, le_uint16 languageID) const -{ - if (fNAMETable == nullptr) { - LETag nameTag = LE_NAME_TABLE_TAG; - PortableFontInstance* realThis = const_cast(this); - - realThis->fNAMETable = static_cast(readFontTable(nameTag)); - - if (realThis->fNAMETable != nullptr) { - realThis->fNameCount = SWAPW(realThis->fNAMETable->count); - realThis->fNameStringOffset = SWAPW(realThis->fNAMETable->stringOffset); - } - } - - for(le_int32 i = 0; i < fNameCount; i += 1) { - const NameRecord *nameRecord = &fNAMETable->nameRecords[i]; - - if (SWAPW(nameRecord->platformID) == platformID && SWAPW(nameRecord->encodingID) == encodingID && - SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) { - char *name = ((char *) fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset); - le_uint16 length = SWAPW(nameRecord->length); - char *result = LE_NEW_ARRAY(char, length + 2); - - LE_ARRAY_COPY(result, name, length); - result[length] = result[length + 1] = 0; - - return result; - } - } - - return nullptr; -} - -const LEUnicode16 *PortableFontInstance::getUnicodeNameString(le_uint16 nameID, le_uint16 platformID, le_uint16 encodingID, le_uint16 languageID) const -{ - if (fNAMETable == nullptr) { - LETag nameTag = LE_NAME_TABLE_TAG; - PortableFontInstance* realThis = const_cast(this); - - realThis->fNAMETable = static_cast(readFontTable(nameTag)); - - if (realThis->fNAMETable != nullptr) { - realThis->fNameCount = SWAPW(realThis->fNAMETable->count); - realThis->fNameStringOffset = SWAPW(realThis->fNAMETable->stringOffset); - } - } - - for(le_int32 i = 0; i < fNameCount; i += 1) { - const NameRecord *nameRecord = &fNAMETable->nameRecords[i]; - - if (SWAPW(nameRecord->platformID) == platformID && SWAPW(nameRecord->encodingID) == encodingID && - SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) { - const LEUnicode16* name = reinterpret_cast(reinterpret_cast(fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset)); - le_uint16 length = SWAPW(nameRecord->length) / 2; - LEUnicode16 *result = LE_NEW_ARRAY(LEUnicode16, length + 2); - - for (le_int32 c = 0; c < length; c += 1) { - result[c] = SWAPW(name[c]); - } - - result[length] = 0; - - return result; - } - } - - return nullptr; -} - -void PortableFontInstance::deleteNameString(const char *name) const -{ - LE_DELETE_ARRAY(name); -} - -void PortableFontInstance::deleteNameString(const LEUnicode16 *name) const -{ - LE_DELETE_ARRAY(name); -} - -void PortableFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const -{ - TTGlyphID ttGlyph = static_cast(LE_GET_GLYPH(glyph)); - - if (fHMTXTable == nullptr) { - LETag maxpTag = LE_MAXP_TABLE_TAG; - LETag hmtxTag = LE_HMTX_TABLE_TAG; - const MAXPTable *maxpTable = (MAXPTable *) readFontTable(maxpTag); - PortableFontInstance* realThis = const_cast(this); - - if (maxpTable != nullptr) { - realThis->fNumGlyphs = SWAPW(maxpTable->numGlyphs); - freeFontTable(maxpTable); - } - - realThis->fHMTXTable = static_cast(readFontTable(hmtxTag)); - } - - le_uint16 index = ttGlyph; - - if (ttGlyph >= fNumGlyphs || fHMTXTable == nullptr) { - advance.fX = advance.fY = 0; - return; - } - - if (ttGlyph >= fNumLongHorMetrics) { - index = fNumLongHorMetrics - 1; - } - - advance.fX = xUnitsToPoints(SWAPW(fHMTXTable->hMetrics[index].advanceWidth)); - advance.fY = 0; -} - -le_bool PortableFontInstance::getGlyphPoint(LEGlyphID /*glyph*/, le_int32 /*pointNumber*/, LEPoint &/*point*/) const -{ - return false; -} - -le_int32 PortableFontInstance::getUnitsPerEM() const -{ - return fUnitsPerEM; -} - -le_uint32 PortableFontInstance::getFontChecksum() const -{ - return fFontChecksum; -} - -le_uint32 PortableFontInstance::getRawChecksum() const -{ - // how big is it? - // fseek(fFile, 0L, SEEK_END); - // long size = ftell(fFile); - le_int32 chksum = 0; - // now, calculate - fseek(fFile, 0L, SEEK_SET); - int r; - while((r = fgetc(fFile)) != EOF) { - chksum += r; - } - return static_cast(chksum); // cast to signed -} - -le_int32 PortableFontInstance::getAscent() const -{ - return fAscent; -} - -le_int32 PortableFontInstance::getDescent() const -{ - return fDescent; -} - -le_int32 PortableFontInstance::getLeading() const -{ - return fLeading; -} - -// We really want to inherit this method from the superclass, but some compilers -// issue a warning if we don't implement it... -LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const -{ - return LEFontInstance::mapCharToGlyph(ch, mapper, filterZeroWidth); -} - -// We really want to inherit this method from the superclass, but some compilers -// issue a warning if we don't implement it... -LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const -{ - return LEFontInstance::mapCharToGlyph(ch, mapper); -} - -LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch) const -{ - return fCMAPMapper->unicodeToGlyph(ch); -} - -float PortableFontInstance::getXPixelsPerEm() const -{ - return fPointSize; -} - -float PortableFontInstance::getYPixelsPerEm() const -{ - return fPointSize; -} - -float PortableFontInstance::getScaleFactorX() const -{ - return 1.0; -} - -float PortableFontInstance::getScaleFactorY() const -{ - return 1.0; -} diff --git a/icu4c/source/test/letest/PortableFontInstance.h b/icu4c/source/test/letest/PortableFontInstance.h deleted file mode 100644 index 9405674ed18..00000000000 --- a/icu4c/source/test/letest/PortableFontInstance.h +++ /dev/null @@ -1,122 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html - -/* - ******************************************************************************* - * - * Copyright (C) 1999-2015, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: PortableFontInstance.h - * - * created on: 11/12/1999 - * created by: Eric R. Mader - */ - -#ifndef __PORTABLEFONTINSTANCE_H -#define __PORTABLEFONTINSTANCE_H - -#include - -#include "layout/LETypes.h" -#include "layout/LEFontInstance.h" - -#include "FontTableCache.h" - -#include "sfnt.h" -#include "cmaps.h" - -class PortableFontInstance : public LEFontInstance, protected FontTableCache -{ -private: - FILE *fFile; - - float fPointSize; - le_int32 fUnitsPerEM; - le_uint32 fFontChecksum; - le_int32 fAscent; - le_int32 fDescent; - le_int32 fLeading; - - const SFNTDirectory *fDirectory; - le_uint16 fDirPower; - le_uint16 fDirExtra; - - float fDeviceScaleX; - float fDeviceScaleY; - - const NAMETable *fNAMETable; - le_uint16 fNameCount; - le_uint16 fNameStringOffset; - - CMAPMapper *fCMAPMapper; - - const HMTXTable *fHMTXTable; - le_uint16 fNumGlyphs; - le_uint16 fNumLongHorMetrics; - - static le_int8 highBit(le_int32 value); - - const DirectoryEntry *findTable(LETag tag) const; - const void *readTable(LETag tag, le_uint32 *length) const; - void getMetrics(); - - CMAPMapper *findUnicodeMapper(); - -protected: - const void *readFontTable(LETag tableTag) const { size_t ignored; return readFontTable(tableTag, ignored); } - const void *readFontTable(LETag tableTag, size_t &length) const override; - -public: - PortableFontInstance(const char *fileName, float pointSize, LEErrorCode &status); - - virtual ~PortableFontInstance(); - - const void *getFontTable(LETag tableTag, size_t &length) const override; - - virtual const char *getNameString(le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) const; - - virtual const LEUnicode16 *getUnicodeNameString(le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) const; - - virtual void deleteNameString(const char *name) const; - - virtual void deleteNameString(const LEUnicode16 *name) const; - - le_int32 getUnitsPerEM() const override; - - virtual le_uint32 getFontChecksum() const; - - virtual le_uint32 getRawChecksum() const; - - le_int32 getAscent() const override; - - le_int32 getDescent() const override; - - le_int32 getLeading() const override; - - // We really want to inherit this method from the superclass, but some compilers - // issue a warning if we don't implement it... - LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const override; - - // We really want to inherit this method from the superclass, but some compilers - // issue a warning if we don't implement it... - LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const override; - - LEGlyphID mapCharToGlyph(LEUnicode32 ch) const override; - - void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const override; - - le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const override; - - float getXPixelsPerEm() const override; - - float getYPixelsPerEm() const override; - - float getScaleFactorX() const override; - - float getScaleFactorY() const override; - -}; - -#endif diff --git a/icu4c/source/test/letest/SimpleFontInstance.cpp b/icu4c/source/test/letest/SimpleFontInstance.cpp index 09c5dfee7a8..c61c95769c2 100644 --- a/icu4c/source/test/letest/SimpleFontInstance.cpp +++ b/icu4c/source/test/letest/SimpleFontInstance.cpp @@ -19,10 +19,6 @@ #include "layout/LETypes.h" #include "layout/LEFontInstance.h" -#ifndef USING_ICULEHB -#include "layout/CanonShaping.h" -#endif - #include "SimpleFontInstance.h" SimpleFontInstance::SimpleFontInstance(float pointSize, LEErrorCode &status) @@ -41,18 +37,9 @@ SimpleFontInstance::~SimpleFontInstance() // nothing to do... } -const void *SimpleFontInstance::getFontTable(LETag tableTag, size_t &length) const +const void *SimpleFontInstance::getFontTable(LETag /*tableTag*/, size_t &length) const { length = -1; // unknown for this test. -#ifndef USING_ICULEHB - if (tableTag == LE_GSUB_TABLE_TAG) { - return CanonShaping::glyphSubstitutionTable; - } - - if (tableTag == LE_GDEF_TABLE_TAG) { - return CanonShaping::glyphDefinitionTable; - } -#endif return nullptr; } diff --git a/icu4c/source/test/letest/cfonts.cpp b/icu4c/source/test/letest/cfonts.cpp deleted file mode 100644 index 07af957b9b4..00000000000 --- a/icu4c/source/test/letest/cfonts.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - * - * (C) Copyright IBM Corp. 1998-2014 - All Rights Reserved - * - */ - -#ifndef USING_ICULEHB /* C API not available under HB */ - -#include "layout/LETypes.h" -#include "loengine.h" -#include "PortableFontInstance.h" -#include "SimpleFontInstance.h" - -U_CDECL_BEGIN - -le_font *le_portableFontOpen(const char *fileName, - float pointSize, - LEErrorCode *status) -{ - return (le_font *) new PortableFontInstance(fileName, pointSize, *status); -} - -le_font *le_simpleFontOpen(float pointSize, - LEErrorCode *status) -{ - return (le_font *) new SimpleFontInstance(pointSize, *status); -} - -void le_fontClose(le_font *font) -{ - LEFontInstance *fontInstance = (LEFontInstance *) font; - - delete fontInstance; -} - -const char *le_getNameString(le_font *font, le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - return pfi->getNameString(nameID, platform, encoding, language); -} - -const LEUnicode16 *le_getUnicodeNameString(le_font *font, le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - return pfi->getUnicodeNameString(nameID, platform, encoding, language); -} - -void le_deleteNameString(le_font *font, const char *name) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - pfi->deleteNameString(name); -} - -void le_deleteUnicodeNameString(le_font *font, const LEUnicode16 *name) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - pfi->deleteNameString(name); -} - -le_uint32 le_getFontChecksum(le_font *font) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - return pfi->getFontChecksum(); -} - -U_CDECL_END -#endif diff --git a/icu4c/source/test/letest/cfonts.h b/icu4c/source/test/letest/cfonts.h deleted file mode 100644 index efa12866894..00000000000 --- a/icu4c/source/test/letest/cfonts.h +++ /dev/null @@ -1,37 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - * - * (C) Copyright IBM Corp. 1998-2014 - All Rights Reserved - * - */ - -#ifndef USING_ICULEHB /* C API not available under HB */ - -#ifndef __CFONTS_H -#define __CFONTS_H - -#include "LETypes.h" -#include "loengine.h" - -le_font *le_portableFontOpen(const char *fileName, - float pointSize, - LEErrorCode *status); - -le_font *le_simpleFontOpen(float pointSize, - LEErrorCode *status); - -void le_fontClose(le_font *font); - -const char *le_getNameString(le_font *font, le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language); - -const LEUnicode16 *le_getUnicodeNameString(le_font *font, le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language); - -void le_deleteNameString(le_font *font, const char *name); - -void le_deleteUnicodeNameString(le_font *font, const LEUnicode16 *name); - -le_uint32 le_getFontChecksum(le_font *font); - -#endif -#endif diff --git a/icu4c/source/test/letest/cletest.c b/icu4c/source/test/letest/cletest.c deleted file mode 100644 index c176576e536..00000000000 --- a/icu4c/source/test/letest/cletest.c +++ /dev/null @@ -1,749 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ******************************************************************************* - * - * Copyright (C) 1999-2014, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - */ - -#ifndef USING_ICULEHB /* C API not available under HB */ - -#include "unicode/utypes.h" -#include "unicode/ubidi.h" -#include "unicode/uscript.h" -#include "unicode/ctest.h" - -#include "layout/LETypes.h" -#include "layout/LEScripts.h" -#include "layout/loengine.h" - -#include "layout/playout.h" -#include "layout/plruns.h" - -#include "cfonts.h" - -#include "letest.h" - -#include "sfnt.h" -#include "xmlreader.h" -#include "putilimp.h" /* for U_FILE_SEP_STRING */ - -#include -#include -#include - -#define CH_COMMA 0x002C - -U_CDECL_BEGIN -static void U_CALLCONV ParamTest(void) -{ - LEErrorCode status = LE_NO_ERROR; - le_font *font = le_simpleFontOpen(12, &status); - le_engine *engine = le_create(font, arabScriptCode, -1, 0, &status); - LEGlyphID *glyphs = NULL; - le_int32 *indices = NULL; - float *positions = NULL; - le_int32 glyphCount = 0; - - float x = 0.0, y = 0.0; - LEUnicode chars[] = { - 0x0045, 0x006E, 0x0067, 0x006C, 0x0069, 0x0073, 0x0068, 0x0020, /* "English " */ - 0x0645, 0x0627, 0x0646, 0x062A, 0x0648, 0x0634, /* MEM ALIF KAF NOON TEH WAW SHEEN */ - 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x02E /* " text." */ - }; - - - glyphCount = le_getGlyphCount(engine, &status); - if (glyphCount != 0) { - log_err("Calling getGlyphCount() on an empty layout returned %d.\n", glyphCount); - } - - glyphs = NEW_ARRAY(LEGlyphID, glyphCount + 10); - indices = NEW_ARRAY(le_int32, glyphCount + 10); - positions = NEW_ARRAY(float, glyphCount + 10); - - le_getGlyphs(engine, NULL, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling getGlyphs(NULL, status) did not return LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - le_getGlyphs(engine, glyphs, &status); - - if (status != LE_NO_LAYOUT_ERROR) { - log_err("Calling getGlyphs(glyphs, status) on an empty layout did not return LE_NO_LAYOUT_ERROR.\n"); - } - - status = LE_NO_ERROR; - le_getCharIndices(engine, NULL, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling getCharIndices(NULL, status) did not return LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - le_getCharIndices(engine, indices, &status); - - if (status != LE_NO_LAYOUT_ERROR) { - log_err("Calling getCharIndices(indices, status) on an empty layout did not return LE_NO_LAYOUT_ERROR.\n"); - } - - status = LE_NO_ERROR; - le_getCharIndicesWithBase(engine, NULL, 1024, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling getCharIndices(NULL, 1024, status) did not return LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - le_getCharIndicesWithBase(engine, indices, 1024, &status); - - if (status != LE_NO_LAYOUT_ERROR) { - log_err("Calling getCharIndices(indices, 1024, status) on an empty layout did not return LE_NO_LAYOUT_ERROR.\n"); - } - - status = LE_NO_ERROR; - le_getGlyphPositions(engine, NULL, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling getGlyphPositions(NULL, status) did not return LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - le_getGlyphPositions(engine, positions, &status); - - if (status != LE_NO_LAYOUT_ERROR) { - log_err("Calling getGlyphPositions(positions, status) on an empty layout did not return LE_NO_LAYOUT_ERROR.\n"); - } - - DELETE_ARRAY(positions); - DELETE_ARRAY(indices); - DELETE_ARRAY(glyphs); - - status = LE_NO_ERROR; - glyphCount = le_layoutChars(engine, NULL, 0, 0, 0, false, 0.0, 0.0, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling layoutChars(NULL, 0, 0, 0, false, 0.0, 0.0, status) did not fail w/ LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - glyphCount = le_layoutChars(engine, chars, -1, 6, 20, true, 0.0, 0.0, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling layoutChars(chars, -1, 6, 20, true, 0.0, 0.0, status) did not fail w/ LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - glyphCount = le_layoutChars(engine, chars, 8, -1, 20, true, 0.0, 0.0, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling layoutChars(chars, 8, -1, 20, true, 0.0, 0.0, status) did not fail w/ LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - glyphCount = le_layoutChars(engine, chars, 8, 6, -1, true, 0.0, 0.0, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling layoutChars((chars, 8, 6, -1, true, 0.0, 0.0, status) did not fail w/ LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - glyphCount = le_layoutChars(engine, chars, 8, 6, 10, true, 0.0, 0.0, &status); - - if (status != LE_ILLEGAL_ARGUMENT_ERROR) { - log_err("Calling layoutChars(chars, 8, 6, 10, true, 0.0, 0.0, status) did not fail w/ LE_ILLEGAL_ARGUMENT_ERROR.\n"); - } - - status = LE_NO_ERROR; - glyphCount = le_layoutChars(engine, chars, 8, 6, 20, true, 0.0, 0.0, &status); - - if (LE_FAILURE(status)) { - log_err("Calling layoutChars(chars, 8, 6, 20, true, 0.0, 0.0, status) failed.\n"); - goto bail; - } - - le_getGlyphPosition(engine, -1, &x, &y, &status); - - if (status != LE_INDEX_OUT_OF_BOUNDS_ERROR) { - log_err("Calling getGlyphPosition(-1, x, y, status) did not fail w/ LE_INDEX_OUT_OF_BOUNDS_ERROR.\n"); - } - - status = LE_NO_ERROR; - le_getGlyphPosition(engine, glyphCount + 1, &x, &y, &status); - - if (status != LE_INDEX_OUT_OF_BOUNDS_ERROR) { - log_err("Calling getGlyphPosition(glyphCount + 1, x, y, status) did not fail w/ LE_INDEX_OUT_OF_BOUNDS_ERROR.\n"); - } - -bail: - le_close(engine); - le_fontClose(font); -} -U_CDECL_END - -U_CDECL_BEGIN -static void U_CALLCONV FactoryTest(void) -{ - LEErrorCode status = LE_NO_ERROR; - le_font *font = le_simpleFontOpen(12, &status); - le_engine *engine = NULL; - le_int32 scriptCode; - - for(scriptCode = 0; scriptCode < scriptCodeCount; scriptCode += 1) { - status = LE_NO_ERROR; - engine = le_create(font, scriptCode, -1, 0, &status); - - if (LE_FAILURE(status)) { - log_err("Could not create a LayoutEngine for script \'%s\'.\n", uscript_getShortName((UScriptCode)scriptCode)); - } - - le_close(engine); - } - - le_fontClose(font); -} -U_CDECL_END - -U_CDECL_BEGIN -static void U_CALLCONV AccessTest(void) -{ - LEErrorCode status = LE_NO_ERROR; - le_font *font = le_simpleFontOpen(12, &status); - le_engine *engine =le_create(font, arabScriptCode, -1, 0, &status); - le_int32 glyphCount; - LEGlyphID glyphs[6]; - le_int32 biasedIndices[6], indices[6], glyph; - float positions[6 * 2 + 2]; - LEUnicode chars[] = { - 0x0045, 0x006E, 0x0067, 0x006C, 0x0069, 0x0073, 0x0068, 0x0020, /* "English " */ - 0x0645, 0x0627, 0x0646, 0x062A, 0x0648, 0x0634, /* MEM ALIF KAF NOON TEH WAW SHEEN */ - 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x02E /* " text." */ - }; - - if (LE_FAILURE(status)) { - log_err("Could not create LayoutEngine.\n"); - goto bail; - } - - glyphCount = le_layoutChars(engine, chars, 8, 6, 20, true, 0.0, 0.0, &status); - - if (LE_FAILURE(status) || glyphCount != 6) { - log_err("layoutChars(chars, 8, 6, 20, true, 0.0, 0.0, status) failed.\n"); - goto bail; - } - - le_getGlyphs(engine, glyphs, &status); - le_getCharIndices(engine, indices, &status); - le_getGlyphPositions(engine, positions, &status); - - if (LE_FAILURE(status)) { - log_err("Could not get glyph, indices and position arrays.\n"); - goto bail; - } - - status = LE_NO_ERROR; - le_getCharIndicesWithBase(engine, biasedIndices, 1024, &status); - - if (LE_FAILURE(status)) { - log_err("getCharIndices(biasedIndices, 1024, status) failed.\n"); - } else { - for (glyph = 0; glyph < glyphCount; glyph += 1) { - if (biasedIndices[glyph] != (indices[glyph] + 1024)) { - log_err("biasedIndices[%d] != indices[%d] + 1024: %8X, %8X\n", - glyph, glyph, biasedIndices[glyph], indices[glyph]); - break; - } - } - } - - status = LE_NO_ERROR; - for (glyph = 0; glyph <= glyphCount; glyph += 1) { - float x = 0.0, y = 0.0; - - le_getGlyphPosition(engine, glyph, &x, &y, &status); - - if (LE_FAILURE(status)) { - log_err("getGlyphPosition(%d, x, y, status) failed.\n", glyph); - break; - } - - if (x != positions[glyph*2] || y != positions[glyph*2 + 1]) { - log_err("getGlyphPosition(%d, x, y, status) returned bad position: (%f, %f) != (%f, %f)\n", - glyph, x, y, positions[glyph*2], positions[glyph*2 + 1]); - break; - } - } - -bail: - le_close(engine); - le_fontClose(font); -} -U_CDECL_END - -static le_bool compareResults(const char *testID, TestResult *expected, TestResult *actual) -{ - le_int32 i; - - /* NOTE: we'll stop on the first failure 'cause once there's one error, it may cascade... */ - if (actual->glyphCount != expected->glyphCount) { - log_err("Test %s: incorrect glyph count: expected %d, got %d\n", - testID, expected->glyphCount, actual->glyphCount); - return false; - } - - for (i = 0; i < actual->glyphCount; i += 1) { - if (actual->glyphs[i] != expected->glyphs[i]) { - log_err("Test %s: incorrect id for glyph %d: expected %4X, got %4X\n", - testID, i, expected->glyphs[i], actual->glyphs[i]); - return false; - } - } - - for (i = 0; i < actual->glyphCount; i += 1) { - if (actual->indices[i] != expected->indices[i]) { - log_err("Test %s: incorrect index for glyph %d: expected %8X, got %8X\n", - testID, i, expected->indices[i], actual->indices[i]); - return false; - } - } - - for (i = 0; i <= actual->glyphCount; i += 1) { - double xError = uprv_fabs(actual->positions[i * 2] - expected->positions[i * 2]); - double yError = uprv_fabs(actual->positions[i * 2 + 1] - expected->positions[i * 2 + 1]); - - if (xError > 0.0001) { - log_err("Test %s: incorrect x position for glyph %d: expected %f, got %f\n", - testID, i, expected->positions[i * 2], actual->positions[i * 2]); - return false; - } - - if (yError < 0) { - yError = -yError; - } - - if (yError > 0.0001) { - log_err("Test %s: incorrect y position for glyph %d: expected %f, got %f\n", - testID, i, expected->positions[i * 2 + 1], actual->positions[i * 2 + 1]); - return false; - } - } - - return true; -} - -static void checkFontVersion(le_font *font, const char *testVersionString, - le_uint32 testChecksum, const char *testID) -{ - le_uint32 fontChecksum = le_getFontChecksum(font); - - if (fontChecksum != testChecksum) { - const char *fontVersionString = le_getNameString(font, NAME_VERSION_STRING, - PLATFORM_MACINTOSH, MACINTOSH_ROMAN, MACINTOSH_ENGLISH); - const LEUnicode16 *uFontVersionString = NULL; - - if (fontVersionString == NULL) { - uFontVersionString = le_getUnicodeNameString(font, NAME_VERSION_STRING, - PLATFORM_MICROSOFT, MICROSOFT_UNICODE_BMP, MICROSOFT_ENGLISH); - } - - log_info("Test %s: this may not be the same font used to generate the test data.\n", testID); - - if (uFontVersionString != NULL) { - log_info("Your font's version string is \"%S\"\n", uFontVersionString); - le_deleteUnicodeNameString(font, uFontVersionString); - } else { - log_info("Your font's version string is \"%s\"\n", fontVersionString); - le_deleteNameString(font, fontVersionString); - } - - log_info("The expected version string is \"%s\"\n", testVersionString); - log_info("If you see errors, they may be due to the version of the font you're using.\n"); - } -} - -/* Returns the path to icu/source/test/testdata/ */ -static const char *getSourceTestData() { -#ifdef U_TOPSRCDIR - const char *srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; -#else - const char *srcDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; - FILE *f = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING"rbbitst.txt", "r"); - - if (f != NULL) { - /* We're in icu/source/test/letest/ */ - fclose(f); - } else { - /* We're in icu/source/test/letest/(Debug|Release) */ - srcDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; - } -#endif - - return srcDataDir; -} - -static const char *getPath(char buffer[2048], const char *filename) { - const char *testDataDirectory = getSourceTestData(); - - strcpy(buffer, testDataDirectory); - strcat(buffer, filename); - - return buffer; -} - -static le_font *openFont(const char *fontName, const char *checksum, const char *version, const char *testID) -{ - char path[2048]; - le_font *font; - LEErrorCode fontStatus = LE_NO_ERROR; - - if (fontName != NULL) { - font = le_portableFontOpen(getPath(path, fontName), 12, &fontStatus); - - if (LE_FAILURE(fontStatus)) { - log_info("Test %s: can't open font %s - test skipped.\n", testID, fontName); - le_fontClose(font); - return NULL; - } else { - le_uint32 cksum = 0; - - sscanf(checksum, "%x", &cksum); - - checkFontVersion(font, version, cksum, testID); - } - } else { - font = le_simpleFontOpen(12, &fontStatus); - } - - return font; -} - -static le_bool getRTL(const LEUnicode *text, le_int32 charCount) -{ - UBiDiLevel level; - le_int32 limit = -1; - UErrorCode status = U_ZERO_ERROR; - UBiDi *ubidi = ubidi_openSized(charCount, 0, &status); - - ubidi_setPara(ubidi, text, charCount, UBIDI_DEFAULT_LTR, NULL, &status); - - /* TODO: Should check that there's only a single logical run... */ - ubidi_getLogicalRun(ubidi, 0, &limit, &level); - - ubidi_close(ubidi); - - return level & 1; -} - -static void doTestCase (const char *testID, - const char *fontName, - const char *fontVersion, - const char *fontChecksum, - le_int32 scriptCode, - le_int32 languageCode, - const LEUnicode *text, - le_int32 charCount, - TestResult *expected) -{ - LEErrorCode status = LE_NO_ERROR; - le_engine *engine; - le_font *font = openFont(fontName, fontChecksum, fontVersion, testID); - le_int32 typoFlags = 3; /* kerning + ligatures */ - TestResult actual; - - if (font == NULL) { - /* error message already printed. */ - return; - } - - if (fontName == NULL) { - typoFlags |= 0x80000000L; /* use CharSubstitutionFilter... */ - } - - engine = le_create(font, scriptCode, languageCode, typoFlags, &status); - - if (LE_FAILURE(status)) { - log_err("Test %s: could not create a LayoutEngine.\n", testID); - goto free_expected; - } - - actual.glyphCount = le_layoutChars(engine, text, 0, charCount, charCount, getRTL(text, charCount), 0, 0, &status); - - actual.glyphs = NEW_ARRAY(LEGlyphID, actual.glyphCount); - actual.indices = NEW_ARRAY(le_int32, actual.glyphCount); - actual.positions = NEW_ARRAY(float, actual.glyphCount * 2 + 2); - - le_getGlyphs(engine, actual.glyphs, &status); - le_getCharIndices(engine, actual.indices, &status); - le_getGlyphPositions(engine, actual.positions, &status); - - compareResults(testID, expected, &actual); - - DELETE_ARRAY(actual.positions); - DELETE_ARRAY(actual.indices); - DELETE_ARRAY(actual.glyphs); - - le_close(engine); - -free_expected: - le_fontClose(font); -} - -static void U_CALLCONV DataDrivenTest(void) -{ - char path[2048]; - const char *testFilePath = getPath(path, "letest.xml"); - - readTestFile(testFilePath, doTestCase); -} - -/* - * From ticket:5923: - * - * Build a paragraph that contains a mixture of left to right and right to left text. - * Break it into multiple lines and make sure that the glyphToCharMap for run in each - * line is correct. - * - * Note: it might be a good idea to also check the glyphs and positions for each run, - * that we get the expected number of runs per line and that the line breaks are where - * we expect them to be. Really, it would be a good idea to make a whole test suite - * for pl_paragraph. - */ -static void U_CALLCONV GlyphToCharTest(void) -{ -#if !UCONFIG_NO_BREAK_ITERATION - LEErrorCode status = LE_NO_ERROR; - le_font *font; - pl_fontRuns *fontRuns; - pl_paragraph *paragraph; - const pl_line *line; - /* - * This is the same text that's in /source/samples/layout/Sample.txt - */ - LEUnicode chars[] = { - /*BOM*/ 0x0054, 0x0068, 0x0065, 0x0020, 0x004c, 0x0061, 0x0079, - 0x006f, 0x0075, 0x0074, 0x0045, 0x006e, 0x0067, 0x0069, 0x006e, - 0x0065, 0x0020, 0x0064, 0x006f, 0x0065, 0x0073, 0x0020, 0x0061, - 0x006c, 0x006c, 0x0020, 0x0074, 0x0068, 0x0065, 0x0020, 0x0077, - 0x006f, 0x0072, 0x006b, 0x0020, 0x006e, 0x0065, 0x0063, 0x0065, - 0x0073, 0x0073, 0x0061, 0x0072, 0x0079, 0x0020, 0x0074, 0x006f, - 0x0020, 0x0064, 0x0069, 0x0073, 0x0070, 0x006c, 0x0061, 0x0079, - 0x0020, 0x0055, 0x006e, 0x0069, 0x0063, 0x006f, 0x0064, 0x0065, - 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x0020, 0x0077, 0x0072, - 0x0069, 0x0074, 0x0074, 0x0065, 0x006e, 0x0020, 0x0069, 0x006e, - 0x0020, 0x006c, 0x0061, 0x006e, 0x0067, 0x0075, 0x0061, 0x0067, - 0x0065, 0x0073, 0x0020, 0x0077, 0x0069, 0x0074, 0x0068, 0x0020, - 0x0063, 0x006f, 0x006d, 0x0070, 0x006c, 0x0065, 0x0078, 0x0020, - 0x0077, 0x0072, 0x0069, 0x0074, 0x0069, 0x006e, 0x0067, 0x0020, - 0x0073, 0x0079, 0x0073, 0x0074, 0x0065, 0x006d, 0x0073, 0x0020, - 0x0073, 0x0075, 0x0063, 0x0068, 0x0020, 0x0061, 0x0073, 0x0020, - 0x0048, 0x0069, 0x006e, 0x0064, 0x0069, 0x0020, 0x0028, 0x0939, - 0x093f, 0x0928, 0x094d, 0x0926, 0x0940, 0x0029, 0x0020, 0x0054, - 0x0068, 0x0061, 0x0069, 0x0020, 0x0028, 0x0e44, 0x0e17, 0x0e22, - 0x0029, 0x0020, 0x0061, 0x006e, 0x0064, 0x0020, 0x0041, 0x0072, - 0x0061, 0x0062, 0x0069, 0x0063, 0x0020, 0x0028, 0x0627, 0x0644, - 0x0639, 0x0631, 0x0628, 0x064a, 0x0629, 0x0029, 0x002e, 0x0020, - 0x0048, 0x0065, 0x0072, 0x0065, 0x0027, 0x0073, 0x0020, 0x0061, - 0x0020, 0x0073, 0x0061, 0x006d, 0x0070, 0x006c, 0x0065, 0x0020, - 0x006f, 0x0066, 0x0020, 0x0073, 0x006f, 0x006d, 0x0065, 0x0020, - 0x0074, 0x0065, 0x0078, 0x0074, 0x0020, 0x0077, 0x0072, 0x0069, - 0x0074, 0x0074, 0x0065, 0x006e, 0x0020, 0x0069, 0x006e, 0x0020, - 0x0053, 0x0061, 0x006e, 0x0073, 0x006b, 0x0072, 0x0069, 0x0074, - 0x003a, 0x0020, 0x0936, 0x094d, 0x0930, 0x0940, 0x092e, 0x0926, - 0x094d, 0x0020, 0x092d, 0x0917, 0x0935, 0x0926, 0x094d, 0x0917, - 0x0940, 0x0924, 0x093e, 0x0020, 0x0905, 0x0927, 0x094d, 0x092f, - 0x093e, 0x092f, 0x0020, 0x0905, 0x0930, 0x094d, 0x091c, 0x0941, - 0x0928, 0x0020, 0x0935, 0x093f, 0x0937, 0x093e, 0x0926, 0x0020, - 0x092f, 0x094b, 0x0917, 0x0020, 0x0927, 0x0943, 0x0924, 0x0930, - 0x093e, 0x0937, 0x094d, 0x091f, 0x094d, 0x0930, 0x0020, 0x0909, - 0x0935, 0x093e, 0x091a, 0x0964, 0x0020, 0x0927, 0x0930, 0x094d, - 0x092e, 0x0915, 0x094d, 0x0937, 0x0947, 0x0924, 0x094d, 0x0930, - 0x0947, 0x0020, 0x0915, 0x0941, 0x0930, 0x0941, 0x0915, 0x094d, - 0x0937, 0x0947, 0x0924, 0x094d, 0x0930, 0x0947, 0x0020, 0x0938, - 0x092e, 0x0935, 0x0947, 0x0924, 0x093e, 0x0020, 0x092f, 0x0941, - 0x092f, 0x0941, 0x0924, 0x094d, 0x0938, 0x0935, 0x0903, 0x0020, - 0x092e, 0x093e, 0x092e, 0x0915, 0x093e, 0x0903, 0x0020, 0x092a, - 0x093e, 0x0923, 0x094d, 0x0921, 0x0935, 0x093e, 0x0936, 0x094d, - 0x091a, 0x0948, 0x0935, 0x0020, 0x0915, 0x093f, 0x092e, 0x0915, - 0x0941, 0x0930, 0x094d, 0x0935, 0x0924, 0x0020, 0x0938, 0x0902, - 0x091c, 0x092f, 0x0020, 0x0048, 0x0065, 0x0072, 0x0065, 0x0027, - 0x0073, 0x0020, 0x0061, 0x0020, 0x0073, 0x0061, 0x006d, 0x0070, - 0x006c, 0x0065, 0x0020, 0x006f, 0x0066, 0x0020, 0x0073, 0x006f, - 0x006d, 0x0065, 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x0020, - 0x0077, 0x0072, 0x0069, 0x0074, 0x0074, 0x0065, 0x006e, 0x0020, - 0x0069, 0x006e, 0x0020, 0x0041, 0x0072, 0x0061, 0x0062, 0x0069, - 0x0063, 0x003a, 0x0020, 0x0623, 0x0633, 0x0627, 0x0633, 0x064b, - 0x0627, 0x060c, 0x0020, 0x062a, 0x062a, 0x0639, 0x0627, 0x0645, - 0x0644, 0x0020, 0x0627, 0x0644, 0x062d, 0x0648, 0x0627, 0x0633, - 0x064a, 0x0628, 0x0020, 0x0641, 0x0642, 0x0637, 0x0020, 0x0645, - 0x0639, 0x0020, 0x0627, 0x0644, 0x0623, 0x0631, 0x0642, 0x0627, - 0x0645, 0x060c, 0x0020, 0x0648, 0x062a, 0x0642, 0x0648, 0x0645, - 0x0020, 0x0628, 0x062a, 0x062e, 0x0632, 0x064a, 0x0646, 0x0020, - 0x0627, 0x0644, 0x0623, 0x062d, 0x0631, 0x0641, 0x0020, 0x0648, - 0x0627, 0x0644, 0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x0020, - 0x0627, 0x0644, 0x0623, 0x062e, 0x0631, 0x0649, 0x0020, 0x0628, - 0x0639, 0x062f, 0x0020, 0x0623, 0x0646, 0x0020, 0x062a, 0x064f, - 0x0639, 0x0637, 0x064a, 0x0020, 0x0631, 0x0642, 0x0645, 0x0627, - 0x0020, 0x0645, 0x0639, 0x064a, 0x0646, 0x0627, 0x0020, 0x0644, - 0x0643, 0x0644, 0x0020, 0x0648, 0x0627, 0x062d, 0x062f, 0x0020, - 0x0645, 0x0646, 0x0647, 0x0627, 0x002e, 0x0020, 0x0648, 0x0642, - 0x0628, 0x0644, 0x0020, 0x0627, 0x062e, 0x062a, 0x0631, 0x0627, - 0x0639, 0x0020, 0x0022, 0x064a, 0x0648, 0x0646, 0x0650, 0x0643, - 0x0648, 0x062f, 0x0022, 0x060c, 0x0020, 0x0643, 0x0627, 0x0646, - 0x0020, 0x0647, 0x0646, 0x0627, 0x0643, 0x0020, 0x0645, 0x0626, - 0x0627, 0x062a, 0x0020, 0x0627, 0x0644, 0x0623, 0x0646, 0x0638, - 0x0645, 0x0629, 0x0020, 0x0644, 0x0644, 0x062a, 0x0634, 0x0641, - 0x064a, 0x0631, 0x0020, 0x0648, 0x062a, 0x062e, 0x0635, 0x064a, - 0x0635, 0x0020, 0x0647, 0x0630, 0x0647, 0x0020, 0x0627, 0x0644, - 0x0623, 0x0631, 0x0642, 0x0627, 0x0645, 0x0020, 0x0644, 0x0644, - 0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x060c, 0x0020, 0x0648, - 0x0644, 0x0645, 0x0020, 0x064a, 0x0648, 0x062c, 0x062f, 0x0020, - 0x0646, 0x0638, 0x0627, 0x0645, 0x0020, 0x062a, 0x0634, 0x0641, - 0x064a, 0x0631, 0x0020, 0x0648, 0x0627, 0x062d, 0x062f, 0x0020, - 0x064a, 0x062d, 0x062a, 0x0648, 0x064a, 0x0020, 0x0639, 0x0644, - 0x0649, 0x0020, 0x062c, 0x0645, 0x064a, 0x0639, 0x0020, 0x0627, - 0x0644, 0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, - 0x0644, 0x0636, 0x0631, 0x0648, 0x0631, 0x064a, 0x0629, 0x0020, - 0x0061, 0x006e, 0x0064, 0x0020, 0x0068, 0x0065, 0x0072, 0x0065, - 0x0027, 0x0073, 0x0020, 0x0061, 0x0020, 0x0073, 0x0061, 0x006d, - 0x0070, 0x006c, 0x0065, 0x0020, 0x006f, 0x0066, 0x0020, 0x0073, - 0x006f, 0x006d, 0x0065, 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, - 0x0020, 0x0077, 0x0072, 0x0069, 0x0074, 0x0074, 0x0065, 0x006e, - 0x0020, 0x0069, 0x006e, 0x0020, 0x0054, 0x0068, 0x0061, 0x0069, - 0x003a, 0x0020, 0x0e1a, 0x0e17, 0x0e17, 0x0e35, 0x0e48, 0x0e51, - 0x0e1e, 0x0e32, 0x0e22, 0x0e38, 0x0e44, 0x0e0b, 0x0e42, 0x0e04, - 0x0e25, 0x0e19, 0x0e42, 0x0e14, 0x0e42, 0x0e23, 0x0e18, 0x0e35, - 0x0e2d, 0x0e32, 0x0e28, 0x0e31, 0x0e22, 0x0e2d, 0x0e22, 0x0e39, - 0x0e48, 0x0e17, 0x0e48, 0x0e32, 0x0e21, 0x0e01, 0x0e25, 0x0e32, - 0x0e07, 0x0e17, 0x0e38, 0x0e48, 0x0e07, 0x0e43, 0x0e2b, 0x0e0d, - 0x0e48, 0x0e43, 0x0e19, 0x0e41, 0x0e04, 0x0e19, 0x0e0b, 0x0e31, - 0x0e2a, 0x0e01, 0x0e31, 0x0e1a, 0x0e25, 0x0e38, 0x0e07, 0x0e40, - 0x0e2e, 0x0e19, 0x0e23, 0x0e35, 0x0e0a, 0x0e32, 0x0e27, 0x0e44, - 0x0e23, 0x0e48, 0x0e41, 0x0e25, 0x0e30, 0x0e1b, 0x0e49, 0x0e32, - 0x0e40, 0x0e2d, 0x0e47, 0x0e21, 0x0e20, 0x0e23, 0x0e23, 0x0e22, - 0x0e32, 0x0e0a, 0x0e32, 0x0e27, 0x0e44, 0x0e23, 0x0e48, 0x0e1a, - 0x0e49, 0x0e32, 0x0e19, 0x0e02, 0x0e2d, 0x0e07, 0x0e1e, 0x0e27, - 0x0e01, 0x0e40, 0x0e02, 0x0e32, 0x0e2b, 0x0e25, 0x0e31, 0x0e07, - 0x0e40, 0x0e25, 0x0e47, 0x0e01, 0x0e40, 0x0e1e, 0x0e23, 0x0e32, - 0x0e30, 0x0e44, 0x0e21, 0x0e49, 0x0e2a, 0x0e23, 0x0e49, 0x0e32, - 0x0e07, 0x0e1a, 0x0e49, 0x0e32, 0x0e19, 0x0e15, 0x0e49, 0x0e2d, - 0x0e07, 0x0e02, 0x0e19, 0x0e21, 0x0e32, 0x0e14, 0x0e49, 0x0e27, - 0x0e22, 0x0e40, 0x0e01, 0x0e27, 0x0e35, 0x0e22, 0x0e19, 0x0e40, - 0x0e1b, 0x0e47, 0x0e19, 0x0e23, 0x0e30, 0x0e22, 0x0e30, 0x0e17, - 0x0e32, 0x0e07, 0x0e2b, 0x0e25, 0x0e32, 0x0e22, 0x0e44, 0x0e21, - 0x0e25, 0x0e4c - }; - le_int32 charCount = LE_ARRAY_SIZE(chars); - le_int32 charIndex = 0, lineNumber = 1; - le_int32 run, i; - const float lineWidth = 600; - - font = le_simpleFontOpen(12, &status); - - if (LE_FAILURE(status)) { - log_err("le_simpleFontOpen(12, &status) failed"); - goto finish; - } - - fontRuns = pl_openEmptyFontRuns(0); - pl_addFontRun(fontRuns, font, charCount); - - paragraph = pl_create(chars, charCount, fontRuns, NULL, NULL, NULL, 0, false, &status); - - pl_closeFontRuns(fontRuns); - - if (LE_FAILURE(status)) { - log_err("pl_create failed."); - goto close_font; - } - - pl_reflow(paragraph); - while ((line = pl_nextLine(paragraph, lineWidth)) != NULL) { - le_int32 runCount = pl_countLineRuns(line); - - for(run = 0; run < runCount; run += 1) { - const pl_visualRun *visualRun = pl_getLineVisualRun(line, run); - const le_int32 glyphCount = pl_getVisualRunGlyphCount(visualRun); - const le_int32 *glyphToCharMap = pl_getVisualRunGlyphToCharMap(visualRun); - - if (pl_getVisualRunDirection(visualRun) == UBIDI_RTL) { - /* - * For a right to left run, make sure that the character indices - * increase from the right most glyph to the left most glyph. If - * there are any one to many glyph substitutions, we might get several - * glyphs in a row with the same character index. - */ - for(i = glyphCount - 1; i >= 0; i -= 1) { - le_int32 ix = glyphToCharMap[i]; - - if (ix != charIndex) { - if (ix != charIndex - 1) { - log_err("Bad glyph to char index for glyph %d on line %d: expected %d, got %d\n", - i, lineNumber, charIndex, ix); - goto close_paragraph; /* once there's one error, we can't count on anything else... */ - } - } else { - charIndex += 1; - } - } - } else { - /* - * We can't just check the order of the character indices - * for left to right runs because Indic text might have been - * reordered. What we can do is find the minimum and maximum - * character indices in the run and make sure that the minimum - * is equal to charIndex and then advance charIndex to the maximum. - */ - le_int32 minIndex = 0x7FFFFFFF, maxIndex = -1; - - for(i = 0; i < glyphCount; i += 1) { - le_int32 ix = glyphToCharMap[i]; - - if (ix > maxIndex) { - maxIndex = ix; - } - - if (ix < minIndex) { - minIndex = ix; - } - } - - if (minIndex != charIndex) { - log_err("Bad minIndex for run %d on line %d: expected %d, got %d\n", - run, lineNumber, charIndex, minIndex); - goto close_paragraph; /* once there's one error, we can't count on anything else... */ - } - - charIndex = maxIndex + 1; - } - } - - lineNumber += 1; - } - -close_paragraph: - pl_close(paragraph); - -close_font: - le_fontClose(font); - -finish: - return; -#endif -} - -U_CFUNC void addCTests(TestNode **root) -{ - addTest(root, &ParamTest, "c_api/ParameterTest"); - addTest(root, &FactoryTest, "c_api/FactoryTest"); - addTest(root, &AccessTest, "c_layout/AccessTest"); - addTest(root, &DataDrivenTest, "c_layout/DataDrivenTest"); - addTest(root, &GlyphToCharTest, "c_paragraph/GlyphToCharTest"); -} - - -#endif diff --git a/icu4c/source/test/letest/cletest.sln b/icu4c/source/test/letest/cletest.sln deleted file mode 100644 index 2054f4b7401..00000000000 --- a/icu4c/source/test/letest/cletest.sln +++ /dev/null @@ -1,26 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cletest", "cletest.vcxproj", "{798E3AE4-A984-43FF-8928-EACFF43F56AE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {798E3AE4-A984-43FF-8928-EACFF43F56AE}.Debug|Win32.ActiveCfg = Debug|Win32 - {798E3AE4-A984-43FF-8928-EACFF43F56AE}.Debug|Win32.Build.0 = Debug|Win32 - {798E3AE4-A984-43FF-8928-EACFF43F56AE}.Debug|x64.ActiveCfg = Debug|x64 - {798E3AE4-A984-43FF-8928-EACFF43F56AE}.Debug|x64.Build.0 = Debug|x64 - {798E3AE4-A984-43FF-8928-EACFF43F56AE}.Release|Win32.ActiveCfg = Release|Win32 - {798E3AE4-A984-43FF-8928-EACFF43F56AE}.Release|Win32.Build.0 = Release|Win32 - {798E3AE4-A984-43FF-8928-EACFF43F56AE}.Release|x64.ActiveCfg = Release|x64 - {798E3AE4-A984-43FF-8928-EACFF43F56AE}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = false - EndGlobalSection -EndGlobal diff --git a/icu4c/source/test/letest/cletest.vcxproj b/icu4c/source/test/letest/cletest.vcxproj deleted file mode 100644 index 86a6e032644..00000000000 --- a/icu4c/source/test/letest/cletest.vcxproj +++ /dev/null @@ -1,193 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {798E3AE4-A984-43FF-8928-EACFF43F56AE} - cletest - Win32Proj - - - - Application - Unicode - true - v140 - - - Application - Unicode - v140 - - - Application - Unicode - true - v140 - - - Application - Unicode - v140 - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - $(SolutionDir).\x64\Debug\ - .\x64\Debug\ - true - $(SolutionDir).\x64\Release\ - .\x64\Release\ - false - - - - Disabled - ..\..\..\include\layout;..\..\..\include;..\..\common;..\..\tools\ctestfw;..\..\tools\toolutil;..\..\layout;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - stdcpp17 - stdc11 - - - ..\..\..\lib\icuucd.lib;..\..\..\lib\icuind.lib;..\..\..\lib\icutestd.lib;..\..\..\lib\icutud.lib;..\..\..\lib\iculed.lib;..\..\..\lib\iculxd.lib;%(AdditionalDependencies) - true - Console - NotSet - - - - - ..\..\..\include\layout;..\..\..\include;..\..\common;..\..\tools\ctestfw;..\..\tools\toolutil;..\..\layout;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - MultiThreadedDLL - - - Level3 - ProgramDatabase - - - ..\..\..\lib\icuuc.lib;..\..\..\lib\icuin.lib;..\..\..\lib\icutest.lib;..\..\..\lib\icutu.lib;..\..\..\lib\icule.lib;..\..\..\lib\iculx.lib;%(AdditionalDependencies) - true - Console - true - true - NotSet - - - - - X64 - - - Disabled - ..\..\..\include\layout;..\..\..\include;..\..\common;..\..\tools\ctestfw;..\..\tools\toolutil;..\..\layout;%(AdditionalIncludeDirectories) - WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - ..\..\..\lib64\icuucd.lib;..\..\..\lib64\icuind.lib;..\..\..\lib64\icutestd.lib;..\..\..\lib64\icutud.lib;..\..\..\lib64\iculed.lib;..\..\..\lib64\iculxd.lib;%(AdditionalDependencies) - true - Console - MachineX64 - - - - - X64 - - - ..\..\..\include\layout;..\..\..\include;..\..\common;..\..\tools\ctestfw;..\..\tools\toolutil;..\..\layout;%(AdditionalIncludeDirectories) - WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - MultiThreadedDLL - - - Level3 - ProgramDatabase - - - ..\..\..\lib64\icuuc.lib;..\..\..\lib64\icuin.lib;..\..\..\lib64\icutest.lib;..\..\..\lib64\icutu.lib;..\..\..\lib64\icule.lib;..\..\..\lib64\iculx.lib;%(AdditionalDependencies) - true - Console - true - true - MachineX64 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/icu4c/source/test/letest/cletest.vcxproj.filters b/icu4c/source/test/letest/cletest.vcxproj.filters deleted file mode 100644 index d296ac3c0be..00000000000 --- a/icu4c/source/test/letest/cletest.vcxproj.filters +++ /dev/null @@ -1,81 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/icu4c/source/test/letest/cmaps.cpp b/icu4c/source/test/letest/cmaps.cpp deleted file mode 100644 index 69c08038fec..00000000000 --- a/icu4c/source/test/letest/cmaps.cpp +++ /dev/null @@ -1,252 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/*************************************************************************** -* -* Copyright (C) 1998-2014, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - -#include "layout/LETypes.h" -#include "layout/LESwaps.h" - -#include "sfnt.h" -#include "cmaps.h" -#include - -#define SWAPU16(code) ((LEUnicode16) SWAPW(code)) -#define SWAPU32(code) ((LEUnicode32) SWAPL(code)) - -// -// Finds the high bit by binary searching -// through the bits in value. -// -le_int8 highBit(le_uint32 value) -{ - le_uint8 bit = 0; - - if (value >= 1 << 16) { - value >>= 16; - bit += 16; - } - - if (value >= 1 << 8) { - value >>= 8; - bit += 8; - } - - if (value >= 1 << 4) { - value >>= 4; - bit += 4; - } - - if (value >= 1 << 2) { - value >>= 2; - bit += 2; - } - - if (value >= 1 << 1) { - value >>= 1; - bit += 1; - } - - return bit; -} - -CMAPMapper *CMAPMapper::createUnicodeMapper(const CMAPTable *cmap) -{ - le_uint16 i; - le_uint16 nSubtables = SWAPW(cmap->numberSubtables); - const CMAPEncodingSubtable *subtable = nullptr; - le_bool found = false; - le_uint16 foundPlatformID = 0xFFFF; - le_uint16 foundPlatformSpecificID = 0xFFFF; - le_uint32 foundOffset = 0; - le_uint16 foundTable = 0xFFFF; - // first pass, look for MS table. (preferred?) - for (i = 0; i < nSubtables && !found; i += 1) { - const CMAPEncodingSubtableHeader *esh = &cmap->encodingSubtableHeaders[i]; - - le_uint16 platformID = SWAPW(esh->platformID); - le_uint16 platformSpecificID = SWAPW(esh->platformSpecificID); - if (platformID == 3) { // microsoft - switch (platformSpecificID) { - case 1: // Unicode BMP (UCS-2) - case 10: // Unicode UCS-4 - foundOffset = SWAPL(esh->encodingOffset); - foundPlatformID = platformID; - foundPlatformSpecificID = platformSpecificID; - found = true; - foundTable = i; - break; - - //default: - // printf("%s:%d: microsoft (3) platform specific ID %d (wanted 1 or 10) for subtable %d/%d\n", __FILE__, __LINE__, (SWAPW(esh->platformSpecificID)), i, nSubtables); - } - } else { - //printf("%s:%d: platform ID %d (wanted 3, microsoft) for subtable %d/%d\n", __FILE__, __LINE__, (SWAPW(esh->platformID)), i, nSubtables); - } - } - - // second pass, allow non MS table - // first pass, look for MS table. (preferred?) - for (i = 0; i < nSubtables && !found; i += 1) { - const CMAPEncodingSubtableHeader *esh = &cmap->encodingSubtableHeaders[i]; - le_uint16 platformID = SWAPW(esh->platformID); - le_uint16 platformSpecificID = SWAPW(esh->platformSpecificID); - //printf("%s:%d: table %d/%d has platform:specific %d:%d\n", __FILE__, __LINE__, i, nSubtables, platformID, platformSpecificID); - switch(platformID) { - case 0: // Unicode platform - switch(platformSpecificID) { - case 0: - case 1: - case 2: - case 3: - foundOffset = SWAPL(esh->encodingOffset); - foundPlatformID = platformID; - foundPlatformSpecificID = platformSpecificID; - foundTable = i; - found = true; - break; - - default: printf("Error: table %d (psid %d) is unknown. Skipping.\n", i, platformSpecificID); break; - } - break; - - //default: - //printf("Skipping platform id %d\n", platformID); - } - } - - - if (found) - { - subtable = reinterpret_cast(reinterpret_cast(cmap) + foundOffset); - //printf("%s:%d: using subtable #%d/%d type %d:%d\n", __FILE__, __LINE__, foundTable, nSubtables, foundPlatformID, foundPlatformSpecificID); - (void)foundPlatformID; // Suppress unused variable compiler warnings. - (void)foundTable; - (void)foundPlatformSpecificID; - } else { - printf("%s:%d: could not find subtable.\n", __FILE__, __LINE__); - return nullptr; - } - - le_uint16 tableFormat = SWAPW(subtable->format); - //printf("%s:%d: table format %d\n", __FILE__, __LINE__, tableFormat); - - switch (tableFormat) { - case 4: - return new CMAPFormat4Mapper(cmap, (const CMAPFormat4Encoding *) subtable); - - case 12: - { - const CMAPFormat12Encoding* encoding = reinterpret_cast(subtable); - - return new CMAPGroupMapper(cmap, encoding->groups, SWAPL(encoding->nGroups)); - } - - default: - break; - } - - printf("%s:%d: Unknown format %x.\n", __FILE__, __LINE__, (SWAPW(subtable->format))); - return nullptr; -} - -CMAPFormat4Mapper::CMAPFormat4Mapper(const CMAPTable *cmap, const CMAPFormat4Encoding *header) - : CMAPMapper(cmap) -{ - le_uint16 segCount = SWAPW(header->segCountX2) / 2; - - fEntrySelector = SWAPW(header->entrySelector); - fRangeShift = SWAPW(header->rangeShift) / 2; - fEndCodes = &header->endCodes[0]; - fStartCodes = &header->endCodes[segCount + 1]; // + 1 for reservedPad... - fIdDelta = &fStartCodes[segCount]; - fIdRangeOffset = &fIdDelta[segCount]; -} - -LEGlyphID CMAPFormat4Mapper::unicodeToGlyph(LEUnicode32 unicode32) const -{ - if (unicode32 >= 0x10000) { - return 0; - } - - LEUnicode16 unicode = static_cast(unicode32); - le_uint16 index = 0; - le_uint16 probe = 1 << fEntrySelector; - TTGlyphID result = 0; - - if (SWAPU16(fStartCodes[fRangeShift]) <= unicode) { - index = fRangeShift; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPU16(fStartCodes[index + probe]) <= unicode) { - index += probe; - } - } - - if (unicode >= SWAPU16(fStartCodes[index]) && unicode <= SWAPU16(fEndCodes[index])) { - if (fIdRangeOffset[index] == 0) { - result = static_cast(unicode); - } else { - le_uint16 offset = unicode - SWAPU16(fStartCodes[index]); - le_uint16 rangeOffset = SWAPW(fIdRangeOffset[index]); - const le_uint16* glyphIndexTable = reinterpret_cast(reinterpret_cast(&fIdRangeOffset[index]) + rangeOffset); - - result = SWAPW(glyphIndexTable[offset]); - } - - result += SWAPW(fIdDelta[index]); - } else { - result = 0; - } - - return LE_SET_GLYPH(0, result); -} - -CMAPFormat4Mapper::~CMAPFormat4Mapper() -{ - // parent destructor does it all -} - -CMAPGroupMapper::CMAPGroupMapper(const CMAPTable *cmap, const CMAPGroup *groups, le_uint32 nGroups) - : CMAPMapper(cmap), fGroups(groups) -{ - le_uint8 bit = highBit(nGroups); - fPower = 1 << bit; - fRangeOffset = nGroups - fPower; -} - -LEGlyphID CMAPGroupMapper::unicodeToGlyph(LEUnicode32 unicode32) const -{ - le_int32 probe = fPower; - le_int32 range = 0; - - if (SWAPU32(fGroups[fRangeOffset].startCharCode) <= unicode32) { - range = fRangeOffset; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPU32(fGroups[range + probe].startCharCode) <= unicode32) { - range += probe; - } - } - - if (SWAPU32(fGroups[range].startCharCode) <= unicode32 && SWAPU32(fGroups[range].endCharCode) >= unicode32) { - return static_cast(SWAPU32(fGroups[range].startGlyphCode) + unicode32 - SWAPU32(fGroups[range].startCharCode)); - } - - return 0; -} - -CMAPGroupMapper::~CMAPGroupMapper() -{ - // parent destructor does it all -} - diff --git a/icu4c/source/test/letest/cmaps.h b/icu4c/source/test/letest/cmaps.h deleted file mode 100644 index 59653049569..00000000000 --- a/icu4c/source/test/letest/cmaps.h +++ /dev/null @@ -1,87 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/*************************************************************************** -* -* Copyright (C) 1998-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - - -#ifndef __CMAPS_H -#define __CMAPS_H - -#include "layout/LETypes.h" -//#include "letest.h" -#include "sfnt.h" - -class CMAPMapper -{ -public: - virtual LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const = 0; - - virtual ~CMAPMapper(); - - static CMAPMapper *createUnicodeMapper(const CMAPTable *cmap); - -protected: - CMAPMapper(const CMAPTable *cmap); - - CMAPMapper() {} - -private: - const CMAPTable *fcmap; -}; - -class CMAPFormat4Mapper : public CMAPMapper -{ -public: - CMAPFormat4Mapper(const CMAPTable *cmap, const CMAPFormat4Encoding *header); - - virtual ~CMAPFormat4Mapper(); - - LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const override; - -protected: - CMAPFormat4Mapper() {} - -private: - le_uint16 fEntrySelector; - le_uint16 fRangeShift; - const le_uint16 *fEndCodes; - const le_uint16 *fStartCodes; - const le_uint16 *fIdDelta; - const le_uint16 *fIdRangeOffset; -}; - -class CMAPGroupMapper : public CMAPMapper -{ -public: - CMAPGroupMapper(const CMAPTable *cmap, const CMAPGroup *groups, le_uint32 nGroups); - - virtual ~CMAPGroupMapper(); - - LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const override; - -protected: - CMAPGroupMapper() {} - -private: - le_int32 fPower; - le_int32 fRangeOffset; - const CMAPGroup *fGroups; -}; - -inline CMAPMapper::CMAPMapper(const CMAPTable *cmap) - : fcmap(cmap) -{ - // nothing else to do -} - -inline CMAPMapper::~CMAPMapper() -{ - LE_DELETE_ARRAY(fcmap); -} - -#endif - diff --git a/icu4c/source/test/letest/gendata.cpp b/icu4c/source/test/letest/gendata.cpp deleted file mode 100644 index d1cae234c7a..00000000000 --- a/icu4c/source/test/letest/gendata.cpp +++ /dev/null @@ -1,383 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ******************************************************************************* - * - * Copyright (C) 1999-2013, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: gendata.cpp - * - * created on: 11/03/2000 - * created by: Eric R. Mader - */ - -#include -#include -#include - -#include "unicode/utypes.h" -#include "unicode/unistr.h" -#include "unicode/uscript.h" -#include "unicode/ubidi.h" -#include "unicode/ustring.h" - -#include "layout/LETypes.h" -#include "layout/LEScripts.h" -#include "layout/LayoutEngine.h" - -#include "PortableFontInstance.h" -#include "SimpleFontInstance.h" - -#include "xmlparser.h" - -#include "letsutil.h" -#include "letest.h" - -U_NAMESPACE_USE - -static LEErrorCode overallStatus = LE_NO_ERROR; -struct TestInput -{ - const char *fontName; - LEUnicode *text; - le_int32 textLength; - le_int32 scriptCode; - le_bool rightToLeft; -}; - -/* Returns the path to icu/source/test/testdata/ */ -const char *getSourceTestData() { - const char *srcDataDir = nullptr; -#ifdef U_TOPSRCDIR - srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING; -#else - srcDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; - FILE *f = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING"rbbitst.txt", "r"); - - if (f != nullptr) { - /* We're in icu/source/test/letest/ */ - fclose(f); - } else { - /* We're in icu/source/test/letest/(Debug|Release) */ - srcDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; - } -#endif - - return srcDataDir; -} - -const char *getPath(char buffer[2048], const char *filename) { - const char *testDataDirectory = getSourceTestData(); - - strcpy(buffer, testDataDirectory); - strcat(buffer, filename); - - return buffer; -} - -/* - * FIXME: should use the output file name and the current date. - */ -const char *header = - "\n" - "\n" - "\n" - "\n" - "\n"; - -void dumpLongs(FILE *file, const char *tag, le_int32 *longs, le_int32 count) { - char lineBuffer[8 * 12 + 2]; - le_int32 bufp = 0; - - fprintf(file, " <%s>\n", tag); - - for (int i = 0; i < count; i += 1) { - if (i % 8 == 0 && bufp != 0) { - fprintf(file, " %s\n", lineBuffer); - bufp = 0; - } - - bufp += snprintf(&lineBuffer[bufp], sizeof(lineBuffer) - bufp, "0x%8.8X, ", longs[i]); - } - - if (bufp != 0) { - lineBuffer[bufp - 2] = '\0'; - fprintf(file, " %s\n", lineBuffer); - } - - fprintf(file, " \n\n", tag); -} - -void dumpFloats(FILE *file, const char *tag, float *floats, le_int32 count) { - char lineBuffer[8 * 16 + 2]; - le_int32 bufp = 0; - - fprintf(file, " <%s>\n", tag); - - for (int i = 0; i < count; i += 1) { - if (i % 8 == 0 && bufp != 0) { - fprintf(file, " %s\n", lineBuffer); - bufp = 0; - } - - bufp += snprintf(&lineBuffer[bufp], sizeof(lineBuffer) - bufp, "%f, ", floats[i]); - } - - if (bufp != 0) { - lineBuffer[bufp - 2] = '\0'; - fprintf(file, " %s\n", lineBuffer); - } - - fprintf(file, " \n", tag); -} - -int main(int argc, char *argv[]) -{ - UErrorCode status = U_ZERO_ERROR; - const char *gendataFile = "gendata.xml"; - FILE *outputFile = fopen(argv[1], "w"); - if(argc>2) { - gendataFile = argv[2]; - } - time_t now = time(nullptr); - struct tm *local = localtime(&now); - const char *tmFormat = "%m/%d/%Y %I:%M:%S %p %Z"; - char tmString[64]; - le_uint32 count = 0; - strftime(tmString, 64, tmFormat, local); - fprintf(outputFile, header, local->tm_year + 1900, tmString); - - UXMLParser *parser = UXMLParser::createParser(status); - UXMLElement *root = parser->parseFile(gendataFile, status); - - if (root == nullptr) { - printf("Error: Could not open %s\n", gendataFile); - delete parser; - return -1; - } else if(U_FAILURE(status)) { - printf("Error reading %s: %s\n", gendataFile, u_errorName(status)); - return -2; - } else { - printf("Reading %s\n", gendataFile); - } - - UnicodeString test_case = UNICODE_STRING_SIMPLE("test-case"); - UnicodeString test_text = UNICODE_STRING_SIMPLE("test-text"); - UnicodeString test_font = UNICODE_STRING_SIMPLE("test-font"); - - // test-case attributes - UnicodeString id_attr = UNICODE_STRING_SIMPLE("id"); - UnicodeString script_attr = UNICODE_STRING_SIMPLE("script"); - UnicodeString lang_attr = UNICODE_STRING_SIMPLE("lang"); - - // test-font attributes - UnicodeString name_attr = UNICODE_STRING_SIMPLE("name"); - - const UXMLElement *testCase; - int32_t tc = 0; - - while((testCase = root->nextChildElement(tc)) != nullptr) { - if (testCase->getTagName().compare(test_case) == 0) { - char *id = getCString(testCase->getAttribute(id_attr)); - char *script = getCString(testCase->getAttribute(script_attr)); - char *lang = getCString(testCase->getAttribute(lang_attr)); - ++count; - printf("\n ID %s\n", id); - LEFontInstance *font = nullptr; - const UXMLElement *element; - int32_t ec = 0; - int32_t charCount = 0; - int32_t typoFlags = LayoutEngine::kTypoFlagKern | LayoutEngine::kTypoFlagLiga; // kerning + ligatures... - UScriptCode scriptCode; - le_int32 languageCode = -1; - UnicodeString text; - int32_t glyphCount = 0; - LEErrorCode leStatus = LE_NO_ERROR; - LayoutEngine *engine = nullptr; - LEGlyphID *glyphs = nullptr; - le_int32 *indices = nullptr; - float *positions = nullptr; - - uscript_getCode(script, &scriptCode, 1, &status); - if (LE_FAILURE(status)) { - printf("Error: invalid script name: %s.\n", script); - goto free_c_strings; - } - - if (lang != nullptr) { - languageCode = getLanguageCode(lang); - - if (languageCode < 0) { - printf("Error: invalid language name: %s.\n", lang); - goto free_c_strings; - } - - fprintf(outputFile, " \n", id, script, lang); - } else { - fprintf(outputFile, " \n", id, script); - } - - while((element = testCase->nextChildElement(ec)) != nullptr) { - UnicodeString tag = element->getTagName(); - - // TODO: make sure that each element is only used once. - if (tag.compare(test_font) == 0) { - char *fontName = getCString(element->getAttribute(name_attr)); - const char *version = nullptr; - char buf[2048]; - PortableFontInstance *pfi = new PortableFontInstance(getPath(buf,fontName), 12, leStatus); - - if (LE_FAILURE(leStatus)) { - printf("Error: could not open font: %s (path: %s)\n", fontName, buf); - freeCString(fontName); - goto free_c_strings; - } - - printf(" Generating: %s, %s, %s, %s\n", id, script, lang, fontName); - - version = pfi->getNameString(NAME_VERSION_STRING, PLATFORM_MACINTOSH, MACINTOSH_ROMAN, MACINTOSH_ENGLISH); - - // The standard recommends that the Macintosh Roman/English name string be present, but - // if it's not, try the Microsoft Unicode/English string. - if (version == nullptr) { - const LEUnicode16 *uversion = pfi->getUnicodeNameString(NAME_VERSION_STRING, PLATFORM_MICROSOFT, MICROSOFT_UNICODE_BMP, MICROSOFT_ENGLISH); - - if (uversion != nullptr) { - char uversion_utf8[300]; - UErrorCode status2 = U_ZERO_ERROR; - u_strToUTF8(uversion_utf8, 300, nullptr, uversion, -1, &status2); - if(U_FAILURE(status2)) { - uversion_utf8[0]=0; - } - fprintf(outputFile, " \n\n", - fontName, uversion_utf8, pfi->getFontChecksum(), pfi->getRawChecksum()); - - pfi->deleteNameString(uversion); - } else { - fprintf(outputFile, " \n\n", - fontName, pfi->getFontChecksum(), pfi->getFontChecksum(), pfi->getRawChecksum()); - } - } else { - fprintf(outputFile, " \n\n", - fontName, version, pfi->getFontChecksum(), pfi->getRawChecksum()); - - pfi->deleteNameString(version); - } - fflush(outputFile); - - freeCString(fontName); - - font = pfi; - } else if (tag.compare(test_text) == 0) { - char *utf8 = nullptr; - - text = element->getText(true); - charCount = text.length(); - - utf8 = getUTF8String(&text); - fprintf(outputFile, " %s\n\n", utf8); - fflush(outputFile); - freeCString(utf8); - } else { - // an unknown tag... - char *cTag = getCString(&tag); - - printf("Test %s: unknown element with tag \"%s\"\n", id, cTag); - freeCString(cTag); - } - } - - if (font == nullptr) { - LEErrorCode fontStatus = LE_NO_ERROR; - - font = new SimpleFontInstance(12, fontStatus); - typoFlags |= 0x80000000L; // use CharSubstitutionFilter... - } - - engine = LayoutEngine::layoutEngineFactory(font, scriptCode, languageCode, typoFlags, leStatus); - - if (LE_FAILURE(leStatus)) { - printf("Error for test %s: could not create a LayoutEngine.\n", id); - goto delete_font; - } - - glyphCount = engine->layoutChars(text.getBuffer(), 0, charCount, charCount, getRTL(text), 0, 0, leStatus); - - glyphs = NEW_ARRAY(LEGlyphID, glyphCount); - indices = NEW_ARRAY(le_int32, glyphCount); - positions = NEW_ARRAY(float, glyphCount * 2 + 2); - - engine->getGlyphs(glyphs, leStatus); - engine->getCharIndices(indices, leStatus); - engine->getGlyphPositions(positions, leStatus); - - if(LE_FAILURE(leStatus)) { - fprintf(stderr, "ERROR: LO returned error: %s\n", u_errorName(static_cast(leStatus))); - overallStatus = leStatus; - fprintf(outputFile, "\n", leStatus); - fflush(outputFile); - leStatus = LE_NO_ERROR; - } else { - dumpLongs(outputFile, "result-glyphs", reinterpret_cast(glyphs), glyphCount); - - dumpLongs(outputFile, "result-indices", indices, glyphCount); - - dumpFloats(outputFile, "result-positions", positions, glyphCount * 2 + 2); - fflush(outputFile); - - } - - DELETE_ARRAY(positions); - DELETE_ARRAY(indices); - DELETE_ARRAY(glyphs); - - delete engine; - -delete_font: - fprintf(outputFile, " \n\n"); - fflush(outputFile); - - delete font; - -free_c_strings: - freeCString(lang); - freeCString(script); - freeCString(id); - } - } - - delete root; - delete parser; - - fprintf(outputFile, "\n"); - - if(count==0) { - fprintf(stderr, "No cases processed!\n"); - return 1; - } - - - if(LE_FAILURE(overallStatus)) { - fprintf(outputFile, "\n", overallStatus); - fprintf(stderr, "!!! FAILED. %d\n", overallStatus); - fclose(outputFile); - return 0; - // return 1; - } else { - printf("Generated.\n"); - fclose(outputFile); - return 0; - } -} diff --git a/icu4c/source/test/letest/gendata.sln b/icu4c/source/test/letest/gendata.sln deleted file mode 100644 index 23bf47eb22a..00000000000 --- a/icu4c/source/test/letest/gendata.sln +++ /dev/null @@ -1,25 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gendata", "gendata.vcxproj", "{DA322426-C37C-4909-A99D-16B05E7FA498}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DA322426-C37C-4909-A99D-16B05E7FA498}.Debug|Win32.ActiveCfg = Debug|Win32 - {DA322426-C37C-4909-A99D-16B05E7FA498}.Debug|Win32.Build.0 = Debug|Win32 - {DA322426-C37C-4909-A99D-16B05E7FA498}.Debug|x64.ActiveCfg = Debug|x64 - {DA322426-C37C-4909-A99D-16B05E7FA498}.Debug|x64.Build.0 = Debug|x64 - {DA322426-C37C-4909-A99D-16B05E7FA498}.Release|Win32.ActiveCfg = Release|Win32 - {DA322426-C37C-4909-A99D-16B05E7FA498}.Release|Win32.Build.0 = Release|Win32 - {DA322426-C37C-4909-A99D-16B05E7FA498}.Release|x64.ActiveCfg = Release|x64 - {DA322426-C37C-4909-A99D-16B05E7FA498}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = false - EndGlobalSection -EndGlobal diff --git a/icu4c/source/test/letest/gendata.vcxproj b/icu4c/source/test/letest/gendata.vcxproj deleted file mode 100644 index fcef1792dc8..00000000000 --- a/icu4c/source/test/letest/gendata.vcxproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {DA322426-C37C-4909-A99D-16B05E7FA498} - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .\x86\Debug\ - .\x86\Debug\ - true - .\x64\Debug\ - .\x64\Debug\ - true - .\x86\Release\ - .\x86\Release\ - false - .\x64\Release\ - .\x64\Release\ - false - - - - .\x86\Debug/gendata.tlb - - - Disabled - ..\..\..\include\layout;..\..\..\include;..\..\common;..\..\layout;..\..\tools\ctestfw;..\..\tools\toolutil;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;LE_USE_CMEMORY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - true - - - .\x86\Debug/gendata.pch - .\x86\Debug/ - .\x86\Debug/ - .\x86\Debug/ - Level3 - true - EditAndContinue - Default - stdcpp17 - stdc11 - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - ..\..\..\lib\iculed.lib;..\..\..\lib\icuucd.lib;..\..\..\lib\icutud.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - .\x86\Debug/gendata.exe - true - true - .\x86\Debug/gendata.pdb - Console - - - - - - - X64 - .\x64\Debug/gendata.tlb - - - Disabled - ..\..\..\include\layout;..\..\..\include;..\..\common;..\..\layout;..\..\tools\ctestfw;..\..\tools\toolutil;%(AdditionalIncludeDirectories) - WIN64;WIN32;_DEBUG;_CONSOLE;LE_USE_CMEMORY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - true - - - .\x64\Debug/gendata.pch - .\x64\Debug/ - .\x64\Debug/ - .\x64\Debug/ - Level3 - true - ProgramDatabase - Default - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - ..\..\..\lib64\iculed.lib;..\..\..\lib64\icuucd.lib;..\..\..\lib64\icutud.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - .\x64\Debug/gendata.exe - true - true - .\x64\Debug/gendata.pdb - Console - - - MachineX64 - - - - - .\x86\Release/gendata.tlb - - - OnlyExplicitInline - ..\..\..\include\layout;..\..\..\include;..\..\common;..\..\layout;..\..\tools\ctestfw;..\..\tools\toolutil;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;LE_USE_CMEMORY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - true - MultiThreaded - true - true - - - .\x86\Release/gendata.pch - .\x86\Release/ - .\x86\Release/ - .\x86\Release/ - Level3 - true - Default - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - ..\..\..\lib\icule.lib;..\..\..\lib\icuuc.lib;..\..\..\lib\icutu.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - .\x86\Release/gendata.exe - true - .\x86\Release/gendata.pdb - Console - - - - - - - X64 - .\x64\Release/gendata.tlb - - - OnlyExplicitInline - ..\..\..\include\layout;..\..\..\include;..\..\common;..\..\layout;..\..\tools\ctestfw;..\..\tools\toolutil;%(AdditionalIncludeDirectories) - WIN64;WIN32;NDEBUG;_CONSOLE;LE_USE_CMEMORY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - true - MultiThreaded - true - true - - - .\x64\Release/gendata.pch - .\x64\Release/ - .\x64\Release/ - .\x64\Release/ - Level3 - true - Default - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - ..\..\..\lib64\icule.lib;..\..\..\lib64\icuuc.lib;..\..\..\lib64\icutu.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - .\x64\Release/gendata.exe - true - .\x64\Release/gendata.pdb - Console - - - MachineX64 - - - - - - - - - - - - - - - - - - - - - - - diff --git a/icu4c/source/test/letest/gendata.vcxproj.filters b/icu4c/source/test/letest/gendata.vcxproj.filters deleted file mode 100644 index 1113fe6a9ee..00000000000 --- a/icu4c/source/test/letest/gendata.vcxproj.filters +++ /dev/null @@ -1,60 +0,0 @@ - - - - - {8a1204a1-4a7b-4382-a68f-92343fbfe65c} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {b3d65edb-0bf9-44db-a4b9-68db05f8431c} - h;hpp;hxx;hm;inl - - - {b4329bb6-c1a3-4c0c-9c09-317bcc35981a} - ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/icu4c/source/test/letest/gendata.xml b/icu4c/source/test/letest/gendata.xml deleted file mode 100644 index a44c15ec8df..00000000000 --- a/icu4c/source/test/letest/gendata.xml +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - श्रीमद् भगवद्गीता अध्याय अर्जुन विषाद योग धृतराष्ट्र उवाचृ धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः मामकाः पाण्डवाश्चैव किमकुर्वत संजव - - - - - أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية - - - - - أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية - - - - - บทที่๑พายุไซโคลนโดโรธีอาศัยอยู่ท่ามกลางทุ่งใหญ่ในแคนซัสกับลุงเฮนรีชาวไร่และป้าเอ็มภรรยาชาวไร่บ้านของพวกเขาหลังเล็กเพราะไม้สร้างบ้านต้องขนมาด้วยเกวียนเป็นระยะทางหลายไมล์ - - - - - أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية - - - - - ुं ं॑ - - - - - कँ कं कः क॑ क॒ कँ॑ कं॒ कँंः क॒॑ - - - - - रू क़् क्ष क्कि क्रि ट्रि हिन्दी र्क्रिं क्षत्रज्ञत्रक्ष श्र थ्र श्र कके र्कें केूकूेकेृ र्कू क़ क क् क्ष क्ष् क्ष्क ज़ ज ज् ज्ञ ज्ञ् ज्ञ्क र्क र्क्क ड्र क्क क़्क क़्क क़् क्ष्क क्ष् त्र्क द्द कि हि रू रु र्के र्कं क् कु के द्द्द क़्ष क्ष र्क्षे द्दत्र्क ज्ञ क्त्व ज्ञ्क र्कँ र्किँ र्केँ र्क्रिँ हिंदी ह्मिह्यिखि ङ्क ङ्म ङ्क्त ङ्ख ङ्ग ङ्घ ङ्क्ष ङ्क्ष्व ङ्क्ष्य र्क्त्वि र्र्र्र कै के कु कू कृ कॅ कॆ हु हू हॆ है हे - - - - - 中华人民共和国 台湾 中華人民共和國 臺灣 - - - - - 中华人民共和国 台湾 中華人民共和國 臺灣 - - - - - 中华人民共和国 台湾 中華人民共和國 臺灣 - - - - - 中华人民共和国 台湾 中華人民共和國 臺灣 - - - - - शङ़ु - - - - - शङ़ु - - - - - क्ष र्क क्‍ष र्‍क - - - - - 마만만 - - - - - מָשְׁכֵנִיאַחֲרֶיךָנָּרוּצָההֱבִיאַנִיהַמֶּלֶךְחֲדָרָיונָגִילָהוְנִשְׂמְחָהבָּךְנַזְכִּירָהדֹדֶיךָמִיַּיִןמֵישָׁרִיםאֲהֵבוּךָ - - - - - Ţhiş iş a ţeşţ. - - - - - Ţhiş iş a ţeşţ. - - - - - فتح بینچ خلیج شیخ پہنچ - - - - - ഹോം - - - - - റ്1്',s - - - - - ണു് - - - - - 中華人民共和國 臺灣 - - - - - ప్రకాష్ - - - - - บทที่๑พายุไซโคลนโดโรธีอาศัยอยู่ท่ามกลางทุ่งใหญ่ในแคนซัสกับลุงเฮนรีชาวไร่และป้าเอ็มภรรยาชาวไร่บ้านของพวกเขาหลังเล็กเพราะไม้สร้างบ้านต้องขนมาด้วยเกวียนเป็นระยะทางหลายไมล์ - - - - - ක්‍රෙ ක්‍යෙ ක්‍ෂෙ ක්‍ෂ්‍යෙ ක්ෂෙ කර්‍මෙ ස්ට්‍රේ ස‍්සෙ ස්ස - - - - - ‭ﻲﺑﺮﻌﻟﺎﺑ - - - - - ﻲﺑﺮﻌﻟﺎﺑ - - - - - ḤḤ - - - - - र्य र्‌य - - - - - The quick brown fox jumps over the lazy dog. • Jackdaws love my big sphinx of quartz - - - - - Pack my bags with six dozen liquor jugs - - - - - Li kien kien, li kieku kieku. - - - - Il-Mistoqsija oħt l-għerf. - - - - - ༄༅།། ཏིན་ཏིན་གྱི་དཔའ་རྩལ - - - - - ᄊᆞᆷ ᄒᆞᆫ글 ᄀᆞᇹ ᄫᆞᆼ - - - - - के े - - - - - अँग्रेज़ी - - - - - To WAVA is easy, it’s the 1,452 other glyphs in the office I’m worried about! - - - - To WAVA is easy, it’s the 1,452 other glyphs in the office I’m worried about! - - - - Orient Bug - - - diff --git a/icu4c/source/test/letest/letest.cpp b/icu4c/source/test/letest/letest.cpp index a0b3ec70a69..287862a64e5 100644 --- a/icu4c/source/test/letest/letest.cpp +++ b/icu4c/source/test/letest/letest.cpp @@ -16,7 +16,6 @@ #include "unicode/utypes.h" #include "unicode/uclean.h" #include "unicode/uchar.h" -#include "unicode/unistr.h" #include "unicode/uscript.h" #include "unicode/putil.h" #include "unicode/ctest.h" @@ -28,13 +27,10 @@ #include "layout/ParagraphLayout.h" #include "layout/RunArrays.h" -#include "PortableFontInstance.h" #include "SimpleFontInstance.h" -#include "letsutil.h" #include "letest.h" -#include "xmlparser.h" #include "putilimp.h" // for uprv_getUTCtime() #include @@ -42,8 +38,6 @@ U_NAMESPACE_USE -#define CH_COMMA 0x002C - U_CDECL_BEGIN static void U_CALLCONV ParamTest() @@ -320,416 +314,6 @@ bail: } U_CDECL_END -le_bool compareResults(const char *testID, TestResult *expected, TestResult *actual) -{ - /* NOTE: we'll stop on the first failure 'cause once there's one error, it may cascade... */ - if (actual->glyphCount != expected->glyphCount) { - log_knownIssue("ICU-22628", - "Test %s: incorrect glyph count: expected %d, got %d\n", - testID, expected->glyphCount, actual->glyphCount); - return false; - } - - le_int32 i; - - for (i = 0; i < actual->glyphCount; i += 1) { - if (actual->glyphs[i] != expected->glyphs[i]) { - log_err("Test %s: incorrect id for glyph %d: expected %4X, got %4X\n", - testID, i, expected->glyphs[i], actual->glyphs[i]); - return false; - } - } - - for (i = 0; i < actual->glyphCount; i += 1) { - if (actual->indices[i] != expected->indices[i]) { - log_err("Test %s: incorrect index for glyph %d: expected %8X, got %8X\n", - testID, i, expected->indices[i], actual->indices[i]); - return false; - } - } - - for (i = 0; i <= actual->glyphCount; i += 1) { - double xError = uprv_fabs(actual->positions[i * 2] - expected->positions[i * 2]); - - if (xError > 0.0001) { - log_err("Test %s: incorrect x position for glyph %d: expected %f, got %f\n", - testID, i, expected->positions[i * 2], actual->positions[i * 2]); - return false; - } - - double yError = uprv_fabs(actual->positions[i * 2 + 1] - expected->positions[i * 2 + 1]); - - if (yError < 0) { - yError = -yError; - } - - if (yError > 0.0001) { - log_err("Test %s: incorrect y position for glyph %d: expected %f, got %f\n", - testID, i, expected->positions[i * 2 + 1], actual->positions[i * 2 + 1]); - return false; - } - } - - return true; -} - -static void checkFontVersion(PortableFontInstance *fontInstance, const char *testVersionString, - le_uint32 testChecksum, const char *testID) -{ - le_uint32 fontChecksum = fontInstance->getFontChecksum(); - - if (fontChecksum != testChecksum) { - const char *fontVersionString = fontInstance->getNameString(NAME_VERSION_STRING, - PLATFORM_MACINTOSH, MACINTOSH_ROMAN, MACINTOSH_ENGLISH); - const LEUnicode *uFontVersionString = nullptr; - - // The standard recommends that the Macintosh Roman/English name string be present, but - // if it's not, try the Microsoft Unicode/English string. - if (fontVersionString == nullptr) { - uFontVersionString = fontInstance->getUnicodeNameString(NAME_VERSION_STRING, - PLATFORM_MICROSOFT, MICROSOFT_UNICODE_BMP, MICROSOFT_ENGLISH); - } - - log_info("Test %s: this may not be the same font used to generate the test data.\n", testID); - - if (uFontVersionString != nullptr) { - log_info("Your font's version string is \"%S\"\n", uFontVersionString); - fontInstance->deleteNameString(uFontVersionString); - } else { - log_info("Your font's version string is \"%s\"\n", fontVersionString); - fontInstance->deleteNameString(fontVersionString); - } - - log_info("The expected version string is \"%s\"\n", testVersionString); - log_info("If you see errors, they may be due to the version of the font you're using.\n"); - } -} - -/* Returns the path to icu/source/test/testdata/ */ -const char *getSourceTestData() { - const char *srcDataDir = nullptr; -#ifdef U_TOPSRCDIR - srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING; -#else - srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING; - FILE *f = fopen(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "rbbitst.txt", "r"); - - if (f != nullptr) { - /* We're in icu/source/test/letest/ */ - fclose(f); - } else { - /* We're in icu/source/test/letest/(Debug|Release) */ - srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" - U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING; - } -#endif - - return srcDataDir; -} - -const char *getPath(char buffer[2048], const char *filename) { - const char *testDataDirectory = getSourceTestData(); - - strcpy(buffer, testDataDirectory); - strcat(buffer, filename); - - return buffer; -} - -le_uint32 *getHexArray(const UnicodeString &numbers, int32_t &arraySize) -{ - int32_t offset = -1; - - arraySize = 1; - while((offset = numbers.indexOf(CH_COMMA, offset + 1)) >= 0) { - arraySize += 1; - } - - le_uint32 *array = NEW_ARRAY(le_uint32, arraySize); - char number[16]; - le_int32 count = 0; - le_int32 start = 0, end = 0; - le_int32 len = 0; - - // trim leading whitespace - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - while((end = numbers.indexOf(CH_COMMA, start)) >= 0) { - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - start = end + 1; - - sscanf(number, "%x", &array[count++]); - - // trim whitespace following the comma - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - } - - // trim trailing whitespace - end = numbers.length(); - while(u_isUWhiteSpace(numbers[end - 1])) { - end -= 1; - } - - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - sscanf(number, "%x", &array[count]); - - return array; -} - -float *getFloatArray(const UnicodeString &numbers, int32_t &arraySize) -{ - int32_t offset = -1; - - arraySize = 1; - while((offset = numbers.indexOf(CH_COMMA, offset + 1)) >= 0) { - arraySize += 1; - } - - float *array = NEW_ARRAY(float, arraySize); - char number[32]; - le_int32 count = 0; - le_int32 start = 0, end = 0; - le_int32 len = 0; - - // trim leading whitespace - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - while((end = numbers.indexOf(CH_COMMA, start)) >= 0) { - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - start = end + 1; - - sscanf(number, "%f", &array[count++]); - - // trim whiteapce following the comma - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - } - - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - // trim trailing whitespace - end = numbers.length(); - while(u_isUWhiteSpace(numbers[end - 1])) { - end -= 1; - } - - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - sscanf(number, "%f", &array[count]); - - return array; -} - -LEFontInstance *openFont(const char *fontName, const char *checksum, const char *version, const char *testID) -{ - char path[2048]; - PortableFontInstance *font; - LEErrorCode fontStatus = LE_NO_ERROR; - - - font = new PortableFontInstance(getPath(path, fontName), 12, fontStatus); - - if (LE_FAILURE(fontStatus)) { - log_info("Test %s: can't open font %s - test skipped.\n", testID, fontName); - delete font; - return nullptr; - } else { - le_uint32 cksum = 0; - - sscanf(checksum, "%x", &cksum); - - checkFontVersion(font, version, cksum, testID); - } - - return font; -} - -U_CDECL_BEGIN -static void U_CALLCONV DataDrivenTest() -{ -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - UErrorCode status = U_ZERO_ERROR; - char path[2048]; - const char *testFilePath = getPath(path, "letest.xml"); - - UXMLParser *parser = UXMLParser::createParser(status); - UXMLElement *root = parser->parseFile(testFilePath, status); - - if (root == nullptr) { - log_err("Could not open the test data file: %s\n", testFilePath); - delete parser; - return; - } - - UnicodeString test_case = UNICODE_STRING_SIMPLE("test-case"); - UnicodeString test_text = UNICODE_STRING_SIMPLE("test-text"); - UnicodeString test_font = UNICODE_STRING_SIMPLE("test-font"); - UnicodeString result_glyphs = UNICODE_STRING_SIMPLE("result-glyphs"); - UnicodeString result_indices = UNICODE_STRING_SIMPLE("result-indices"); - UnicodeString result_positions = UNICODE_STRING_SIMPLE("result-positions"); - - // test-case attributes - UnicodeString id_attr = UNICODE_STRING_SIMPLE("id"); - UnicodeString script_attr = UNICODE_STRING_SIMPLE("script"); - UnicodeString lang_attr = UNICODE_STRING_SIMPLE("lang"); - - // test-font attributes - UnicodeString name_attr = UNICODE_STRING_SIMPLE("name"); - UnicodeString ver_attr = UNICODE_STRING_SIMPLE("version"); - UnicodeString cksum_attr = UNICODE_STRING_SIMPLE("checksum"); - - const UXMLElement *testCase; - int32_t tc = 0; - - while((testCase = root->nextChildElement(tc)) != nullptr) { - if (testCase->getTagName().compare(test_case) == 0) { - char *id = getCString(testCase->getAttribute(id_attr)); - char *script = getCString(testCase->getAttribute(script_attr)); - char *lang = getCString(testCase->getAttribute(lang_attr)); - LEFontInstance *font = nullptr; - const UXMLElement *element; - int32_t ec = 0; - int32_t charCount = 0; - int32_t typoFlags = 3; // kerning + ligatures... - UScriptCode scriptCode; - le_int32 languageCode = -1; - UnicodeString text, glyphs, indices, positions; - int32_t glyphCount = 0, indexCount = 0, positionCount = 0; - TestResult expected = {0, nullptr, nullptr, nullptr}; - TestResult actual = {0, nullptr, nullptr, nullptr}; - LEErrorCode success = LE_NO_ERROR; - LayoutEngine *engine = nullptr; - - uscript_getCode(script, &scriptCode, 1, &status); - if (LE_FAILURE(status)) { - log_err("invalid script name: %s.\n", script); - goto free_c_strings; - } - - if (lang != nullptr) { - languageCode = getLanguageCode(lang); - - if (languageCode < 0) { - log_err("invalid language name: %s.\n", lang); - goto free_c_strings; - } - } - - while((element = testCase->nextChildElement(ec)) != nullptr) { - UnicodeString tag = element->getTagName(); - - // TODO: make sure that each element is only used once. - if (tag.compare(test_font) == 0) { - char *fontName = getCString(element->getAttribute(name_attr)); - char *fontVer = getCString(element->getAttribute(ver_attr)); - char *fontCksum = getCString(element->getAttribute(cksum_attr)); - - font = openFont(fontName, fontCksum, fontVer, id); - freeCString(fontCksum); - freeCString(fontVer); - freeCString(fontName); - - if (font == nullptr) { - // warning message already displayed... - goto free_c_strings; - } - } else if (tag.compare(test_text) == 0) { - text = element->getText(true); - charCount = text.length(); - } else if (tag.compare(result_glyphs) == 0) { - glyphs = element->getText(true); - } else if (tag.compare(result_indices) == 0) { - indices = element->getText(true); - } else if (tag.compare(result_positions) == 0) { - positions = element->getText(true); - } else { - // an unknown tag... - char *cTag = getCString(&tag); - - log_info("Test %s: unknown element with tag \"%s\"\n", id, cTag); - freeCString(cTag); - } - } - - // TODO: make sure that the font, test-text, result-glyphs, result-indices and result-positions - // have all been provided - if (font == nullptr) { - LEErrorCode fontStatus = LE_NO_ERROR; - - font = new SimpleFontInstance(12, fontStatus); - typoFlags |= 0x80000000L; // use CharSubstitutionFilter... - } - - expected.glyphs = (LEGlyphID *) getHexArray(glyphs, glyphCount); - expected.indices = (le_int32 *) getHexArray(indices, indexCount); - expected.positions = getFloatArray(positions, positionCount); - - expected.glyphCount = glyphCount; - - if (glyphCount < charCount || indexCount != glyphCount || positionCount < glyphCount * 2 + 2) { - log_err("Test %s: inconsistent input data: charCount = %d, glyphCount = %d, indexCount = %d, positionCount = %d\n", - id, charCount, glyphCount, indexCount, positionCount); - goto free_expected; - }; - - engine = LayoutEngine::layoutEngineFactory(font, scriptCode, languageCode, typoFlags, success); - - if (LE_FAILURE(success)) { - log_err("Test %s: could not create a LayoutEngine.\n", id); - goto free_expected; - } - - actual.glyphCount = engine->layoutChars(text.getBuffer(), 0, charCount, charCount, getRTL(text), 0, 0, success); - - actual.glyphs = NEW_ARRAY(LEGlyphID, actual.glyphCount); - actual.indices = NEW_ARRAY(le_int32, actual.glyphCount); - actual.positions = NEW_ARRAY(float, actual.glyphCount * 2 + 2); - - engine->getGlyphs(actual.glyphs, success); - engine->getCharIndices(actual.indices, success); - engine->getGlyphPositions(actual.positions, success); - - compareResults(id, &expected, &actual); - - DELETE_ARRAY(actual.positions); - DELETE_ARRAY(actual.indices); - DELETE_ARRAY(actual.glyphs); - - delete engine; - - log_verbose("OK - %4d glyphs: %s\n", actual.glyphCount, id); -free_expected: - DELETE_ARRAY(expected.positions); - DELETE_ARRAY(expected.indices); - DELETE_ARRAY(expected.glyphs); - - delete font; - -free_c_strings: - freeCString(lang); - freeCString(script); - freeCString(id); - } - } - - delete root; - delete parser; -#endif -} -U_CDECL_END - U_CDECL_BEGIN /* * From ticket:5923: @@ -965,12 +549,7 @@ static void addAllTests(TestNode **root) addTest(root, &ParamTest, "api/ParameterTest"); addTest(root, &FactoryTest, "api/FactoryTest"); addTest(root, &AccessTest, "layout/AccessTest"); - addTest(root, &DataDrivenTest, "layout/DataDrivenTest"); addTest(root, &GlyphToCharTest, "paragraph/GlyphToCharTest"); - -#ifndef USING_ICULEHB - addCTests(root); -#endif } /* returns the path to icu/source/data/out */ diff --git a/icu4c/source/test/letest/letest.h b/icu4c/source/test/letest/letest.h index b26e85762ce..c3a42b81e12 100644 --- a/icu4c/source/test/letest/letest.h +++ b/icu4c/source/test/letest/letest.h @@ -16,41 +16,9 @@ #ifndef __LETEST_H #define __LETEST_H - -#ifdef USING_ICULEHB -#include "layout/LETypes.h" -#else -#include "LETypes.h" -#endif -#include "unicode/ctest.h" - #include -#include - -U_NAMESPACE_USE - -#define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) - -#define ARRAY_COPY(dst, src, count) memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0]) #define NEW_ARRAY(type,count) (type *) malloc((count) * sizeof(type)) - #define DELETE_ARRAY(array) free((void *) (array)) -#define GROW_ARRAY(array,newSize) realloc((void *) (array), (newSize) * sizeof (array)[0]) - -struct TestResult -{ - le_int32 glyphCount; - LEGlyphID *glyphs; - le_int32 *indices; - float *positions; -}; - -#ifndef __cplusplus -typedef struct TestResult TestResult; -#endif - -U_CFUNC void addCTests(TestNode **root); - #endif diff --git a/icu4c/source/test/letest/letest.vcxproj b/icu4c/source/test/letest/letest.vcxproj index 44be57e1cf4..dd788dec575 100644 --- a/icu4c/source/test/letest/letest.vcxproj +++ b/icu4c/source/test/letest/letest.vcxproj @@ -220,26 +220,12 @@ - - - - - - - - - - - - - - diff --git a/icu4c/source/test/letest/letest.vcxproj.filters b/icu4c/source/test/letest/letest.vcxproj.filters index ec34558ac86..5ab6ea8903c 100644 --- a/icu4c/source/test/letest/letest.vcxproj.filters +++ b/icu4c/source/test/letest/letest.vcxproj.filters @@ -15,61 +15,19 @@ - - Source Files - - - Source Files - - - Source Files - - - Source Files - Source Files - - Source Files - - - Source Files - Source Files - - Source Files - - - Header Files - - - Header Files - - - Header Files - Header Files - - Header Files - - - Header Files - - - Header Files - Header Files - - Header Files - \ No newline at end of file diff --git a/icu4c/source/test/letest/letsutil.cpp b/icu4c/source/test/letest/letsutil.cpp deleted file mode 100644 index fd8e0062a83..00000000000 --- a/icu4c/source/test/letest/letsutil.cpp +++ /dev/null @@ -1,127 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ******************************************************************************* - * - * Copyright (C) 1999-2014, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: letsutil.cpp - * - * created on: 04/25/2006 - * created by: Eric R. Mader - */ - -#include "unicode/utypes.h" -#include "unicode/unistr.h" -#include "unicode/ubidi.h" - -#include "layout/LETypes.h" -#include "layout/LEScripts.h" -#include "layout/LayoutEngine.h" -#include "layout/LELanguages.h" - -#ifndef USING_ICULEHB -#include "OpenTypeLayoutEngine.h" -#endif - -#include "letest.h" -#include "letsutil.h" - -U_NAMESPACE_USE - -char *getCString(const UnicodeString *uString) -{ - if (uString == nullptr) { - return nullptr; - } - - le_int32 uLength = uString->length(); - le_int32 cLength = uString->extract(0, uLength, nullptr, 0, US_INV); - char *cString = NEW_ARRAY(char, cLength + 1); - - uString->extract(0, uLength, cString, cLength, US_INV); - cString[cLength] = '\0'; - - return cString; -} - -char *getCString(const LEUnicode16 *uChars) -{ - if (uChars == nullptr) { - return nullptr; - } - - const UnicodeString ustring(uChars); - - return getCString(&ustring); -} - -char *getUTF8String(const UnicodeString *uString) -{ - if (uString == nullptr) { - return nullptr; - } - - le_int32 uLength = uString->length(); - le_int32 cLength = uString->extract(0, uLength, nullptr, 0, "UTF-8"); - char *cString = NEW_ARRAY(char, cLength + 1); - - uString->extract(0, uLength, cString, cLength, "UTF-8"); - - cString[cLength] = '\0'; - - return cString; -} - -void freeCString(char *cString) -{ - DELETE_ARRAY(cString); -} - -le_bool getRTL(const UnicodeString &text) -{ - UBiDiLevel level = 0; - UErrorCode status = U_ZERO_ERROR; - le_int32 charCount = text.length(); - le_int32 limit = -1; - UBiDi *ubidi = ubidi_openSized(charCount, 0, &status); - - ubidi_setPara(ubidi, text.getBuffer(), charCount, UBIDI_DEFAULT_LTR, nullptr, &status); - - // TODO: Should check that there's only a single logical run... - ubidi_getLogicalRun(ubidi, 0, &limit, &level); - - ubidi_close(ubidi); - - return level & 1; -} - -le_int32 getLanguageCode(const char *lang) -{ - if (strlen(lang) != 3) { - return -1; - } - -#ifndef USING_ICULEHB - LETag langTag = (LETag) ((lang[0] << 24) + (lang[1] << 16) + (lang[2] << 8) + 0x20); - for (le_int32 i = 0; i < languageCodeCount; i += 1) { - if (langTag == OpenTypeLayoutEngine::languageTags[i]) { - return i; - } - } -#else - if (!strcmp(lang, "JAN")) return janLanguageCode; - if (!strcmp(lang, "KOR")) return korLanguageCode; - if (!strcmp(lang, "ZHT")) return zhtLanguageCode; - if (!strcmp(lang, "ZHS")) return zhsLanguageCode; - if (!strcmp(lang, "HIN")) return hinLanguageCode; - if (!strcmp(lang, "MAR")) return marLanguageCode; - if (!strcmp(lang, "ROM")) return romLanguageCode; -#endif - - - return -1; -} - diff --git a/icu4c/source/test/letest/letsutil.h b/icu4c/source/test/letest/letsutil.h deleted file mode 100644 index 734e2aab261..00000000000 --- a/icu4c/source/test/letest/letsutil.h +++ /dev/null @@ -1,41 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ******************************************************************************* - * - * Copyright (C) 1999-2014, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: letsutil.h - * - * created on: 04/25/2006 - * created by: Eric R. Mader - */ - -#ifndef __LETSUTIL_H -#define __LETSUTIL_H - -#include "unicode/utypes.h" -#include "unicode/unistr.h" -#include "unicode/ubidi.h" - -#include "layout/LETypes.h" -#include "layout/LEScripts.h" -#include "layout/LayoutEngine.h" -#include "layout/LELanguages.h" - -#ifndef USING_ICULEHB -#include "OpenTypeLayoutEngine.h" -#endif - -#include "letest.h" - -char *getCString(const UnicodeString *uString); -char *getCString(const LEUnicode16 *uChars); -char *getUTF8String(const UnicodeString *uString); -void freeCString(char *cString); -le_bool getRTL(const UnicodeString &text); -le_int32 getLanguageCode(const char *lang); - -#endif diff --git a/icu4c/source/test/letest/readme.html b/icu4c/source/test/letest/readme.html deleted file mode 100644 index 73d9d7731df..00000000000 --- a/icu4c/source/test/letest/readme.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - -Readme file for letest and gendata - - -

What are letest and gendata?

-letest is a test program that you can use to verify the basic -functionality of the ICU LayoutEngine. It tests the LayoutEngine's -API and reads an XML file that contains test cases to test some of -the features of the LayoutEngine. These test cases are not -comprehensive, but they do test the most important features of - the LayoutEngine. When you have successfully run letest, you -can use the ICU LayoutEngine in you application knowing that the -basic functionality is working correctly.
-

gendata is a program that is used by the ICU team to build the -file letest.xml which contains the test cases. Unless you have -changed your copy of the LayoutEngine and want to validate the -changes on other platforms, there's no reason for you to run this -program.

-

(The ICU team first runs a Windows application which uses the -ICU LayoutEngine to display the text that letest uses. Once it has -been verified that the text is displayed correctly, gendata is run -to produce letest.xml, and then letest is run on Windows to verify -that letest still works with the new data.)

-

How do I build letest?

-First, you need to build ICU, including the LayoutEngine.  -

On Windows, letest is part of the allinone project, so a normal -build of ICU will also build letest. On UNIX systems, connect to -<top-build-dir>/test/letest and do "make all" .

-

How do I run letest?

-Before you can run letest, you'll need to get the fonts it uses. -For legal reasons, we can't include most of them with ICU, but you -can download them from the web. To do this, you'll need access to a -computer running Windows. All of the fonts should be stored in -<icu>/source/test/testdata. Here's how to get the fonts: -

Download a recent version of the Java 2 Platform, Standard -Edition (J2SE) from java.sun.com. -Click on the "Download" button for the version of Java that you -want to download. The page offers both JDKs and JREs. (The JRE is -sufficient for letest.) The download page will have a link to the -license agreement. Be sure to read and understand the license -agreement, and then click on the Accept button. Download the -package and install it. You'll need one font. On Windows, it will -be in, for example, "C:\Program Files\Java\jdk1.6.0\jre\lib\fonts". -The file you want is "LucidaSansRegular.ttf". Copy this file into -the directory from which you'll run letest.

-

Next is the Hindi font. Go to the NCST site and download -raghu.ttf. -When you hit the DOWNLOAD button on the page, it will open another -window which contains a disclaimer and a license agreement. Be sure -that you understand and agree to all of this before you download -the font. You can download raghu.ttf into the directory from which -you'll run letest.

-

Then download the Thai font. Go to into-asia.com -and click on the link for the Angsana font. This will download a -.ZIP file. Extract the font file, angsd___.ttf, into the directory -from which you will run letest.

-

There's still one more font to get, the Code2000 Unicode font. -Go to James Kass' Unicode -Support In Your Browser page and click on the link that says -"Click Here to download Code2000 shareware demo Unicode font." This -will download a .ZIP file which contains CODE2000.TTF and -CODE2000.HTM. Expand this .ZIP file and put the CODE2000.TTF file -in the directory from which you'll run letest.

-

Note: The Code2000 font -is shareware. If you want to use it for longer than a trial period, -you should send a shareware fee to James. Directions for how to do -this are in CODE2000.HTM.

-

letest.xml references three other fonts:

-
    -
  • ARIALUNI.TTF is Microsoft's Arial Unicode MS font, which is -distributed with Microsoft Office and is licensed only for use on -the Windows operating system.
  • -
  • Devamt.ttf is a proprietary font which cannot be freely -downloaded.
  • -
  • TestFont1.otf is included with ICU.
  • -
-To run letest type CTRL+F5 in Visual Studio, or "make check" in -UNIX.  If everything's OK you should see something like this: -
 /
- /api/
-   ---[OK]  ---/api/ParameterTest
-   ---[OK]  ---/api/FactoryTest
- /layout/
-   ---[OK]  ---/layout/AccessTest
-   ---[OK]  ---/layout/DataDrivenTest
- /c_api/
-   ---[OK]  ---/c_api/ParameterTest
-   ---[OK]  ---/c_api/FactoryTest
- /c_layout/
-   ---[OK]  ---/c_layout/AccessTest
-   ---[OK]  ---/c_layout/DataDrivenTest
-
-[All tests passed successfully...]
-Elapsed Time: 00:00:00.351
-If letest cannot open a font, it will print a warning message and -skip the test. letest will also check the version of the font you -have to make sure it's the same one that was used to generate the -test case. If the version doesn't match, letest will print a -warning message and proceed with the test.
- - diff --git a/icu4c/source/test/letest/sfnt.h b/icu4c/source/test/letest/sfnt.h deleted file mode 100644 index 140e0948405..00000000000 --- a/icu4c/source/test/letest/sfnt.h +++ /dev/null @@ -1,451 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/*************************************************************************** -* -* Copyright (C) 1998-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - -#ifndef __SFNT_H -#define __SFNT_H - -#include "layout/LETypes.h" - -U_NAMESPACE_USE - -#ifndef ANY_NUMBER -#define ANY_NUMBER 1 -#endif - -struct DirectoryEntry -{ - le_uint32 tag; - le_uint32 checksum; - le_uint32 offset; - le_uint32 length; -}; - -#ifndef __cplusplus -typedef struct DirectoryEntry DirectoryEntry; -#endif - -struct SFNTDirectory -{ - le_uint32 scalerType; - le_uint16 numTables; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - DirectoryEntry tableDirectory[ANY_NUMBER]; -}; - -#ifndef __cplusplus -typedef struct SFNTDirectory SFNTDirectory; -#endif - - -struct CMAPEncodingSubtableHeader -{ - le_uint16 platformID; - le_uint16 platformSpecificID; - le_uint32 encodingOffset; -}; - -#ifndef __cplusplus -typedef struct CMAPEncodingSubtableHeader CMAPEncodingSubtableHeader; -#endif - -struct CMAPTable -{ - le_uint16 version; - le_uint16 numberSubtables; - CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; -}; - -#ifndef __cplusplus -typedef struct CMAPTable CMAPTable; -#endif - -struct CMAPEncodingSubtable -{ - le_uint16 format; - le_uint16 length; - le_uint16 language; -}; - -#ifndef __cplusplus -typedef struct CMAPEncodingSubtable CMAPEncodingSubtable; -#endif - -#ifdef __cplusplus -struct CMAPFormat0Encoding : CMAPEncodingSubtable -{ - le_uint8 glyphIndexArray[256]; -}; -#else -struct CMAPFormat0Encoding -{ - CMAPEncodingSubtable base; - - le_uint8 glyphIndexArray[256]; -}; - -typedef struct CMAPFormat0Encoding CMAPFormat0Encoding; -#endif - -struct CMAPFormat2Subheader -{ - le_uint16 firstCode; - le_uint16 entryCount; - le_int16 idDelta; - le_uint16 idRangeOffset; -}; - -#ifndef __cplusplus -typedef struct CMAPFormat2Subheader CMAPFormat2Subheader; -#endif - -#ifdef __cplusplus -struct CMAPFormat2Encoding : CMAPEncodingSubtable -{ - le_uint16 subHeadKeys[256]; - CMAPFormat2Subheader subheaders[ANY_NUMBER]; -}; -#else -struct CMAPFormat2Encoding -{ - CMAPEncodingSubtable base; - - le_uint16 subHeadKeys[256]; - CMAPFormat2Subheader subheaders[ANY_NUMBER]; -}; - -typedef struct CMAPFormat2Encoding CMAPFormat2Encoding; -#endif - -#ifdef __cplusplus -struct CMAPFormat4Encoding : CMAPEncodingSubtable -{ - le_uint16 segCountX2; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - le_uint16 endCodes[ANY_NUMBER]; -/* - le_uint16 reservedPad; - le_uint16 startCodes[ANY_NUMBER]; - le_uint16 idDelta[ANY_NUMBER]; - le_uint16 idRangeOffset[ANY_NUMBER]; - le_uint16 glyphIndexArray[ANY_NUMBER]; -*/ -}; -#else -struct CMAPFormat4Encoding -{ - CMAPEncodingSubtable base; - - le_uint16 segCountX2; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - le_uint16 endCodes[ANY_NUMBER]; -/* -// le_uint16 reservedPad; -// le_uint16 startCodes[ANY_NUMBER]; -// le_uint16 idDelta[ANY_NUMBER]; -// le_uint16 idRangeOffset[ANY_NUMBER]; -// le_uint16 glyphIndexArray[ANY_NUMBER]; -*/ -}; - -typedef struct CMAPFormat4Encoding CMAPFormat4Encoding; -#endif - -#ifdef __cplusplus -struct CMAPFormat6Encoding : CMAPEncodingSubtable -{ - le_uint16 firstCode; - le_uint16 entryCount; - le_uint16 glyphIndexArray[ANY_NUMBER]; -}; -#else -struct CMAPFormat6Encoding -{ - CMAPEncodingSubtable base; - - le_uint16 firstCode; - le_uint16 entryCount; - le_uint16 glyphIndexArray[ANY_NUMBER]; -}; - -typedef struct CMAPFormat6Encoding CMAPFormat6Encoding; -#endif - -struct CMAPEncodingSubtable32 -{ - le_uint32 format; - le_uint32 length; - le_uint32 language; -}; - -#ifndef __cplusplus -typedef struct CMAPEncodingSubtable32 CMAPEncodingSubtable32; -#endif - -struct CMAPGroup -{ - le_uint32 startCharCode; - le_uint32 endCharCode; - le_uint32 startGlyphCode; -}; - -#ifndef __cplusplus -typedef struct CMAPGroup CMAPGroup; -#endif - -#ifdef __cplusplus -struct CMAPFormat8Encoding : CMAPEncodingSubtable32 -{ - le_uint32 is32[65536/32]; - le_uint32 nGroups; - CMAPGroup groups[ANY_NUMBER]; -}; -#else -struct CMAPFormat8Encoding -{ - CMAPEncodingSubtable32 base; - - le_uint32 is32[65536/32]; - le_uint32 nGroups; - CMAPGroup groups[ANY_NUMBER]; -}; - -typedef struct CMAPFormat8Encoding CMAPFormat8Encoding; -#endif - -#ifdef __cplusplus -struct CMAPFormat10Encoding : CMAPEncodingSubtable32 -{ - le_uint32 startCharCode; - le_uint32 numCharCodes; - le_uint16 glyphs[ANY_NUMBER]; -}; -#else -struct CMAPFormat10Encoding -{ - CMAPEncodingSubtable32 base; - - le_uint32 startCharCode; - le_uint32 numCharCodes; - le_uint16 glyphs[ANY_NUMBER]; -}; - -typedef struct CMAPFormat10Encoding CMAPFormat10Encoding; -#endif - -#ifdef __cplusplus -struct CMAPFormat12Encoding : CMAPEncodingSubtable32 -{ - le_uint32 nGroups; - CMAPGroup groups[ANY_NUMBER]; -}; -#else -struct CMAPFormat12Encoding -{ - CMAPEncodingSubtable32 base; - - le_uint32 nGroups; - CMAPGroup groups[ANY_NUMBER]; -}; - -typedef struct CMAPFormat12Encoding CMAPFormat12Encoding; -#endif - -typedef le_int32 fixed; - -struct BigDate -{ - le_uint32 bc; - le_uint32 ad; -}; - -#ifndef __cplusplus -typedef struct BigDate BigDate; -#endif - -struct HEADTable -{ - fixed version; - fixed fontRevision; - le_uint32 checksumAdjustment; - le_uint32 magicNumber; - le_uint16 flags; - le_uint16 unitsPerEm; - BigDate created; - BigDate modified; - le_int16 xMin; - le_int16 yMin; - le_int16 xMax; - le_int16 yMax; - le_int16 lowestRecPPEM; - le_int16 fontDirectionHint; - le_int16 indexToLocFormat; - le_int16 glyphDataFormat; -}; - -#ifndef __cplusplus -typedef struct HEADTable HEADTable; -#endif - -struct MAXPTable -{ - fixed version; - le_uint16 numGlyphs; - le_uint16 maxPoints; - le_uint16 maxContours; - le_uint16 maxComponentPoints; - le_uint16 maxComponentContours; - le_uint16 maxZones; - le_uint16 maxTwilightPoints; - le_uint16 maxStorage; - le_uint16 maxFunctionDefs; - le_uint16 maxInstructionDefs; - le_uint16 maxStackElements; - le_uint16 maxSizeOfInstructions; - le_uint16 maxComponentElements; - le_uint16 maxComponentDepth; -}; - -#ifndef __cplusplus -typedef struct MAXPTable MAXPTable; -#endif - -struct HHEATable -{ - fixed version; - le_int16 ascent; - le_int16 descent; - le_int16 lineGap; - le_uint16 advanceWidthMax; - le_int16 minLeftSideBearing; - le_int16 minRightSideBearing; - le_int16 xMaxExtent; - le_int16 caretSlopeRise; - le_int16 caretSlopeRun; - le_int16 caretOffset; - le_int16 reserved1; - le_int16 reserved2; - le_int16 reserved3; - le_int16 reserved4; - le_int16 metricDataFormat; - le_uint16 numOfLongHorMetrics; -}; - -#ifndef __cplusplus -typedef struct HHEATable HHEATable; -#endif - -struct LongHorMetric -{ - le_uint16 advanceWidth; - le_int16 leftSideBearing; -}; - -#ifndef __cplusplus -typedef struct LongHorMetric LongHorMetric; -#endif - -struct HMTXTable -{ - LongHorMetric hMetrics[ANY_NUMBER]; /* ANY_NUMBER = numOfLongHorMetrics from hhea table */ -/* le_int16 leftSideBearing[ANY_NUMBER]; ANY_NUMBER = numGlyphs - numOfLongHorMetrics */ -}; - -#ifndef __cplusplus -typedef struct HMTXTable HMTXTable; -#endif - -enum PlatformID -{ - PLATFORM_UNICODE = 0, - PLATFORM_MACINTOSH = 1, - PLATFORM_ISO = 2, - PLATFORM_MICROSOFT = 3, - PLATFORM_CUSTOM = 4 -}; - -enum MacintoshEncodingID -{ - MACINTOSH_ROMAN = 0 -}; - -enum MacintoshLanguageID -{ - MACINTOSH_ENGLISH = 0 -}; - -enum MicrosoftEncodingID -{ - MICROSOFT_UNICODE_BMP = 1, - MICROSOFT_UNICODE_FULL = 10 -}; - -enum MicrosoftLanguageID -{ - MICROSOFT_ENGLISH = 0x409 -}; - -enum NameID -{ - NAME_COPYRIGHT_NOTICE = 0, - NAME_FONT_FAMILY = 1, - NAME_FONT_SUB_FAMILY = 2, - NAME_UNIQUE_FONT_ID = 3, - NAME_FULL_FONT_NAME = 4, - NAME_VERSION_STRING = 5, - NAME_POSTSCRIPT_NAME = 6, - NAME_TRADEMARK = 7, - NAME_MANUFACTURER = 8, - NAME_DESIGNER = 9, - NAME_DESCRIPTION = 10, - NAME_VENDOR_URL = 11, - NAME_DESIGNER_URL = 12, - NAME_LICENSE_DESCRIPTION = 13, - NAME_LICENSE_URL = 14, - NAME_RESERVED = 15, - NAME_PREFERRED_FAMILY = 16, - NAME_PREFERRED_SUB_FAMILY = 17, - NAME_COMPATIBLE_FULL = 18, - NAME_SAMPLE_TEXT = 19, - NAME_POSTSCRIPT_CID = 20 -}; - -struct NameRecord -{ - le_uint16 platformID; - le_uint16 encodingID; - le_uint16 languageID; - le_uint16 nameID; - le_uint16 length; - le_uint16 offset; -}; - -#ifndef __cplusplus -typedef struct NameRecord NameRecord; -#endif - -struct NAMETable -{ - le_uint16 version; - le_uint16 count; - le_uint16 stringOffset; - NameRecord nameRecords[ANY_NUMBER]; -}; - -#ifndef __cplusplus -typedef struct NAMETable NAMETable; -#endif - -#endif - diff --git a/icu4c/source/test/letest/testdata.cpp b/icu4c/source/test/letest/testdata.cpp deleted file mode 100644 index ea8ff5f12dd..00000000000 --- a/icu4c/source/test/letest/testdata.cpp +++ /dev/null @@ -1,640 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ******************************************************************************* - * - * Copyright (C) 1999-2005, International Business Machines - * Corporation and others. All Rights Reserved. - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT - * UNLESS YOU REALLY KNOW WHAT YOU'RE DOING. - * - ******************************************************************************* - * - * file name: testdata.cpp - * generated on: 02/28/2005 03:20:06 PM Pacific Standard Time - * generated by: gendata.cpp - */ - -#include "layout/LETypes.h" -#include "layout/LEScripts.h" -#include "letest.h" - -const char *fontVersionString0 = "Version 0.99"; -le_uint32 fontChecksum0 = 0x541C94C7; - -LEUnicode inputText0[] = -{ - 0x0936, 0x094D, 0x0930, 0x0940, 0x092E, 0x0926, 0x094D, 0x0020, - 0x092D, 0x0917, 0x0935, 0x0926, 0x094D, 0x0917, 0x0940, 0x0924, - 0x093E, 0x0020, 0x0905, 0x0927, 0x094D, 0x092F, 0x093E, 0x092F, - 0x0020, 0x0905, 0x0930, 0x094D, 0x091C, 0x0941, 0x0928, 0x0020, - 0x0935, 0x093F, 0x0937, 0x093E, 0x0926, 0x0020, 0x092F, 0x094B, - 0x0917, 0x0020, 0x0927, 0x0943, 0x0924, 0x0930, 0x093E, 0x0937, - 0x094D, 0x091F, 0x094D, 0x0930, 0x0020, 0x0909, 0x0935, 0x093E, - 0x091A, 0x0943, 0x0020, 0x0927, 0x0930, 0x094D, 0x092E, 0x0915, - 0x094D, 0x0937, 0x0947, 0x0924, 0x094D, 0x0930, 0x0947, 0x0020, - 0x0915, 0x0941, 0x0930, 0x0941, 0x0915, 0x094D, 0x0937, 0x0947, - 0x0924, 0x094D, 0x0930, 0x0947, 0x0020, 0x0938, 0x092E, 0x0935, - 0x0947, 0x0924, 0x093E, 0x0020, 0x092F, 0x0941, 0x092F, 0x0941, - 0x0924, 0x094D, 0x0938, 0x0935, 0x0903, 0x0020, 0x092E, 0x093E, - 0x092E, 0x0915, 0x093E, 0x0903, 0x0020, 0x092A, 0x093E, 0x0923, - 0x094D, 0x0921, 0x0935, 0x093E, 0x0936, 0x094D, 0x091A, 0x0948, - 0x0935, 0x0020, 0x0915, 0x093F, 0x092E, 0x0915, 0x0941, 0x0930, - 0x094D, 0x0935, 0x0924, 0x0020, 0x0938, 0x0902, 0x091C, 0x0935 -}; - -LEGlyphID resultGlyphs0[] = -{ - 0x0000012E, 0x0000FFFF, 0x0000FFFF, 0x00000222, 0x00000098, 0x0000026E, 0x0000FFFF, 0x00000003, - 0x00000097, 0x00000082, 0x0000009D, 0x000001A5, 0x0000FFFF, 0x0000FFFF, 0x00000222, 0x0000008F, - 0x00000221, 0x00000003, 0x0000005C, 0x000000DA, 0x0000FFFF, 0x00000099, 0x00000221, 0x00000099, - 0x00000003, 0x0000005C, 0x00000087, 0x000001D5, 0x0000005B, 0x0000FFFF, 0x00000093, 0x00000003, - 0x000001D2, 0x0000009D, 0x0000009F, 0x00000221, 0x00000091, 0x00000003, 0x00000099, 0x0000022A, - 0x00000082, 0x00000003, 0x00000092, 0x000001D9, 0x0000008F, 0x0000009A, 0x00000221, 0x000001B6, - 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x00000060, 0x0000009D, 0x00000221, - 0x00000085, 0x000001D9, 0x00000003, 0x00000092, 0x00000098, 0x0000005B, 0x0000FFFF, 0x000000A2, - 0x0000FFFF, 0x0000FFFF, 0x0000022F, 0x0000011F, 0x0000FFFF, 0x0000FFFF, 0x0000022F, 0x00000003, - 0x00000080, 0x000001D5, 0x0000009A, 0x000001FD, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x0000022F, - 0x0000011F, 0x0000FFFF, 0x0000FFFF, 0x0000022F, 0x00000003, 0x000000A0, 0x00000098, 0x0000009D, - 0x0000022F, 0x0000008F, 0x00000221, 0x00000003, 0x00000099, 0x000001D5, 0x00000099, 0x000001D5, - 0x000000D7, 0x0000FFFF, 0x000000A0, 0x0000009D, 0x0000022C, 0x00000003, 0x00000098, 0x00000221, - 0x00000098, 0x00000080, 0x00000221, 0x0000022C, 0x00000003, 0x00000094, 0x00000221, 0x000000D6, - 0x0000FFFF, 0x0000008C, 0x0000009D, 0x00000221, 0x000001B1, 0x0000FFFF, 0x0000FFFF, 0x00000230, - 0x0000009D, 0x00000003, 0x000001D1, 0x00000080, 0x00000098, 0x00000080, 0x000001D5, 0x0000009D, - 0x0000005B, 0x0000FFFF, 0x0000008F, 0x00000003, 0x000000A0, 0x00000232, 0x00000087, 0x0000009D -}; - -le_int32 resultGlyphCount0 = 136; - -le_int32 resultIndices0[] = -{ - 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001C, 0x0000001D, 0x0000001A, 0x0000001B, 0x0000001E, 0x0000001F, - 0x00000021, 0x00000020, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000033, 0x00000032, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003E, 0x0000003C, 0x0000003D, 0x0000003F, - 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000045, 0x00000044, 0x00000046, 0x00000047, - 0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, - 0x00000050, 0x00000052, 0x00000051, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, - 0x00000058, 0x00000059, 0x0000005A, 0x0000005B, 0x0000005C, 0x0000005D, 0x0000005E, 0x0000005F, - 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, - 0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 0x0000006D, 0x0000006E, 0x0000006F, - 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, - 0x00000078, 0x00000079, 0x0000007B, 0x0000007A, 0x0000007C, 0x0000007D, 0x0000007E, 0x00000081, - 0x0000007F, 0x00000080, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087 -}; - -float resultPositions0[] = -{ - 0.000000F, 0.000000F, 9.468750F, 0.000000F, 9.468750F, 0.000000F, 9.468750F, 0.000000F, - 13.125000F, 0.000000F, 22.593750F, 0.000000F, 30.562500F, 0.000000F, 30.562500F, 0.000000F, - 36.562500F, 0.000000F, 46.031250F, 0.000000F, 55.500000F, 0.000000F, 63.468750F, 0.000000F, - 71.437500F, 0.000000F, 71.437500F, 0.000000F, 71.437500F, 0.000000F, 75.093750F, 0.000000F, - 83.062500F, 0.000000F, 86.718750F, 0.000000F, 92.718750F, 0.000000F, 102.656250F, 0.000000F, - 109.921875F, 0.000000F, 109.921875F, 0.000000F, 119.390625F, 0.000000F, 123.046875F, 0.000000F, - 132.515625F, 0.000000F, 138.515625F, 0.000000F, 148.453125F, 0.000000F, 158.203125F, -0.011719F, - 158.203125F, 0.263672F, 157.921875F, 0.000000F, 157.921875F, 0.000000F, 167.390625F, 0.000000F, - 173.390625F, 0.000000F, 177.750000F, 0.000000F, 185.718750F, 0.000000F, 193.687500F, 0.000000F, - 197.343750F, 0.000000F, 205.312500F, 0.000000F, 211.312500F, 0.000000F, 220.781250F, 0.000000F, - 224.859375F, 0.000000F, 234.328125F, 0.000000F, 240.328125F, 0.000000F, 250.224609F, -0.011719F, - 249.796875F, 0.000000F, 257.765625F, 0.000000F, 264.281250F, 0.000000F, 267.937500F, 0.000000F, - 276.281250F, 0.000000F, 276.281250F, 0.000000F, 276.281250F, 0.000000F, 276.281250F, 0.000000F, - 276.281250F, 0.000000F, 282.281250F, 0.000000F, 290.250000F, 0.000000F, 298.218750F, 0.000000F, - 301.875000F, 0.000000F, 311.859375F, -0.011719F, 311.343750F, 0.000000F, 317.343750F, 0.000000F, - 326.812500F, 0.000000F, 336.644531F, 0.263672F, 336.281250F, 0.000000F, 336.281250F, 0.000000F, - 347.156250F, 0.000000F, 347.156250F, 0.000000F, 346.353516F, 0.275391F, 347.156250F, 0.000000F, - 355.125000F, 0.000000F, 355.125000F, 0.000000F, 355.263672F, 0.263672F, 355.125000F, 0.000000F, - 361.125000F, 0.000000F, 368.824219F, -0.011719F, 372.000000F, 0.000000F, 378.515625F, 0.000000F, - 379.875000F, 0.000000F, 390.750000F, 0.000000F, 390.750000F, 0.000000F, 389.947266F, 0.275391F, - 390.750000F, 0.000000F, 398.718750F, 0.000000F, 398.718750F, 0.000000F, 398.857422F, 0.263672F, - 398.718750F, 0.000000F, 404.718750F, 0.000000F, 414.187500F, 0.000000F, 423.656250F, 0.000000F, - 430.769531F, 0.263672F, 431.625000F, 0.000000F, 439.593750F, 0.000000F, 443.250000F, 0.000000F, - 449.250000F, 0.000000F, 458.859375F, -0.011719F, 458.718750F, 0.000000F, 468.328125F, -0.011719F, - 468.187500F, 0.000000F, 474.117188F, 0.000000F, 474.117188F, 0.000000F, 483.585938F, 0.000000F, - 491.554688F, 0.000000F, 495.914063F, 0.000000F, 501.914063F, 0.000000F, 511.382813F, 0.000000F, - 515.039063F, 0.000000F, 524.507813F, 0.000000F, 535.382813F, 0.000000F, 539.039063F, 0.000000F, - 543.398438F, 0.000000F, 549.398438F, 0.000000F, 557.367188F, 0.000000F, 561.023438F, 0.000000F, - 568.289063F, 0.000000F, 568.289063F, 0.000000F, 576.257813F, 0.000000F, 584.226563F, 0.000000F, - 587.882813F, 0.000000F, 598.757813F, 0.000000F, 598.757813F, 0.000000F, 598.628906F, 0.263672F, - 598.757813F, 0.000000F, 606.726563F, 0.000000F, 612.726563F, 0.000000F, 617.085938F, 0.000000F, - 627.960938F, 0.000000F, 637.429688F, 0.000000F, 645.128906F, -0.011719F, 648.304688F, 0.000000F, - 656.566406F, 0.263672F, 656.273438F, 0.000000F, 656.273438F, 0.000000F, 664.242188F, 0.000000F, - 670.242188F, 0.000000F, 679.429688F, 0.966797F, 679.710938F, 0.000000F, 689.179688F, 0.000000F, - 697.148438F, 0.000000F -}; - - -const char *fontVersionString1 = "Version 1.14"; -le_uint32 fontChecksum1 = 0x2B6E171D; - -LEUnicode inputText1[] = -{ - 0x0623, 0x0633, 0x0627, 0x0633, 0x064B, 0x0627, 0x060C, 0x0020, - 0x062A, 0x062A, 0x0639, 0x0627, 0x0645, 0x0644, 0x0020, 0x0627, - 0x0644, 0x062D, 0x0648, 0x0627, 0x0633, 0x064A, 0x0628, 0x0020, - 0x0641, 0x0642, 0x0637, 0x0020, 0x0645, 0x0639, 0x0020, 0x0627, - 0x0644, 0x0623, 0x0631, 0x0642, 0x0627, 0x0645, 0x060C, 0x0020, - 0x0648, 0x062A, 0x0642, 0x0648, 0x0645, 0x0020, 0x0628, 0x062A, - 0x062E, 0x0632, 0x064A, 0x0646, 0x0020, 0x0627, 0x0644, 0x0623, - 0x062D, 0x0631, 0x0641, 0x0020, 0x0648, 0x0627, 0x0644, 0x0645, - 0x062D, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 0x0644, 0x0623, - 0x062E, 0x0631, 0x0649, 0x0020, 0x0628, 0x0639, 0x062F, 0x0020, - 0x0623, 0x0646, 0x0020, 0x062A, 0x064F, 0x0639, 0x0637, 0x064A, - 0x0020, 0x0631, 0x0642, 0x0645, 0x0627, 0x0020, 0x0645, 0x0639, - 0x064A, 0x0646, 0x0627, 0x0020, 0x0644, 0x0643, 0x0644, 0x0020, - 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x0645, 0x0646, 0x0647, - 0x0627, 0x002E, 0x0020, 0x0648, 0x0642, 0x0628, 0x0644, 0x0020, - 0x0627, 0x062E, 0x062A, 0x0631, 0x0627, 0x0639, 0x0020, 0x0022, - 0x064A, 0x0648, 0x0646, 0x0650, 0x0643, 0x0648, 0x062F, 0x0022, - 0x060C, 0x0020, 0x0643, 0x0627, 0x0646, 0x0020, 0x0647, 0x0646, - 0x0627, 0x0643, 0x0020, 0x0645, 0x0626, 0x0627, 0x062A, 0x0020, - 0x0627, 0x0644, 0x0623, 0x0646, 0x0638, 0x0645, 0x0629, 0x0020, - 0x0644, 0x0644, 0x062A, 0x0634, 0x0641, 0x064A, 0x0631, 0x0020, - 0x0648, 0x062A, 0x062E, 0x0635, 0x064A, 0x0635, 0x0020, 0x0647, - 0x0630, 0x0647, 0x0020, 0x0627, 0x0644, 0x0623, 0x0631, 0x0642, - 0x0627, 0x0645, 0x0020, 0x0644, 0x0644, 0x0645, 0x062D, 0x0627, - 0x0631, 0x0641, 0x060C, 0x0020, 0x0648, 0x0644, 0x0645, 0x0020, - 0x064A, 0x0648, 0x062C, 0x062F, 0x0020, 0x0646, 0x0638, 0x0627, - 0x0645, 0x0020, 0x062A, 0x0634, 0x0641, 0x064A, 0x0631, 0x0020, - 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x064A, 0x062D, 0x062A, - 0x0648, 0x064A, 0x0020, 0x0639, 0x0644, 0x0649, 0x0020, 0x062C, - 0x0645, 0x064A, 0x0639, 0x0020, 0x0627, 0x0644, 0x0645, 0x062D, - 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 0x0644, 0x0636, 0x0631, - 0x0648, 0x0631, 0x064A, 0x0629 -}; - -LEGlyphID resultGlyphs1[] = -{ - 0x0000C530, 0x0000C58F, 0x0000C549, 0x0000C589, 0x0000C54A, 0x0000C55C, 0x0000C57B, 0x0000C529, - 0x00000003, 0x0000C56D, 0x0000C549, 0x0000C52A, 0x0000C540, 0x0000C580, 0x0000C57B, 0x0000C529, - 0x00000003, 0x0000C566, 0x0000C590, 0x0000C580, 0x0000C53B, 0x00000003, 0x0000C58C, 0x0000C57C, - 0x0000C567, 0x00000003, 0x0000C58D, 0x0000C58A, 0x0000C534, 0x0000C540, 0x0000C58F, 0x00000003, - 0x0000C546, 0x0000C53F, 0x0000C529, 0x0000C589, 0x00000003, 0x0000C54A, 0x0000C590, 0x0000C570, - 0x0000C554, 0x0000C533, 0x00000003, 0x0000C57D, 0x0000C52A, 0x0000C564, 0x0000C583, 0x00000003, - 0x0000C546, 0x0000C53B, 0x0000C58A, 0x0000C58F, 0x00000003, 0x0000C57E, 0x0000C57B, 0x0000C589, - 0x00000003, 0x00000528, 0x0000C56D, 0x0000C549, 0x0000C52A, 0x0000C540, 0x0000C580, 0x0000C57C, - 0x0000C57B, 0x00000003, 0x0000C57D, 0x0000C52A, 0x0000C573, 0x0000C549, 0x0000FFFE, 0x0000C593, - 0x0000C529, 0x00000003, 0x0000C585, 0x0000C548, 0x0000C587, 0x00000003, 0x0000C556, 0x0000C590, - 0x0000C558, 0x0000C544, 0x0000C533, 0x0000C589, 0x00000003, 0x0000C54A, 0x0000C590, 0x0000C570, - 0x0000C554, 0x0000C534, 0x0000C57C, 0x0000C57B, 0x00000003, 0x0000C530, 0x0000C580, 0x0000C564, - 0x0000C583, 0x0000FFFE, 0x0000C593, 0x0000C529, 0x00000003, 0x0000C531, 0x0000C52A, 0x00000530, - 0x0000C57F, 0x00000003, 0x0000C575, 0x0000C52A, 0x0000C584, 0x0000C587, 0x00000003, 0x0000C581, - 0x0000C52A, 0x0000C577, 0x00000003, 0x00000528, 0x00000005, 0x0000C545, 0x0000C58A, 0x0000C578, - 0x00000555, 0x0000C583, 0x0000C58A, 0x0000C58F, 0x00000005, 0x00000003, 0x0000C565, 0x0000C529, - 0x0000C54A, 0x0000C534, 0x0000C543, 0x0000C529, 0x00000003, 0x0000C57A, 0x0000C52E, 0x0000C573, - 0x0000C589, 0x00000003, 0x00000011, 0x0000C52A, 0x0000C588, 0x0000C584, 0x0000C57F, 0x00000003, - 0x0000C546, 0x0000C53F, 0x0000C529, 0x0000C589, 0x00000003, 0x0000C57A, 0x0000C578, 0x0000C57B, - 0x00000003, 0x0000C52A, 0x0000C584, 0x0000C590, 0x0000C568, 0x0000C57F, 0x00000003, 0x0000C52A, - 0x0000C580, 0x0000C573, 0x0000C549, 0x00000003, 0x0000C58E, 0x0000C560, 0x0000C568, 0x00000554, - 0x0000C533, 0x00000003, 0x0000C581, 0x0000C51F, 0x00000003, 0x0000C546, 0x0000C568, 0x0000C52D, - 0x00000003, 0x0000C58B, 0x0000C54A, 0x0000C543, 0x0000FFFE, 0x0000C593, 0x0000C529, 0x00000003, - 0x0000C56D, 0x0000C549, 0x0000C52A, 0x0000C540, 0x0000C580, 0x0000C57B, 0x0000C529, 0x0000C589, - 0x00000003, 0x0000C56D, 0x0000C54A, 0x0000C53F, 0x0000FFFE, 0x0000C593, 0x0000C529, 0x00000003, - 0x0000C582, 0x0000C58F, 0x0000C54C, 0x0000C544, 0x0000C534, 0x0000C52D, 0x00000003, 0x0000C57D, - 0x0000C58A, 0x0000C574, 0x0000C533, 0x0000C589, 0x00000003, 0x00000528, 0x0000C57D, 0x0000C52A, - 0x0000C573, 0x0000C549, 0x0000FFFE, 0x0000C593, 0x0000C529, 0x00000003, 0x0000C566, 0x0000C57F, - 0x00000003, 0x0000C55E, 0x0000C574, 0x0000C56F, 0x00000003, 0x0000C52C, 0x0000C590, 0x0000C54F, - 0x0000C529, 0x0000C58A, 0x0000C540, 0x0000C57B, 0x0000C529, 0x00000003, 0x0000C57A, 0x0000C57F, - 0x0000C52A, 0x0000C568, 0x0000C534, 0x0000C533, 0x00000003, 0x00000528, 0x0000C52A, 0x00000550, - 0x0000C54F, 0x0000C52A, 0x0000C54F, 0x0000C51F -}; - -le_int32 resultGlyphCount1 = 252; - -le_int32 resultIndices1[] = -{ - 0x000000FB, 0x000000FA, 0x000000F9, 0x000000F8, 0x000000F7, 0x000000F6, 0x000000F5, 0x000000F4, - 0x000000F3, 0x000000F2, 0x000000F1, 0x000000F0, 0x000000EF, 0x000000EE, 0x000000ED, 0x000000EC, - 0x000000EB, 0x000000EA, 0x000000E9, 0x000000E8, 0x000000E7, 0x000000E6, 0x000000E5, 0x000000E4, - 0x000000E3, 0x000000E2, 0x000000E1, 0x000000E0, 0x000000DF, 0x000000DE, 0x000000DD, 0x000000DC, - 0x000000DB, 0x000000DA, 0x000000D9, 0x000000D8, 0x000000D7, 0x000000D6, 0x000000D5, 0x000000D4, - 0x000000D3, 0x000000D2, 0x000000D1, 0x000000D0, 0x000000CF, 0x000000CE, 0x000000CD, 0x000000CC, - 0x000000CB, 0x000000CA, 0x000000C9, 0x000000C8, 0x000000C7, 0x000000C6, 0x000000C5, 0x000000C4, - 0x000000C3, 0x000000C2, 0x000000C1, 0x000000C0, 0x000000BF, 0x000000BE, 0x000000BD, 0x000000BC, - 0x000000BB, 0x000000BA, 0x000000B9, 0x000000B8, 0x000000B7, 0x000000B6, 0x000000B5, 0x000000B4, - 0x000000B3, 0x000000B2, 0x000000B1, 0x000000B0, 0x000000AF, 0x000000AE, 0x000000AD, 0x000000AC, - 0x000000AB, 0x000000AA, 0x000000A9, 0x000000A8, 0x000000A7, 0x000000A6, 0x000000A5, 0x000000A4, - 0x000000A3, 0x000000A2, 0x000000A1, 0x000000A0, 0x0000009F, 0x0000009E, 0x0000009D, 0x0000009C, - 0x0000009B, 0x0000009A, 0x00000099, 0x00000098, 0x00000097, 0x00000096, 0x00000095, 0x00000094, - 0x00000093, 0x00000092, 0x00000091, 0x00000090, 0x0000008F, 0x0000008E, 0x0000008D, 0x0000008C, - 0x0000008B, 0x0000008A, 0x00000089, 0x00000088, 0x00000087, 0x00000086, 0x00000085, 0x00000084, - 0x00000083, 0x00000082, 0x00000081, 0x00000080, 0x0000007F, 0x0000007E, 0x0000007D, 0x0000007C, - 0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 0x00000074, - 0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 0x0000006C, - 0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 0x00000064, - 0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 0x0000005C, - 0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 0x00000054, - 0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 0x0000004C, - 0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 0x00000044, - 0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 0x0000003C, - 0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 0x00000034, - 0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 0x0000002C, - 0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, - 0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 0x0000001C, - 0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 0x00000014, - 0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 0x0000000C, - 0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 0x00000004, - 0x00000003, 0x00000002, 0x00000001, 0x00000000 -}; - -float resultPositions1[] = -{ - 0.000000F, 0.000000F, 4.007813F, 0.000000F, 8.226563F, 0.000000F, 12.679688F, 0.000000F, - 18.679688F, 0.000000F, 23.132813F, 0.000000F, 31.289063F, 0.000000F, 34.312500F, 0.000000F, - 36.375000F, 0.000000F, 41.062500F, 0.000000F, 50.296875F, 0.000000F, 54.750000F, 0.000000F, - 56.859375F, 0.000000F, 62.367188F, 0.000000F, 66.632813F, 0.000000F, 69.656250F, 0.000000F, - 71.718750F, 0.000000F, 76.406250F, 0.000000F, 81.421875F, 0.000000F, 85.664063F, 0.000000F, - 89.929688F, 0.000000F, 95.742188F, 0.000000F, 100.429688F, 0.000000F, 108.796875F, 0.000000F, - 112.171875F, 0.000000F, 115.734375F, 0.000000F, 120.421875F, 0.000000F, 128.765625F, 0.000000F, - 134.765625F, 0.000000F, 139.007813F, 0.000000F, 144.515625F, 0.000000F, 148.734375F, 0.000000F, - 153.421875F, 0.000000F, 157.359375F, 0.000000F, 163.171875F, 0.000000F, 165.234375F, 0.000000F, - 171.234375F, 0.000000F, 175.921875F, 0.000000F, 180.375000F, 0.000000F, 184.617188F, 0.000000F, - 188.085938F, 0.000000F, 195.117188F, 0.000000F, 199.312500F, 0.000000F, 204.000000F, 0.000000F, - 208.007813F, 0.000000F, 210.117188F, 0.000000F, 217.054688F, 0.000000F, 220.429688F, 0.000000F, - 225.117188F, 0.000000F, 229.054688F, 0.000000F, 234.867188F, 0.000000F, 240.867188F, 0.000000F, - 245.085938F, 0.000000F, 249.773438F, 0.000000F, 253.781250F, 0.000000F, 256.804688F, 0.000000F, - 262.804688F, 0.000000F, 267.492188F, 0.000000F, 271.007813F, 0.000000F, 280.242188F, 0.000000F, - 284.695313F, 0.000000F, 286.804688F, 0.000000F, 292.312500F, 0.000000F, 296.578125F, 0.000000F, - 299.953125F, 0.000000F, 302.976563F, 0.000000F, 307.664063F, 0.000000F, 311.671875F, 0.000000F, - 313.781250F, 0.000000F, 317.882813F, 0.000000F, 322.335938F, 0.000000F, 322.335938F, 0.000000F, - 328.500000F, 0.000000F, 330.562500F, 0.000000F, 335.250000F, 0.000000F, 339.140625F, 0.000000F, - 343.078125F, 0.000000F, 348.984375F, 0.000000F, 353.671875F, 0.000000F, 366.445313F, 0.000000F, - 370.687500F, 0.000000F, 378.843750F, 0.000000F, 384.351563F, 0.000000F, 388.546875F, 0.000000F, - 394.546875F, 0.000000F, 399.234375F, 0.000000F, 403.687500F, 0.000000F, 407.929688F, 0.000000F, - 411.398438F, 0.000000F, 418.429688F, 0.000000F, 422.671875F, 0.000000F, 426.046875F, 0.000000F, - 429.070313F, 0.000000F, 433.757813F, 0.000000F, 437.765625F, 0.000000F, 442.031250F, 0.000000F, - 448.968750F, 0.000000F, 452.343750F, 0.000000F, 452.343750F, 0.000000F, 458.507813F, 0.000000F, - 460.570313F, 0.000000F, 465.257813F, 0.000000F, 474.492188F, 0.000000F, 476.601563F, 0.000000F, - 484.968750F, 0.000000F, 489.234375F, 0.000000F, 493.921875F, 0.000000F, 501.562500F, 0.000000F, - 503.671875F, 0.000000F, 507.890625F, 0.000000F, 513.796875F, 0.000000F, 518.484375F, 0.000000F, - 525.796875F, 0.000000F, 527.906250F, 0.000000F, 533.578125F, 0.000000F, 538.265625F, 0.000000F, - 541.781250F, 0.000000F, 547.171875F, 0.000000F, 550.710938F, 0.000000F, 556.710938F, 0.000000F, - 564.492188F, 0.000000F, 564.492188F, 0.000000F, 567.867188F, 0.000000F, 573.867188F, 0.000000F, - 578.085938F, 0.000000F, 583.476563F, 0.000000F, 588.164063F, 0.000000F, 593.976563F, 0.000000F, - 596.039063F, 0.000000F, 600.492188F, 0.000000F, 604.734375F, 0.000000F, 610.546875F, 0.000000F, - 612.609375F, 0.000000F, 617.296875F, 0.000000F, 623.695313F, 0.000000F, 627.937500F, 0.000000F, - 632.039063F, 0.000000F, 638.039063F, 0.000000F, 642.726563F, 0.000000F, 646.054688F, 0.000000F, - 648.164063F, 0.000000F, 651.914063F, 0.000000F, 656.132813F, 0.000000F, 660.398438F, 0.000000F, - 665.085938F, 0.000000F, 669.023438F, 0.000000F, 674.835938F, 0.000000F, 676.898438F, 0.000000F, - 682.898438F, 0.000000F, 687.585938F, 0.000000F, 693.984375F, 0.000000F, 701.765625F, 0.000000F, - 704.789063F, 0.000000F, 709.476563F, 0.000000F, 711.585938F, 0.000000F, 715.804688F, 0.000000F, - 720.046875F, 0.000000F, 723.515625F, 0.000000F, 727.781250F, 0.000000F, 732.468750F, 0.000000F, - 734.578125F, 0.000000F, 738.843750F, 0.000000F, 742.945313F, 0.000000F, 747.398438F, 0.000000F, - 752.085938F, 0.000000F, 760.453125F, 0.000000F, 767.390625F, 0.000000F, 770.859375F, 0.000000F, - 770.859375F, 0.000000F, 775.054688F, 0.000000F, 779.742188F, 0.000000F, 787.054688F, 0.000000F, - 789.398438F, 0.000000F, 794.085938F, 0.000000F, 798.023438F, 0.000000F, 801.492188F, 0.000000F, - 804.937500F, 0.000000F, 809.625000F, 0.000000F, 817.968750F, 0.000000F, 822.421875F, 0.000000F, - 828.234375F, 0.000000F, 828.234375F, 0.000000F, 834.398438F, 0.000000F, 836.460938F, 0.000000F, - 841.148438F, 0.000000F, 850.382813F, 0.000000F, 854.835938F, 0.000000F, 856.945313F, 0.000000F, - 862.453125F, 0.000000F, 866.718750F, 0.000000F, 869.742188F, 0.000000F, 871.804688F, 0.000000F, - 877.804688F, 0.000000F, 882.492188F, 0.000000F, 891.726563F, 0.000000F, 896.179688F, 0.000000F, - 901.992188F, 0.000000F, 901.992188F, 0.000000F, 908.156250F, 0.000000F, 910.218750F, 0.000000F, - 914.906250F, 0.000000F, 922.382813F, 0.000000F, 926.601563F, 0.000000F, 931.054688F, 0.000000F, - 936.562500F, 0.000000F, 940.804688F, 0.000000F, 944.250000F, 0.000000F, 948.937500F, 0.000000F, - 952.945313F, 0.000000F, 958.945313F, 0.000000F, 962.414063F, 0.000000F, 966.609375F, 0.000000F, - 972.609375F, 0.000000F, 977.296875F, 0.000000F, 980.812500F, 0.000000F, 984.820313F, 0.000000F, - 986.929688F, 0.000000F, 991.031250F, 0.000000F, 995.484375F, 0.000000F, 995.484375F, 0.000000F, - 1001.648438F, 0.000000F, 1003.710938F, 0.000000F, 1008.398438F, 0.000000F, 1013.414063F, 0.000000F, - 1017.679688F, 0.000000F, 1022.367188F, 0.000000F, 1030.312500F, 0.000000F, 1033.781250F, 0.000000F, - 1037.882813F, 0.000000F, 1042.570313F, 0.000000F, 1051.921875F, 0.000000F, 1056.164063F, 0.000000F, - 1062.984375F, 0.000000F, 1065.046875F, 0.000000F, 1071.046875F, 0.000000F, 1076.554688F, 0.000000F, - 1079.578125F, 0.000000F, 1081.640625F, 0.000000F, 1086.328125F, 0.000000F, 1092.726563F, 0.000000F, - 1096.992188F, 0.000000F, 1099.101563F, 0.000000F, 1102.570313F, 0.000000F, 1106.812500F, 0.000000F, - 1111.007813F, 0.000000F, 1115.695313F, 0.000000F, 1119.210938F, 0.000000F, 1121.320313F, 0.000000F, - 1121.320313F, 0.000000F, 1128.140625F, 0.000000F, 1130.250000F, 0.000000F, 1137.070313F, 0.000000F, - 1139.414063F, 0.000000F -}; - - -const char *fontVersionString2 = "Version 1.20 - October 2000"; -le_uint32 fontChecksum2 = 0xF5D9BA6D; - -LEUnicode inputText2[] = -{ - 0x0623, 0x0633, 0x0627, 0x0633, 0x064B, 0x0627, 0x060C, 0x0020, - 0x062A, 0x062A, 0x0639, 0x0627, 0x0645, 0x0644, 0x0020, 0x0627, - 0x0644, 0x062D, 0x0648, 0x0627, 0x0633, 0x064A, 0x0628, 0x0020, - 0x0641, 0x0642, 0x0637, 0x0020, 0x0645, 0x0639, 0x0020, 0x0627, - 0x0644, 0x0623, 0x0631, 0x0642, 0x0627, 0x0645, 0x060C, 0x0020, - 0x0648, 0x062A, 0x0642, 0x0648, 0x0645, 0x0020, 0x0628, 0x062A, - 0x062E, 0x0632, 0x064A, 0x0646, 0x0020, 0x0627, 0x0644, 0x0623, - 0x062D, 0x0631, 0x0641, 0x0020, 0x0648, 0x0627, 0x0644, 0x0645, - 0x062D, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 0x0644, 0x0623, - 0x062E, 0x0631, 0x0649, 0x0020, 0x0628, 0x0639, 0x062F, 0x0020, - 0x0623, 0x0646, 0x0020, 0x062A, 0x064F, 0x0639, 0x0637, 0x064A, - 0x0020, 0x0631, 0x0642, 0x0645, 0x0627, 0x0020, 0x0645, 0x0639, - 0x064A, 0x0646, 0x0627, 0x0020, 0x0644, 0x0643, 0x0644, 0x0020, - 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x0645, 0x0646, 0x0647, - 0x0627, 0x002E, 0x0020, 0x0648, 0x0642, 0x0628, 0x0644, 0x0020, - 0x0627, 0x062E, 0x062A, 0x0631, 0x0627, 0x0639, 0x0020, 0x0022, - 0x064A, 0x0648, 0x0646, 0x0650, 0x0643, 0x0648, 0x062F, 0x0022, - 0x060C, 0x0020, 0x0643, 0x0627, 0x0646, 0x0020, 0x0647, 0x0646, - 0x0627, 0x0643, 0x0020, 0x0645, 0x0626, 0x0627, 0x062A, 0x0020, - 0x0627, 0x0644, 0x0623, 0x0646, 0x0638, 0x0645, 0x0629, 0x0020, - 0x0644, 0x0644, 0x062A, 0x0634, 0x0641, 0x064A, 0x0631, 0x0020, - 0x0648, 0x062A, 0x062E, 0x0635, 0x064A, 0x0635, 0x0020, 0x0647, - 0x0630, 0x0647, 0x0020, 0x0627, 0x0644, 0x0623, 0x0631, 0x0642, - 0x0627, 0x0645, 0x0020, 0x0644, 0x0644, 0x0645, 0x062D, 0x0627, - 0x0631, 0x0641, 0x060C, 0x0020, 0x0648, 0x0644, 0x0645, 0x0020, - 0x064A, 0x0648, 0x062C, 0x062F, 0x0020, 0x0646, 0x0638, 0x0627, - 0x0645, 0x0020, 0x062A, 0x0634, 0x0641, 0x064A, 0x0631, 0x0020, - 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x064A, 0x062D, 0x062A, - 0x0648, 0x064A, 0x0020, 0x0639, 0x0644, 0x0649, 0x0020, 0x062C, - 0x0645, 0x064A, 0x0639, 0x0020, 0x0627, 0x0644, 0x0645, 0x062D, - 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 0x0644, 0x0636, 0x0631, - 0x0648, 0x0631, 0x064A, 0x0629 -}; - -LEGlyphID resultGlyphs2[] = -{ - 0x00000872, 0x000008D1, 0x000003F9, 0x0000040B, 0x0000088C, 0x0000089E, 0x000008BD, 0x000003EF, - 0x00000003, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, - 0x00000003, 0x000008A8, 0x000008D2, 0x000008C2, 0x0000087D, 0x00000003, 0x000008CE, 0x000008BE, - 0x000008A9, 0x00000003, 0x0000040D, 0x000008CC, 0x00000876, 0x00000882, 0x000008D1, 0x00000003, - 0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, - 0x00000896, 0x00000875, 0x00000003, 0x00000408, 0x0000086C, 0x000008A6, 0x000008C5, 0x00000003, - 0x00000888, 0x0000087D, 0x000008CC, 0x000008D1, 0x00000003, 0x000008C0, 0x000008BD, 0x0000040B, - 0x00000003, 0x000003E6, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BE, - 0x000008BD, 0x00000003, 0x00000408, 0x0000086C, 0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, - 0x000003EF, 0x00000003, 0x0000040A, 0x0000088A, 0x000008C9, 0x00000003, 0x00000898, 0x000008D2, - 0x0000089A, 0x00000886, 0x00000875, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, - 0x00000896, 0x00000876, 0x000008BE, 0x000008BD, 0x00000003, 0x00000872, 0x000008C2, 0x000008A6, - 0x000008C5, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000003F2, 0x0000086C, 0x0000086A, - 0x000008C1, 0x00000003, 0x00000406, 0x0000086C, 0x000008C6, 0x000008C9, 0x00000003, 0x00000409, - 0x0000086C, 0x000008B9, 0x00000003, 0x000003E6, 0x00000005, 0x000003F7, 0x000008CC, 0x000008BA, - 0x00000413, 0x000008C5, 0x000008CC, 0x000008D1, 0x00000005, 0x00000003, 0x00000401, 0x000003EF, - 0x0000088C, 0x00000876, 0x00000885, 0x000003EF, 0x00000003, 0x000008BC, 0x00000870, 0x000008B5, - 0x0000040B, 0x00000003, 0x00000011, 0x0000086C, 0x000008CA, 0x000008C6, 0x000008C1, 0x00000003, - 0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x000008BC, 0x000008BA, 0x000008BD, - 0x00000003, 0x0000086C, 0x000008C6, 0x000008D2, 0x000008AA, 0x000008C1, 0x00000003, 0x0000086C, - 0x000008C2, 0x000008B5, 0x000003F9, 0x00000003, 0x000008D0, 0x000008A2, 0x000008AA, 0x00000412, - 0x00000875, 0x00000003, 0x00000409, 0x000003EB, 0x00000003, 0x00000888, 0x000008AA, 0x0000086F, - 0x00000003, 0x0000040C, 0x0000088C, 0x00000885, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, - 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, 0x0000040B, - 0x00000003, 0x00000404, 0x0000088C, 0x00000881, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, - 0x000008C4, 0x000008D1, 0x0000088E, 0x00000886, 0x00000876, 0x0000086F, 0x00000003, 0x00000408, - 0x000008CC, 0x000008B6, 0x00000875, 0x0000040B, 0x00000003, 0x000003E6, 0x00000408, 0x0000086C, - 0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000008A8, 0x000008C1, - 0x00000003, 0x000008A0, 0x000008B6, 0x000008B1, 0x00000003, 0x0000086E, 0x000008D2, 0x00000891, - 0x000003EF, 0x000008CC, 0x00000882, 0x000008BD, 0x000003EF, 0x00000003, 0x000008BC, 0x000008C1, - 0x0000086C, 0x000008AA, 0x00000876, 0x00000875, 0x00000003, 0x000003E6, 0x0000086C, 0x0000040E, - 0x00000891, 0x0000086C, 0x00000891, 0x000003EB -}; - -le_int32 resultGlyphCount2 = 252; - -le_int32 resultIndices2[] = -{ - 0x000000FB, 0x000000FA, 0x000000F9, 0x000000F8, 0x000000F7, 0x000000F6, 0x000000F5, 0x000000F4, - 0x000000F3, 0x000000F2, 0x000000F1, 0x000000F0, 0x000000EF, 0x000000EE, 0x000000ED, 0x000000EC, - 0x000000EB, 0x000000EA, 0x000000E9, 0x000000E8, 0x000000E7, 0x000000E6, 0x000000E5, 0x000000E4, - 0x000000E3, 0x000000E2, 0x000000E1, 0x000000E0, 0x000000DF, 0x000000DE, 0x000000DD, 0x000000DC, - 0x000000DB, 0x000000DA, 0x000000D9, 0x000000D8, 0x000000D7, 0x000000D6, 0x000000D5, 0x000000D4, - 0x000000D3, 0x000000D2, 0x000000D1, 0x000000D0, 0x000000CF, 0x000000CE, 0x000000CD, 0x000000CC, - 0x000000CB, 0x000000CA, 0x000000C9, 0x000000C8, 0x000000C7, 0x000000C6, 0x000000C5, 0x000000C4, - 0x000000C3, 0x000000C2, 0x000000C1, 0x000000C0, 0x000000BF, 0x000000BE, 0x000000BD, 0x000000BC, - 0x000000BB, 0x000000BA, 0x000000B9, 0x000000B8, 0x000000B7, 0x000000B6, 0x000000B5, 0x000000B4, - 0x000000B3, 0x000000B2, 0x000000B1, 0x000000B0, 0x000000AF, 0x000000AE, 0x000000AD, 0x000000AC, - 0x000000AB, 0x000000AA, 0x000000A9, 0x000000A8, 0x000000A7, 0x000000A6, 0x000000A5, 0x000000A4, - 0x000000A3, 0x000000A2, 0x000000A1, 0x000000A0, 0x0000009F, 0x0000009E, 0x0000009D, 0x0000009C, - 0x0000009B, 0x0000009A, 0x00000099, 0x00000098, 0x00000097, 0x00000096, 0x00000095, 0x00000094, - 0x00000093, 0x00000092, 0x00000091, 0x00000090, 0x0000008F, 0x0000008E, 0x0000008D, 0x0000008C, - 0x0000008B, 0x0000008A, 0x00000089, 0x00000088, 0x00000087, 0x00000086, 0x00000085, 0x00000084, - 0x00000083, 0x00000082, 0x00000081, 0x00000080, 0x0000007F, 0x0000007E, 0x0000007D, 0x0000007C, - 0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 0x00000074, - 0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 0x0000006C, - 0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 0x00000064, - 0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 0x0000005C, - 0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 0x00000054, - 0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 0x0000004C, - 0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 0x00000044, - 0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 0x0000003C, - 0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 0x00000034, - 0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 0x0000002C, - 0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, - 0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 0x0000001C, - 0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 0x00000014, - 0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 0x0000000C, - 0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 0x00000004, - 0x00000003, 0x00000002, 0x00000001, 0x00000000 -}; - -float resultPositions2[] = -{ - 0.000000F, 0.000000F, 6.316406F, 0.000000F, 10.382813F, 0.000000F, 15.492188F, 0.000000F, - 21.035156F, 0.000000F, 27.058594F, 0.000000F, 39.527344F, 0.000000F, 43.792969F, 0.000000F, - 47.408203F, 0.000000F, 51.205078F, 0.000000F, 66.216797F, 0.000000F, 71.326172F, 0.000000F, - 74.695313F, 0.000000F, 83.367188F, 0.000000F, 90.826172F, 0.000000F, 95.091797F, 0.000000F, - 98.707031F, 0.000000F, 102.503906F, 0.000000F, 109.962891F, 0.000000F, 114.949219F, 0.000000F, - 122.408203F, 0.000000F, 130.687500F, 0.000000F, 134.484375F, 0.000000F, 145.787109F, 0.000000F, - 150.773438F, 0.000000F, 156.884766F, 0.000000F, 160.681641F, 0.000000F, 172.277344F, 0.000000F, - 177.919922F, 0.000000F, 182.906250F, 0.000000F, 191.578125F, 0.000000F, 195.644531F, 0.000000F, - 199.441406F, 0.000000F, 206.507813F, 0.000000F, 214.787109F, 0.000000F, 218.402344F, 0.000000F, - 223.945313F, 0.000000F, 227.742188F, 0.000000F, 233.765625F, 0.000000F, 238.751953F, 0.000000F, - 245.185547F, 0.000000F, 257.982422F, 0.000000F, 262.048828F, 0.000000F, 265.845703F, 0.000000F, - 272.654297F, 0.000000F, 276.023438F, 0.000000F, 285.240234F, 0.000000F, 289.306641F, 0.000000F, - 293.103516F, 0.000000F, 300.169922F, 0.000000F, 308.449219F, 0.000000F, 314.091797F, 0.000000F, - 318.158203F, 0.000000F, 321.955078F, 0.000000F, 329.572266F, 0.000000F, 333.837891F, 0.000000F, - 339.380859F, 0.000000F, 343.177734F, 0.000000F, 346.974609F, 0.000000F, 361.986328F, 0.000000F, - 367.095703F, 0.000000F, 370.464844F, 0.000000F, 379.136719F, 0.000000F, 386.595703F, 0.000000F, - 391.582031F, 0.000000F, 395.847656F, 0.000000F, 399.644531F, 0.000000F, 406.453125F, 0.000000F, - 409.822266F, 0.000000F, 415.523438F, 0.000000F, 420.632813F, 0.000000F, 420.632813F, 0.000000F, - 427.441406F, 0.000000F, 431.056641F, 0.000000F, 434.853516F, 0.000000F, 441.357422F, 0.000000F, - 448.423828F, 0.000000F, 455.912109F, 0.000000F, 459.708984F, 0.000000F, 479.255859F, 0.000000F, - 484.242188F, 0.000000F, 496.710938F, 0.000000F, 505.382813F, 0.000000F, 509.449219F, 0.000000F, - 514.992188F, 0.000000F, 518.789063F, 0.000000F, 524.812500F, 0.000000F, 529.798828F, 0.000000F, - 536.232422F, 0.000000F, 549.029297F, 0.000000F, 554.015625F, 0.000000F, 559.001953F, 0.000000F, - 563.267578F, 0.000000F, 567.064453F, 0.000000F, 573.380859F, 0.000000F, 580.839844F, 0.000000F, - 590.056641F, 0.000000F, 594.123047F, 0.000000F, 594.123047F, 0.000000F, 600.931641F, 0.000000F, - 604.546875F, 0.000000F, 608.343750F, 0.000000F, 620.636719F, 0.000000F, 624.005859F, 0.000000F, - 628.992188F, 0.000000F, 635.830078F, 0.000000F, 639.626953F, 0.000000F, 653.361328F, 0.000000F, - 656.730469F, 0.000000F, 661.716797F, 0.000000F, 669.205078F, 0.000000F, 673.001953F, 0.000000F, - 683.777344F, 0.000000F, 687.146484F, 0.000000F, 692.660156F, 0.000000F, 696.457031F, 0.000000F, - 700.253906F, 0.000000F, 704.736328F, 0.000000F, 711.105469F, 0.000000F, 716.748047F, 0.000000F, - 722.994141F, 0.000000F, 722.994141F, 0.000000F, 727.060547F, 0.000000F, 732.703125F, 0.000000F, - 736.769531F, 0.000000F, 741.251953F, 0.000000F, 745.048828F, 0.000000F, 752.507813F, 0.000000F, - 756.123047F, 0.000000F, 762.146484F, 0.000000F, 767.132813F, 0.000000F, 775.412109F, 0.000000F, - 779.027344F, 0.000000F, 782.824219F, 0.000000F, 794.203125F, 0.000000F, 799.189453F, 0.000000F, - 804.890625F, 0.000000F, 810.433594F, 0.000000F, 814.230469F, 0.000000F, 818.027344F, 0.000000F, - 821.396484F, 0.000000F, 828.128906F, 0.000000F, 833.115234F, 0.000000F, 839.953125F, 0.000000F, - 843.750000F, 0.000000F, 850.816406F, 0.000000F, 859.095703F, 0.000000F, 862.710938F, 0.000000F, - 868.253906F, 0.000000F, 872.050781F, 0.000000F, 883.429688F, 0.000000F, 889.675781F, 0.000000F, - 893.941406F, 0.000000F, 897.738281F, 0.000000F, 901.107422F, 0.000000F, 906.093750F, 0.000000F, - 911.080078F, 0.000000F, 917.800781F, 0.000000F, 924.638672F, 0.000000F, 928.435547F, 0.000000F, - 931.804688F, 0.000000F, 939.263672F, 0.000000F, 944.964844F, 0.000000F, 950.074219F, 0.000000F, - 953.871094F, 0.000000F, 965.173828F, 0.000000F, 974.390625F, 0.000000F, 981.111328F, 0.000000F, - 981.111328F, 0.000000F, 985.177734F, 0.000000F, 988.974609F, 0.000000F, 999.750000F, 0.000000F, - 1003.365234F, 0.000000F, 1007.162109F, 0.000000F, 1014.228516F, 0.000000F, 1020.949219F, 0.000000F, - 1025.015625F, 0.000000F, 1028.812500F, 0.000000F, 1040.408203F, 0.000000F, 1046.431641F, 0.000000F, - 1054.710938F, 0.000000F, 1054.710938F, 0.000000F, 1061.519531F, 0.000000F, 1065.134766F, 0.000000F, - 1068.931641F, 0.000000F, 1083.943359F, 0.000000F, 1089.052734F, 0.000000F, 1092.421875F, 0.000000F, - 1101.093750F, 0.000000F, 1108.552734F, 0.000000F, 1112.818359F, 0.000000F, 1116.433594F, 0.000000F, - 1121.976563F, 0.000000F, 1125.773438F, 0.000000F, 1140.785156F, 0.000000F, 1146.808594F, 0.000000F, - 1155.087891F, 0.000000F, 1155.087891F, 0.000000F, 1161.896484F, 0.000000F, 1165.511719F, 0.000000F, - 1169.308594F, 0.000000F, 1180.541016F, 0.000000F, 1184.607422F, 0.000000F, 1190.630859F, 0.000000F, - 1199.302734F, 0.000000F, 1204.289063F, 0.000000F, 1208.355469F, 0.000000F, 1212.152344F, 0.000000F, - 1218.960938F, 0.000000F, 1224.603516F, 0.000000F, 1231.037109F, 0.000000F, 1235.103516F, 0.000000F, - 1240.646484F, 0.000000F, 1244.443359F, 0.000000F, 1248.240234F, 0.000000F, 1255.048828F, 0.000000F, - 1258.417969F, 0.000000F, 1264.119141F, 0.000000F, 1269.228516F, 0.000000F, 1269.228516F, 0.000000F, - 1276.037109F, 0.000000F, 1279.652344F, 0.000000F, 1283.449219F, 0.000000F, 1290.908203F, 0.000000F, - 1297.746094F, 0.000000F, 1301.542969F, 0.000000F, 1311.427734F, 0.000000F, 1317.861328F, 0.000000F, - 1323.562500F, 0.000000F, 1327.359375F, 0.000000F, 1341.492188F, 0.000000F, 1346.478516F, 0.000000F, - 1357.904297F, 0.000000F, 1361.519531F, 0.000000F, 1367.162109F, 0.000000F, 1375.833984F, 0.000000F, - 1380.099609F, 0.000000F, 1383.714844F, 0.000000F, 1387.511719F, 0.000000F, 1398.890625F, 0.000000F, - 1405.728516F, 0.000000F, 1409.097656F, 0.000000F, 1415.818359F, 0.000000F, 1420.804688F, 0.000000F, - 1424.871094F, 0.000000F, 1428.667969F, 0.000000F, 1432.464844F, 0.000000F, 1435.833984F, 0.000000F, - 1435.833984F, 0.000000F, 1447.259766F, 0.000000F, 1450.628906F, 0.000000F, 1462.054688F, 0.000000F, - 1465.669922F, 0.000000F -}; - - -const char *fontVersionString3 = "Version 2.1 - July 1995"; -le_uint32 fontChecksum3 = 0x49B67200; - -LEUnicode inputText3[] = -{ - 0x0E1A, 0x0E17, 0x0E17, 0x0E35, 0x0E48, 0x0E51, 0x0E1E, 0x0E32, - 0x0E22, 0x0E38, 0x0E44, 0x0E0B, 0x0E42, 0x0E04, 0x0E25, 0x0E19, - 0x0E42, 0x0E14, 0x0E42, 0x0E23, 0x0E18, 0x0E35, 0x0E2D, 0x0E32, - 0x0E28, 0x0E31, 0x0E22, 0x0E2D, 0x0E22, 0x0E39, 0x0E48, 0x0E17, - 0x0E48, 0x0E32, 0x0E21, 0x0E01, 0x0E25, 0x0E32, 0x0E07, 0x0E17, - 0x0E38, 0x0E48, 0x0E07, 0x0E43, 0x0E2B, 0x0E0D, 0x0E48, 0x0E43, - 0x0E19, 0x0E41, 0x0E04, 0x0E19, 0x0E0B, 0x0E31, 0x0E2A, 0x0E01, - 0x0E31, 0x0E1A, 0x0E25, 0x0E38, 0x0E07, 0x0E40, 0x0E2E, 0x0E19, - 0x0E23, 0x0E35, 0x0E0A, 0x0E32, 0x0E27, 0x0E44, 0x0E23, 0x0E48, - 0x0E41, 0x0E25, 0x0E30, 0x0E1B, 0x0E49, 0x0E32, 0x0E40, 0x0E2D, - 0x0E47, 0x0E21, 0x0E20, 0x0E23, 0x0E23, 0x0E22, 0x0E32, 0x0E0A, - 0x0E32, 0x0E27, 0x0E44, 0x0E23, 0x0E48, 0x0E1A, 0x0E49, 0x0E32, - 0x0E19, 0x0E02, 0x0E2D, 0x0E07, 0x0E1E, 0x0E27, 0x0E01, 0x0E40, - 0x0E02, 0x0E32, 0x0E2B, 0x0E25, 0x0E31, 0x0E07, 0x0E40, 0x0E25, - 0x0E47, 0x0E01, 0x0E40, 0x0E1E, 0x0E23, 0x0E32, 0x0E30, 0x0E44, - 0x0E21, 0x0E49, 0x0E2A, 0x0E23, 0x0E49, 0x0E32, 0x0E07, 0x0E1A, - 0x0E49, 0x0E32, 0x0E19, 0x0E15, 0x0E49, 0x0E2D, 0x0E07, 0x0E02, - 0x0E19, 0x0E21, 0x0E32, 0x0E14, 0x0E49, 0x0E27, 0x0E22, 0x0E40, - 0x0E01, 0x0E27, 0x0E35, 0x0E22, 0x0E19, 0x0E40, 0x0E1B, 0x0E47, - 0x0E19, 0x0E23, 0x0E30, 0x0E22, 0x0E30, 0x0E17, 0x0E32, 0x0E07, - 0x0E2B, 0x0E25, 0x0E32, 0x0E22, 0x0E44, 0x0E21, 0x0E25, 0x0E4C -}; - -LEGlyphID resultGlyphs3[] = -{ - 0x000000F3, 0x000000F0, 0x000000F0, 0x0000010E, 0x0000011D, 0x00000126, 0x000000F7, 0x0000010B, - 0x000000FB, 0x00000111, 0x00000119, 0x000000E4, 0x00000117, 0x000000DD, 0x000000FE, 0x000000F2, - 0x00000117, 0x000000ED, 0x00000117, 0x000000FC, 0x000000F1, 0x0000010E, 0x00000106, 0x0000010B, - 0x00000101, 0x0000010A, 0x000000FB, 0x00000106, 0x000000FB, 0x00000112, 0x0000013B, 0x000000F0, - 0x0000013B, 0x0000010B, 0x000000FA, 0x000000DA, 0x000000FE, 0x0000010B, 0x000000E0, 0x000000F0, - 0x00000111, 0x0000013B, 0x000000E0, 0x00000118, 0x00000104, 0x000000E6, 0x0000013B, 0x00000118, - 0x000000F2, 0x00000116, 0x000000DD, 0x000000F2, 0x000000E4, 0x0000010A, 0x00000103, 0x000000DA, - 0x0000010A, 0x000000F3, 0x000000FE, 0x00000111, 0x000000E0, 0x00000115, 0x00000107, 0x000000F2, - 0x000000FC, 0x0000010E, 0x000000E3, 0x0000010B, 0x00000100, 0x00000119, 0x000000FC, 0x0000013B, - 0x00000116, 0x000000FE, 0x00000109, 0x000000F4, 0x00000137, 0x0000010B, 0x00000115, 0x00000106, - 0x0000011C, 0x000000FA, 0x000000F9, 0x000000FC, 0x000000FC, 0x000000FB, 0x0000010B, 0x000000E3, - 0x0000010B, 0x00000100, 0x00000119, 0x000000FC, 0x0000013B, 0x000000F3, 0x0000013C, 0x0000010B, - 0x000000F2, 0x000000DB, 0x00000106, 0x000000E0, 0x000000F7, 0x00000100, 0x000000DA, 0x00000115, - 0x000000DB, 0x0000010B, 0x00000104, 0x000000FE, 0x0000010A, 0x000000E0, 0x00000115, 0x000000FE, - 0x0000011C, 0x000000DA, 0x00000115, 0x000000F7, 0x000000FC, 0x0000010B, 0x00000109, 0x00000119, - 0x000000FA, 0x0000013C, 0x00000103, 0x000000FC, 0x0000013C, 0x0000010B, 0x000000E0, 0x000000F3, - 0x0000013C, 0x0000010B, 0x000000F2, 0x000000EE, 0x0000013C, 0x00000106, 0x000000E0, 0x000000DB, - 0x000000F2, 0x000000FA, 0x0000010B, 0x000000ED, 0x0000013C, 0x00000100, 0x000000FB, 0x00000115, - 0x000000DA, 0x00000100, 0x0000010E, 0x000000FB, 0x000000F2, 0x00000115, 0x000000F4, 0x00000143, - 0x000000F2, 0x000000FC, 0x00000109, 0x000000FB, 0x00000109, 0x000000F0, 0x0000010B, 0x000000E0, - 0x00000104, 0x000000FE, 0x0000010B, 0x000000FB, 0x00000119, 0x000000FA, 0x000000FE, 0x0000013F -}; - -le_int32 resultGlyphCount3 = 168; - -le_int32 resultIndices3[] = -{ - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, - 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003C, 0x0000003D, 0x0000003E, 0x0000003F, - 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, - 0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, - 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, - 0x00000058, 0x00000059, 0x0000005A, 0x0000005B, 0x0000005C, 0x0000005D, 0x0000005E, 0x0000005F, - 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, - 0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 0x0000006D, 0x0000006E, 0x0000006F, - 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, - 0x00000078, 0x00000079, 0x0000007A, 0x0000007B, 0x0000007C, 0x0000007D, 0x0000007E, 0x0000007F, - 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, - 0x00000088, 0x00000089, 0x0000008A, 0x0000008B, 0x0000008C, 0x0000008D, 0x0000008E, 0x0000008F, - 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, - 0x00000098, 0x00000099, 0x0000009A, 0x0000009B, 0x0000009C, 0x0000009D, 0x0000009E, 0x0000009F, - 0x000000A0, 0x000000A1, 0x000000A2, 0x000000A3, 0x000000A4, 0x000000A5, 0x000000A6, 0x000000A7 -}; - -float resultPositions3[] = -{ - 0.000000F, 0.000000F, 5.399414F, 0.000000F, 10.798828F, 0.000000F, 16.198242F, 0.000000F, - 16.198242F, 0.000000F, 16.198242F, 0.000000F, 21.046875F, 0.000000F, 26.616211F, 0.000000F, - 30.035156F, 0.000000F, 34.151367F, 0.000000F, 34.151367F, 0.000000F, 38.279297F, 0.000000F, - 43.558594F, 0.000000F, 47.663086F, 0.000000F, 52.438477F, 0.000000F, 57.178711F, 0.000000F, - 62.698242F, 0.000000F, 66.802734F, 0.000000F, 71.601563F, 0.000000F, 75.706055F, 0.000000F, - 79.810547F, 0.000000F, 84.369141F, 0.000000F, 84.369141F, 0.000000F, 89.097656F, 0.000000F, - 92.516602F, 0.000000F, 97.195313F, 0.000000F, 97.195313F, 0.000000F, 101.311523F, 0.000000F, - 106.040039F, 0.000000F, 110.156250F, 0.000000F, 110.156250F, 0.000000F, 110.156250F, 0.000000F, - 115.555664F, 0.000000F, 115.555664F, 0.000000F, 118.974609F, 0.000000F, 124.013672F, 0.000000F, - 128.765625F, 0.000000F, 133.505859F, 0.000000F, 136.924805F, 0.000000F, 140.704102F, 0.000000F, - 146.103516F, 0.000000F, 146.103516F, 0.000000F, 146.103516F, 0.000000F, 149.882813F, 0.000000F, - 153.553711F, 0.000000F, 159.158203F, 0.000000F, 165.421875F, 0.000000F, 165.421875F, 0.000000F, - 169.092773F, 0.000000F, 174.612305F, 0.000000F, 179.135742F, 0.000000F, 183.911133F, 0.000000F, - 189.430664F, 0.000000F, 194.709961F, 0.000000F, 194.709961F, 0.000000F, 199.989258F, 0.000000F, - 204.741211F, 0.000000F, 204.741211F, 0.000000F, 210.140625F, 0.000000F, 214.880859F, 0.000000F, - 214.880859F, 0.000000F, 218.660156F, 0.000000F, 220.675781F, 0.000000F, 225.128906F, 0.000000F, - 230.648438F, 0.000000F, 234.752930F, 0.000000F, 234.752930F, 0.000000F, 239.613281F, 0.000000F, - 243.032227F, 0.000000F, 247.280273F, 0.000000F, 251.408203F, 0.000000F, 255.512695F, 0.000000F, - 255.512695F, 0.000000F, 260.036133F, 0.000000F, 264.776367F, 0.000000F, 269.071289F, 0.000000F, - 274.470703F, 0.000000F, 274.470703F, 0.000000F, 277.889648F, 0.000000F, 279.905273F, 0.000000F, - 284.633789F, 0.000000F, 284.633789F, 0.000000F, 289.672852F, 0.000000F, 294.641602F, 0.000000F, - 298.746094F, 0.000000F, 302.850586F, 0.000000F, 306.966797F, 0.000000F, 310.385742F, 0.000000F, - 315.246094F, 0.000000F, 318.665039F, 0.000000F, 322.913086F, 0.000000F, 327.041016F, 0.000000F, - 331.145508F, 0.000000F, 331.145508F, 0.000000F, 336.544922F, 0.000000F, 336.544922F, 0.000000F, - 339.963867F, 0.000000F, 345.483398F, 0.000000F, 350.258789F, 0.000000F, 354.987305F, 0.000000F, - 358.766602F, 0.000000F, 364.335938F, 0.000000F, 368.583984F, 0.000000F, 373.335938F, 0.000000F, - 375.351563F, 0.000000F, 380.126953F, 0.000000F, 383.545898F, 0.000000F, 389.150391F, 0.000000F, - 393.890625F, 0.000000F, 393.890625F, 0.000000F, 397.669922F, 0.000000F, 399.685547F, 0.000000F, - 404.425781F, 0.000000F, 404.425781F, 0.000000F, 409.177734F, 0.000000F, 411.193359F, 0.000000F, - 416.762695F, 0.000000F, 420.867188F, 0.000000F, 424.286133F, 0.000000F, 428.581055F, 0.000000F, - 432.708984F, 0.000000F, 437.748047F, 0.000000F, 437.748047F, 0.000000F, 443.027344F, 0.000000F, - 447.131836F, 0.000000F, 447.131836F, 0.000000F, 450.550781F, 0.000000F, 454.330078F, 0.000000F, - 459.729492F, 0.000000F, 459.729492F, 0.000000F, 463.148438F, 0.000000F, 468.667969F, 0.000000F, - 473.478516F, 0.000000F, 473.478516F, 0.000000F, 478.207031F, 0.000000F, 481.986328F, 0.000000F, - 486.761719F, 0.000000F, 492.281250F, 0.000000F, 497.320313F, 0.000000F, 500.739258F, 0.000000F, - 505.538086F, 0.000000F, 505.538086F, 0.000000F, 509.786133F, 0.000000F, 513.902344F, 0.000000F, - 515.917969F, 0.000000F, 520.669922F, 0.000000F, 524.917969F, 0.000000F, 524.917969F, 0.000000F, - 529.034180F, 0.000000F, 534.553711F, 0.000000F, 536.569336F, 0.000000F, 541.968750F, 0.000000F, - 541.968750F, 0.000000F, 547.488281F, 0.000000F, 551.592773F, 0.000000F, 555.887695F, 0.000000F, - 560.003906F, 0.000000F, 564.298828F, 0.000000F, 569.698242F, 0.000000F, 573.117188F, 0.000000F, - 576.896484F, 0.000000F, 582.500977F, 0.000000F, 587.241211F, 0.000000F, 590.660156F, 0.000000F, - 594.776367F, 0.000000F, 598.904297F, 0.000000F, 603.943359F, 0.000000F, 608.683594F, 0.000000F, - 608.683594F, 0.000000F -}; - - -TestInput testInputs[] = -{ - {"raghu.ttf", fontVersionString0, fontChecksum0, inputText0, 136, devaScriptCode, false}, - {"CODE2000.TTF", fontVersionString1, fontChecksum1, inputText1, 252, arabScriptCode, true}, - {"LucidaSansRegular.ttf", fontVersionString2, fontChecksum2, inputText2, 252, arabScriptCode, true}, - {"angsd___.ttf", fontVersionString3, fontChecksum3, inputText3, 168, thaiScriptCode, false}, -}; - -le_int32 testCount = ARRAY_LENGTH(testInputs); - -TestResult testResults[] = -{ - {resultGlyphCount0, resultGlyphs0, resultIndices0, resultPositions0}, - {resultGlyphCount1, resultGlyphs1, resultIndices1, resultPositions1}, - {resultGlyphCount2, resultGlyphs2, resultIndices2, resultPositions2}, - {resultGlyphCount3, resultGlyphs3, resultIndices3, resultPositions3}, -}; - diff --git a/icu4c/source/test/letest/xmlreader.cpp b/icu4c/source/test/letest/xmlreader.cpp deleted file mode 100644 index 5d4acc8c2f0..00000000000 --- a/icu4c/source/test/letest/xmlreader.cpp +++ /dev/null @@ -1,261 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ******************************************************************************* - * - * Copyright (C) 1999-2014, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - */ - -#include "unicode/utypes.h" -#include "unicode/uclean.h" -#include "unicode/uchar.h" -#include "unicode/unistr.h" -#include "unicode/uscript.h" -#include "unicode/putil.h" -#include "unicode/ctest.h" - -#include "layout/LETypes.h" -#include "layout/LEScripts.h" - -#include "letsutil.h" -#include "letest.h" - -#include "xmlreader.h" - -#include "xmlparser.h" - -#include -#include -#include - -//U_NAMESPACE_USE - -#define CH_COMMA 0x002C - -static le_uint32 *getHexArray(const UnicodeString &numbers, int32_t &arraySize) -{ - int32_t offset = -1; - - arraySize = 1; - while((offset = numbers.indexOf(CH_COMMA, offset + 1)) >= 0) { - arraySize += 1; - } - - le_uint32 *array = NEW_ARRAY(le_uint32, arraySize); - char number[16]; - le_int32 count = 0; - le_int32 start = 0, end = 0; - le_int32 len = 0; - - // trim leading whitespace - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - while((end = numbers.indexOf(CH_COMMA, start)) >= 0) { - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - start = end + 1; - - sscanf(number, "%x", &array[count++]); - - // trim whitespace following the comma - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - } - - // trim trailing whitespace - end = numbers.length(); - while(u_isUWhiteSpace(numbers[end - 1])) { - end -= 1; - } - - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - sscanf(number, "%x", &array[count]); - - return array; -} - -static float *getFloatArray(const UnicodeString &numbers, int32_t &arraySize) -{ - int32_t offset = -1; - - arraySize = 1; - while((offset = numbers.indexOf(CH_COMMA, offset + 1)) >= 0) { - arraySize += 1; - } - - float *array = NEW_ARRAY(float, arraySize); - char number[32]; - le_int32 count = 0; - le_int32 start = 0, end = 0; - le_int32 len = 0; - - // trim leading whitespace - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - while((end = numbers.indexOf(CH_COMMA, start)) >= 0) { - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - start = end + 1; - - sscanf(number, "%f", &array[count++]); - - // trim whiteapce following the comma - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - } - - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - // trim trailing whitespace - end = numbers.length(); - while(u_isUWhiteSpace(numbers[end - 1])) { - end -= 1; - } - - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - sscanf(number, "%f", &array[count]); - - return array; -} - -U_CDECL_BEGIN -void readTestFile(const char *testFilePath, TestCaseCallback callback) -{ -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - UErrorCode status = U_ZERO_ERROR; - UXMLParser *parser = UXMLParser::createParser(status); - UXMLElement *root = parser->parseFile(testFilePath, status); - - if (root == nullptr) { - log_err("Could not open the test data file: %s\n", testFilePath); - delete parser; - return; - } - - UnicodeString test_case = UNICODE_STRING_SIMPLE("test-case"); - UnicodeString test_text = UNICODE_STRING_SIMPLE("test-text"); - UnicodeString test_font = UNICODE_STRING_SIMPLE("test-font"); - UnicodeString result_glyphs = UNICODE_STRING_SIMPLE("result-glyphs"); - UnicodeString result_indices = UNICODE_STRING_SIMPLE("result-indices"); - UnicodeString result_positions = UNICODE_STRING_SIMPLE("result-positions"); - - // test-case attributes - UnicodeString id_attr = UNICODE_STRING_SIMPLE("id"); - UnicodeString script_attr = UNICODE_STRING_SIMPLE("script"); - UnicodeString lang_attr = UNICODE_STRING_SIMPLE("lang"); - - // test-font attributes - UnicodeString name_attr = UNICODE_STRING_SIMPLE("name"); - UnicodeString ver_attr = UNICODE_STRING_SIMPLE("version"); - UnicodeString cksum_attr = UNICODE_STRING_SIMPLE("checksum"); - - const UXMLElement *testCase; - int32_t tc = 0; - - while((testCase = root->nextChildElement(tc)) != nullptr) { - if (testCase->getTagName().compare(test_case) == 0) { - char *id = getCString(testCase->getAttribute(id_attr)); - char *script = getCString(testCase->getAttribute(script_attr)); - char *lang = getCString(testCase->getAttribute(lang_attr)); - char *fontName = nullptr; - char *fontVer = nullptr; - char *fontCksum = nullptr; - const UXMLElement *element; - int32_t ec = 0; - int32_t charCount = 0; - // int32_t typoFlags = 3; // kerning + ligatures... - UScriptCode scriptCode; - le_int32 languageCode = -1; - UnicodeString text, glyphs, indices, positions; - int32_t glyphCount = 0, indexCount = 0, positionCount = 0; - TestResult expected = {0, nullptr, nullptr, nullptr}; - - uscript_getCode(script, &scriptCode, 1, &status); - if (LE_FAILURE(status)) { - log_err("invalid script name: %s.\n", script); - goto free_c_strings; - } - - if (lang != nullptr) { - languageCode = getLanguageCode(lang); - - if (languageCode < 0) { - log_err("invalid language name: %s.\n", lang); - goto free_c_strings; - } - } - - while((element = testCase->nextChildElement(ec)) != nullptr) { - UnicodeString tag = element->getTagName(); - - // TODO: make sure that each element is only used once. - if (tag.compare(test_font) == 0) { - fontName = getCString(element->getAttribute(name_attr)); - fontVer = getCString(element->getAttribute(ver_attr)); - fontCksum = getCString(element->getAttribute(cksum_attr)); - - } else if (tag.compare(test_text) == 0) { - text = element->getText(true); - charCount = text.length(); - } else if (tag.compare(result_glyphs) == 0) { - glyphs = element->getText(true); - } else if (tag.compare(result_indices) == 0) { - indices = element->getText(true); - } else if (tag.compare(result_positions) == 0) { - positions = element->getText(true); - } else { - // an unknown tag... - char *cTag = getCString(&tag); - - log_info("Test %s: unknown element with tag \"%s\"\n", id, cTag); - freeCString(cTag); - } - } - - expected.glyphs = (LEGlyphID *) getHexArray(glyphs, glyphCount); - expected.indices = (le_int32 *) getHexArray(indices, indexCount); - expected.positions = getFloatArray(positions, positionCount); - - expected.glyphCount = glyphCount; - - if (glyphCount < charCount || indexCount != glyphCount || positionCount < glyphCount * 2 + 2) { - log_err("Test %s: inconsistent input data: charCount = %d, glyphCount = %d, indexCount = %d, positionCount = %d\n", - id, charCount, glyphCount, indexCount, positionCount); - goto free_expected; - }; - - (*callback)(id, fontName, fontVer, fontCksum, scriptCode, languageCode, text.getBuffer(), charCount, &expected); - -free_expected: - DELETE_ARRAY(expected.positions); - DELETE_ARRAY(expected.indices); - DELETE_ARRAY(expected.glyphs); - -free_c_strings: - freeCString(fontCksum); - freeCString(fontVer); - freeCString(fontName); - freeCString(lang); - freeCString(script); - freeCString(id); - } - } - - delete root; - delete parser; -#endif -} -U_CDECL_END diff --git a/icu4c/source/test/letest/xmlreader.h b/icu4c/source/test/letest/xmlreader.h deleted file mode 100644 index 2067f0a7f6e..00000000000 --- a/icu4c/source/test/letest/xmlreader.h +++ /dev/null @@ -1,27 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - * - * (C) Copyright IBM Corp. 1998-2014 - All Rights Reserved - * - */ - -#ifndef __XMLREADER_H -#define __XMLREADER_H - -#include "layout/LETypes.h" -#include "letest.h" - -typedef void (*TestCaseCallback) (const char *testID, - const char *fontName, - const char *fontVersion, - const char *fontChecksum, - le_int32 scriptCode, - le_int32 languageCode, - const LEUnicode *text, - le_int32 charCount, - TestResult *expected); - -U_CAPI void readTestFile(const char *testFilePath, TestCaseCallback callback); - -#endif diff --git a/icu4c/source/test/perf/leperf/FontObject.cpp b/icu4c/source/test/perf/leperf/FontObject.cpp deleted file mode 100644 index 31b13eb4f73..00000000000 --- a/icu4c/source/test/perf/leperf/FontObject.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/*************************************************************************** -* -* © 2016 and later: Unicode, Inc. and others. -* License & terms of use: http://www.unicode.org/copyright.html -* -****************************************************************************/ -/*************************************************************************** -* -* Copyright (C) 1998-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - -#include - -#include "layout/LETypes.h" -#include "FontObject.h" -#include "layout/LESwaps.h" - -using icu::LESwaps; - -FontObject::FontObject(char *fileName) - : directory(nullptr), numTables(0), searchRange(0),entrySelector(0), - cmapTable(nullptr), cmSegCount(0), cmSearchRange(0), cmEntrySelector(0), - cmEndCodes(nullptr), cmStartCodes(nullptr), cmIdDelta(nullptr), cmIdRangeOffset(nullptr), - headTable(nullptr), hmtxTable(nullptr), numGlyphs(0), numOfLongHorMetrics(0), file(nullptr) -{ - file = fopen(fileName, "rb"); - - if (file == nullptr) { - printf("?? Couldn't open %s", fileName); - return; - } - - SFNTDirectory tempDir; - - fread(&tempDir, sizeof tempDir, 1, file); - - numTables = SWAPW(tempDir.numTables); - searchRange = SWAPW(tempDir.searchRange) >> 4; - entrySelector = SWAPW(tempDir.entrySelector); - rangeShift = SWAPW(tempDir.rangeShift) >> 4; - - int dirSize = sizeof tempDir + ((numTables - ANY_NUMBER) * sizeof(DirectoryEntry)); - - directory = reinterpret_cast(new char[dirSize]); - - fseek(file, 0L, SEEK_SET); - fread(directory, sizeof(char), dirSize, file); - - initUnicodeCMAP(); -} - -FontObject::~FontObject() -{ - fclose(file); - delete[] directory; - delete[] cmapTable; - delete[] headTable; - delete[] hmtxTable; -} - -void FontObject::deleteTable(void *table) -{ - delete[] static_cast(table); -} - -DirectoryEntry *FontObject::findTable(LETag tag) -{ - le_uint16 table = 0; - le_uint16 probe = 1 << entrySelector; - - if (SWAPL(directory->tableDirectory[rangeShift].tag) <= tag) { - table = rangeShift; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPL(directory->tableDirectory[table + probe].tag) <= tag) { - table += probe; - } - } - - if (SWAPL(directory->tableDirectory[table].tag) == tag) { - return &directory->tableDirectory[table]; - } - - return nullptr; -} - -void *FontObject::readTable(LETag tag, le_uint32 *length) -{ - DirectoryEntry *entry = findTable(tag); - - if (entry == nullptr) { - *length = 0; - return nullptr; - } - - *length = SWAPL(entry->length); - - void *table = new char[*length]; - - fseek(file, SWAPL(entry->offset), SEEK_SET); - fread(table, sizeof(char), *length, file); - - return table; -} - -CMAPEncodingSubtable *FontObject::findCMAP(le_uint16 platformID, le_uint16 platformSpecificID) -{ - LETag cmapTag = 0x636D6170; // 'cmap' - - if (cmapTable == nullptr) { - le_uint32 length; - - cmapTable = static_cast(readTable(cmapTag, &length)); - } - - if (cmapTable != nullptr) { - le_uint16 i; - le_uint16 nSubtables = SWAPW(cmapTable->numberSubtables); - - - for (i = 0; i < nSubtables; i += 1) { - CMAPEncodingSubtableHeader *esh = &cmapTable->encodingSubtableHeaders[i]; - - if (SWAPW(esh->platformID) == platformID && - SWAPW(esh->platformSpecificID) == platformSpecificID) { - return reinterpret_cast(reinterpret_cast(cmapTable) + SWAPL(esh->encodingOffset)); - } - } - } - - return nullptr; -} - -void FontObject::initUnicodeCMAP() -{ - CMAPEncodingSubtable *encodingSubtable = findCMAP(3, 1); - - if (encodingSubtable == nullptr || - SWAPW(encodingSubtable->format) != 4) { - printf("Can't find unicode 'cmap'"); - return; - } - - CMAPFormat4Encoding *header = (CMAPFormat4Encoding *) encodingSubtable; - - cmSegCount = SWAPW(header->segCountX2) / 2; - cmSearchRange = SWAPW(header->searchRange); - cmEntrySelector = SWAPW(header->entrySelector); - cmRangeShift = SWAPW(header->rangeShift) / 2; - cmEndCodes = &header->endCodes[0]; - cmStartCodes = &header->endCodes[cmSegCount + 1]; // + 1 for reservedPad... - cmIdDelta = &cmStartCodes[cmSegCount]; - cmIdRangeOffset = &cmIdDelta[cmSegCount]; -} - -LEGlyphID FontObject::unicodeToGlyph(LEUnicode32 unicode32) -{ - if (unicode32 >= 0x10000) { - return 0; - } - - LEUnicode16 unicode = static_cast(unicode32); - le_uint16 index = 0; - le_uint16 probe = 1 << cmEntrySelector; - LEGlyphID result = 0; - - if (SWAPW(cmStartCodes[cmRangeShift]) <= unicode) { - index = cmRangeShift; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPW(cmStartCodes[index + probe]) <= unicode) { - index += probe; - } - } - - if (unicode >= SWAPW(cmStartCodes[index]) && unicode <= SWAPW(cmEndCodes[index])) { - if (cmIdRangeOffset[index] == 0) { - result = static_cast(unicode); - } else { - le_uint16 offset = unicode - SWAPW(cmStartCodes[index]); - le_uint16 rangeOffset = SWAPW(cmIdRangeOffset[index]); - le_uint16* glyphIndexTable = reinterpret_cast(reinterpret_cast(&cmIdRangeOffset[index]) + rangeOffset); - - result = SWAPW(glyphIndexTable[offset]); - } - - result += SWAPW(cmIdDelta[index]); - } else { - result = 0; - } - - return result; -} - -le_uint16 FontObject::getUnitsPerEM() -{ - if (headTable == nullptr) { - LETag headTag = 0x68656164; // 'head' - le_uint32 length; - - headTable = static_cast(readTable(headTag, &length)); - } - - return SWAPW(headTable->unitsPerEm); -} - -le_uint16 FontObject::getGlyphAdvance(LEGlyphID glyph) -{ - if (hmtxTable == nullptr) { - LETag maxpTag = 0x6D617870; // 'maxp' - LETag hheaTag = 0x68686561; // 'hhea' - LETag hmtxTag = 0x686D7478; // 'hmtx' - le_uint32 length; - HHEATable *hheaTable; - MAXPTable* maxpTable = static_cast(readTable(maxpTag, &length)); - - numGlyphs = SWAPW(maxpTable->numGlyphs); - deleteTable(maxpTable); - - hheaTable = static_cast(readTable(hheaTag, &length)); - numOfLongHorMetrics = SWAPW(hheaTable->numOfLongHorMetrics); - deleteTable(hheaTable); - - hmtxTable = static_cast(readTable(hmtxTag, &length)); - } - - le_uint16 index = glyph; - - if (glyph >= numGlyphs) { - return 0; - } - - if (glyph >= numOfLongHorMetrics) { - index = numOfLongHorMetrics - 1; - } - - return SWAPW(hmtxTable->hMetrics[index].advanceWidth); -} - - diff --git a/icu4c/source/test/perf/leperf/FontObject.h b/icu4c/source/test/perf/leperf/FontObject.h deleted file mode 100644 index b58f5c08dcf..00000000000 --- a/icu4c/source/test/perf/leperf/FontObject.h +++ /dev/null @@ -1,241 +0,0 @@ -/************************************************************************** -* -* © 2016 and later: Unicode, Inc. and others. -* License & terms of use: http://www.unicode.org/copyright.html -* -*************************************************************************** -*************************************************************************** -* -* Copyright (C) 1998-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - - -#ifndef __FONTOBJECT_H -#define __FONTOBJECT_H - -#include - -#include "layout/LETypes.h" - - -#ifndef ANY_NUMBER -#define ANY_NUMBER 1 -#endif - -struct DirectoryEntry -{ - le_uint32 tag; - le_uint32 checksum; - le_uint32 offset; - le_uint32 length; -}; - -struct SFNTDirectory -{ - le_uint32 scalerType; - le_uint16 numTables; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - DirectoryEntry tableDirectory[ANY_NUMBER]; -}; - - -struct CMAPEncodingSubtableHeader -{ - le_uint16 platformID; - le_uint16 platformSpecificID; - le_uint32 encodingOffset; -}; - -struct CMAPTable -{ - le_uint16 version; - le_uint16 numberSubtables; - CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; -}; - -struct CMAPEncodingSubtable -{ - le_uint16 format; - le_uint16 length; - le_uint16 language; -}; - -struct CMAPFormat0Encoding : CMAPEncodingSubtable -{ - le_uint8 glyphIndexArray[256]; -}; - -struct CMAPFormat2Subheader -{ - le_uint16 firstCode; - le_uint16 entryCount; - le_int16 idDelta; - le_uint16 idRangeOffset; -}; - -struct CMAPFormat2Encoding : CMAPEncodingSubtable -{ - le_uint16 subHeadKeys[256]; - CMAPFormat2Subheader subheaders[ANY_NUMBER]; -}; - -struct CMAPFormat4Encoding : CMAPEncodingSubtable -{ - le_uint16 segCountX2; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - le_uint16 endCodes[ANY_NUMBER]; -// le_uint16 reservedPad; -// le_uint16 startCodes[ANY_NUMBER]; -// le_uint16 idDelta[ANY_NUMBER]; -// le_uint16 idRangeOffset[ANY_NUMBER]; -// le_uint16 glyphIndexArray[ANY_NUMBER]; -}; - -struct CMAPFormat6Encoding : CMAPEncodingSubtable -{ - le_uint16 firstCode; - le_uint16 entryCount; - le_uint16 glyphIndexArray[ANY_NUMBER]; -}; - -typedef le_int32 fixed; - -struct BigDate -{ - le_uint32 bc; - le_uint32 ad; -}; - -struct HEADTable -{ - fixed version; - fixed fontRevision; - le_uint32 checksumAdjustment; - le_uint32 magicNumber; - le_uint16 flags; - le_uint16 unitsPerEm; - BigDate created; - BigDate modified; - le_int16 xMin; - le_int16 yMin; - le_int16 xMax; - le_int16 yMax; - le_int16 lowestRecPPEM; - le_int16 fontDirectionHint; - le_int16 indexToLocFormat; - le_int16 glyphDataFormat; -}; - -struct MAXPTable -{ - fixed version; - le_uint16 numGlyphs; - le_uint16 maxPoints; - le_uint16 maxContours; - le_uint16 maxComponentPoints; - le_uint16 maxComponentContours; - le_uint16 maxZones; - le_uint16 maxTwilightPoints; - le_uint16 maxStorage; - le_uint16 maxFunctionDefs; - le_uint16 maxInstructionDefs; - le_uint16 maxStackElements; - le_uint16 maxSizeOfInstructions; - le_uint16 maxComponentElements; - le_uint16 maxComponentDepth; -}; - -struct HHEATable -{ - fixed version; - le_int16 ascent; - le_int16 descent; - le_int16 lineGap; - le_uint16 advanceWidthMax; - le_int16 minLeftSideBearing; - le_int16 minRightSideBearing; - le_int16 xMaxExtent; - le_int16 caretSlopeRise; - le_int16 caretSlopeRun; - le_int16 caretOffset; - le_int16 reserved1; - le_int16 reserved2; - le_int16 reserved3; - le_int16 reserved4; - le_int16 metricDataFormat; - le_uint16 numOfLongHorMetrics; -}; - -struct LongHorMetric -{ - le_uint16 advanceWidth; - le_int16 leftSideBearing; -}; - -struct HMTXTable -{ - LongHorMetric hMetrics[ANY_NUMBER]; // ANY_NUMBER = numOfLongHorMetrics from hhea table -// le_int16 leftSideBearing[ANY_NUMBER]; // ANY_NUMBER = numGlyphs - numOfLongHorMetrics -}; - -class FontObject -{ -public: - FontObject(char *fontName); - ~FontObject(); - - void *readTable(LETag tag, le_uint32 *length); - void deleteTable(void *table); - - LEGlyphID unicodeToGlyph(LEUnicode32 unicode); - -#if 0 - le_uint32 unicodesToGlyphs(LEUnicode *chars, le_uint32 nChars, LEGlyphID *glyphs, - le_uint32 *charIndices, le_bool rightToLeft); -#endif - - le_uint16 getUnitsPerEM(); - - le_uint16 getGlyphAdvance(LEGlyphID glyph); - -private: - FontObject(); - - DirectoryEntry *findTable(LETag tag); - CMAPEncodingSubtable *findCMAP(le_uint16 platformID, le_uint16 platformSpecificID); - void initUnicodeCMAP(); - - SFNTDirectory *directory; - le_uint16 numTables; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - - CMAPTable *cmapTable; - le_uint16 cmSegCount; - le_uint16 cmSearchRange; - le_uint16 cmEntrySelector; - le_uint16 cmRangeShift; - le_uint16 *cmEndCodes; - le_uint16 *cmStartCodes; - le_uint16 *cmIdDelta; - le_uint16 *cmIdRangeOffset; - - HEADTable *headTable; - - HMTXTable *hmtxTable; - le_uint16 numGlyphs; - le_uint16 numOfLongHorMetrics; - - FILE *file; - -}; - -#endif - diff --git a/icu4c/source/test/perf/leperf/FontTableCache.cpp b/icu4c/source/test/perf/leperf/FontTableCache.cpp deleted file mode 100644 index 53af2734bad..00000000000 --- a/icu4c/source/test/perf/leperf/FontTableCache.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* -************************************************************************** - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - ************************************************************************* - ************************************************************************* - * Copyright (C) 2003-2013, International Business Machines - * Corporation and others. All Rights Reserved. - ************************************************************************* - */ - -#include "layout/LETypes.h" - -//#include "letest.h" -#include "FontTableCache.h" - -#define TABLE_CACHE_INIT 5 -#define TABLE_CACHE_GROW 5 - -struct FontTableCacheEntry -{ - LETag tag; - const void *table; - size_t length; -}; - -FontTableCache::FontTableCache() - : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT) -{ - fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize); - - if (fTableCache == nullptr) { - fTableCacheSize = 0; - return; - } - - for (int i = 0; i < fTableCacheSize; i += 1) { - fTableCache[i].tag = 0; - fTableCache[i].table = nullptr; - fTableCache[i].length = 0; - } -} - -FontTableCache::~FontTableCache() -{ - for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { - LE_DELETE_ARRAY(fTableCache[i].table); - - fTableCache[i].tag = 0; - fTableCache[i].table = nullptr; - fTableCache[i].length = 0; - } - - fTableCacheCurr = 0; - - LE_DELETE_ARRAY(fTableCache); -} - -void FontTableCache::freeFontTable(const void *table) const -{ - LE_DELETE_ARRAY(table); -} - -const void *FontTableCache::find(LETag tableTag, size_t &length) const -{ - for (int i = 0; i < fTableCacheCurr; i += 1) { - if (fTableCache[i].tag == tableTag) { - length = fTableCache[i].length; - return fTableCache[i].table; - } - } - - const void *table = readFontTable(tableTag, length); - - const_cast(this)->add(tableTag, table, length); - - return table; -} - -void FontTableCache::add(LETag tableTag, const void *table, size_t length) -{ - if (fTableCacheCurr >= fTableCacheSize) { - le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; - - fTableCache = static_cast(LE_GROW_ARRAY(fTableCache, newSize)); - - for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { - fTableCache[i].tag = 0; - fTableCache[i].table = nullptr; - fTableCache[i].length = 0; - } - - fTableCacheSize = newSize; - } - - fTableCache[fTableCacheCurr].tag = tableTag; - fTableCache[fTableCacheCurr].table = table; - fTableCache[fTableCacheCurr].length = length; - - fTableCacheCurr += 1; -} diff --git a/icu4c/source/test/perf/leperf/FontTableCache.h b/icu4c/source/test/perf/leperf/FontTableCache.h deleted file mode 100644 index 2a839068c91..00000000000 --- a/icu4c/source/test/perf/leperf/FontTableCache.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - ********************************************************************** - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - ********************************************************************** - ********************************************************************** - * Copyright (C) 2003-2013, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#ifndef __FONTTABLECACHE_H - -#define __FONTTABLECACHE_H - -#include "layout/LETypes.h" - -U_NAMESPACE_USE - -struct FontTableCacheEntry; - -class FontTableCache -{ -public: - FontTableCache(); - - virtual ~FontTableCache(); - - const void *find(LETag tableTag, size_t &length) const; - -protected: - virtual const void *readFontTable(LETag tableTag, size_t &length) const = 0; - virtual void freeFontTable(const void *table) const; - -private: - - void add(LETag tableTag, const void *table, size_t length); - - FontTableCacheEntry *fTableCache; - le_int32 fTableCacheCurr; - le_int32 fTableCacheSize; -}; - -#endif - diff --git a/icu4c/source/test/perf/leperf/Makefile.in b/icu4c/source/test/perf/leperf/Makefile.in deleted file mode 100644 index 27b0fb3153e..00000000000 --- a/icu4c/source/test/perf/leperf/Makefile.in +++ /dev/null @@ -1,86 +0,0 @@ -## Makefile.in for ICU - test/perf/collperf -## Copyright (C) 2016 and later: Unicode, Inc. and others. -## License & terms of use: http://www.unicode.org/copyright.html -## -## Copyright (c) 2001-2013, International Business Machines Corporation and -## others. All Rights Reserved. - -## Source directory information -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ - -top_builddir = ../../.. - -include $(top_builddir)/icudefs.mk - --include Makefile.local - -## Build directory information -subdir = test/perf/leperf - -## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) - -## Target information -TARGET = leperf - -CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/tools/toolutil -I$(top_srcdir)/tools/ctestfw -I$(top_srcdir)/io -I$(top_srcdir)/i18n -LIBS = $(LIBCTESTFW) $(LIBICUIO) $(LIBICULE) $(LIBICUUC) $(LIBICUI18N) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) - -OBJECTS = $(TARGET).o - -DEPS = $(OBJECTS:.o=.d) - -## List of phony targets -.PHONY : all all-local install install-local clean clean-local \ -distclean distclean-local dist dist-local check check-local - -## Clear suffix list -.SUFFIXES : - -## List of standard targets -all: all-local -install: install-local -clean: clean-local -distclean : distclean-local -dist: dist-local -check: all check-local - -all-local: $(TARGET) - -install-local: - -dist-local: - -clean-local: - test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - $(RMV) $(OBJECTS) $(TARGET) - -distclean-local: clean-local - $(RMV) Makefile - -check-local: all-local - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - -$(TARGET) : $(OBJECTS) - $(LINK.cc) -o $@ $^ $(LIBS) - $(POST_BUILD_STEP) - -invoke: - @$(RMV) current.out -# following is bash specific - set -o pipefail && ( ICU_DATA=$${ICU_DATA:-$(top_builddir)/data/} TZ=PST8PDT $(INVOKE) ./$(TARGET) $(INVOCATION) | tee current.out ) - -ifeq (,$(MAKECMDGOALS)) --include $(DEPS) -else -ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),) -ifneq ($(patsubst %install,,$(MAKECMDGOALS)),) --include $(DEPS) -endif -endif -endif - diff --git a/icu4c/source/test/perf/leperf/PortableFontInstance.cpp b/icu4c/source/test/perf/leperf/PortableFontInstance.cpp deleted file mode 100644 index 354701c2978..00000000000 --- a/icu4c/source/test/perf/leperf/PortableFontInstance.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/* - ******************************************************************************* - * - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - * - ******************************************************************************* - ******************************************************************************* - * - * Copyright (C) 1999-2013, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: PortableFontInstance.cpp - * - * created on: 11/22/1999 - * created by: Eric R. Mader - */ - -#include - -#include "layout/LETypes.h" -#include "layout/LEFontInstance.h" -#include "layout/LESwaps.h" - -#include "PortableFontInstance.h" - -//#include "letest.h" -#include "sfnt.h" - -#include -#include - -#if 0 -static const char *letagToStr(LETag tag, char *str) { - str[0]= 0xFF & (tag>>24); - str[1]= 0xFF & (tag>>16); - str[2]= 0xFF & (tag>>8); - str[3]= 0xFF & (tag>>0); - str[4]= 0; - return str; -} -#endif - -// -// Finds the high bit by binary searching -// through the bits in n. -// -le_int8 PortableFontInstance::highBit(le_int32 value) -{ - if (value <= 0) { - return -32; - } - - le_uint8 bit = 0; - - if (value >= 1 << 16) { - value >>= 16; - bit += 16; - } - - if (value >= 1 << 8) { - value >>= 8; - bit += 8; - } - - if (value >= 1 << 4) { - value >>= 4; - bit += 4; - } - - if (value >= 1 << 2) { - value >>= 2; - bit += 2; - } - - if (value >= 1 << 1) { - value >>= 1; - bit += 1; - } - - return bit; -} - -PortableFontInstance::PortableFontInstance(const char *fileName, float pointSize, LEErrorCode &status) - : fFile(nullptr), fPointSize(pointSize), fUnitsPerEM(0), fFontChecksum(0), fAscent(0), fDescent(0), fLeading(0), - fDirectory(nullptr), fNAMETable(nullptr), fNameCount(0), fNameStringOffset(0), fCMAPMapper(nullptr), fHMTXTable(nullptr), fNumGlyphs(0), fNumLongHorMetrics(0) -{ - if (LE_FAILURE(status)) { - return; - } - - // open the font file - fFile = fopen(fileName, "rb"); - //printf("Open Font: %s\n", fileName); - - if (fFile == nullptr) { - printf("%s:%d: %s: FNF\n", __FILE__, __LINE__, fileName); - status = LE_FONT_FILE_NOT_FOUND_ERROR; - return; - } - - // read in the directory - SFNTDirectory tempDir; - - fread(&tempDir, sizeof tempDir, 1, fFile); - - le_int32 dirSize = sizeof tempDir + ((SWAPW(tempDir.numTables) - ANY_NUMBER) * sizeof(DirectoryEntry)); - const LETag headTag = LE_HEAD_TABLE_TAG; - const LETag hheaTag = LE_HHEA_TABLE_TAG; - const HEADTable *headTable = nullptr; - const HHEATable *hheaTable = nullptr; -// const NAMETable *nameTable = nullptr; - le_uint16 numTables = 0; - - fDirectory = reinterpret_cast(LE_NEW_ARRAY(char, dirSize)); - - if (fDirectory == nullptr) { - printf("%s:%d: %s: malloc err\n", __FILE__, __LINE__, fileName); - status = LE_MEMORY_ALLOCATION_ERROR; - goto error_exit; - } - - fseek(fFile, 0L, SEEK_SET); - fread((void *) fDirectory, sizeof(char), dirSize, fFile); - - // - // We calculate these numbers 'cause some fonts - // have bogus values for them in the directory header. - // - numTables = SWAPW(fDirectory->numTables); - fDirPower = 1 << highBit(numTables); - fDirExtra = numTables - fDirPower; - - // read unitsPerEm from 'head' table - headTable = static_cast(readFontTable(headTag)); - - if (headTable == nullptr) { - status = LE_MISSING_FONT_TABLE_ERROR; - printf("%s:%d: %s: missing head table\n", __FILE__, __LINE__, fileName); - goto error_exit; - } - - fUnitsPerEM = SWAPW(headTable->unitsPerEm); - fFontChecksum = SWAPL(headTable->checksumAdjustment); - freeFontTable(headTable); - - //nameTable = (NAMETable *) readFontTable(nameTag); - - //if (nameTable == nullptr) { - // status = LE_MISSING_FONT_TABLE_ERROR; - // goto error_exit; - //} - - //fFontVersionString = findName(nameTable, NAME_VERSION_STRING, PLATFORM_MACINTOSH, MACINTOSH_ROMAN, MACINTOSH_ENGLISH); - - //if (fFontVersionString == nullptr) { - // status = LE_MISSING_FONT_TABLE_ERROR; - // goto error_exit; - //} - - //freeFontTable(nameTable); - - hheaTable = (HHEATable *) readFontTable(hheaTag); - - if (hheaTable == nullptr) { - printf("%s:%d: %s: missing hhea table\n", __FILE__, __LINE__, fileName); - status = LE_MISSING_FONT_TABLE_ERROR; - goto error_exit; - } - - fAscent = static_cast(yUnitsToPoints(static_cast(SWAPW(hheaTable->ascent)))); - fDescent = static_cast(yUnitsToPoints(static_cast(SWAPW(hheaTable->descent)))); - fLeading = static_cast(yUnitsToPoints(static_cast(SWAPW(hheaTable->lineGap)))); - - fNumLongHorMetrics = SWAPW(hheaTable->numOfLongHorMetrics); - - freeFontTable((void *) hheaTable); - - fCMAPMapper = findUnicodeMapper(); - - if (fCMAPMapper == nullptr) { - printf("%s:%d: %s: can't load cmap\n", __FILE__, __LINE__, fileName); - status = LE_MISSING_FONT_TABLE_ERROR; - goto error_exit; - } - - return; - -error_exit: - fclose(fFile); - fFile = nullptr; -} - -PortableFontInstance::~PortableFontInstance() -{ - if (fFile != nullptr) { - fclose(fFile); - - freeFontTable(fHMTXTable); - freeFontTable(fNAMETable); - - delete fCMAPMapper; - - LE_DELETE_ARRAY(fDirectory); - } -} - -const DirectoryEntry *PortableFontInstance::findTable(LETag tag) const -{ - if (fDirectory != nullptr) { - le_uint16 table = 0; - le_uint16 probe = fDirPower; - - if (SWAPL(fDirectory->tableDirectory[fDirExtra].tag) <= tag) { - table = fDirExtra; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPL(fDirectory->tableDirectory[table + probe].tag) <= tag) { - table += probe; - } - } - - if (SWAPL(fDirectory->tableDirectory[table].tag) == tag) { - return &fDirectory->tableDirectory[table]; - } - } - - return nullptr; -} - -const void *PortableFontInstance::readTable(LETag tag, le_uint32 *length) const -{ - const DirectoryEntry *entry = findTable(tag); - - if (entry == nullptr) { - *length = 0; - return nullptr; - } - - *length = SWAPL(entry->length); - - void *table = LE_NEW_ARRAY(char, *length); - - if (table != nullptr) { - fseek(fFile, SWAPL(entry->offset), SEEK_SET); - fread(table, sizeof(char), *length, fFile); - } - - return table; -} - -const void *PortableFontInstance::getFontTable(LETag tableTag) const -{ - size_t ignored; - return getFontTable(tableTag, ignored); -} - -const void *PortableFontInstance::getFontTable(LETag tableTag, size_t &length) const -{ - return FontTableCache::find(tableTag, length); -} - -const void *PortableFontInstance::readFontTable(LETag tableTag, size_t &length) const -{ - le_uint32 len; - - const void *data= readTable(tableTag, &len); - length = len; - //char tag5[5]; - //printf("Read %s, result %p #%d\n", letagToStr(tableTag,tag5), data,len); - return data; -} - -CMAPMapper *PortableFontInstance::findUnicodeMapper() -{ - LETag cmapTag = LE_CMAP_TABLE_TAG; - const CMAPTable *cmap = (CMAPTable *) readFontTable(cmapTag); - - if (cmap == nullptr) { - return nullptr; - } - - return CMAPMapper::createUnicodeMapper(cmap); -} - -const char *PortableFontInstance::getNameString(le_uint16 nameID, le_uint16 platformID, le_uint16 encodingID, le_uint16 languageID) const -{ - if (fNAMETable == nullptr) { - LETag nameTag = LE_NAME_TABLE_TAG; - PortableFontInstance* realThis = const_cast(this); - - realThis->fNAMETable = static_cast(readFontTable(nameTag)); - - if (realThis->fNAMETable != nullptr) { - realThis->fNameCount = SWAPW(realThis->fNAMETable->count); - realThis->fNameStringOffset = SWAPW(realThis->fNAMETable->stringOffset); - } - } - - for(le_int32 i = 0; i < fNameCount; i += 1) { - const NameRecord *nameRecord = &fNAMETable->nameRecords[i]; - - if (SWAPW(nameRecord->platformID) == platformID && SWAPW(nameRecord->encodingID) == encodingID && - SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) { - char *name = ((char *) fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset); - le_uint16 length = SWAPW(nameRecord->length); - char *result = LE_NEW_ARRAY(char, length + 2); - - LE_ARRAY_COPY(result, name, length); - result[length] = result[length + 1] = 0; - - return result; - } - } - - return nullptr; -} - -const LEUnicode16 *PortableFontInstance::getUnicodeNameString(le_uint16 nameID, le_uint16 platformID, le_uint16 encodingID, le_uint16 languageID) const -{ - if (fNAMETable == nullptr) { - LETag nameTag = LE_NAME_TABLE_TAG; - PortableFontInstance* realThis = const_cast(this); - - realThis->fNAMETable = static_cast(readFontTable(nameTag)); - - if (realThis->fNAMETable != nullptr) { - realThis->fNameCount = SWAPW(realThis->fNAMETable->count); - realThis->fNameStringOffset = SWAPW(realThis->fNAMETable->stringOffset); - } - } - - for(le_int32 i = 0; i < fNameCount; i += 1) { - const NameRecord *nameRecord = &fNAMETable->nameRecords[i]; - - if (SWAPW(nameRecord->platformID) == platformID && SWAPW(nameRecord->encodingID) == encodingID && - SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) { - const LEUnicode16* name = reinterpret_cast(reinterpret_cast(fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset)); - le_uint16 length = SWAPW(nameRecord->length) / 2; - LEUnicode16 *result = LE_NEW_ARRAY(LEUnicode16, length + 2); - - for (le_int32 c = 0; c < length; c += 1) { - result[c] = SWAPW(name[c]); - } - - result[length] = 0; - - return result; - } - } - - return nullptr; -} - -void PortableFontInstance::deleteNameString(const char *name) const -{ - LE_DELETE_ARRAY(name); -} - -void PortableFontInstance::deleteNameString(const LEUnicode16 *name) const -{ - LE_DELETE_ARRAY(name); -} - -void PortableFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const -{ - TTGlyphID ttGlyph = static_cast(LE_GET_GLYPH(glyph)); - - if (fHMTXTable == nullptr) { - LETag maxpTag = LE_MAXP_TABLE_TAG; - LETag hmtxTag = LE_HMTX_TABLE_TAG; - const MAXPTable *maxpTable = (MAXPTable *) readFontTable(maxpTag); - PortableFontInstance* realThis = const_cast(this); - - if (maxpTable != nullptr) { - realThis->fNumGlyphs = SWAPW(maxpTable->numGlyphs); - freeFontTable(maxpTable); - } - - realThis->fHMTXTable = static_cast(readFontTable(hmtxTag)); - } - - le_uint16 index = ttGlyph; - - if (ttGlyph >= fNumGlyphs || fHMTXTable == nullptr) { - advance.fX = advance.fY = 0; - return; - } - - if (ttGlyph >= fNumLongHorMetrics) { - index = fNumLongHorMetrics - 1; - } - - advance.fX = xUnitsToPoints(SWAPW(fHMTXTable->hMetrics[index].advanceWidth)); - advance.fY = 0; -} - -le_bool PortableFontInstance::getGlyphPoint(LEGlyphID /*glyph*/, le_int32 /*pointNumber*/, LEPoint &/*point*/) const -{ - return false; -} - -le_int32 PortableFontInstance::getUnitsPerEM() const -{ - return fUnitsPerEM; -} - -le_uint32 PortableFontInstance::getFontChecksum() const -{ - return fFontChecksum; -} - -le_uint32 PortableFontInstance::getRawChecksum() const -{ - // how big is it? - // fseek(fFile, 0L, SEEK_END); - // long size = ftell(fFile); - le_int32 chksum = 0; - // now, calculate - fseek(fFile, 0L, SEEK_SET); - int r; - while((r = fgetc(fFile)) != EOF) { - chksum += r; - } - return static_cast(chksum); // cast to signed -} - -le_int32 PortableFontInstance::getAscent() const -{ - return fAscent; -} - -le_int32 PortableFontInstance::getDescent() const -{ - return fDescent; -} - -le_int32 PortableFontInstance::getLeading() const -{ - return fLeading; -} - -// We really want to inherit this method from the superclass, but some compilers -// issue a warning if we don't implement it... -LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const -{ - return LEFontInstance::mapCharToGlyph(ch, mapper, filterZeroWidth); -} - -// We really want to inherit this method from the superclass, but some compilers -// issue a warning if we don't implement it... -LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const -{ - return LEFontInstance::mapCharToGlyph(ch, mapper); -} - -LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch) const -{ - return fCMAPMapper->unicodeToGlyph(ch); -} - -float PortableFontInstance::getXPixelsPerEm() const -{ - return fPointSize; -} - -float PortableFontInstance::getYPixelsPerEm() const -{ - return fPointSize; -} - -float PortableFontInstance::getScaleFactorX() const -{ - return 1.0; -} - -float PortableFontInstance::getScaleFactorY() const -{ - return 1.0; -} diff --git a/icu4c/source/test/perf/leperf/PortableFontInstance.h b/icu4c/source/test/perf/leperf/PortableFontInstance.h deleted file mode 100644 index 95ab0508b25..00000000000 --- a/icu4c/source/test/perf/leperf/PortableFontInstance.h +++ /dev/null @@ -1,127 +0,0 @@ - -/* - ******************************************************************************* - * - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - * - ******************************************************************************* - ******************************************************************************* - * - * Copyright (C) 1999-2013, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: PortableFontInstance.h - * - * created on: 11/12/1999 - * created by: Eric R. Mader - */ - -#ifndef __PORTABLEFONTINSTANCE_H -#define __PORTABLEFONTINSTANCE_H - -#include - -#include "layout/LETypes.h" -#include "layout/LEFontInstance.h" - -#include "FontTableCache.h" - -#include "sfnt.h" -#include "cmaps.h" - -class PortableFontInstance : public LEFontInstance, protected FontTableCache -{ -private: - FILE *fFile; - - float fPointSize; - le_int32 fUnitsPerEM; - le_uint32 fFontChecksum; - le_int32 fAscent; - le_int32 fDescent; - le_int32 fLeading; - - const SFNTDirectory *fDirectory; - le_uint16 fDirPower; - le_uint16 fDirExtra; - - float fDeviceScaleX; - float fDeviceScaleY; - - const NAMETable *fNAMETable; - le_uint16 fNameCount; - le_uint16 fNameStringOffset; - - CMAPMapper *fCMAPMapper; - - const HMTXTable *fHMTXTable; - le_uint16 fNumGlyphs; - le_uint16 fNumLongHorMetrics; - - static le_int8 highBit(le_int32 value); - - const DirectoryEntry *findTable(LETag tag) const; - const void *readTable(LETag tag, le_uint32 *length) const; - void getMetrics(); - - CMAPMapper *findUnicodeMapper(); - -protected: - const void *readFontTable(LETag tableTag) const { size_t ignored; return readFontTable(tableTag, ignored); } - const void *readFontTable(LETag tableTag, size_t &length) const override; - -public: - PortableFontInstance(const char *fileName, float pointSize, LEErrorCode &status); - - virtual ~PortableFontInstance(); - - virtual const void *getFontTable(LETag tableTag) const; - const void *getFontTable(LETag tableTag, size_t &length) const override; - - virtual const char *getNameString(le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) const; - - virtual const LEUnicode16 *getUnicodeNameString(le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) const; - - virtual void deleteNameString(const char *name) const; - - virtual void deleteNameString(const LEUnicode16 *name) const; - - le_int32 getUnitsPerEM() const override; - - virtual le_uint32 getFontChecksum() const; - - virtual le_uint32 getRawChecksum() const; - - le_int32 getAscent() const override; - - le_int32 getDescent() const override; - - le_int32 getLeading() const override; - - // We really want to inherit this method from the superclass, but some compilers - // issue a warning if we don't implement it... - LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const override; - - // We really want to inherit this method from the superclass, but some compilers - // issue a warning if we don't implement it... - LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const override; - - LEGlyphID mapCharToGlyph(LEUnicode32 ch) const override; - - void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const override; - - le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const override; - - float getXPixelsPerEm() const override; - - float getYPixelsPerEm() const override; - - float getScaleFactorX() const override; - - float getScaleFactorY() const override; - -}; - -#endif diff --git a/icu4c/source/test/perf/leperf/SimpleFontInstance.cpp b/icu4c/source/test/perf/leperf/SimpleFontInstance.cpp deleted file mode 100644 index c4478c192c6..00000000000 --- a/icu4c/source/test/perf/leperf/SimpleFontInstance.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - ******************************************************************************* - * - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - * - ******************************************************************************* - ******************************************************************************* - * - * Copyright (C) 1999-2013, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: SimpleFontInstance.cpp - * - * created on: 03/30/2006 - * created by: Eric R. Mader - */ - -#include "unicode/utypes.h" -#include "unicode/uchar.h" - -#include "layout/LETypes.h" -#include "layout/LEFontInstance.h" - -#include "layout/CanonShaping.h" -#include "SimpleFontInstance.h" - -SimpleFontInstance::SimpleFontInstance(float pointSize, LEErrorCode &status) - : fPointSize(pointSize), fAscent(0), fDescent(0) -{ - if (LE_FAILURE(status)) { - return; - } - - fAscent = static_cast(yUnitsToPoints(2000.0)); - fDescent = static_cast(yUnitsToPoints(600.0)); -} - -SimpleFontInstance::~SimpleFontInstance() -{ - // nothing to do... -} - -const void *SimpleFontInstance::getFontTable(LETag tableTag) const -{ - if (tableTag == LE_GSUB_TABLE_TAG) { - return CanonShaping::glyphSubstitutionTable; - } - - if (tableTag == LE_GDEF_TABLE_TAG) { - return CanonShaping::glyphDefinitionTable; - } - - return nullptr; -} - -void SimpleFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const -{ -#if 0 - if (u_getCombiningClass((UChar32) glyph) == 0) { - advance.fX = xUnitsToPoints(2048); - } else { - advance.fX = 0; - } -#else - advance.fX = xUnitsToPoints(2048); -#endif - - advance.fY = 0; -} - -le_int32 SimpleFontInstance::getUnitsPerEM() const -{ - return 2048; -} - -le_int32 SimpleFontInstance::getAscent() const -{ - return fAscent; -} - -le_int32 SimpleFontInstance::getDescent() const -{ - return fDescent; -} - -le_int32 SimpleFontInstance::getLeading() const -{ - return 0; -} - -// We really want to inherit this method from the superclass, but some compilers -// issue a warning if we don't implement it... -LEGlyphID SimpleFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const -{ - return LEFontInstance::mapCharToGlyph(ch, mapper, filterZeroWidth); -} - -// We really want to inherit this method from the superclass, but some compilers -// issue a warning if we don't implement it... -LEGlyphID SimpleFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const -{ - return LEFontInstance::mapCharToGlyph(ch, mapper); -} - -LEGlyphID SimpleFontInstance::mapCharToGlyph(LEUnicode32 ch) const -{ - return static_cast(ch); -} - -float SimpleFontInstance::getXPixelsPerEm() const -{ - return fPointSize; -} - -float SimpleFontInstance::getYPixelsPerEm() const -{ - return fPointSize; -} - -float SimpleFontInstance::getScaleFactorX() const -{ - return 1.0; -} - -float SimpleFontInstance::getScaleFactorY() const -{ - return 1.0; -} - -le_bool SimpleFontInstance::getGlyphPoint(LEGlyphID /*glyph*/, le_int32 /*pointNumber*/, LEPoint &/*point*/) const -{ - return false; -} - diff --git a/icu4c/source/test/perf/leperf/SimpleFontInstance.h b/icu4c/source/test/perf/leperf/SimpleFontInstance.h deleted file mode 100644 index 7f91d41c174..00000000000 --- a/icu4c/source/test/perf/leperf/SimpleFontInstance.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - ******************************************************************************* - * - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - * - ******************************************************************************* - ******************************************************************************* - * - * Copyright (C) 1999-2013, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: SimpleFontInstance.h - * - * created on: 03/30/2006 - * created by: Eric R. Mader - */ - -#ifndef __SIMPLEFONTINSTANCE_H -#define __SIMPLEFONTINSTANCE_H - -#include "layout/LETypes.h" -#include "layout/LEFontInstance.h" - -U_NAMESPACE_USE - -class SimpleFontInstance : public LEFontInstance -{ -private: - float fPointSize; - le_int32 fAscent; - le_int32 fDescent; - -protected: - const void *readFontTable(LETag tableTag) const; - -public: - SimpleFontInstance(float pointSize, LEErrorCode &status); - - virtual ~SimpleFontInstance(); - - const void *getFontTable(LETag tableTag) const override; - - le_int32 getUnitsPerEM() const override; - - le_int32 getAscent() const override; - - le_int32 getDescent() const override; - - le_int32 getLeading() const override; - - // We really want to inherit this method from the superclass, but some compilers - // issue a warning if we don't implement it... - LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const override; - - // We really want to inherit this method from the superclass, but some compilers - // issue a warning if we don't implement it... - LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const override; - - LEGlyphID mapCharToGlyph(LEUnicode32 ch) const override; - - void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const override; - - le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const override; - - float getXPixelsPerEm() const override; - - float getYPixelsPerEm() const override; - - float getScaleFactorX() const override; - - float getScaleFactorY() const override; - -}; - -#endif diff --git a/icu4c/source/test/perf/leperf/cfonts.cpp b/icu4c/source/test/perf/leperf/cfonts.cpp deleted file mode 100644 index 09328e893db..00000000000 --- a/icu4c/source/test/perf/leperf/cfonts.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#include "layout/LETypes.h" -#include "layout/loengine.h" -#include "PortableFontInstance.h" -#include "SimpleFontInstance.h" - -U_CDECL_BEGIN - -le_font *le_portableFontOpen(const char *fileName, - float pointSize, - LEErrorCode *status) -{ - return (le_font *) new PortableFontInstance(fileName, pointSize, *status); -} - -le_font *le_simpleFontOpen(float pointSize, - LEErrorCode *status) -{ - return (le_font *) new SimpleFontInstance(pointSize, *status); -} - -void le_fontClose(le_font *font) -{ - LEFontInstance *fontInstance = (LEFontInstance *) font; - - delete fontInstance; -} - -const char *le_getNameString(le_font *font, le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - return pfi->getNameString(nameID, platform, encoding, language); -} - -const LEUnicode16 *le_getUnicodeNameString(le_font *font, le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - return pfi->getUnicodeNameString(nameID, platform, encoding, language); -} - -void le_deleteNameString(le_font *font, const char *name) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - pfi->deleteNameString(name); -} - -void le_deleteUnicodeNameString(le_font *font, const LEUnicode16 *name) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - pfi->deleteNameString(name); -} - -le_uint32 le_getFontChecksum(le_font *font) -{ - PortableFontInstance *pfi = (PortableFontInstance *) font; - - return pfi->getFontChecksum(); -} - -U_CDECL_END diff --git a/icu4c/source/test/perf/leperf/cfonts.h b/icu4c/source/test/perf/leperf/cfonts.h deleted file mode 100644 index f9403cd25e3..00000000000 --- a/icu4c/source/test/perf/leperf/cfonts.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __CFONTS_H -#define __CFONTS_H - -#include "LETypes.h" -#include "loengine.h" - -le_font *le_portableFontOpen(const char *fileName, - float pointSize, - LEErrorCode *status); - -le_font *le_simpleFontOpen(float pointSize, - LEErrorCode *status); - -void le_fontClose(le_font *font); - -const char *le_getNameString(le_font *font, le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language); - -const LEUnicode16 *le_getUnicodeNameString(le_font *font, le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language); - -void le_deleteNameString(le_font *font, const char *name); - -void le_deleteUnicodeNameString(le_font *font, const LEUnicode16 *name); - -le_uint32 le_getFontChecksum(le_font *font); - -#endif diff --git a/icu4c/source/test/perf/leperf/cmaps.cpp b/icu4c/source/test/perf/leperf/cmaps.cpp deleted file mode 100644 index d6db5e8a4ed..00000000000 --- a/icu4c/source/test/perf/leperf/cmaps.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/************************************************************************** -* -* © 2016 and later: Unicode, Inc. and others. -* License & terms of use: http://www.unicode.org/copyright.html -* -*************************************************************************** -*************************************************************************** -* -* Copyright (C) 1998-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - -#include "layout/LETypes.h" -#include "layout/LESwaps.h" - -#include "sfnt.h" -#include "cmaps.h" -#include - -#define SWAPU16(code) ((LEUnicode16) SWAPW(code)) -#define SWAPU32(code) ((LEUnicode32) SWAPL(code)) - -// -// Finds the high bit by binary searching -// through the bits in value. -// -le_int8 highBit(le_uint32 value) -{ - le_uint8 bit = 0; - - if (value >= 1 << 16) { - value >>= 16; - bit += 16; - } - - if (value >= 1 << 8) { - value >>= 8; - bit += 8; - } - - if (value >= 1 << 4) { - value >>= 4; - bit += 4; - } - - if (value >= 1 << 2) { - value >>= 2; - bit += 2; - } - - if (value >= 1 << 1) { - value >>= 1; - bit += 1; - } - - return bit; -} - -CMAPMapper *CMAPMapper::createUnicodeMapper(const CMAPTable *cmap) -{ - le_uint16 i; - le_uint16 nSubtables = SWAPW(cmap->numberSubtables); - const CMAPEncodingSubtable *subtable = nullptr; - le_bool found = false; - //le_uint16 foundPlatformID = 0xFFFF; - //le_uint16 foundPlatformSpecificID = 0xFFFF; - le_uint32 foundOffset = 0; - //le_uint16 foundTable = 0xFFFF; - // first pass, look for MS table. (preferred?) - for (i = 0; i < nSubtables && !found; i += 1) { - const CMAPEncodingSubtableHeader *esh = &cmap->encodingSubtableHeaders[i]; - - le_uint16 platformID = SWAPW(esh->platformID); - le_uint16 platformSpecificID = SWAPW(esh->platformSpecificID); - if (platformID == 3) { // microsoft - switch (platformSpecificID) { - case 1: // Unicode BMP (UCS-2) - case 10: // Unicode UCS-4 - foundOffset = SWAPL(esh->encodingOffset); - //foundPlatformID = platformID; - //foundPlatformSpecificID = platformSpecificID; - found = true; - //foundTable = i; - break; - - //default: - // printf("%s:%d: microsoft (3) platform specific ID %d (wanted 1 or 10) for subtable %d/%d\n", __FILE__, __LINE__, (SWAPW(esh->platformSpecificID)), i, nSubtables); - } - } else { - //printf("%s:%d: platform ID %d (wanted 3, microsoft) for subtable %d/%d\n", __FILE__, __LINE__, (SWAPW(esh->platformID)), i, nSubtables); - } - } - - // second pass, allow non MS table - // first pass, look for MS table. (preferred?) - for (i = 0; i < nSubtables && !found; i += 1) { - const CMAPEncodingSubtableHeader *esh = &cmap->encodingSubtableHeaders[i]; - le_uint16 platformID = SWAPW(esh->platformID); - le_uint16 platformSpecificID = SWAPW(esh->platformSpecificID); - //printf("%s:%d: table %d/%d has platform:specific %d:%d\n", __FILE__, __LINE__, i, nSubtables, platformID, platformSpecificID); - switch(platformID) { - case 0: // Unicode platform - switch(platformSpecificID) { - case 0: - case 1: - case 2: - case 3: - foundOffset = SWAPL(esh->encodingOffset); - //foundPlatformID = platformID; - //foundPlatformSpecificID = platformSpecificID; - //foundTable = i; - found = true; - break; - - default: printf("Error: table %d (psid %d) is unknown. Skipping.\n", i, platformSpecificID); break; - } - break; - - //default: - //printf("Skipping platform id %d\n", platformID); - } - } - - - if (found) - { - subtable = reinterpret_cast(reinterpret_cast(cmap) + foundOffset); - //printf("%s:%d: using subtable #%d/%d type %d:%d\n", __FILE__, __LINE__, foundTable, nSubtables, foundPlatformID, foundPlatformSpecificID); - } else { - printf("%s:%d: could not find subtable.\n", __FILE__, __LINE__); - return nullptr; - } - - le_uint16 tableFormat = SWAPW(subtable->format); - //printf("%s:%d: table format %d\n", __FILE__, __LINE__, tableFormat); - - switch (tableFormat) { - case 4: - return new CMAPFormat4Mapper(cmap, (const CMAPFormat4Encoding *) subtable); - - case 12: - { - const CMAPFormat12Encoding* encoding = reinterpret_cast(subtable); - - return new CMAPGroupMapper(cmap, encoding->groups, SWAPL(encoding->nGroups)); - } - - default: - break; - } - - printf("%s:%d: Unknown format %x.\n", __FILE__, __LINE__, (SWAPW(subtable->format))); - return nullptr; -} - -CMAPFormat4Mapper::CMAPFormat4Mapper(const CMAPTable *cmap, const CMAPFormat4Encoding *header) - : CMAPMapper(cmap) -{ - le_uint16 segCount = SWAPW(header->segCountX2) / 2; - - fEntrySelector = SWAPW(header->entrySelector); - fRangeShift = SWAPW(header->rangeShift) / 2; - fEndCodes = &header->endCodes[0]; - fStartCodes = &header->endCodes[segCount + 1]; // + 1 for reservedPad... - fIdDelta = &fStartCodes[segCount]; - fIdRangeOffset = &fIdDelta[segCount]; -} - -LEGlyphID CMAPFormat4Mapper::unicodeToGlyph(LEUnicode32 unicode32) const -{ - if (unicode32 >= 0x10000) { - return 0; - } - - LEUnicode16 unicode = static_cast(unicode32); - le_uint16 index = 0; - le_uint16 probe = 1 << fEntrySelector; - TTGlyphID result = 0; - - if (SWAPU16(fStartCodes[fRangeShift]) <= unicode) { - index = fRangeShift; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPU16(fStartCodes[index + probe]) <= unicode) { - index += probe; - } - } - - if (unicode >= SWAPU16(fStartCodes[index]) && unicode <= SWAPU16(fEndCodes[index])) { - if (fIdRangeOffset[index] == 0) { - result = static_cast(unicode); - } else { - le_uint16 offset = unicode - SWAPU16(fStartCodes[index]); - le_uint16 rangeOffset = SWAPW(fIdRangeOffset[index]); - const le_uint16* glyphIndexTable = reinterpret_cast(reinterpret_cast(&fIdRangeOffset[index]) + rangeOffset); - - result = SWAPW(glyphIndexTable[offset]); - } - - result += SWAPW(fIdDelta[index]); - } else { - result = 0; - } - - return LE_SET_GLYPH(0, result); -} - -CMAPFormat4Mapper::~CMAPFormat4Mapper() -{ - // parent destructor does it all -} - -CMAPGroupMapper::CMAPGroupMapper(const CMAPTable *cmap, const CMAPGroup *groups, le_uint32 nGroups) - : CMAPMapper(cmap), fGroups(groups) -{ - le_uint8 bit = highBit(nGroups); - fPower = 1 << bit; - fRangeOffset = nGroups - fPower; -} - -LEGlyphID CMAPGroupMapper::unicodeToGlyph(LEUnicode32 unicode32) const -{ - le_int32 probe = fPower; - le_int32 range = 0; - - if (SWAPU32(fGroups[fRangeOffset].startCharCode) <= unicode32) { - range = fRangeOffset; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPU32(fGroups[range + probe].startCharCode) <= unicode32) { - range += probe; - } - } - - if (SWAPU32(fGroups[range].startCharCode) <= unicode32 && SWAPU32(fGroups[range].endCharCode) >= unicode32) { - return static_cast(SWAPU32(fGroups[range].startGlyphCode) + unicode32 - SWAPU32(fGroups[range].startCharCode)); - } - - return 0; -} - -CMAPGroupMapper::~CMAPGroupMapper() -{ - // parent destructor does it all -} - diff --git a/icu4c/source/test/perf/leperf/cmaps.h b/icu4c/source/test/perf/leperf/cmaps.h deleted file mode 100644 index 65c6c06cca8..00000000000 --- a/icu4c/source/test/perf/leperf/cmaps.h +++ /dev/null @@ -1,91 +0,0 @@ -/************************************************************************** -* -* © 2016 and later: Unicode, Inc. and others. -* License & terms of use: http://www.unicode.org/copyright.html -* -*************************************************************************** -*************************************************************************** -* -* Copyright (C) 1998-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - - -#ifndef __CMAPS_H -#define __CMAPS_H - -#include "layout/LETypes.h" -//#include "letest.h" -#include "sfnt.h" - -class CMAPMapper -{ -public: - virtual LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const = 0; - - virtual ~CMAPMapper(); - - static CMAPMapper *createUnicodeMapper(const CMAPTable *cmap); - -protected: - CMAPMapper(const CMAPTable *cmap); - - CMAPMapper() {} - -private: - const CMAPTable *fcmap; -}; - -class CMAPFormat4Mapper : public CMAPMapper -{ -public: - CMAPFormat4Mapper(const CMAPTable *cmap, const CMAPFormat4Encoding *header); - - virtual ~CMAPFormat4Mapper(); - - LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const override; - -protected: - CMAPFormat4Mapper() {} - -private: - le_uint16 fEntrySelector; - le_uint16 fRangeShift; - const le_uint16 *fEndCodes; - const le_uint16 *fStartCodes; - const le_uint16 *fIdDelta; - const le_uint16 *fIdRangeOffset; -}; - -class CMAPGroupMapper : public CMAPMapper -{ -public: - CMAPGroupMapper(const CMAPTable *cmap, const CMAPGroup *groups, le_uint32 nGroups); - - virtual ~CMAPGroupMapper(); - - LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const override; - -protected: - CMAPGroupMapper() {} - -private: - le_int32 fPower; - le_int32 fRangeOffset; - const CMAPGroup *fGroups; -}; - -inline CMAPMapper::CMAPMapper(const CMAPTable *cmap) - : fcmap(cmap) -{ - // nothing else to do -} - -inline CMAPMapper::~CMAPMapper() -{ - LE_DELETE_ARRAY(fcmap); -} - -#endif - diff --git a/icu4c/source/test/perf/leperf/leperf.cpp b/icu4c/source/test/perf/leperf/leperf.cpp deleted file mode 100644 index f33e7ce7aae..00000000000 --- a/icu4c/source/test/perf/leperf/leperf.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/************************************************************************** -* -* © 2016 and later: Unicode, Inc. and others. -* License & terms of use: http://www.unicode.org/copyright.html -* -*************************************************************************** -*************************************************************************** -* -* Copyright (C) 2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - -#include "unicode/utimer.h" -#include "unicode/ustdio.h" -#include "layout/LETypes.h" -#include "layout/LayoutEngine.h" -#include "layout/LEScripts.h" -#include "SimpleFontInstance.h" -#include "PortableFontInstance.h" - -class Params { -public: - LEFontInstance *font; - LEUnicode *chars; - le_int32 charLen; - ScriptCodes script; - le_int32 glyphCount; -}; - -LEUnicode ArabChars[] = { - 0x0045, 0x006E, 0x0067, 0x006C, 0x0069, 0x0073, 0x0068, 0x0020, // "English " - 0x0645, 0x0627, 0x0646, 0x062A, 0x0648, 0x0634, // MEM ALIF KAF NOON TEH WAW SHEEN - 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x02E, 0 // " text." - }; - -void iterate(void * p) { - Params* params = static_cast(p); - - LEErrorCode status = LE_NO_ERROR; - LEFontInstance *font = params->font; - LayoutEngine *engine = LayoutEngine::layoutEngineFactory(font, params->script, -1, status); - LEGlyphID *glyphs = nullptr; - le_int32 *indices = nullptr; - float *positions = nullptr; - le_int32 glyphCount = 0; - LEUnicode *chars = params->chars; - glyphCount = engine->layoutChars(chars, 0, params->charLen, params->charLen, true, 0.0, 0.0, status); - glyphs = LE_NEW_ARRAY(LEGlyphID, glyphCount + 10); - indices = LE_NEW_ARRAY(le_int32, glyphCount + 10); - positions = LE_NEW_ARRAY(float, glyphCount + 10); - engine->getGlyphs(glyphs, status); - params->glyphCount = glyphCount; - - - delete glyphs; - delete indices; - delete positions; - delete engine; - //delete font; -} - -int main(int argc, const char *argv[]) { - double len=10.0; - for(int i=1;i='0' && argv[i][0]<='9') { - len = (1.0)*(argv[i][0]-'0'); - } - } - u_printf("leperf: Testing %s for %.fs...\n", U_ICU_VERSION, len); - //LEErrorCode status = LE_NO_ERROR; - //uloc_setDefault("en_US", &status); - Params p; - -#if 0 - p.script = arabScriptCode; - p.chars = ArabChars; - p.charLen = sizeof(ArabChars)/sizeof(ArabChars[0]); -#else - p.script = latnScriptCode; - p.chars = new LEUnicode[257]; - for(int i=0;i<256;i++) { - p.chars[i] = i+1; - } - p.chars[256] = 0; - p.charLen = 256; -#endif - - int32_t loopCount; - double timeTaken; - double timeNs; -#if 0 - p.font = new SimpleFontInstance(12, status); - u_printf("leperf: Running SFI...\r"); - timeTaken = utimer_loopUntilDone(len, &loopCount, iterate, &p); - u_printf("leperf: SFI .. took %.fs %.2fns/ea\nleperf: .. iter= %d\n", timeTaken, 1000000000.0*(timeTaken/(double)loopCount), (int32_t)loopCount); - delete p.font; -#endif - PortableFontInstance *font; - LEErrorCode fontStatus = LE_NO_ERROR; - const char *fontPath = "myfont.ttf"; - - font = new PortableFontInstance(fontPath, 12, fontStatus); - - p.font = font; - loopCount=0; - u_printf("leperf: testing %s\n", fontPath); - u_printf("leperf: Running ...\r"); - timeTaken = utimer_loopUntilDone(len, &loopCount, iterate, &p); - timeNs = 1000000000.0 * (timeTaken / static_cast(loopCount)); - u_printf("leperf: PFI .. took %.fs %.2fns/ea\nleperf: .. iter= %d\n", timeTaken, timeNs, loopCount); - u_printf("leperf: DATA|\"%s\"|%.2f|\n", U_ICU_VERSION, timeNs); - u_printf("leperf: glyphs=%d\n", p.glyphCount); - return 0; -} - -// hack - #include these for easier build. -#include "SimpleFontInstance.cpp" -#include "PortableFontInstance.cpp" -#include "cmaps.cpp" -#include "FontTableCache.cpp" diff --git a/icu4c/source/test/perf/leperf/sfnt.h b/icu4c/source/test/perf/leperf/sfnt.h deleted file mode 100644 index 8e4d3d8d0ff..00000000000 --- a/icu4c/source/test/perf/leperf/sfnt.h +++ /dev/null @@ -1,455 +0,0 @@ -/*************************************************************************** -* -* © 2016 and later: Unicode, Inc. and others. -* License & terms of use: http://www.unicode.org/copyright.html -* -****************************************************************************/ -/*************************************************************************** -* -* Copyright (C) 1998-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -************************************************************************/ - -#ifndef __SFNT_H -#define __SFNT_H - -#include "layout/LETypes.h" - -U_NAMESPACE_USE - -#ifndef ANY_NUMBER -#define ANY_NUMBER 1 -#endif - -struct DirectoryEntry -{ - le_uint32 tag; - le_uint32 checksum; - le_uint32 offset; - le_uint32 length; -}; - -#ifndef __cplusplus -typedef struct DirectoryEntry DirectoryEntry; -#endif - -struct SFNTDirectory -{ - le_uint32 scalerType; - le_uint16 numTables; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - DirectoryEntry tableDirectory[ANY_NUMBER]; -}; - -#ifndef __cplusplus -typedef struct SFNTDirectory SFNTDirectory; -#endif - - -struct CMAPEncodingSubtableHeader -{ - le_uint16 platformID; - le_uint16 platformSpecificID; - le_uint32 encodingOffset; -}; - -#ifndef __cplusplus -typedef struct CMAPEncodingSubtableHeader CMAPEncodingSubtableHeader; -#endif - -struct CMAPTable -{ - le_uint16 version; - le_uint16 numberSubtables; - CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; -}; - -#ifndef __cplusplus -typedef struct CMAPTable CMAPTable; -#endif - -struct CMAPEncodingSubtable -{ - le_uint16 format; - le_uint16 length; - le_uint16 language; -}; - -#ifndef __cplusplus -typedef struct CMAPEncodingSubtable CMAPEncodingSubtable; -#endif - -#ifdef __cplusplus -struct CMAPFormat0Encoding : CMAPEncodingSubtable -{ - le_uint8 glyphIndexArray[256]; -}; -#else -struct CMAPFormat0Encoding -{ - CMAPEncodingSubtable base; - - le_uint8 glyphIndexArray[256]; -}; - -typedef struct CMAPFormat0Encoding CMAPFormat0Encoding; -#endif - -struct CMAPFormat2Subheader -{ - le_uint16 firstCode; - le_uint16 entryCount; - le_int16 idDelta; - le_uint16 idRangeOffset; -}; - -#ifndef __cplusplus -typedef struct CMAPFormat2Subheader CMAPFormat2Subheader; -#endif - -#ifdef __cplusplus -struct CMAPFormat2Encoding : CMAPEncodingSubtable -{ - le_uint16 subHeadKeys[256]; - CMAPFormat2Subheader subheaders[ANY_NUMBER]; -}; -#else -struct CMAPFormat2Encoding -{ - CMAPEncodingSubtable base; - - le_uint16 subHeadKeys[256]; - CMAPFormat2Subheader subheaders[ANY_NUMBER]; -}; - -typedef struct CMAPFormat2Encoding CMAPFormat2Encoding; -#endif - -#ifdef __cplusplus -struct CMAPFormat4Encoding : CMAPEncodingSubtable -{ - le_uint16 segCountX2; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - le_uint16 endCodes[ANY_NUMBER]; -/* - le_uint16 reservedPad; - le_uint16 startCodes[ANY_NUMBER]; - le_uint16 idDelta[ANY_NUMBER]; - le_uint16 idRangeOffset[ANY_NUMBER]; - le_uint16 glyphIndexArray[ANY_NUMBER]; -*/ -}; -#else -struct CMAPFormat4Encoding -{ - CMAPEncodingSubtable base; - - le_uint16 segCountX2; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - le_uint16 endCodes[ANY_NUMBER]; -/* -// le_uint16 reservedPad; -// le_uint16 startCodes[ANY_NUMBER]; -// le_uint16 idDelta[ANY_NUMBER]; -// le_uint16 idRangeOffset[ANY_NUMBER]; -// le_uint16 glyphIndexArray[ANY_NUMBER]; -*/ -}; - -typedef struct CMAPFormat4Encoding CMAPFormat4Encoding; -#endif - -#ifdef __cplusplus -struct CMAPFormat6Encoding : CMAPEncodingSubtable -{ - le_uint16 firstCode; - le_uint16 entryCount; - le_uint16 glyphIndexArray[ANY_NUMBER]; -}; -#else -struct CMAPFormat6Encoding -{ - CMAPEncodingSubtable base; - - le_uint16 firstCode; - le_uint16 entryCount; - le_uint16 glyphIndexArray[ANY_NUMBER]; -}; - -typedef struct CMAPFormat6Encoding CMAPFormat6Encoding; -#endif - -struct CMAPEncodingSubtable32 -{ - le_uint32 format; - le_uint32 length; - le_uint32 language; -}; - -#ifndef __cplusplus -typedef struct CMAPEncodingSubtable32 CMAPEncodingSubtable32; -#endif - -struct CMAPGroup -{ - le_uint32 startCharCode; - le_uint32 endCharCode; - le_uint32 startGlyphCode; -}; - -#ifndef __cplusplus -typedef struct CMAPGroup CMAPGroup; -#endif - -#ifdef __cplusplus -struct CMAPFormat8Encoding : CMAPEncodingSubtable32 -{ - le_uint32 is32[65536/32]; - le_uint32 nGroups; - CMAPGroup groups[ANY_NUMBER]; -}; -#else -struct CMAPFormat8Encoding -{ - CMAPEncodingSubtable32 base; - - le_uint32 is32[65536/32]; - le_uint32 nGroups; - CMAPGroup groups[ANY_NUMBER]; -}; - -typedef struct CMAPFormat8Encoding CMAPFormat8Encoding; -#endif - -#ifdef __cplusplus -struct CMAPFormat10Encoding : CMAPEncodingSubtable32 -{ - le_uint32 startCharCode; - le_uint32 numCharCodes; - le_uint16 glyphs[ANY_NUMBER]; -}; -#else -struct CMAPFormat10Encoding -{ - CMAPEncodingSubtable32 base; - - le_uint32 startCharCode; - le_uint32 numCharCodes; - le_uint16 glyphs[ANY_NUMBER]; -}; - -typedef struct CMAPFormat10Encoding CMAPFormat10Encoding; -#endif - -#ifdef __cplusplus -struct CMAPFormat12Encoding : CMAPEncodingSubtable32 -{ - le_uint32 nGroups; - CMAPGroup groups[ANY_NUMBER]; -}; -#else -struct CMAPFormat12Encoding -{ - CMAPEncodingSubtable32 base; - - le_uint32 nGroups; - CMAPGroup groups[ANY_NUMBER]; -}; - -typedef struct CMAPFormat12Encoding CMAPFormat12Encoding; -#endif - -typedef le_int32 fixed; - -struct BigDate -{ - le_uint32 bc; - le_uint32 ad; -}; - -#ifndef __cplusplus -typedef struct BigDate BigDate; -#endif - -struct HEADTable -{ - fixed version; - fixed fontRevision; - le_uint32 checksumAdjustment; - le_uint32 magicNumber; - le_uint16 flags; - le_uint16 unitsPerEm; - BigDate created; - BigDate modified; - le_int16 xMin; - le_int16 yMin; - le_int16 xMax; - le_int16 yMax; - le_int16 lowestRecPPEM; - le_int16 fontDirectionHint; - le_int16 indexToLocFormat; - le_int16 glyphDataFormat; -}; - -#ifndef __cplusplus -typedef struct HEADTable HEADTable; -#endif - -struct MAXPTable -{ - fixed version; - le_uint16 numGlyphs; - le_uint16 maxPoints; - le_uint16 maxContours; - le_uint16 maxComponentPoints; - le_uint16 maxComponentContours; - le_uint16 maxZones; - le_uint16 maxTwilightPoints; - le_uint16 maxStorage; - le_uint16 maxFunctionDefs; - le_uint16 maxInstructionDefs; - le_uint16 maxStackElements; - le_uint16 maxSizeOfInstructions; - le_uint16 maxComponentElements; - le_uint16 maxComponentDepth; -}; - -#ifndef __cplusplus -typedef struct MAXPTable MAXPTable; -#endif - -struct HHEATable -{ - fixed version; - le_int16 ascent; - le_int16 descent; - le_int16 lineGap; - le_uint16 advanceWidthMax; - le_int16 minLeftSideBearing; - le_int16 minRightSideBearing; - le_int16 xMaxExtent; - le_int16 caretSlopeRise; - le_int16 caretSlopeRun; - le_int16 caretOffset; - le_int16 reserved1; - le_int16 reserved2; - le_int16 reserved3; - le_int16 reserved4; - le_int16 metricDataFormat; - le_uint16 numOfLongHorMetrics; -}; - -#ifndef __cplusplus -typedef struct HHEATable HHEATable; -#endif - -struct LongHorMetric -{ - le_uint16 advanceWidth; - le_int16 leftSideBearing; -}; - -#ifndef __cplusplus -typedef struct LongHorMetric LongHorMetric; -#endif - -struct HMTXTable -{ - LongHorMetric hMetrics[ANY_NUMBER]; /* ANY_NUMBER = numOfLongHorMetrics from hhea table */ -/* le_int16 leftSideBearing[ANY_NUMBER]; ANY_NUMBER = numGlyphs - numOfLongHorMetrics */ -}; - -#ifndef __cplusplus -typedef struct HMTXTable HMTXTable; -#endif - -enum PlatformID -{ - PLATFORM_UNICODE = 0, - PLATFORM_MACINTOSH = 1, - PLATFORM_ISO = 2, - PLATFORM_MICROSOFT = 3, - PLATFORM_CUSTOM = 4 -}; - -enum MacintoshEncodingID -{ - MACINTOSH_ROMAN = 0 -}; - -enum MacintoshLanguageID -{ - MACINTOSH_ENGLISH = 0 -}; - -enum MicrosoftEncodingID -{ - MICROSOFT_UNICODE_BMP = 1, - MICROSOFT_UNICODE_FULL = 10 -}; - -enum MicrosoftLanguageID -{ - MICROSOFT_ENGLISH = 0x409 -}; - -enum NameID -{ - NAME_COPYRIGHT_NOTICE = 0, - NAME_FONT_FAMILY = 1, - NAME_FONT_SUB_FAMILY = 2, - NAME_UNIQUE_FONT_ID = 3, - NAME_FULL_FONT_NAME = 4, - NAME_VERSION_STRING = 5, - NAME_POSTSCRIPT_NAME = 6, - NAME_TRADEMARK = 7, - NAME_MANUFACTURER = 8, - NAME_DESIGNER = 9, - NAME_DESCRIPTION = 10, - NAME_VENDOR_URL = 11, - NAME_DESIGNER_URL = 12, - NAME_LICENSE_DESCRIPTION = 13, - NAME_LICENSE_URL = 14, - NAME_RESERVED = 15, - NAME_PREFERRED_FAMILY = 16, - NAME_PREFERRED_SUB_FAMILY = 17, - NAME_COMPATIBLE_FULL = 18, - NAME_SAMPLE_TEXT = 19, - NAME_POSTSCRIPT_CID = 20 -}; - -struct NameRecord -{ - le_uint16 platformID; - le_uint16 encodingID; - le_uint16 languageID; - le_uint16 nameID; - le_uint16 length; - le_uint16 offset; -}; - -#ifndef __cplusplus -typedef struct NameRecord NameRecord; -#endif - -struct NAMETable -{ - le_uint16 version; - le_uint16 count; - le_uint16 stringOffset; - NameRecord nameRecords[ANY_NUMBER]; -}; - -#ifndef __cplusplus -typedef struct NAMETable NAMETable; -#endif - -#endif - diff --git a/icu4c/source/test/perf/leperf/xmlreader.cpp b/icu4c/source/test/perf/leperf/xmlreader.cpp deleted file mode 100644 index e575274380c..00000000000 --- a/icu4c/source/test/perf/leperf/xmlreader.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/* - ******************************************************************************* - * - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - * - ******************************************************************************* - ******************************************************************************* - * - * Copyright (C) 1999-2013, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - */ - -#include "unicode/utypes.h" -#include "unicode/uclean.h" -#include "unicode/uchar.h" -#include "unicode/unistr.h" -#include "unicode/uscript.h" -#include "unicode/putil.h" -#include "unicode/ctest.h" - -#include "layout/LETypes.h" -#include "layout/LEScripts.h" - -#include "letsutil.h" -#include "letest.h" - -#include "xmlreader.h" - -#include "xmlparser.h" - -#include -#include -#include - -//U_NAMESPACE_USE - -#define CH_COMMA 0x002C - -static le_uint32 *getHexArray(const UnicodeString &numbers, int32_t &arraySize) -{ - int32_t offset = -1; - - arraySize = 1; - while((offset = numbers.indexOf(CH_COMMA, offset + 1)) >= 0) { - arraySize += 1; - } - - le_uint32 *array = NEW_ARRAY(le_uint32, arraySize); - char number[16]; - le_int32 count = 0; - le_int32 start = 0, end = 0; - le_int32 len = 0; - - // trim leading whitespace - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - while((end = numbers.indexOf(CH_COMMA, start)) >= 0) { - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - start = end + 1; - - sscanf(number, "%x", &array[count++]); - - // trim whitespace following the comma - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - } - - // trim trailing whitespace - end = numbers.length(); - while(u_isUWhiteSpace(numbers[end - 1])) { - end -= 1; - } - - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - sscanf(number, "%x", &array[count]); - - return array; -} - -static float *getFloatArray(const UnicodeString &numbers, int32_t &arraySize) -{ - int32_t offset = -1; - - arraySize = 1; - while((offset = numbers.indexOf(CH_COMMA, offset + 1)) >= 0) { - arraySize += 1; - } - - float *array = NEW_ARRAY(float, arraySize); - char number[32]; - le_int32 count = 0; - le_int32 start = 0, end = 0; - le_int32 len = 0; - - // trim leading whitespace - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - while((end = numbers.indexOf(CH_COMMA, start)) >= 0) { - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - start = end + 1; - - sscanf(number, "%f", &array[count++]); - - // trim whiteapce following the comma - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - } - - while(u_isUWhiteSpace(numbers[start])) { - start += 1; - } - - // trim trailing whitespace - end = numbers.length(); - while(u_isUWhiteSpace(numbers[end - 1])) { - end -= 1; - } - - len = numbers.extract(start, end - start, number, ARRAY_SIZE(number), US_INV); - number[len] = '\0'; - sscanf(number, "%f", &array[count]); - - return array; -} - -U_CDECL_BEGIN -void readTestFile(const char *testFilePath, TestCaseCallback callback) -{ -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - UErrorCode status = U_ZERO_ERROR; - UXMLParser *parser = UXMLParser::createParser(status); - UXMLElement *root = parser->parseFile(testFilePath, status); - - if (root == nullptr) { - log_err("Could not open the test data file: %s\n", testFilePath); - delete parser; - return; - } - - UnicodeString test_case = UNICODE_STRING_SIMPLE("test-case"); - UnicodeString test_text = UNICODE_STRING_SIMPLE("test-text"); - UnicodeString test_font = UNICODE_STRING_SIMPLE("test-font"); - UnicodeString result_glyphs = UNICODE_STRING_SIMPLE("result-glyphs"); - UnicodeString result_indices = UNICODE_STRING_SIMPLE("result-indices"); - UnicodeString result_positions = UNICODE_STRING_SIMPLE("result-positions"); - - // test-case attributes - UnicodeString id_attr = UNICODE_STRING_SIMPLE("id"); - UnicodeString script_attr = UNICODE_STRING_SIMPLE("script"); - UnicodeString lang_attr = UNICODE_STRING_SIMPLE("lang"); - - // test-font attributes - UnicodeString name_attr = UNICODE_STRING_SIMPLE("name"); - UnicodeString ver_attr = UNICODE_STRING_SIMPLE("version"); - UnicodeString cksum_attr = UNICODE_STRING_SIMPLE("checksum"); - - const UXMLElement *testCase; - int32_t tc = 0; - - while((testCase = root->nextChildElement(tc)) != nullptr) { - if (testCase->getTagName().compare(test_case) == 0) { - char *id = getCString(testCase->getAttribute(id_attr)); - char *script = getCString(testCase->getAttribute(script_attr)); - char *lang = getCString(testCase->getAttribute(lang_attr)); - char *fontName = nullptr; - char *fontVer = nullptr; - char *fontCksum = nullptr; - const UXMLElement *element; - int32_t ec = 0; - int32_t charCount = 0; - UScriptCode scriptCode; - le_int32 languageCode = -1; - UnicodeString text, glyphs, indices, positions; - int32_t glyphCount = 0, indexCount = 0, positionCount = 0; - TestResult expected = {0, nullptr, nullptr, nullptr}; - - uscript_getCode(script, &scriptCode, 1, &status); - if (LE_FAILURE(status)) { - log_err("invalid script name: %s.\n", script); - goto free_c_strings; - } - - if (lang != nullptr) { - languageCode = getLanguageCode(lang); - - if (languageCode < 0) { - log_err("invalid language name: %s.\n", lang); - goto free_c_strings; - } - } - - while((element = testCase->nextChildElement(ec)) != nullptr) { - UnicodeString tag = element->getTagName(); - - // TODO: make sure that each element is only used once. - if (tag.compare(test_font) == 0) { - fontName = getCString(element->getAttribute(name_attr)); - fontVer = getCString(element->getAttribute(ver_attr)); - fontCksum = getCString(element->getAttribute(cksum_attr)); - - } else if (tag.compare(test_text) == 0) { - text = element->getText(true); - charCount = text.length(); - } else if (tag.compare(result_glyphs) == 0) { - glyphs = element->getText(true); - } else if (tag.compare(result_indices) == 0) { - indices = element->getText(true); - } else if (tag.compare(result_positions) == 0) { - positions = element->getText(true); - } else { - // an unknown tag... - char *cTag = getCString(&tag); - - log_info("Test %s: unknown element with tag \"%s\"\n", id, cTag); - freeCString(cTag); - } - } - - expected.glyphs = (LEGlyphID *) getHexArray(glyphs, glyphCount); - expected.indices = (le_int32 *) getHexArray(indices, indexCount); - expected.positions = getFloatArray(positions, positionCount); - - expected.glyphCount = glyphCount; - - if (glyphCount < charCount || indexCount != glyphCount || positionCount < glyphCount * 2 + 2) { - log_err("Test %s: inconsistent input data: charCount = %d, glyphCount = %d, indexCount = %d, positionCount = %d\n", - id, charCount, glyphCount, indexCount, positionCount); - goto free_expected; - }; - - (*callback)(id, fontName, fontVer, fontCksum, scriptCode, languageCode, text.getBuffer(), charCount, &expected); - -free_expected: - DELETE_ARRAY(expected.positions); - DELETE_ARRAY(expected.indices); - DELETE_ARRAY(expected.glyphs); - -free_c_strings: - freeCString(fontCksum); - freeCString(fontVer); - freeCString(fontName); - freeCString(lang); - freeCString(script); - freeCString(id); - } - } - - delete root; - delete parser; -#endif -} -U_CDECL_END diff --git a/icu4c/source/test/perf/leperf/xmlreader.h b/icu4c/source/test/perf/leperf/xmlreader.h deleted file mode 100644 index 978b7b40228..00000000000 --- a/icu4c/source/test/perf/leperf/xmlreader.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * © 2016 and later: Unicode, Inc. and others. - * License & terms of use: http://www.unicode.org/copyright.html - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __XMLREADER_H -#define __XMLREADER_H - -#include "layout/LETypes.h" -#include "letest.h" - -typedef void (*TestCaseCallback) (const char *testID, - const char *fontName, - const char *fontVersion, - const char *fontChecksum, - le_int32 scriptCode, - le_int32 languageCode, - const LEUnicode *text, - le_int32 charCount, - TestResult *expected); - -U_CAPI void readTestFile(const char *testFilePath, TestCaseCallback callback); - -#endif diff --git a/icu4c/source/test/testdata/break_rules/grapheme.txt b/icu4c/source/test/testdata/break_rules/grapheme.txt index d5776f33c20..0a811057a57 100644 --- a/icu4c/source/test/testdata/break_rules/grapheme.txt +++ b/icu4c/source/test/testdata/break_rules/grapheme.txt @@ -18,7 +18,7 @@ CR = [\p{Grapheme_Cluster_Break = CR}]; LF = [\p{Grapheme_Cluster_Break = LF}]; Control = [[\p{Grapheme_Cluster_Break = Control}]]; -Extend = [[\p{Grapheme_Cluster_Break = Extend}]]; +Extend_ = [[\p{Grapheme_Cluster_Break = Extend}]]; ZWJ = [\p{Grapheme_Cluster_Break = ZWJ}]; Regional_Indicator = [\p{Grapheme_Cluster_Break = Regional_Indicator}]; Prepend = [\p{Grapheme_Cluster_Break = Prepend}]; @@ -38,11 +38,9 @@ LVT = [\p{Grapheme_Cluster_Break = LVT}]; Extended_Pict = [:ExtPict:]; # Indic Sequences -Virama_ = [[\p{Gujr}\p{sc=Telu}\p{sc=Mlym}\p{sc=Orya}\p{sc=Beng}\p{sc=Deva}] & [\p{Indic_Syllabic_Category=Virama}]]; - -LinkingConsonant = [[\p{Gujr}\p{sc=Telu}\p{sc=Mlym}\p{sc=Orya}\p{sc=Beng}\p{sc=Deva}] & [\p{Indic_Syllabic_Category=Consonant}]]; - -ExtCccZwj = [[Extend-[\p{ccc=0}]] ZWJ]; +InCBLinker = [\p{InCB=Linker}]; +InCBConsonant = [\p{InCB=Consonant}]; +InCBExtend = [\p{InCB=Extend}]; GB3: CR LF; GB4: (Control | CR | LF) ÷; @@ -52,9 +50,9 @@ GB6: L (L | V | LV | LVT); GB7: (LV | V) (V | T); GB8: (LVT | T) T; -GB11: Extended_Pict Extend* ZWJ Extended_Pict; -GB9c: LinkingConsonant ExtCccZwj* Virama_ ExtCccZwj* LinkingConsonant; -GB9: . (Extend | ZWJ); +GB11: Extended_Pict Extend_* ZWJ Extended_Pict; +GB9c: InCBConsonant ( InCBExtend | InCBLinker )* InCBLinker ( InCBExtend | InCBLinker )* InCBConsonant; +GB9: . (Extend_ | ZWJ); GB9a: . SpacingMark; GB9b: Prepend .; diff --git a/icu4c/source/test/testdata/break_rules/line.txt b/icu4c/source/test/testdata/break_rules/line.txt index 9f85b791713..e2154abf630 100644 --- a/icu4c/source/test/testdata/break_rules/line.txt +++ b/icu4c/source/test/testdata/break_rules/line.txt @@ -176,7 +176,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_cj.txt b/icu4c/source/test/testdata/break_rules/line_cj.txt index 7aad76ecf10..bb0a6880ea2 100644 --- a/icu4c/source/test/testdata/break_rules/line_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_cj.txt @@ -180,7 +180,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_loose.txt b/icu4c/source/test/testdata/break_rules/line_loose.txt index 72e7563c927..f9152060bf2 100644 --- a/icu4c/source/test/testdata/break_rules/line_loose.txt +++ b/icu4c/source/test/testdata/break_rules/line_loose.txt @@ -181,7 +181,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_loose_cj.txt b/icu4c/source/test/testdata/break_rules/line_loose_cj.txt index 99d01874d1f..b04236532bb 100644 --- a/icu4c/source/test/testdata/break_rules/line_loose_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_loose_cj.txt @@ -200,7 +200,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA BAX HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_normal.txt b/icu4c/source/test/testdata/break_rules/line_normal.txt index 21129853979..c7c518d5b68 100644 --- a/icu4c/source/test/testdata/break_rules/line_normal.txt +++ b/icu4c/source/test/testdata/break_rules/line_normal.txt @@ -182,7 +182,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/line_normal_cj.txt b/icu4c/source/test/testdata/break_rules/line_normal_cj.txt index 2061f917084..cfa9c7968e1 100644 --- a/icu4c/source/test/testdata/break_rules/line_normal_cj.txt +++ b/icu4c/source/test/testdata/break_rules/line_normal_cj.txt @@ -186,7 +186,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4c/source/test/testdata/break_rules/word.txt b/icu4c/source/test/testdata/break_rules/word.txt index 002d1af5780..5ace30266c8 100644 --- a/icu4c/source/test/testdata/break_rules/word.txt +++ b/icu4c/source/test/testdata/break_rules/word.txt @@ -29,7 +29,7 @@ ALetter = [\p{Word_Break = ALetter}]; Single_Quote = [\p{Word_Break = Single_Quote}]; Double_Quote = [\p{Word_Break = Double_Quote}]; MidNumLet = [\p{Word_Break = MidNumLet}]; -MidLetter = [\p{Word_Break = MidLetter} - [\: \uFE55 \uFF1A]]; +MidLetter = [\p{Word_Break = MidLetter}]; MidNum = [\p{Word_Break = MidNum}]; Numeric = [\p{Word_Break = Numeric}]; ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; diff --git a/icu4c/source/test/testdata/break_rules/word_POSIX.txt b/icu4c/source/test/testdata/break_rules/word_POSIX.txt index fc4eedeb8bd..7fdc1a1ee07 100644 --- a/icu4c/source/test/testdata/break_rules/word_POSIX.txt +++ b/icu4c/source/test/testdata/break_rules/word_POSIX.txt @@ -28,7 +28,7 @@ ALetter = [\p{Word_Break = ALetter}]; Single_Quote = [\p{Word_Break = Single_Quote}]; Double_Quote = [\p{Word_Break = Double_Quote}]; MidNumLet = [\p{Word_Break = MidNumLet} - [.]]; -MidLetter = [\p{Word_Break = MidLetter} - [\: \uFE55 \uFF1A]]; +MidLetter = [\p{Word_Break = MidLetter} - [\:]]; MidNum = [\p{Word_Break = MidNum} [.]]; Numeric = [\p{Word_Break = Numeric}]; ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; diff --git a/icu4c/source/test/testdata/cldr/localeIdentifiers/likelySubtags.txt b/icu4c/source/test/testdata/cldr/localeIdentifiers/likelySubtags.txt index d7f06199e44..aca47b1a577 100644 --- a/icu4c/source/test/testdata/cldr/localeIdentifiers/likelySubtags.txt +++ b/icu4c/source/test/testdata/cldr/localeIdentifiers/likelySubtags.txt @@ -1441,7 +1441,7 @@ und-Latn-MQ ; fr-Latn-MQ ; fr-MQ ; und-Latn-MR ; fr-Latn-MR ; fr-MR ; und-Latn-MS ; en-Latn-MS ; en-MS ; und-Latn-MT ; mt-Latn-MT ; mt ; -und-Latn-MU ; en-Latn-MU ; en-MU ; +und-Latn-MU ; mfe-Latn-MU ; mfe ; und-Latn-MV ; en-Latn-MV ; en-MV ; und-Latn-MW ; en-Latn-MW ; en-MW ; und-Latn-MX ; es-Latn-MX ; es-MX ; @@ -1484,7 +1484,7 @@ und-Latn-SH ; en-Latn-SH ; en-SH ; und-Latn-SI ; sl-Latn-SI ; sl ; und-Latn-SJ ; nb-Latn-SJ ; nb-SJ ; und-Latn-SK ; sk-Latn-SK ; sk ; -und-Latn-SL ; en-Latn-SL ; en-SL ; +und-Latn-SL ; kri-Latn-SL ; kri ; und-Latn-SM ; it-Latn-SM ; it-SM ; und-Latn-SN ; fr-Latn-SN ; fr-SN ; und-Latn-SO ; so-Latn-SO ; so ; @@ -1498,7 +1498,7 @@ und-Latn-SZ ; en-Latn-SZ ; en-SZ ; und-Latn-TC ; en-Latn-TC ; en-TC ; und-Latn-TD ; fr-Latn-TD ; fr-TD ; und-Latn-TG ; fr-Latn-TG ; fr-TG ; -und-Latn-TK ; en-Latn-TK ; en-TK ; +und-Latn-TK ; tkl-Latn-TK ; tkl ; und-Latn-TL ; pt-Latn-TL ; pt-TL ; und-Latn-TM ; tk-Latn-TM ; tk ; und-Latn-TN ; fr-Latn-TN ; fr-TN ; @@ -1524,7 +1524,7 @@ und-Latn-WS ; sm-Latn-WS ; sm ; und-Latn-XK ; sq-Latn-XK ; sq-XK ; und-Latn-YT ; fr-Latn-YT ; fr-YT ; und-Latn-ZA ; en-Latn-ZA ; en-ZA ; -und-Latn-ZM ; en-Latn-ZM ; en-ZM ; +und-Latn-ZM ; bem-Latn-ZM ; bem ; und-Latn-ZW ; sn-Latn-ZW ; sn ; und-MA ; ar-Arab-MA ; ar-MA ; und-MC ; fr-Latn-MC ; fr-MC ; diff --git a/icu4c/source/test/testdata/letest.xml b/icu4c/source/test/testdata/letest.xml deleted file mode 100644 index c77eec0e50b..00000000000 --- a/icu4c/source/test/testdata/letest.xml +++ /dev/null @@ -1,1956 +0,0 @@ - - - - - - - - - - श्रीमद् भगवद्गीता अध्याय अर्जुन विषाद योग धृतराष्ट्र उवाचृ धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः मामकाः पाण्डवाश्चैव किमकुर्वत संजव - - - 0x0000009E, 0x0000009A, 0x00000051, 0x00000222, 0x00000098, 0x00000091, 0x00000051, 0x00000003, - 0x00000097, 0x00000082, 0x0000009D, 0x000001A5, 0x0000FFFF, 0x0000FFFF, 0x00000222, 0x0000008F, - 0x00000221, 0x00000003, 0x0000005C, 0x000000DA, 0x0000FFFF, 0x00000099, 0x00000221, 0x00000099, - 0x00000003, 0x0000005C, 0x00000087, 0x000001D5, 0x0000005B, 0x0000FFFF, 0x00000093, 0x00000003, - 0x000001D2, 0x0000009D, 0x0000009F, 0x00000221, 0x00000091, 0x00000003, 0x00000099, 0x0000022A, - 0x00000082, 0x00000003, 0x00000092, 0x000001D9, 0x0000008F, 0x0000009A, 0x00000221, 0x000001B4, - 0x0000FFFF, 0x0000FFFF, 0x0000009A, 0x00000051, 0x00000003, 0x00000060, 0x0000009D, 0x00000221, - 0x00000085, 0x000001D9, 0x00000003, 0x00000092, 0x00000098, 0x0000005B, 0x0000FFFF, 0x000000A2, - 0x0000FFFF, 0x0000FFFF, 0x0000022F, 0x0000008F, 0x0000009A, 0x00000051, 0x0000022F, 0x00000003, - 0x00000080, 0x000001D5, 0x0000009A, 0x000001FD, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x0000022F, - 0x0000008F, 0x0000009A, 0x00000051, 0x0000022F, 0x00000003, 0x000000A0, 0x00000098, 0x0000009D, - 0x0000022F, 0x0000008F, 0x00000221, 0x00000003, 0x00000099, 0x000001D5, 0x00000099, 0x000001D5, - 0x000000D7, 0x0000FFFF, 0x000000A0, 0x0000009D, 0x0000022C, 0x00000003, 0x00000098, 0x00000221, - 0x00000098, 0x00000080, 0x00000221, 0x0000022C, 0x00000003, 0x00000094, 0x00000221, 0x000000D6, - 0x0000FFFF, 0x0000008C, 0x0000009D, 0x00000221, 0x000001B1, 0x0000FFFF, 0x0000FFFF, 0x00000230, - 0x0000009D, 0x00000003, 0x000001D1, 0x00000080, 0x00000098, 0x00000080, 0x000001D5, 0x0000009D, - 0x0000005B, 0x0000FFFF, 0x0000008F, 0x00000003, 0x000000A0, 0x00000232, 0x00000087, 0x0000009D - - - - 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001C, 0x0000001D, 0x0000001A, 0x0000001B, 0x0000001E, 0x0000001F, - 0x00000021, 0x00000020, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000033, 0x00000032, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003E, 0x0000003C, 0x0000003D, 0x0000003F, - 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000045, 0x00000044, 0x00000046, 0x00000047, - 0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, - 0x00000050, 0x00000052, 0x00000051, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, - 0x00000058, 0x00000059, 0x0000005A, 0x0000005B, 0x0000005C, 0x0000005D, 0x0000005E, 0x0000005F, - 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, - 0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 0x0000006D, 0x0000006E, 0x0000006F, - 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, - 0x00000078, 0x00000079, 0x0000007B, 0x0000007A, 0x0000007C, 0x0000007D, 0x0000007E, 0x00000081, - 0x0000007F, 0x00000080, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087 - - - - 0.000000, 0.000000, 9.468750, 0.000000, 19.130859, -0.451172, 15.984375, 0.000000, - 19.640625, 0.000000, 29.109375, 0.000000, 40.177734, -0.451172, 37.078125, 0.000000, - 43.078125, 0.000000, 52.546875, 0.000000, 62.015625, 0.000000, 69.984375, 0.000000, - 77.953125, 0.000000, 77.953125, 0.000000, 77.953125, 0.000000, 81.609375, 0.000000, - 89.578125, 0.000000, 93.234375, 0.000000, 99.234375, 0.000000, 109.171875, 0.000000, - 116.437500, 0.000000, 116.437500, 0.000000, 125.906250, 0.000000, 129.562500, 0.000000, - 139.031250, 0.000000, 145.031250, 0.000000, 154.968750, 0.000000, 164.718750, -0.011719, - 164.718750, 0.263672, 164.437500, 0.000000, 164.437500, 0.000000, 173.906250, 0.000000, - 179.906250, 0.000000, 184.265625, 0.000000, 192.234375, 0.000000, 200.203125, 0.000000, - 203.859375, 0.000000, 211.828125, 0.000000, 217.828125, 0.000000, 227.296875, 0.000000, - 231.375000, 0.000000, 240.843750, 0.000000, 246.843750, 0.000000, 256.740234, -0.011719, - 256.312500, 0.000000, 264.281250, 0.000000, 270.796875, 0.000000, 274.453125, 0.000000, - 282.796875, 0.000000, 282.796875, 0.000000, 282.796875, 0.000000, 292.458984, -0.451172, - 289.312500, 0.000000, 295.312500, 0.000000, 303.281250, 0.000000, 311.250000, 0.000000, - 314.906250, 0.000000, 324.890625, -0.011719, 324.375000, 0.000000, 330.375000, 0.000000, - 339.843750, 0.000000, 349.675781, 0.263672, 349.312500, 0.000000, 349.312500, 0.000000, - 360.187500, 0.000000, 360.187500, 0.000000, 359.384766, 0.275391, 360.187500, 0.000000, - 368.156250, 0.000000, 377.818359, -0.451172, 372.996094, 0.263672, 374.671875, 0.000000, - 380.671875, 0.000000, 388.371094, -0.011719, 391.546875, 0.000000, 398.062500, 0.000000, - 399.421875, 0.000000, 410.296875, 0.000000, 410.296875, 0.000000, 409.494141, 0.275391, - 410.296875, 0.000000, 418.265625, 0.000000, 427.927734, -0.451172, 423.105469, 0.263672, - 424.781250, 0.000000, 430.781250, 0.000000, 440.250000, 0.000000, 449.718750, 0.000000, - 456.832031, 0.263672, 457.687500, 0.000000, 465.656250, 0.000000, 469.312500, 0.000000, - 475.312500, 0.000000, 484.921875, -0.011719, 484.781250, 0.000000, 494.390625, -0.011719, - 494.250000, 0.000000, 500.179688, 0.000000, 500.179688, 0.000000, 509.648438, 0.000000, - 517.617188, 0.000000, 521.976562, 0.000000, 527.976562, 0.000000, 537.445312, 0.000000, - 541.101562, 0.000000, 550.570312, 0.000000, 561.445312, 0.000000, 565.101562, 0.000000, - 569.460938, 0.000000, 575.460938, 0.000000, 583.429688, 0.000000, 587.085938, 0.000000, - 594.351562, 0.000000, 594.351562, 0.000000, 602.320312, 0.000000, 610.289062, 0.000000, - 613.945312, 0.000000, 624.820312, 0.000000, 624.820312, 0.000000, 624.691406, 0.263672, - 624.820312, 0.000000, 632.789062, 0.000000, 638.789062, 0.000000, 643.148438, 0.000000, - 654.023438, 0.000000, 663.492188, 0.000000, 671.191406, -0.011719, 674.367188, 0.000000, - 682.628906, 0.263672, 682.335938, 0.000000, 682.335938, 0.000000, 690.304688, 0.000000, - 696.304688, 0.000000, 705.140625, 0.439453, 705.773438, 0.000000, 715.242188, 0.000000, - 723.210938, 0.000000 - - - - - - - أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية - - - 0x0000CE28, 0x0000CE87, 0x0000CE41, 0x0000CE81, 0x0000CE42, 0x0000CE54, 0x0000CE73, 0x0000CE21, - 0x00000003, 0x0000CE65, 0x0000CE41, 0x0000CE22, 0x0000CE38, 0x0000CE78, 0x0000CE73, 0x0000CE21, - 0x00000003, 0x0000CE5E, 0x0000CE88, 0x0000CE78, 0x0000CE33, 0x00000003, 0x0000CE84, 0x0000CE74, - 0x0000CE5F, 0x00000003, 0x0000CE85, 0x0000CE82, 0x0000CE2C, 0x0000CE38, 0x0000CE87, 0x00000003, - 0x0000CE3E, 0x0000CE37, 0x0000CE21, 0x0000CE81, 0x00000003, 0x0000CE42, 0x0000CE88, 0x0000CE68, - 0x0000CE4C, 0x0000CE2B, 0x00000003, 0x0000CE75, 0x0000CE22, 0x0000CE5C, 0x0000CE7B, 0x00000003, - 0x0000CE3E, 0x0000CE33, 0x0000CE82, 0x0000CE87, 0x00000003, 0x0000CE76, 0x0000CE73, 0x0000CE81, - 0x00000003, 0x00000588, 0x0000CE65, 0x0000CE41, 0x0000CE22, 0x0000CE38, 0x0000CE78, 0x0000CE74, - 0x0000CE73, 0x00000003, 0x0000CE75, 0x0000CE22, 0x0000CE6B, 0x0000CE41, 0x0000FFFE, 0x0000CE8B, - 0x0000CE21, 0x00000003, 0x0000CE7D, 0x0000CE40, 0x0000CE7F, 0x00000003, 0x0000CE4E, 0x0000CE88, - 0x0000CE50, 0x0000CE3C, 0x0000CE2B, 0x0000CE81, 0x00000003, 0x0000CE42, 0x0000CE88, 0x0000CE68, - 0x0000CE4C, 0x0000CE2C, 0x0000CE74, 0x0000CE73, 0x00000003, 0x0000CE28, 0x0000CE78, 0x0000CE5C, - 0x0000CE7B, 0x0000FFFE, 0x0000CE8B, 0x0000CE21, 0x00000003, 0x0000CE29, 0x0000CE22, 0x0000CE20, - 0x0000CE77, 0x00000003, 0x0000CE6D, 0x0000CE22, 0x0000CE7C, 0x0000CE7F, 0x00000003, 0x0000CE79, - 0x0000CE22, 0x0000CE6F, 0x00000003, 0x00000588, 0x00000005, 0x0000CE3D, 0x0000CE82, 0x0000CE70, - 0x000005B5, 0x0000CE7B, 0x0000CE82, 0x0000CE87, 0x00000005, 0x00000003, 0x0000CE5D, 0x0000CE21, - 0x0000CE42, 0x0000CE2C, 0x0000CE3B, 0x0000CE21, 0x00000003, 0x0000CE72, 0x0000CE26, 0x0000CE6B, - 0x0000CE81, 0x00000003, 0x00000011, 0x0000CE22, 0x0000CE80, 0x0000CE7C, 0x0000CE77, 0x00000003, - 0x0000CE3E, 0x0000CE37, 0x0000CE21, 0x0000CE81, 0x00000003, 0x0000CE72, 0x0000CE70, 0x0000CE73, - 0x00000003, 0x0000CE22, 0x0000CE7C, 0x0000CE88, 0x0000CE60, 0x0000CE77, 0x00000003, 0x0000CE22, - 0x0000CE78, 0x0000CE6B, 0x0000CE41, 0x00000003, 0x0000CE86, 0x0000CE58, 0x0000CE60, 0x000005B4, - 0x0000CE2B, 0x00000003, 0x0000CE79, 0x0000CE17, 0x00000003, 0x0000CE3E, 0x0000CE60, 0x0000CE25, - 0x00000003, 0x0000CE83, 0x0000CE42, 0x0000CE3B, 0x0000FFFE, 0x0000CE8B, 0x0000CE21, 0x00000003, - 0x0000CE65, 0x0000CE41, 0x0000CE22, 0x0000CE38, 0x0000CE78, 0x0000CE73, 0x0000CE21, 0x0000CE81, - 0x00000003, 0x0000CE65, 0x0000CE42, 0x0000CE37, 0x0000FFFE, 0x0000CE8B, 0x0000CE21, 0x00000003, - 0x0000CE7A, 0x0000CE87, 0x0000CE44, 0x0000CE3C, 0x0000CE2C, 0x0000CE25, 0x00000003, 0x0000CE75, - 0x0000CE82, 0x0000CE6C, 0x0000CE2B, 0x0000CE81, 0x00000003, 0x00000588, 0x0000CE75, 0x0000CE22, - 0x0000CE6B, 0x0000CE41, 0x0000FFFE, 0x0000CE8B, 0x0000CE21, 0x00000003, 0x0000CE5E, 0x0000CE77, - 0x00000003, 0x0000CE56, 0x0000CE6C, 0x0000CE67, 0x00000003, 0x0000CE24, 0x0000CE88, 0x0000CE47, - 0x0000CE21, 0x0000CE82, 0x0000CE38, 0x0000CE73, 0x0000CE21, 0x00000003, 0x0000CE72, 0x0000CE77, - 0x0000CE22, 0x0000CE60, 0x0000CE2C, 0x0000CE2B, 0x00000003, 0x00000588, 0x0000CE22, 0x000005B0, - 0x0000CE47, 0x0000CE22, 0x0000CE47, 0x0000CE17 - - - - 0x000000FB, 0x000000FA, 0x000000F9, 0x000000F8, 0x000000F7, 0x000000F6, 0x000000F5, 0x000000F4, - 0x000000F3, 0x000000F2, 0x000000F1, 0x000000F0, 0x000000EF, 0x000000EE, 0x000000ED, 0x000000EC, - 0x000000EB, 0x000000EA, 0x000000E9, 0x000000E8, 0x000000E7, 0x000000E6, 0x000000E5, 0x000000E4, - 0x000000E3, 0x000000E2, 0x000000E1, 0x000000E0, 0x000000DF, 0x000000DE, 0x000000DD, 0x000000DC, - 0x000000DB, 0x000000DA, 0x000000D9, 0x000000D8, 0x000000D7, 0x000000D6, 0x000000D5, 0x000000D4, - 0x000000D3, 0x000000D2, 0x000000D1, 0x000000D0, 0x000000CF, 0x000000CE, 0x000000CD, 0x000000CC, - 0x000000CB, 0x000000CA, 0x000000C9, 0x000000C8, 0x000000C7, 0x000000C6, 0x000000C5, 0x000000C4, - 0x000000C3, 0x000000C2, 0x000000C1, 0x000000C0, 0x000000BF, 0x000000BE, 0x000000BD, 0x000000BC, - 0x000000BB, 0x000000BA, 0x000000B9, 0x000000B8, 0x000000B7, 0x000000B6, 0x000000B5, 0x000000B4, - 0x000000B3, 0x000000B2, 0x000000B1, 0x000000B0, 0x000000AF, 0x000000AE, 0x000000AD, 0x000000AC, - 0x000000AB, 0x000000AA, 0x000000A9, 0x000000A8, 0x000000A7, 0x000000A6, 0x000000A5, 0x000000A4, - 0x000000A3, 0x000000A2, 0x000000A1, 0x000000A0, 0x0000009F, 0x0000009E, 0x0000009D, 0x0000009C, - 0x0000009B, 0x0000009A, 0x00000099, 0x00000098, 0x00000097, 0x00000096, 0x00000095, 0x00000094, - 0x00000093, 0x00000092, 0x00000091, 0x00000090, 0x0000008F, 0x0000008E, 0x0000008D, 0x0000008C, - 0x0000008B, 0x0000008A, 0x00000089, 0x00000088, 0x00000087, 0x00000086, 0x00000085, 0x00000084, - 0x00000083, 0x00000082, 0x00000081, 0x00000080, 0x0000007F, 0x0000007E, 0x0000007D, 0x0000007C, - 0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 0x00000074, - 0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 0x0000006C, - 0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 0x00000064, - 0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 0x0000005C, - 0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 0x00000054, - 0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 0x0000004C, - 0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 0x00000044, - 0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 0x0000003C, - 0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 0x00000034, - 0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 0x0000002C, - 0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, - 0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 0x0000001C, - 0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 0x00000014, - 0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 0x0000000C, - 0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 0x00000004, - 0x00000003, 0x00000002, 0x00000001, 0x00000000 - - - - 0.000000, 0.000000, 4.007812, 0.000000, 8.226562, 0.000000, 12.679688, 0.000000, - 18.679688, 0.000000, 23.132812, 0.000000, 31.289062, 0.000000, 34.312500, 0.000000, - 36.375000, 0.000000, 41.062500, 0.000000, 50.296875, 0.000000, 54.750000, 0.000000, - 56.859375, 0.000000, 62.367188, 0.000000, 66.632812, 0.000000, 69.656250, 0.000000, - 71.718750, 0.000000, 76.406250, 0.000000, 81.421875, 0.000000, 85.664062, 0.000000, - 89.929688, 0.000000, 95.742188, 0.000000, 100.429688, 0.000000, 108.796875, 0.000000, - 112.171875, 0.000000, 115.734375, 0.000000, 120.421875, 0.000000, 128.765625, 0.000000, - 134.765625, 0.000000, 139.007812, 0.000000, 144.515625, 0.000000, 148.734375, 0.000000, - 153.421875, 0.000000, 157.359375, 0.000000, 163.171875, 0.000000, 165.234375, 0.000000, - 171.234375, 0.000000, 175.921875, 0.000000, 180.375000, 0.000000, 184.617188, 0.000000, - 188.085938, 0.000000, 195.117188, 0.000000, 199.312500, 0.000000, 204.000000, 0.000000, - 208.007812, 0.000000, 210.117188, 0.000000, 217.054688, 0.000000, 220.429688, 0.000000, - 225.117188, 0.000000, 229.054688, 0.000000, 234.867188, 0.000000, 240.867188, 0.000000, - 245.085938, 0.000000, 249.773438, 0.000000, 253.781250, 0.000000, 256.804688, 0.000000, - 262.804688, 0.000000, 267.492188, 0.000000, 271.007812, 0.000000, 280.242188, 0.000000, - 284.695312, 0.000000, 286.804688, 0.000000, 292.312500, 0.000000, 296.578125, 0.000000, - 299.953125, 0.000000, 302.976562, 0.000000, 307.664062, 0.000000, 311.671875, 0.000000, - 313.781250, 0.000000, 317.882812, 0.000000, 322.335938, 0.000000, 322.335938, 0.000000, - 328.500000, 0.000000, 330.562500, 0.000000, 335.250000, 0.000000, 339.140625, 0.000000, - 343.078125, 0.000000, 348.984375, 0.000000, 353.671875, 0.000000, 366.445312, 0.000000, - 370.687500, 0.000000, 378.843750, 0.000000, 384.351562, 0.000000, 388.546875, 0.000000, - 394.546875, 0.000000, 399.234375, 0.000000, 403.687500, 0.000000, 407.929688, 0.000000, - 411.398438, 0.000000, 418.429688, 0.000000, 422.671875, 0.000000, 426.046875, 0.000000, - 429.070312, 0.000000, 433.757812, 0.000000, 437.765625, 0.000000, 442.031250, 0.000000, - 448.968750, 0.000000, 452.343750, 0.000000, 452.343750, 0.000000, 458.507812, 0.000000, - 460.570312, 0.000000, 465.257812, 0.000000, 474.492188, 0.000000, 476.601562, 0.000000, - 480.843750, 0.000000, 485.109375, 0.000000, 489.796875, 0.000000, 497.437500, 0.000000, - 499.546875, 0.000000, 503.765625, 0.000000, 509.671875, 0.000000, 514.359375, 0.000000, - 521.671875, 0.000000, 523.781250, 0.000000, 529.453125, 0.000000, 534.140625, 0.000000, - 537.656250, 0.000000, 543.046875, 0.000000, 546.585938, 0.000000, 552.585938, 0.000000, - 560.367188, 0.000000, 560.367188, 0.000000, 563.742188, 0.000000, 569.742188, 0.000000, - 573.960938, 0.000000, 579.351562, 0.000000, 584.039062, 0.000000, 589.851562, 0.000000, - 591.914062, 0.000000, 596.367188, 0.000000, 600.609375, 0.000000, 606.421875, 0.000000, - 608.484375, 0.000000, 613.171875, 0.000000, 619.570312, 0.000000, 623.812500, 0.000000, - 627.914062, 0.000000, 633.914062, 0.000000, 638.601562, 0.000000, 641.929688, 0.000000, - 644.039062, 0.000000, 647.789062, 0.000000, 652.007812, 0.000000, 656.273438, 0.000000, - 660.960938, 0.000000, 664.898438, 0.000000, 670.710938, 0.000000, 672.773438, 0.000000, - 678.773438, 0.000000, 683.460938, 0.000000, 689.859375, 0.000000, 697.640625, 0.000000, - 700.664062, 0.000000, 705.351562, 0.000000, 707.460938, 0.000000, 711.679688, 0.000000, - 715.921875, 0.000000, 719.390625, 0.000000, 723.656250, 0.000000, 728.343750, 0.000000, - 730.453125, 0.000000, 734.718750, 0.000000, 738.820312, 0.000000, 743.273438, 0.000000, - 747.960938, 0.000000, 756.328125, 0.000000, 763.265625, 0.000000, 766.734375, 0.000000, - 766.734375, 0.000000, 770.929688, 0.000000, 775.617188, 0.000000, 782.929688, 0.000000, - 785.273438, 0.000000, 789.960938, 0.000000, 793.898438, 0.000000, 797.367188, 0.000000, - 800.812500, 0.000000, 805.500000, 0.000000, 813.843750, 0.000000, 818.296875, 0.000000, - 824.109375, 0.000000, 824.109375, 0.000000, 830.273438, 0.000000, 832.335938, 0.000000, - 837.023438, 0.000000, 846.257812, 0.000000, 850.710938, 0.000000, 852.820312, 0.000000, - 858.328125, 0.000000, 862.593750, 0.000000, 865.617188, 0.000000, 867.679688, 0.000000, - 873.679688, 0.000000, 878.367188, 0.000000, 887.601562, 0.000000, 892.054688, 0.000000, - 897.867188, 0.000000, 897.867188, 0.000000, 904.031250, 0.000000, 906.093750, 0.000000, - 910.781250, 0.000000, 918.257812, 0.000000, 922.476562, 0.000000, 926.929688, 0.000000, - 932.437500, 0.000000, 936.679688, 0.000000, 940.125000, 0.000000, 944.812500, 0.000000, - 948.820312, 0.000000, 954.820312, 0.000000, 958.289062, 0.000000, 962.484375, 0.000000, - 968.484375, 0.000000, 973.171875, 0.000000, 976.687500, 0.000000, 980.695312, 0.000000, - 982.804688, 0.000000, 986.906250, 0.000000, 991.359375, 0.000000, 991.359375, 0.000000, - 997.523438, 0.000000, 999.585938, 0.000000, 1004.273438, 0.000000, 1009.289062, 0.000000, - 1013.554688, 0.000000, 1018.242188, 0.000000, 1026.187500, 0.000000, 1029.656250, 0.000000, - 1033.757812, 0.000000, 1038.445312, 0.000000, 1047.796875, 0.000000, 1052.039062, 0.000000, - 1058.859375, 0.000000, 1060.921875, 0.000000, 1066.921875, 0.000000, 1072.429688, 0.000000, - 1075.453125, 0.000000, 1077.515625, 0.000000, 1082.203125, 0.000000, 1088.601562, 0.000000, - 1092.867188, 0.000000, 1094.976562, 0.000000, 1098.445312, 0.000000, 1102.687500, 0.000000, - 1106.882812, 0.000000, 1111.570312, 0.000000, 1115.085938, 0.000000, 1117.195312, 0.000000, - 1117.195312, 0.000000, 1124.015625, 0.000000, 1126.125000, 0.000000, 1132.945312, 0.000000, - 1135.289062, 0.000000 - - - - - - - أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية - - - 0x00000872, 0x000008D1, 0x000003F9, 0x0000040B, 0x0000088C, 0x0000089E, 0x000008BD, 0x000003EF, - 0x00000003, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, - 0x00000003, 0x000008A8, 0x000008D2, 0x000008C2, 0x0000087D, 0x00000003, 0x000008CE, 0x000008BE, - 0x000008A9, 0x00000003, 0x0000040D, 0x000008CC, 0x00000876, 0x00000882, 0x000008D1, 0x00000003, - 0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, - 0x00000896, 0x00000875, 0x00000003, 0x00000408, 0x0000086C, 0x000008A6, 0x000008C5, 0x00000003, - 0x00000888, 0x0000087D, 0x000008CC, 0x000008D1, 0x00000003, 0x000008C0, 0x000008BD, 0x0000040B, - 0x00000003, 0x000003E6, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BE, - 0x000008BD, 0x00000003, 0x00000408, 0x0000086C, 0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, - 0x000003EF, 0x00000003, 0x0000040A, 0x0000088A, 0x000008C9, 0x00000003, 0x00000898, 0x000008D2, - 0x0000089A, 0x00000886, 0x00000875, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, - 0x00000896, 0x00000876, 0x000008BE, 0x000008BD, 0x00000003, 0x00000872, 0x000008C2, 0x000008A6, - 0x000008C5, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000003F2, 0x0000086C, 0x0000086A, - 0x000008C1, 0x00000003, 0x00000406, 0x0000086C, 0x000008C6, 0x000008C9, 0x00000003, 0x00000409, - 0x0000086C, 0x000008B9, 0x00000003, 0x000003E6, 0x00000005, 0x000003F7, 0x000008CC, 0x000008BA, - 0x00000413, 0x000008C5, 0x000008CC, 0x000008D1, 0x00000005, 0x00000003, 0x00000401, 0x000003EF, - 0x0000088C, 0x00000876, 0x00000885, 0x000003EF, 0x00000003, 0x000008BC, 0x00000870, 0x000008B5, - 0x0000040B, 0x00000003, 0x00000011, 0x0000086C, 0x000008CA, 0x000008C6, 0x000008C1, 0x00000003, - 0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x000008BC, 0x000008BA, 0x000008BD, - 0x00000003, 0x0000086C, 0x000008C6, 0x000008D2, 0x000008AA, 0x000008C1, 0x00000003, 0x0000086C, - 0x000008C2, 0x000008B5, 0x000003F9, 0x00000003, 0x000008D0, 0x000008A2, 0x000008AA, 0x00000412, - 0x00000875, 0x00000003, 0x00000409, 0x000003EB, 0x00000003, 0x00000888, 0x000008AA, 0x0000086F, - 0x00000003, 0x0000040C, 0x0000088C, 0x00000885, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, - 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, 0x0000040B, - 0x00000003, 0x00000404, 0x0000088C, 0x00000881, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, - 0x000008C4, 0x000008D1, 0x0000088E, 0x00000886, 0x00000876, 0x0000086F, 0x00000003, 0x00000408, - 0x000008CC, 0x000008B6, 0x00000875, 0x0000040B, 0x00000003, 0x000003E6, 0x00000408, 0x0000086C, - 0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000008A8, 0x000008C1, - 0x00000003, 0x000008A0, 0x000008B6, 0x000008B1, 0x00000003, 0x0000086E, 0x000008D2, 0x00000891, - 0x000003EF, 0x000008CC, 0x00000882, 0x000008BD, 0x000003EF, 0x00000003, 0x000008BC, 0x000008C1, - 0x0000086C, 0x000008AA, 0x00000876, 0x00000875, 0x00000003, 0x000003E6, 0x0000086C, 0x0000040E, - 0x00000891, 0x0000086C, 0x00000891, 0x000003EB - - - - 0x000000FB, 0x000000FA, 0x000000F9, 0x000000F8, 0x000000F7, 0x000000F6, 0x000000F5, 0x000000F4, - 0x000000F3, 0x000000F2, 0x000000F1, 0x000000F0, 0x000000EF, 0x000000EE, 0x000000ED, 0x000000EC, - 0x000000EB, 0x000000EA, 0x000000E9, 0x000000E8, 0x000000E7, 0x000000E6, 0x000000E5, 0x000000E4, - 0x000000E3, 0x000000E2, 0x000000E1, 0x000000E0, 0x000000DF, 0x000000DE, 0x000000DD, 0x000000DC, - 0x000000DB, 0x000000DA, 0x000000D9, 0x000000D8, 0x000000D7, 0x000000D6, 0x000000D5, 0x000000D4, - 0x000000D3, 0x000000D2, 0x000000D1, 0x000000D0, 0x000000CF, 0x000000CE, 0x000000CD, 0x000000CC, - 0x000000CB, 0x000000CA, 0x000000C9, 0x000000C8, 0x000000C7, 0x000000C6, 0x000000C5, 0x000000C4, - 0x000000C3, 0x000000C2, 0x000000C1, 0x000000C0, 0x000000BF, 0x000000BE, 0x000000BD, 0x000000BC, - 0x000000BB, 0x000000BA, 0x000000B9, 0x000000B8, 0x000000B7, 0x000000B6, 0x000000B5, 0x000000B4, - 0x000000B3, 0x000000B2, 0x000000B1, 0x000000B0, 0x000000AF, 0x000000AE, 0x000000AD, 0x000000AC, - 0x000000AB, 0x000000AA, 0x000000A9, 0x000000A8, 0x000000A7, 0x000000A6, 0x000000A5, 0x000000A4, - 0x000000A3, 0x000000A2, 0x000000A1, 0x000000A0, 0x0000009F, 0x0000009E, 0x0000009D, 0x0000009C, - 0x0000009B, 0x0000009A, 0x00000099, 0x00000098, 0x00000097, 0x00000096, 0x00000095, 0x00000094, - 0x00000093, 0x00000092, 0x00000091, 0x00000090, 0x0000008F, 0x0000008E, 0x0000008D, 0x0000008C, - 0x0000008B, 0x0000008A, 0x00000089, 0x00000088, 0x00000087, 0x00000086, 0x00000085, 0x00000084, - 0x00000083, 0x00000082, 0x00000081, 0x00000080, 0x0000007F, 0x0000007E, 0x0000007D, 0x0000007C, - 0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 0x00000074, - 0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 0x0000006C, - 0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 0x00000064, - 0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 0x0000005C, - 0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 0x00000054, - 0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 0x0000004C, - 0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 0x00000044, - 0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 0x0000003C, - 0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 0x00000034, - 0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 0x0000002C, - 0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, - 0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 0x0000001C, - 0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 0x00000014, - 0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 0x0000000C, - 0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 0x00000004, - 0x00000003, 0x00000002, 0x00000001, 0x00000000 - - - - 0.000000, 0.000000, 6.316406, 0.000000, 10.382812, 0.000000, 15.492188, 0.000000, - 21.035156, 0.000000, 27.058594, 0.000000, 39.527344, 0.000000, 43.792969, 0.000000, - 47.408203, 0.000000, 51.205078, 0.000000, 66.216797, 0.000000, 71.326172, 0.000000, - 74.695312, 0.000000, 83.367188, 0.000000, 90.826172, 0.000000, 95.091797, 0.000000, - 98.707031, 0.000000, 102.503906, 0.000000, 109.962891, 0.000000, 114.949219, 0.000000, - 122.408203, 0.000000, 130.687500, 0.000000, 134.484375, 0.000000, 145.787109, 0.000000, - 150.773438, 0.000000, 156.884766, 0.000000, 160.681641, 0.000000, 172.277344, 0.000000, - 177.919922, 0.000000, 182.906250, 0.000000, 191.578125, 0.000000, 195.644531, 0.000000, - 199.441406, 0.000000, 206.507812, 0.000000, 214.787109, 0.000000, 218.402344, 0.000000, - 223.945312, 0.000000, 227.742188, 0.000000, 233.765625, 0.000000, 238.751953, 0.000000, - 245.185547, 0.000000, 257.982422, 0.000000, 262.048828, 0.000000, 265.845703, 0.000000, - 272.654297, 0.000000, 276.023438, 0.000000, 285.240234, 0.000000, 289.306641, 0.000000, - 293.103516, 0.000000, 300.169922, 0.000000, 308.449219, 0.000000, 314.091797, 0.000000, - 318.158203, 0.000000, 321.955078, 0.000000, 329.572266, 0.000000, 333.837891, 0.000000, - 339.380859, 0.000000, 343.177734, 0.000000, 346.974609, 0.000000, 361.986328, 0.000000, - 367.095703, 0.000000, 370.464844, 0.000000, 379.136719, 0.000000, 386.595703, 0.000000, - 391.582031, 0.000000, 395.847656, 0.000000, 399.644531, 0.000000, 406.453125, 0.000000, - 409.822266, 0.000000, 415.523438, 0.000000, 420.632812, 0.000000, 420.632812, 0.000000, - 427.441406, 0.000000, 431.056641, 0.000000, 434.853516, 0.000000, 441.357422, 0.000000, - 448.423828, 0.000000, 455.912109, 0.000000, 459.708984, 0.000000, 479.255859, 0.000000, - 484.242188, 0.000000, 496.710938, 0.000000, 505.382812, 0.000000, 509.449219, 0.000000, - 514.992188, 0.000000, 518.789062, 0.000000, 524.812500, 0.000000, 529.798828, 0.000000, - 536.232422, 0.000000, 549.029297, 0.000000, 554.015625, 0.000000, 559.001953, 0.000000, - 563.267578, 0.000000, 567.064453, 0.000000, 573.380859, 0.000000, 580.839844, 0.000000, - 590.056641, 0.000000, 594.123047, 0.000000, 594.123047, 0.000000, 600.931641, 0.000000, - 604.546875, 0.000000, 608.343750, 0.000000, 620.636719, 0.000000, 624.005859, 0.000000, - 628.992188, 0.000000, 635.830078, 0.000000, 639.626953, 0.000000, 653.361328, 0.000000, - 656.730469, 0.000000, 661.716797, 0.000000, 669.205078, 0.000000, 673.001953, 0.000000, - 683.777344, 0.000000, 687.146484, 0.000000, 692.660156, 0.000000, 696.457031, 0.000000, - 700.253906, 0.000000, 704.736328, 0.000000, 711.105469, 0.000000, 716.748047, 0.000000, - 722.994141, 0.000000, 722.994141, 0.000000, 727.060547, 0.000000, 732.703125, 0.000000, - 736.769531, 0.000000, 741.251953, 0.000000, 745.048828, 0.000000, 752.507812, 0.000000, - 756.123047, 0.000000, 762.146484, 0.000000, 767.132812, 0.000000, 775.412109, 0.000000, - 779.027344, 0.000000, 782.824219, 0.000000, 794.203125, 0.000000, 799.189453, 0.000000, - 804.890625, 0.000000, 810.433594, 0.000000, 814.230469, 0.000000, 818.027344, 0.000000, - 821.396484, 0.000000, 828.128906, 0.000000, 833.115234, 0.000000, 839.953125, 0.000000, - 843.750000, 0.000000, 850.816406, 0.000000, 859.095703, 0.000000, 862.710938, 0.000000, - 868.253906, 0.000000, 872.050781, 0.000000, 883.429688, 0.000000, 889.675781, 0.000000, - 893.941406, 0.000000, 897.738281, 0.000000, 901.107422, 0.000000, 906.093750, 0.000000, - 911.080078, 0.000000, 917.800781, 0.000000, 924.638672, 0.000000, 928.435547, 0.000000, - 931.804688, 0.000000, 939.263672, 0.000000, 944.964844, 0.000000, 950.074219, 0.000000, - 953.871094, 0.000000, 965.173828, 0.000000, 974.390625, 0.000000, 981.111328, 0.000000, - 981.111328, 0.000000, 985.177734, 0.000000, 988.974609, 0.000000, 999.750000, 0.000000, - 1003.365234, 0.000000, 1007.162109, 0.000000, 1014.228516, 0.000000, 1020.949219, 0.000000, - 1025.015625, 0.000000, 1028.812500, 0.000000, 1040.408203, 0.000000, 1046.431641, 0.000000, - 1054.710938, 0.000000, 1054.710938, 0.000000, 1061.519531, 0.000000, 1065.134766, 0.000000, - 1068.931641, 0.000000, 1083.943359, 0.000000, 1089.052734, 0.000000, 1092.421875, 0.000000, - 1101.093750, 0.000000, 1108.552734, 0.000000, 1112.818359, 0.000000, 1116.433594, 0.000000, - 1121.976562, 0.000000, 1125.773438, 0.000000, 1140.785156, 0.000000, 1146.808594, 0.000000, - 1155.087891, 0.000000, 1155.087891, 0.000000, 1161.896484, 0.000000, 1165.511719, 0.000000, - 1169.308594, 0.000000, 1180.541016, 0.000000, 1184.607422, 0.000000, 1190.630859, 0.000000, - 1199.302734, 0.000000, 1204.289062, 0.000000, 1208.355469, 0.000000, 1212.152344, 0.000000, - 1218.960938, 0.000000, 1224.603516, 0.000000, 1231.037109, 0.000000, 1235.103516, 0.000000, - 1240.646484, 0.000000, 1244.443359, 0.000000, 1248.240234, 0.000000, 1255.048828, 0.000000, - 1258.417969, 0.000000, 1264.119141, 0.000000, 1269.228516, 0.000000, 1269.228516, 0.000000, - 1276.037109, 0.000000, 1279.652344, 0.000000, 1283.449219, 0.000000, 1290.908203, 0.000000, - 1297.746094, 0.000000, 1301.542969, 0.000000, 1311.427734, 0.000000, 1317.861328, 0.000000, - 1323.562500, 0.000000, 1327.359375, 0.000000, 1341.492188, 0.000000, 1346.478516, 0.000000, - 1357.904297, 0.000000, 1361.519531, 0.000000, 1367.162109, 0.000000, 1375.833984, 0.000000, - 1380.099609, 0.000000, 1383.714844, 0.000000, 1387.511719, 0.000000, 1398.890625, 0.000000, - 1405.728516, 0.000000, 1409.097656, 0.000000, 1415.818359, 0.000000, 1420.804688, 0.000000, - 1424.871094, 0.000000, 1428.667969, 0.000000, 1432.464844, 0.000000, 1435.833984, 0.000000, - 1435.833984, 0.000000, 1447.259766, 0.000000, 1450.628906, 0.000000, 1462.054688, 0.000000, - 1465.669922, 0.000000 - - - - - - - บทที่๑พายุไซโคลนโดโรธีอาศัยอยู่ท่ามกลางทุ่งใหญ่ในแคนซัสกับลุงเฮนรีชาวไร่และป้าเอ็มภรรยาชาวไร่บ้านของพวกเขาหลังเล็กเพราะไม้สร้างบ้านต้องขนมาด้วยเกวียนเป็นระยะทางหลายไมล์ - - - 0x000000F3, 0x000000F0, 0x000000F0, 0x0000010E, 0x0000011D, 0x00000126, 0x000000F7, 0x0000010B, - 0x000000FB, 0x00000111, 0x00000119, 0x000000E4, 0x00000117, 0x000000DD, 0x000000FE, 0x000000F2, - 0x00000117, 0x000000ED, 0x00000117, 0x000000FC, 0x000000F1, 0x0000010E, 0x00000106, 0x0000010B, - 0x00000101, 0x0000010A, 0x000000FB, 0x00000106, 0x000000FB, 0x00000112, 0x0000013B, 0x000000F0, - 0x0000013B, 0x0000010B, 0x000000FA, 0x000000DA, 0x000000FE, 0x0000010B, 0x000000E0, 0x000000F0, - 0x00000111, 0x0000013B, 0x000000E0, 0x00000118, 0x00000104, 0x000000E6, 0x0000013B, 0x00000118, - 0x000000F2, 0x00000116, 0x000000DD, 0x000000F2, 0x000000E4, 0x0000010A, 0x00000103, 0x000000DA, - 0x0000010A, 0x000000F3, 0x000000FE, 0x00000111, 0x000000E0, 0x00000115, 0x00000107, 0x000000F2, - 0x000000FC, 0x0000010E, 0x000000E3, 0x0000010B, 0x00000100, 0x00000119, 0x000000FC, 0x0000013B, - 0x00000116, 0x000000FE, 0x00000109, 0x000000F4, 0x00000137, 0x0000010B, 0x00000115, 0x00000106, - 0x0000011C, 0x000000FA, 0x000000F9, 0x000000FC, 0x000000FC, 0x000000FB, 0x0000010B, 0x000000E3, - 0x0000010B, 0x00000100, 0x00000119, 0x000000FC, 0x0000013B, 0x000000F3, 0x0000013C, 0x0000010B, - 0x000000F2, 0x000000DB, 0x00000106, 0x000000E0, 0x000000F7, 0x00000100, 0x000000DA, 0x00000115, - 0x000000DB, 0x0000010B, 0x00000104, 0x000000FE, 0x0000010A, 0x000000E0, 0x00000115, 0x000000FE, - 0x0000011C, 0x000000DA, 0x00000115, 0x000000F7, 0x000000FC, 0x0000010B, 0x00000109, 0x00000119, - 0x000000FA, 0x0000013C, 0x00000103, 0x000000FC, 0x0000013C, 0x0000010B, 0x000000E0, 0x000000F3, - 0x0000013C, 0x0000010B, 0x000000F2, 0x000000EE, 0x0000013C, 0x00000106, 0x000000E0, 0x000000DB, - 0x000000F2, 0x000000FA, 0x0000010B, 0x000000ED, 0x0000013C, 0x00000100, 0x000000FB, 0x00000115, - 0x000000DA, 0x00000100, 0x0000010E, 0x000000FB, 0x000000F2, 0x00000115, 0x000000F4, 0x00000143, - 0x000000F2, 0x000000FC, 0x00000109, 0x000000FB, 0x00000109, 0x000000F0, 0x0000010B, 0x000000E0, - 0x00000104, 0x000000FE, 0x0000010B, 0x000000FB, 0x00000119, 0x000000FA, 0x000000FE, 0x0000013F - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, - 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003C, 0x0000003D, 0x0000003E, 0x0000003F, - 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, - 0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, - 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, - 0x00000058, 0x00000059, 0x0000005A, 0x0000005B, 0x0000005C, 0x0000005D, 0x0000005E, 0x0000005F, - 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, - 0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 0x0000006D, 0x0000006E, 0x0000006F, - 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, - 0x00000078, 0x00000079, 0x0000007A, 0x0000007B, 0x0000007C, 0x0000007D, 0x0000007E, 0x0000007F, - 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, - 0x00000088, 0x00000089, 0x0000008A, 0x0000008B, 0x0000008C, 0x0000008D, 0x0000008E, 0x0000008F, - 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, - 0x00000098, 0x00000099, 0x0000009A, 0x0000009B, 0x0000009C, 0x0000009D, 0x0000009E, 0x0000009F, - 0x000000A0, 0x000000A1, 0x000000A2, 0x000000A3, 0x000000A4, 0x000000A5, 0x000000A6, 0x000000A7 - - - - 0.000000, 0.000000, 5.399414, 0.000000, 10.798828, 0.000000, 16.198242, 0.000000, - 16.198242, 0.000000, 16.198242, 0.000000, 21.046875, 0.000000, 26.616211, 0.000000, - 30.035156, 0.000000, 34.151367, 0.000000, 34.151367, 0.000000, 38.279297, 0.000000, - 43.558594, 0.000000, 47.663086, 0.000000, 52.438477, 0.000000, 57.178711, 0.000000, - 62.698242, 0.000000, 66.802734, 0.000000, 71.601562, 0.000000, 75.706055, 0.000000, - 79.810547, 0.000000, 84.369141, 0.000000, 84.369141, 0.000000, 89.097656, 0.000000, - 92.516602, 0.000000, 97.195312, 0.000000, 97.195312, 0.000000, 101.311523, 0.000000, - 106.040039, 0.000000, 110.156250, 0.000000, 110.156250, 0.000000, 110.156250, 0.000000, - 115.555664, 0.000000, 115.555664, 0.000000, 118.974609, 0.000000, 124.013672, 0.000000, - 128.765625, 0.000000, 133.505859, 0.000000, 136.924805, 0.000000, 140.704102, 0.000000, - 146.103516, 0.000000, 146.103516, 0.000000, 146.103516, 0.000000, 149.882812, 0.000000, - 153.553711, 0.000000, 159.158203, 0.000000, 165.421875, 0.000000, 165.421875, 0.000000, - 169.092773, 0.000000, 174.612305, 0.000000, 179.135742, 0.000000, 183.911133, 0.000000, - 189.430664, 0.000000, 194.709961, 0.000000, 194.709961, 0.000000, 199.989258, 0.000000, - 204.741211, 0.000000, 204.741211, 0.000000, 210.140625, 0.000000, 214.880859, 0.000000, - 214.880859, 0.000000, 218.660156, 0.000000, 220.675781, 0.000000, 225.128906, 0.000000, - 230.648438, 0.000000, 234.752930, 0.000000, 234.752930, 0.000000, 239.613281, 0.000000, - 243.032227, 0.000000, 247.280273, 0.000000, 251.408203, 0.000000, 255.512695, 0.000000, - 255.512695, 0.000000, 260.036133, 0.000000, 264.776367, 0.000000, 269.071289, 0.000000, - 274.470703, 0.000000, 274.470703, 0.000000, 277.889648, 0.000000, 279.905273, 0.000000, - 284.633789, 0.000000, 284.633789, 0.000000, 289.672852, 0.000000, 294.641602, 0.000000, - 298.746094, 0.000000, 302.850586, 0.000000, 306.966797, 0.000000, 310.385742, 0.000000, - 315.246094, 0.000000, 318.665039, 0.000000, 322.913086, 0.000000, 327.041016, 0.000000, - 331.145508, 0.000000, 331.145508, 0.000000, 336.544922, 0.000000, 336.544922, 0.000000, - 339.963867, 0.000000, 345.483398, 0.000000, 350.258789, 0.000000, 354.987305, 0.000000, - 358.766602, 0.000000, 364.335938, 0.000000, 368.583984, 0.000000, 373.335938, 0.000000, - 375.351562, 0.000000, 380.126953, 0.000000, 383.545898, 0.000000, 389.150391, 0.000000, - 393.890625, 0.000000, 393.890625, 0.000000, 397.669922, 0.000000, 399.685547, 0.000000, - 404.425781, 0.000000, 404.425781, 0.000000, 409.177734, 0.000000, 411.193359, 0.000000, - 416.762695, 0.000000, 420.867188, 0.000000, 424.286133, 0.000000, 428.581055, 0.000000, - 432.708984, 0.000000, 437.748047, 0.000000, 437.748047, 0.000000, 443.027344, 0.000000, - 447.131836, 0.000000, 447.131836, 0.000000, 450.550781, 0.000000, 454.330078, 0.000000, - 459.729492, 0.000000, 459.729492, 0.000000, 463.148438, 0.000000, 468.667969, 0.000000, - 473.478516, 0.000000, 473.478516, 0.000000, 478.207031, 0.000000, 481.986328, 0.000000, - 486.761719, 0.000000, 492.281250, 0.000000, 497.320312, 0.000000, 500.739258, 0.000000, - 505.538086, 0.000000, 505.538086, 0.000000, 509.786133, 0.000000, 513.902344, 0.000000, - 515.917969, 0.000000, 520.669922, 0.000000, 524.917969, 0.000000, 524.917969, 0.000000, - 529.034180, 0.000000, 534.553711, 0.000000, 536.569336, 0.000000, 541.968750, 0.000000, - 541.968750, 0.000000, 547.488281, 0.000000, 551.592773, 0.000000, 555.887695, 0.000000, - 560.003906, 0.000000, 564.298828, 0.000000, 569.698242, 0.000000, 573.117188, 0.000000, - 576.896484, 0.000000, 582.500977, 0.000000, 587.241211, 0.000000, 590.660156, 0.000000, - 594.776367, 0.000000, 598.904297, 0.000000, 603.943359, 0.000000, 608.683594, 0.000000, - 608.683594, 0.000000 - - - - - - - أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية - - - 0x00000872, 0x000008D1, 0x000003F9, 0x0000040B, 0x0000088C, 0x0000089E, 0x000008BD, 0x000003EF, - 0x00000003, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, - 0x00000003, 0x000008A8, 0x000008D2, 0x000008C2, 0x0000087D, 0x00000003, 0x000008CE, 0x000008BE, - 0x000008A9, 0x00000003, 0x0000040D, 0x000008CC, 0x00000876, 0x00000882, 0x000008D1, 0x00000003, - 0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, - 0x00000896, 0x00000875, 0x00000003, 0x00000408, 0x0000086C, 0x000008A6, 0x000008C5, 0x00000003, - 0x00000888, 0x0000087D, 0x000008CC, 0x000008D1, 0x00000003, 0x000008C0, 0x000008BD, 0x0000040B, - 0x00000003, 0x000003E6, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BE, - 0x000008BD, 0x00000003, 0x00000408, 0x0000086C, 0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, - 0x000003EF, 0x00000003, 0x0000040A, 0x0000088A, 0x000008C9, 0x00000003, 0x00000898, 0x000008D2, - 0x0000089A, 0x00000886, 0x00000875, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, - 0x00000896, 0x00000876, 0x000008BE, 0x000008BD, 0x00000003, 0x00000872, 0x000008C2, 0x000008A6, - 0x000008C5, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000003F2, 0x0000086C, 0x0000086A, - 0x000008C1, 0x00000003, 0x00000406, 0x0000086C, 0x000008C6, 0x000008C9, 0x00000003, 0x00000409, - 0x0000086C, 0x000008B9, 0x00000003, 0x000003E6, 0x00000005, 0x000003F7, 0x000008CC, 0x000008BA, - 0x00000413, 0x000008C5, 0x000008CC, 0x000008D1, 0x00000005, 0x00000003, 0x00000401, 0x000003EF, - 0x0000088C, 0x00000876, 0x00000885, 0x000003EF, 0x00000003, 0x000008BC, 0x00000870, 0x000008B5, - 0x0000040B, 0x00000003, 0x00000011, 0x0000086C, 0x000008CA, 0x000008C6, 0x000008C1, 0x00000003, - 0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x000008BC, 0x000008BA, 0x000008BD, - 0x00000003, 0x0000086C, 0x000008C6, 0x000008D2, 0x000008AA, 0x000008C1, 0x00000003, 0x0000086C, - 0x000008C2, 0x000008B5, 0x000003F9, 0x00000003, 0x000008D0, 0x000008A2, 0x000008AA, 0x00000412, - 0x00000875, 0x00000003, 0x00000409, 0x000003EB, 0x00000003, 0x00000888, 0x000008AA, 0x0000086F, - 0x00000003, 0x0000040C, 0x0000088C, 0x00000885, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, - 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, 0x0000040B, - 0x00000003, 0x00000404, 0x0000088C, 0x00000881, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, - 0x000008C4, 0x000008D1, 0x0000088E, 0x00000886, 0x00000876, 0x0000086F, 0x00000003, 0x00000408, - 0x000008CC, 0x000008B6, 0x00000875, 0x0000040B, 0x00000003, 0x000003E6, 0x00000408, 0x0000086C, - 0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000008A8, 0x000008C1, - 0x00000003, 0x000008A0, 0x000008B6, 0x000008B1, 0x00000003, 0x0000086E, 0x000008D2, 0x00000891, - 0x000003EF, 0x000008CC, 0x00000882, 0x000008BD, 0x000003EF, 0x00000003, 0x000008BC, 0x000008C1, - 0x0000086C, 0x000008AA, 0x00000876, 0x00000875, 0x00000003, 0x000003E6, 0x0000086C, 0x0000040E, - 0x00000891, 0x0000086C, 0x00000891, 0x000003EB - - - - 0x000000FB, 0x000000FA, 0x000000F9, 0x000000F8, 0x000000F7, 0x000000F6, 0x000000F5, 0x000000F4, - 0x000000F3, 0x000000F2, 0x000000F1, 0x000000F0, 0x000000EF, 0x000000EE, 0x000000ED, 0x000000EC, - 0x000000EB, 0x000000EA, 0x000000E9, 0x000000E8, 0x000000E7, 0x000000E6, 0x000000E5, 0x000000E4, - 0x000000E3, 0x000000E2, 0x000000E1, 0x000000E0, 0x000000DF, 0x000000DE, 0x000000DD, 0x000000DC, - 0x000000DB, 0x000000DA, 0x000000D9, 0x000000D8, 0x000000D7, 0x000000D6, 0x000000D5, 0x000000D4, - 0x000000D3, 0x000000D2, 0x000000D1, 0x000000D0, 0x000000CF, 0x000000CE, 0x000000CD, 0x000000CC, - 0x000000CB, 0x000000CA, 0x000000C9, 0x000000C8, 0x000000C7, 0x000000C6, 0x000000C5, 0x000000C4, - 0x000000C3, 0x000000C2, 0x000000C1, 0x000000C0, 0x000000BF, 0x000000BE, 0x000000BD, 0x000000BC, - 0x000000BB, 0x000000BA, 0x000000B9, 0x000000B8, 0x000000B7, 0x000000B6, 0x000000B5, 0x000000B4, - 0x000000B3, 0x000000B2, 0x000000B1, 0x000000B0, 0x000000AF, 0x000000AE, 0x000000AD, 0x000000AC, - 0x000000AB, 0x000000AA, 0x000000A9, 0x000000A8, 0x000000A7, 0x000000A6, 0x000000A5, 0x000000A4, - 0x000000A3, 0x000000A2, 0x000000A1, 0x000000A0, 0x0000009F, 0x0000009E, 0x0000009D, 0x0000009C, - 0x0000009B, 0x0000009A, 0x00000099, 0x00000098, 0x00000097, 0x00000096, 0x00000095, 0x00000094, - 0x00000093, 0x00000092, 0x00000091, 0x00000090, 0x0000008F, 0x0000008E, 0x0000008D, 0x0000008C, - 0x0000008B, 0x0000008A, 0x00000089, 0x00000088, 0x00000087, 0x00000086, 0x00000085, 0x00000084, - 0x00000083, 0x00000082, 0x00000081, 0x00000080, 0x0000007F, 0x0000007E, 0x0000007D, 0x0000007C, - 0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 0x00000074, - 0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 0x0000006C, - 0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 0x00000064, - 0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 0x0000005C, - 0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 0x00000054, - 0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 0x0000004C, - 0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 0x00000044, - 0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 0x0000003C, - 0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 0x00000034, - 0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 0x0000002C, - 0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, - 0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 0x0000001C, - 0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 0x00000014, - 0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 0x0000000C, - 0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 0x00000004, - 0x00000003, 0x00000002, 0x00000001, 0x00000000 - - - - 0.000000, 0.000000, 6.316406, 0.000000, 10.382812, 0.000000, 15.492188, 0.000000, - 21.035156, 0.000000, 27.058594, 0.000000, 39.527344, 0.000000, 43.792969, 0.000000, - 47.408203, 0.000000, 51.205078, 0.000000, 66.216797, 0.000000, 71.326172, 0.000000, - 74.695312, 0.000000, 83.367188, 0.000000, 90.826172, 0.000000, 95.091797, 0.000000, - 98.707031, 0.000000, 102.503906, 0.000000, 109.962891, 0.000000, 114.949219, 0.000000, - 122.408203, 0.000000, 130.687500, 0.000000, 134.484375, 0.000000, 145.787109, 0.000000, - 150.773438, 0.000000, 156.884766, 0.000000, 160.681641, 0.000000, 172.277344, 0.000000, - 177.919922, 0.000000, 182.906250, 0.000000, 191.578125, 0.000000, 195.644531, 0.000000, - 199.441406, 0.000000, 206.507812, 0.000000, 214.787109, 0.000000, 218.402344, 0.000000, - 223.945312, 0.000000, 227.742188, 0.000000, 233.765625, 0.000000, 238.751953, 0.000000, - 245.185547, 0.000000, 257.982422, 0.000000, 262.048828, 0.000000, 265.845703, 0.000000, - 272.654297, 0.000000, 276.023438, 0.000000, 285.240234, 0.000000, 289.306641, 0.000000, - 293.103516, 0.000000, 300.169922, 0.000000, 308.449219, 0.000000, 314.091797, 0.000000, - 318.158203, 0.000000, 321.955078, 0.000000, 329.572266, 0.000000, 333.837891, 0.000000, - 339.380859, 0.000000, 343.177734, 0.000000, 346.974609, 0.000000, 361.986328, 0.000000, - 367.095703, 0.000000, 370.464844, 0.000000, 379.136719, 0.000000, 386.595703, 0.000000, - 391.582031, 0.000000, 395.847656, 0.000000, 399.644531, 0.000000, 406.453125, 0.000000, - 409.822266, 0.000000, 415.523438, 0.000000, 420.632812, 0.000000, 420.632812, 0.000000, - 427.441406, 0.000000, 431.056641, 0.000000, 434.853516, 0.000000, 441.357422, 0.000000, - 448.423828, 0.000000, 455.912109, 0.000000, 459.708984, 0.000000, 479.255859, 0.000000, - 484.242188, 0.000000, 496.710938, 0.000000, 505.382812, 0.000000, 509.449219, 0.000000, - 514.992188, 0.000000, 518.789062, 0.000000, 524.812500, 0.000000, 529.798828, 0.000000, - 536.232422, 0.000000, 549.029297, 0.000000, 554.015625, 0.000000, 559.001953, 0.000000, - 563.267578, 0.000000, 567.064453, 0.000000, 573.380859, 0.000000, 580.839844, 0.000000, - 590.056641, 0.000000, 594.123047, 0.000000, 594.123047, 0.000000, 600.931641, 0.000000, - 604.546875, 0.000000, 608.343750, 0.000000, 620.636719, 0.000000, 624.005859, 0.000000, - 628.992188, 0.000000, 635.830078, 0.000000, 639.626953, 0.000000, 653.361328, 0.000000, - 656.730469, 0.000000, 661.716797, 0.000000, 669.205078, 0.000000, 673.001953, 0.000000, - 683.777344, 0.000000, 687.146484, 0.000000, 692.660156, 0.000000, 696.457031, 0.000000, - 700.253906, 0.000000, 704.736328, 0.000000, 711.105469, 0.000000, 716.748047, 0.000000, - 722.994141, 0.000000, 722.994141, 0.000000, 727.060547, 0.000000, 732.703125, 0.000000, - 736.769531, 0.000000, 741.251953, 0.000000, 745.048828, 0.000000, 752.507812, 0.000000, - 756.123047, 0.000000, 762.146484, 0.000000, 767.132812, 0.000000, 775.412109, 0.000000, - 779.027344, 0.000000, 782.824219, 0.000000, 794.203125, 0.000000, 799.189453, 0.000000, - 804.890625, 0.000000, 810.433594, 0.000000, 814.230469, 0.000000, 818.027344, 0.000000, - 821.396484, 0.000000, 828.128906, 0.000000, 833.115234, 0.000000, 839.953125, 0.000000, - 843.750000, 0.000000, 850.816406, 0.000000, 859.095703, 0.000000, 862.710938, 0.000000, - 868.253906, 0.000000, 872.050781, 0.000000, 883.429688, 0.000000, 889.675781, 0.000000, - 893.941406, 0.000000, 897.738281, 0.000000, 901.107422, 0.000000, 906.093750, 0.000000, - 911.080078, 0.000000, 917.800781, 0.000000, 924.638672, 0.000000, 928.435547, 0.000000, - 931.804688, 0.000000, 939.263672, 0.000000, 944.964844, 0.000000, 950.074219, 0.000000, - 953.871094, 0.000000, 965.173828, 0.000000, 974.390625, 0.000000, 981.111328, 0.000000, - 981.111328, 0.000000, 985.177734, 0.000000, 988.974609, 0.000000, 999.750000, 0.000000, - 1003.365234, 0.000000, 1007.162109, 0.000000, 1014.228516, 0.000000, 1020.949219, 0.000000, - 1025.015625, 0.000000, 1028.812500, 0.000000, 1040.408203, 0.000000, 1046.431641, 0.000000, - 1054.710938, 0.000000, 1054.710938, 0.000000, 1061.519531, 0.000000, 1065.134766, 0.000000, - 1068.931641, 0.000000, 1083.943359, 0.000000, 1089.052734, 0.000000, 1092.421875, 0.000000, - 1101.093750, 0.000000, 1108.552734, 0.000000, 1112.818359, 0.000000, 1116.433594, 0.000000, - 1121.976562, 0.000000, 1125.773438, 0.000000, 1140.785156, 0.000000, 1146.808594, 0.000000, - 1155.087891, 0.000000, 1155.087891, 0.000000, 1161.896484, 0.000000, 1165.511719, 0.000000, - 1169.308594, 0.000000, 1180.541016, 0.000000, 1184.607422, 0.000000, 1190.630859, 0.000000, - 1199.302734, 0.000000, 1204.289062, 0.000000, 1208.355469, 0.000000, 1212.152344, 0.000000, - 1218.960938, 0.000000, 1224.603516, 0.000000, 1231.037109, 0.000000, 1235.103516, 0.000000, - 1240.646484, 0.000000, 1244.443359, 0.000000, 1248.240234, 0.000000, 1255.048828, 0.000000, - 1258.417969, 0.000000, 1264.119141, 0.000000, 1269.228516, 0.000000, 1269.228516, 0.000000, - 1276.037109, 0.000000, 1279.652344, 0.000000, 1283.449219, 0.000000, 1290.908203, 0.000000, - 1297.746094, 0.000000, 1301.542969, 0.000000, 1311.427734, 0.000000, 1317.861328, 0.000000, - 1323.562500, 0.000000, 1327.359375, 0.000000, 1341.492188, 0.000000, 1346.478516, 0.000000, - 1357.904297, 0.000000, 1361.519531, 0.000000, 1367.162109, 0.000000, 1375.833984, 0.000000, - 1380.099609, 0.000000, 1383.714844, 0.000000, 1387.511719, 0.000000, 1398.890625, 0.000000, - 1405.728516, 0.000000, 1409.097656, 0.000000, 1415.818359, 0.000000, 1420.804688, 0.000000, - 1424.871094, 0.000000, 1428.667969, 0.000000, 1432.464844, 0.000000, 1435.833984, 0.000000, - 1435.833984, 0.000000, 1447.259766, 0.000000, 1450.628906, 0.000000, 1462.054688, 0.000000, - 1465.669922, 0.000000 - - - - - - - ुं ं॑ - - - 0x0000029C, 0x000001D5, 0x00000232, 0x00000003, 0x0000029C, 0x00000232, 0x00000233 - - - - 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000003, 0x00000004 - - - - 0.000000, 0.000000, 7.541016, 0.000000, 7.541016, 0.000000, 7.541016, 0.000000, - 13.541016, 0.000000, 21.082031, 0.000000, 19.953125, -6.052734, 21.082031, 0.000000 - - - - - - - कँ कं कः क॑ क॒ कँ॑ कं॒ कँंः क॒॑ - - - 0x00000080, 0x00000231, 0x00000003, 0x00000080, 0x00000232, 0x00000003, 0x00000080, 0x0000022C, - 0x00000003, 0x00000080, 0x00000233, 0x00000003, 0x00000080, 0x000001DF, 0x00000003, 0x00000080, - 0x00000231, 0x00000233, 0x00000003, 0x00000080, 0x000001DF, 0x00000232, 0x00000003, 0x00000080, - 0x00000231, 0x0000029C, 0x00000232, 0x0000029C, 0x0000022C, 0x00000003, 0x00000080, 0x00000233, - 0x0000029C, 0x000001DF - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000015, 0x00000014, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x00000019, 0x0000001A, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, - 0x0000001E, 0x0000001E - - - - 0.000000, 0.000000, 10.001953, -0.087891, 10.875000, 0.000000, 16.875000, 0.000000, - 23.783203, 0.439453, 27.750000, 0.000000, 33.750000, 0.000000, 44.625000, 0.000000, - 48.984375, 0.000000, 54.984375, 0.000000, 63.546875, -1.669922, 65.859375, 0.000000, - 71.859375, 0.000000, 80.332031, 0.492188, 82.734375, 0.000000, 88.734375, 0.000000, - 98.736328, -0.087891, 97.431641, -6.228516, 99.609375, 0.000000, 105.609375, 0.000000, - 114.082031, 0.492188, 112.517578, 0.439453, 116.484375, 0.000000, 122.484375, 0.000000, - 132.486328, -0.087891, 133.359375, 0.000000, 140.900391, 0.000000, 140.900391, 0.000000, - 148.441406, 0.000000, 152.800781, 0.000000, 158.800781, 0.000000, 167.363281, -1.669922, - 169.675781, 0.000000, 177.216797, 0.000000, 177.216797, 0.000000 - - - - - - - रू क़् क्ष क्कि क्रि ट्रि हिन्दी र्क्रिं क्षत्रज्ञत्रक्ष श्र थ्र श्र कके र्कें केूकूेकेृ र्कू क़ क क् क्ष क्ष् क्ष्क ज़ ज ज् ज्ञ ज्ञ् ज्ञ्क र्क र्क्क ड्र क्क क़्क क़्क क़् क्ष्क क्ष् त्र्क द्द कि हि रू रु र्के र्कं क् कु के द्द्द क़्ष क्ष र्क्षे द्दत्र्क ज्ञ क्त्व ज्ञ्क र्कँ र्किँ र्केँ र्क्रिँ हिंदी ह्मिह्यिखि ङ्क ङ्म ङ्क्त ङ्ख ङ्ग ङ्घ ङ्क्ष ङ्क्ष्व ङ्क्ष्य र्क्त्वि र्र्र्र कै के कु कू कृ कॅ कॆ हु हू हॆ है हे - - - 0x0000009A, 0x000001FE, 0x00000003, 0x000000A4, 0x00000051, 0x00000003, 0x000000A2, 0x0000FFFF, - 0x0000FFFF, 0x00000003, 0x000001D4, 0x000000C8, 0x0000FFFF, 0x00000080, 0x00000003, 0x000001D1, - 0x00000080, 0x0000009A, 0x00000051, 0x00000003, 0x000001D1, 0x0000008A, 0x0000009A, 0x00000051, - 0x00000003, 0x000001D1, 0x000000A1, 0x000000DB, 0x0000FFFF, 0x00000091, 0x00000223, 0x00000003, - 0x000001D1, 0x00000080, 0x000000E2, 0x0000FFFF, 0x0000009A, 0x00000051, 0x00000232, 0x00000003, - 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x0000008F, 0x000000E2, 0x0000FFFF, 0x000000A3, 0x0000FFFF, - 0x0000FFFF, 0x0000008F, 0x000000E2, 0x0000FFFF, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, - 0x0000009E, 0x0000009A, 0x00000051, 0x00000003, 0x00000090, 0x0000009A, 0x00000051, 0x00000003, - 0x0000009E, 0x0000009A, 0x00000051, 0x00000003, 0x00000080, 0x00000080, 0x0000022F, 0x00000003, - 0x00000080, 0x0000022F, 0x0000024D, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x00000080, 0x0000022F, - 0x0000029C, 0x000001D7, 0x00000080, 0x000001D7, 0x0000029C, 0x0000022F, 0x00000080, 0x0000022F, - 0x0000029C, 0x000001D9, 0x00000003, 0x00000080, 0x000001D7, 0x0000005B, 0x0000FFFF, 0x00000003, - 0x000000A4, 0x00000003, 0x00000080, 0x00000003, 0x00000080, 0x00000051, 0x00000003, 0x000000A2, - 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000051, 0x00000003, - 0x000000EA, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000080, 0x00000003, 0x00000003, 0x000000AB, - 0x0000FFFF, 0x00000003, 0x00000087, 0x00000003, 0x00000087, 0x00000051, 0x00000003, 0x000000A3, - 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000A3, 0x0000FFFF, 0x0000FFFF, 0x00000051, 0x00000003, - 0x000000EB, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000080, 0x00000003, 0x00000080, 0x0000005B, - 0x0000FFFF, 0x00000003, 0x000000C8, 0x0000FFFF, 0x00000080, 0x0000005B, 0x0000FFFF, 0x00000003, - 0x0000008C, 0x0000009A, 0x00000051, 0x00000003, 0x000000C8, 0x0000FFFF, 0x00000080, 0x00000003, - 0x000000EC, 0x0000FFFF, 0x00000080, 0x00000003, 0x000000EC, 0x0000FFFF, 0x00000080, 0x00000003, - 0x000000A4, 0x00000051, 0x00000003, 0x000000EA, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000080, - 0x00000003, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000051, 0x00000003, 0x000000D7, 0x0000FFFF, - 0x000000E2, 0x0000FFFF, 0x00000080, 0x00000003, 0x000001A7, 0x0000FFFF, 0x0000FFFF, 0x00000003, - 0x000001D1, 0x00000080, 0x00000003, 0x000001D1, 0x000000A1, 0x00000003, 0x0000009A, 0x000001FE, - 0x00000003, 0x0000009A, 0x000001FD, 0x00000003, 0x00000080, 0x0000022F, 0x0000005A, 0x0000FFFF, - 0x00000003, 0x00000080, 0x0000024D, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x00000080, 0x00000051, - 0x00000003, 0x00000080, 0x000001D5, 0x00000003, 0x00000080, 0x0000022F, 0x00000003, 0x000000D9, - 0x0000FFFF, 0x000001A7, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000EC, 0x0000FFFF, 0x0000009F, - 0x00000003, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000A2, 0x0000FFFF, 0x0000FFFF, - 0x0000022F, 0x0000005A, 0x0000FFFF, 0x00000003, 0x000001A7, 0x0000FFFF, 0x0000FFFF, 0x000000D7, - 0x0000FFFF, 0x000000E2, 0x0000FFFF, 0x00000080, 0x00000003, 0x000000A3, 0x0000FFFF, 0x0000FFFF, - 0x00000003, 0x000000C8, 0x0000FFFF, 0x000000D7, 0x0000FFFF, 0x0000009D, 0x00000003, 0x000000EB, - 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000080, 0x00000003, 0x00000080, 0x0000024C, 0x0000FFFF, - 0x0000FFFF, 0x00000003, 0x000001D1, 0x00000080, 0x0000024C, 0x0000FFFF, 0x0000FFFF, 0x00000003, - 0x00000080, 0x0000022F, 0x0000024C, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000001D1, 0x00000080, - 0x000000E2, 0x0000FFFF, 0x0000009A, 0x00000051, 0x00000231, 0x00000003, 0x000001D1, 0x000000A1, - 0x00000232, 0x00000091, 0x00000223, 0x00000003, 0x000001D3, 0x000001BA, 0x0000FFFF, 0x0000FFFF, - 0x000001D3, 0x000001BB, 0x0000FFFF, 0x0000FFFF, 0x000001D4, 0x00000081, 0x00000003, 0x000000CC, - 0x0000FFFF, 0x00000080, 0x00000003, 0x000001A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000CC, - 0x0000FFFF, 0x000001A0, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000CC, 0x0000FFFF, 0x00000081, - 0x00000003, 0x000000CC, 0x0000FFFF, 0x00000082, 0x00000003, 0x000000CC, 0x0000FFFF, 0x00000083, - 0x00000003, 0x000000CC, 0x0000FFFF, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000CC, - 0x0000FFFF, 0x000000EA, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000009D, 0x00000003, 0x000000CC, - 0x0000FFFF, 0x000000EA, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000099, 0x00000003, 0x000001D4, - 0x000000C8, 0x0000FFFF, 0x000000D7, 0x0000FFFF, 0x0000009D, 0x0000005B, 0x0000FFFF, 0x00000003, - 0x0000009A, 0x00000051, 0x0000009A, 0x000000E2, 0x0000FFFF, 0x0000009A, 0x00000051, 0x00000003, - 0x00000080, 0x00000230, 0x00000003, 0x00000080, 0x0000022F, 0x00000003, 0x00000080, 0x000001D5, - 0x00000003, 0x00000080, 0x000001D7, 0x00000003, 0x00000080, 0x000001D9, 0x00000003, 0x00000080, - 0x0000022D, 0x00000003, 0x00000080, 0x0000022E, 0x00000003, 0x000000A1, 0x000001D5, 0x00000003, - 0x000000A1, 0x000001D7, 0x00000003, 0x000000A1, 0x0000022E, 0x00000003, 0x000000A1, 0x00000230, - 0x00000003, 0x000000A1, 0x0000022F - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000D, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000E, 0x00000012, - 0x0000000F, 0x00000011, 0x00000010, 0x00000013, 0x00000017, 0x00000014, 0x00000016, 0x00000015, - 0x00000018, 0x0000001A, 0x00000019, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, - 0x00000025, 0x00000022, 0x00000024, 0x00000023, 0x00000020, 0x00000021, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002D, 0x0000002C, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000033, 0x00000032, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x0000003A, 0x00000039, 0x0000003B, 0x0000003C, 0x0000003E, 0x0000003D, 0x0000003F, - 0x00000040, 0x00000042, 0x00000041, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, - 0x0000004A, 0x0000004B, 0x00000048, 0x00000049, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, - 0x00000050, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000053, 0x00000054, 0x00000055, - 0x00000056, 0x00000056, 0x00000057, 0x0000005A, 0x0000005B, 0x00000058, 0x00000059, 0x0000005C, - 0x0000005D, 0x0000005E, 0x0000005F, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, - 0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, - 0x0000006D, 0x0000006E, 0x0000006F, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, - 0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007A, 0x0000007B, 0x0000007C, - 0x0000007D, 0x0000007E, 0x0000007F, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, - 0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008A, 0x0000008D, 0x0000008B, - 0x0000008C, 0x0000008E, 0x00000091, 0x00000092, 0x00000093, 0x0000008F, 0x00000090, 0x00000094, - 0x00000095, 0x00000097, 0x00000096, 0x00000098, 0x00000099, 0x0000009A, 0x0000009B, 0x0000009C, - 0x0000009D, 0x0000009E, 0x0000009F, 0x000000A0, 0x000000A1, 0x000000A2, 0x000000A3, 0x000000A4, - 0x000000A5, 0x000000A6, 0x000000A7, 0x000000A8, 0x000000A9, 0x000000AA, 0x000000AB, 0x000000AC, - 0x000000AD, 0x000000AE, 0x000000AF, 0x000000B0, 0x000000B1, 0x000000B2, 0x000000B3, 0x000000B4, - 0x000000B5, 0x000000B6, 0x000000B7, 0x000000B8, 0x000000B9, 0x000000BA, 0x000000BB, 0x000000BC, - 0x000000BE, 0x000000BD, 0x000000BF, 0x000000C1, 0x000000C0, 0x000000C2, 0x000000C3, 0x000000C4, - 0x000000C5, 0x000000C6, 0x000000C7, 0x000000C8, 0x000000CB, 0x000000CC, 0x000000C9, 0x000000CA, - 0x000000CD, 0x000000D0, 0x000000CE, 0x000000CF, 0x000000D1, 0x000000D2, 0x000000D3, 0x000000D4, - 0x000000D5, 0x000000D6, 0x000000D7, 0x000000D8, 0x000000D9, 0x000000DA, 0x000000DB, 0x000000DC, - 0x000000DD, 0x000000DE, 0x000000DF, 0x000000E0, 0x000000E1, 0x000000E2, 0x000000E3, 0x000000E4, - 0x000000E5, 0x000000E6, 0x000000E7, 0x000000E8, 0x000000E9, 0x000000EC, 0x000000ED, 0x000000EE, - 0x000000EF, 0x000000EA, 0x000000EB, 0x000000F0, 0x000000F1, 0x000000F2, 0x000000F3, 0x000000F4, - 0x000000F5, 0x000000F6, 0x000000F7, 0x000000F8, 0x000000F9, 0x000000FA, 0x000000FB, 0x000000FC, - 0x000000FD, 0x000000FE, 0x000000FF, 0x00000100, 0x00000101, 0x00000102, 0x00000103, 0x00000104, - 0x00000105, 0x00000106, 0x00000107, 0x00000108, 0x00000109, 0x0000010C, 0x0000010A, 0x0000010B, - 0x0000010D, 0x0000010E, 0x00000112, 0x00000111, 0x0000010F, 0x00000110, 0x00000113, 0x00000114, - 0x00000117, 0x00000118, 0x00000115, 0x00000116, 0x00000119, 0x0000011A, 0x00000120, 0x0000011D, - 0x0000011F, 0x0000011E, 0x0000011B, 0x0000011C, 0x00000121, 0x00000122, 0x00000124, 0x00000123, - 0x00000125, 0x00000126, 0x00000127, 0x00000128, 0x0000012C, 0x00000129, 0x0000012A, 0x0000012B, - 0x00000130, 0x0000012D, 0x0000012E, 0x0000012F, 0x00000132, 0x00000131, 0x00000133, 0x00000134, - 0x00000135, 0x00000136, 0x00000137, 0x00000138, 0x00000139, 0x0000013A, 0x0000013B, 0x0000013C, - 0x0000013D, 0x0000013E, 0x0000013F, 0x00000140, 0x00000141, 0x00000142, 0x00000143, 0x00000144, - 0x00000145, 0x00000146, 0x00000147, 0x00000148, 0x00000149, 0x0000014A, 0x0000014B, 0x0000014C, - 0x0000014D, 0x0000014E, 0x0000014F, 0x00000150, 0x00000151, 0x00000152, 0x00000153, 0x00000154, - 0x00000155, 0x00000156, 0x00000157, 0x00000158, 0x00000159, 0x0000015A, 0x0000015B, 0x0000015C, - 0x0000015D, 0x0000015E, 0x0000015F, 0x00000160, 0x00000161, 0x00000162, 0x00000163, 0x0000016B, - 0x00000166, 0x00000167, 0x00000168, 0x00000169, 0x0000016A, 0x00000164, 0x00000165, 0x0000016C, - 0x0000016F, 0x00000170, 0x00000171, 0x00000173, 0x00000172, 0x0000016D, 0x0000016E, 0x00000174, - 0x00000175, 0x00000176, 0x00000177, 0x00000178, 0x00000179, 0x0000017A, 0x0000017B, 0x0000017C, - 0x0000017D, 0x0000017E, 0x0000017F, 0x00000180, 0x00000181, 0x00000182, 0x00000183, 0x00000184, - 0x00000185, 0x00000186, 0x00000187, 0x00000188, 0x00000189, 0x0000018A, 0x0000018B, 0x0000018C, - 0x0000018D, 0x0000018E, 0x0000018F, 0x00000190, 0x00000191, 0x00000192, 0x00000193, 0x00000194, - 0x00000195, 0x00000196, 0x00000197 - - - - 0.000000, 0.000000, 6.515625, 0.000000, 8.121094, 0.000000, 14.121094, 0.000000, - 24.861328, -0.451172, 24.996094, 0.000000, 30.996094, 0.000000, 41.871094, 0.000000, - 41.871094, 0.000000, 41.871094, 0.000000, 47.871094, 0.000000, 52.230469, 0.000000, - 60.949219, 0.000000, 60.949219, 0.000000, 71.824219, 0.000000, 77.824219, 0.000000, - 82.183594, 0.000000, 93.058594, 0.000000, 102.720703, -0.451172, 99.574219, 0.000000, - 105.574219, 0.000000, 109.933594, 0.000000, 117.902344, 0.000000, 127.564453, -0.451172, - 124.417969, 0.000000, 130.417969, 0.000000, 134.777344, 0.000000, 142.746094, 0.000000, - 150.011719, 0.000000, 150.011719, 0.000000, 157.980469, 0.000000, 161.636719, 0.000000, - 167.636719, 0.000000, 171.996094, 0.000000, 182.871094, 0.000000, 186.621094, 0.000000, - 186.621094, 0.000000, 196.283203, -0.451172, 191.613281, 0.439453, 193.136719, 0.000000, - 199.136719, 0.000000, 210.011719, 0.000000, 210.011719, 0.000000, 210.011719, 0.000000, - 217.980469, 0.000000, 221.730469, 0.000000, 221.730469, 0.000000, 232.605469, 0.000000, - 232.605469, 0.000000, 232.605469, 0.000000, 240.574219, 0.000000, 244.324219, 0.000000, - 244.324219, 0.000000, 255.199219, 0.000000, 255.199219, 0.000000, 255.199219, 0.000000, - 261.199219, 0.000000, 270.667969, 0.000000, 280.330078, -0.451172, 277.183594, 0.000000, - 283.183594, 0.000000, 292.652344, 0.000000, 302.314453, -0.451172, 299.167969, 0.000000, - 305.167969, 0.000000, 314.636719, 0.000000, 324.298828, -0.451172, 321.152344, 0.000000, - 327.152344, 0.000000, 338.027344, 0.000000, 344.783203, 0.263672, 348.902344, 0.000000, - 354.902344, 0.000000, 361.658203, 0.263672, 362.279297, 0.263672, 365.777344, 0.000000, - 365.777344, 0.000000, 365.777344, 0.000000, 371.777344, 0.000000, 378.533203, 0.263672, - 382.652344, 0.000000, 390.193359, 0.000000, 390.193359, 0.000000, 397.916016, -0.011719, - 401.068359, 0.000000, 408.609375, 0.000000, 408.609375, 0.000000, 415.365234, 0.263672, - 419.484375, 0.000000, 427.025391, 0.000000, 427.025391, 0.000000, 433.025391, 0.000000, - 440.748047, -0.011719, 440.929688, 0.263672, 443.900391, 0.000000, 443.900391, 0.000000, - 449.900391, 0.000000, 460.775391, 0.000000, 466.775391, 0.000000, 477.650391, 0.000000, - 483.650391, 0.000000, 494.390625, -0.451172, 494.525391, 0.000000, 500.525391, 0.000000, - 511.400391, 0.000000, 511.400391, 0.000000, 511.400391, 0.000000, 517.400391, 0.000000, - 528.275391, 0.000000, 528.275391, 0.000000, 531.457031, -0.451172, 528.275391, 0.000000, - 534.275391, 0.000000, 542.994141, 0.000000, 542.994141, 0.000000, 542.994141, 0.000000, - 542.994141, 0.000000, 553.869141, 0.000000, 559.869141, 0.000000, 565.869141, 0.000000, - 575.337891, 0.000000, 575.337891, 0.000000, 581.337891, 0.000000, 590.806641, 0.000000, - 596.806641, 0.000000, 609.597656, -0.451172, 606.275391, 0.000000, 612.275391, 0.000000, - 623.150391, 0.000000, 623.150391, 0.000000, 623.150391, 0.000000, 629.150391, 0.000000, - 640.025391, 0.000000, 640.025391, 0.000000, 643.207031, -0.451172, 640.025391, 0.000000, - 646.025391, 0.000000, 653.994141, 0.000000, 653.994141, 0.000000, 653.994141, 0.000000, - 653.994141, 0.000000, 664.869141, 0.000000, 670.869141, 0.000000, 678.773438, 0.263672, - 681.744141, 0.000000, 681.744141, 0.000000, 687.744141, 0.000000, 696.462891, 0.000000, - 696.462891, 0.000000, 704.367188, 0.263672, 707.337891, 0.000000, 707.337891, 0.000000, - 713.337891, 0.000000, 721.306641, 0.000000, 730.968750, -0.451172, 727.822266, 0.000000, - 733.822266, 0.000000, 742.541016, 0.000000, 742.541016, 0.000000, 753.416016, 0.000000, - 759.416016, 0.000000, 768.134766, 0.000000, 768.134766, 0.000000, 779.009766, 0.000000, - 785.009766, 0.000000, 793.728516, 0.000000, 793.728516, 0.000000, 804.603516, 0.000000, - 810.603516, 0.000000, 821.343750, -0.451172, 821.478516, 0.000000, 827.478516, 0.000000, - 836.197266, 0.000000, 836.197266, 0.000000, 836.197266, 0.000000, 836.197266, 0.000000, - 847.072266, 0.000000, 853.072266, 0.000000, 863.947266, 0.000000, 863.947266, 0.000000, - 867.128906, -0.451172, 863.947266, 0.000000, 869.947266, 0.000000, 875.876953, 0.000000, - 875.876953, 0.000000, 879.626953, 0.000000, 879.626953, 0.000000, 890.501953, 0.000000, - 896.501953, 0.000000, 903.064453, 0.000000, 903.064453, 0.000000, 903.064453, 0.000000, - 909.064453, 0.000000, 913.423828, 0.000000, 924.298828, 0.000000, 930.298828, 0.000000, - 934.658203, 0.000000, 942.626953, 0.000000, 948.626953, 0.000000, 955.142578, 0.000000, - 956.748047, 0.000000, 962.748047, 0.000000, 969.263672, 0.000000, 970.623047, 0.000000, - 976.623047, 0.000000, 983.378906, 0.263672, 983.853516, 0.164062, 987.498047, 0.000000, - 987.498047, 0.000000, 993.498047, 0.000000, 1000.875000, 0.263672, 1004.373047, 0.000000, - 1004.373047, 0.000000, 1004.373047, 0.000000, 1010.373047, 0.000000, 1021.113281, -0.451172, - 1021.248047, 0.000000, 1027.248047, 0.000000, 1034.947266, -0.011719, 1038.123047, 0.000000, - 1044.123047, 0.000000, 1050.878906, 0.263672, 1054.998047, 0.000000, 1060.998047, 0.000000, - 1068.966797, 0.000000, 1068.966797, 0.000000, 1075.529297, 0.000000, 1075.529297, 0.000000, - 1075.529297, 0.000000, 1081.529297, 0.000000, 1090.248047, 0.000000, 1090.248047, 0.000000, - 1098.216797, 0.000000, 1104.216797, 0.000000, 1115.091797, 0.000000, 1115.091797, 0.000000, - 1115.091797, 0.000000, 1121.091797, 0.000000, 1131.966797, 0.000000, 1131.966797, 0.000000, - 1131.164062, 0.275391, 1131.638672, 0.175781, 1131.966797, 0.000000, 1131.966797, 0.000000, - 1137.966797, 0.000000, 1144.529297, 0.000000, 1144.529297, 0.000000, 1144.529297, 0.000000, - 1150.458984, 0.000000, 1150.458984, 0.000000, 1154.208984, 0.000000, 1154.208984, 0.000000, - 1165.083984, 0.000000, 1171.083984, 0.000000, 1181.958984, 0.000000, 1181.958984, 0.000000, - 1181.958984, 0.000000, 1187.958984, 0.000000, 1196.677734, 0.000000, 1196.677734, 0.000000, - 1202.607422, 0.000000, 1202.607422, 0.000000, 1210.576172, 0.000000, 1216.576172, 0.000000, - 1224.544922, 0.000000, 1224.544922, 0.000000, 1224.544922, 0.000000, 1224.544922, 0.000000, - 1235.419922, 0.000000, 1241.419922, 0.000000, 1249.236328, 0.263672, 1252.294922, 0.000000, - 1252.294922, 0.000000, 1252.294922, 0.000000, 1258.294922, 0.000000, 1262.654297, 0.000000, - 1270.470703, 0.263672, 1273.529297, 0.000000, 1273.529297, 0.000000, 1273.529297, 0.000000, - 1279.529297, 0.000000, 1286.285156, 0.263672, 1287.345703, 0.263672, 1290.404297, 0.000000, - 1290.404297, 0.000000, 1290.404297, 0.000000, 1296.404297, 0.000000, 1300.763672, 0.000000, - 1311.638672, 0.000000, 1315.388672, 0.000000, 1315.388672, 0.000000, 1325.050781, -0.451172, - 1323.474609, -0.087891, 1321.904297, 0.000000, 1327.904297, 0.000000, 1332.263672, 0.000000, - 1338.767578, 0.439453, 1340.232422, 0.000000, 1348.201172, 0.000000, 1351.857422, 0.000000, - 1357.857422, 0.000000, 1362.216797, 0.000000, 1372.388672, 0.000000, 1372.388672, 0.000000, - 1372.388672, 0.000000, 1376.748047, 0.000000, 1386.919922, 0.000000, 1386.919922, 0.000000, - 1386.919922, 0.000000, 1391.279297, 0.000000, 1402.154297, 0.000000, 1408.154297, 0.000000, - 1416.123047, 0.000000, 1416.123047, 0.000000, 1426.998047, 0.000000, 1432.998047, 0.000000, - 1446.076172, 0.000000, 1446.076172, 0.000000, 1446.076172, 0.000000, 1452.076172, 0.000000, - 1460.044922, 0.000000, 1460.044922, 0.000000, 1471.294922, 0.000000, 1471.294922, 0.000000, - 1471.294922, 0.000000, 1477.294922, 0.000000, 1485.263672, 0.000000, 1485.263672, 0.000000, - 1496.138672, 0.000000, 1502.138672, 0.000000, 1510.107422, 0.000000, 1510.107422, 0.000000, - 1519.576172, 0.000000, 1525.576172, 0.000000, 1533.544922, 0.000000, 1533.544922, 0.000000, - 1543.013672, 0.000000, 1549.013672, 0.000000, 1556.982422, 0.000000, 1556.982422, 0.000000, - 1567.857422, 0.000000, 1567.857422, 0.000000, 1567.857422, 0.000000, 1573.857422, 0.000000, - 1581.826172, 0.000000, 1581.826172, 0.000000, 1590.544922, 0.000000, 1590.544922, 0.000000, - 1590.544922, 0.000000, 1590.544922, 0.000000, 1598.513672, 0.000000, 1604.513672, 0.000000, - 1612.482422, 0.000000, 1612.482422, 0.000000, 1621.201172, 0.000000, 1621.201172, 0.000000, - 1621.201172, 0.000000, 1621.201172, 0.000000, 1630.669922, 0.000000, 1636.669922, 0.000000, - 1641.029297, 0.000000, 1649.748047, 0.000000, 1649.748047, 0.000000, 1655.677734, 0.000000, - 1655.677734, 0.000000, 1663.939453, 0.263672, 1663.646484, 0.000000, 1663.646484, 0.000000, - 1669.646484, 0.000000, 1679.308594, -0.451172, 1676.162109, 0.000000, 1682.677734, 0.000000, - 1686.427734, 0.000000, 1686.427734, 0.000000, 1696.089844, -0.451172, 1692.943359, 0.000000, - 1698.943359, 0.000000, 1706.314453, 0.263672, 1709.818359, 0.000000, 1715.818359, 0.000000, - 1722.574219, 0.263672, 1726.693359, 0.000000, 1732.693359, 0.000000, 1740.392578, -0.011719, - 1743.568359, 0.000000, 1749.568359, 0.000000, 1757.291016, -0.011719, 1760.443359, 0.000000, - 1766.443359, 0.000000, 1774.376953, -0.011719, 1777.318359, 0.000000, 1783.318359, 0.000000, - 1791.738281, -0.439453, 1794.193359, 0.000000, 1800.193359, 0.000000, 1808.121094, 0.263672, - 1811.068359, 0.000000, 1817.068359, 0.000000, 1823.085938, -0.011719, 1825.037109, 0.000000, - 1831.037109, 0.000000, 1837.078125, -0.011719, 1839.005859, 0.000000, 1845.005859, 0.000000, - 1852.529297, 0.263672, 1852.974609, 0.000000, 1858.974609, 0.000000, 1865.941406, 0.263672, - 1866.943359, 0.000000, 1872.943359, 0.000000, 1879.294922, 0.263672, 1880.912109, 0.000000 - - - - - - - 中华人民共和国 台湾 中華人民共和國 臺灣 - - - 0x000020BC, 0x000025DD, 0x00002149, 0x00003EA0, 0x00002400, 0x0000271B, 0x0000298C, 0x00000003, - 0x0000267F, 0x0000410D, 0x00000003, 0x000020BC, 0x0000567E, 0x00002149, 0x00003EA0, 0x00002400, - 0x0000271B, 0x0000299A, 0x00000003, 0x00005489, 0x000042F2 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014 - - - - 0.000000, 0.000000, 12.000000, 0.000000, 24.000000, 0.000000, 36.000000, 0.000000, - 48.000000, 0.000000, 60.000000, 0.000000, 72.000000, 0.000000, 84.000000, 0.000000, - 87.333984, 0.000000, 99.333984, 0.000000, 111.333984, 0.000000, 114.667969, 0.000000, - 126.667969, 0.000000, 138.667969, 0.000000, 150.667969, 0.000000, 162.667969, 0.000000, - 174.667969, 0.000000, 186.667969, 0.000000, 198.667969, 0.000000, 202.001953, 0.000000, - 214.001953, 0.000000, 226.001953, 0.000000 - - - - - - - 中华人民共和国 台湾 中華人民共和國 臺灣 - - - 0x000020BC, 0x000025DD, 0x00002149, 0x00003EA0, 0x00002400, 0x0000271B, 0x0000298C, 0x00000003, - 0x0000267F, 0x0000410D, 0x00000003, 0x000020BC, 0x00007492, 0x00002149, 0x00003EA0, 0x00002400, - 0x0000271B, 0x0000299A, 0x00000003, 0x00005489, 0x000042F2 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014 - - - - 0.000000, 0.000000, 12.000000, 0.000000, 24.000000, 0.000000, 36.000000, 0.000000, - 48.000000, 0.000000, 60.000000, 0.000000, 72.000000, 0.000000, 84.000000, 0.000000, - 87.333984, 0.000000, 99.333984, 0.000000, 111.333984, 0.000000, 114.667969, 0.000000, - 126.667969, 0.000000, 138.667969, 0.000000, 150.667969, 0.000000, 162.667969, 0.000000, - 174.667969, 0.000000, 186.667969, 0.000000, 198.667969, 0.000000, 202.001953, 0.000000, - 214.001953, 0.000000, 226.001953, 0.000000 - - - - - - - 中华人民共和国 台湾 中華人民共和國 臺灣 - - - 0x000020BC, 0x000025DD, 0x00002149, 0x000079EB, 0x00002400, 0x0000271B, 0x0000298C, 0x00000003, - 0x00007677, 0x0000410D, 0x00000003, 0x000020BC, 0x00007E26, 0x00002149, 0x000079EB, 0x00002400, - 0x0000271B, 0x0000299A, 0x00000003, 0x00007D8F, 0x00007A97 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014 - - - - 0.000000, 0.000000, 12.000000, 0.000000, 24.000000, 0.000000, 36.000000, 0.000000, - 48.000000, 0.000000, 60.000000, 0.000000, 72.000000, 0.000000, 84.000000, 0.000000, - 87.333984, 0.000000, 99.333984, 0.000000, 111.333984, 0.000000, 114.667969, 0.000000, - 126.667969, 0.000000, 138.667969, 0.000000, 150.667969, 0.000000, 162.667969, 0.000000, - 174.667969, 0.000000, 186.667969, 0.000000, 198.667969, 0.000000, 202.001953, 0.000000, - 214.001953, 0.000000, 226.001953, 0.000000 - - - - - - - 中华人民共和国 台湾 中華人民共和國 臺灣 - - - 0x000020BC, 0x000025DD, 0x00002149, 0x000079EB, 0x00002400, 0x0000271B, 0x0000298C, 0x00000003, - 0x00007677, 0x00008886, 0x00000003, 0x000020BC, 0x0000567E, 0x00002149, 0x000079EB, 0x00002400, - 0x0000271B, 0x0000299A, 0x00000003, 0x00007D8F, 0x00007A97 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014 - - - - 0.000000, 0.000000, 12.000000, 0.000000, 24.000000, 0.000000, 36.000000, 0.000000, - 48.000000, 0.000000, 60.000000, 0.000000, 72.000000, 0.000000, 84.000000, 0.000000, - 87.333984, 0.000000, 99.333984, 0.000000, 111.333984, 0.000000, 114.667969, 0.000000, - 126.667969, 0.000000, 138.667969, 0.000000, 150.667969, 0.000000, 162.667969, 0.000000, - 174.667969, 0.000000, 186.667969, 0.000000, 198.667969, 0.000000, 202.001953, 0.000000, - 214.001953, 0.000000, 226.001953, 0.000000 - - - - - - - शङ़ु - - - 0x00000002, 0x00000001, 0x00000006, 0x0000FFFF - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003 - - - - 0.000000, 0.000000, 7.572000, 0.000000, 15.108000, 0.000000, 15.108000, 0.000000, - 15.108000, 0.000000 - - - - - - - शङ़ु - - - 0x00000005, 0x00000001, 0x00000006, 0x0000FFFF - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003 - - - - 0.000000, 0.000000, 7.392000, 0.000000, 14.927999, 0.000000, 14.927999, 0.000000, - 14.927999, 0.000000 - - - - - - - क्ष र्क क्‍ष र्‍क - - - 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x00000080, 0x0000005B, 0x0000FFFF, 0x00000003, - 0x00000080, 0x00000051, 0x00000001, 0x0000009F, 0x00000003, 0x0000009A, 0x00000051, 0x00000001, - 0x00000080 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000006, 0x00000004, 0x00000005, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010 - - - - 0.000000, 0.000000, 10.875000, 0.000000, 10.875000, 0.000000, 10.875000, 0.000000, - 16.875000, 0.000000, 24.779297, 0.263672, 27.750000, 0.000000, 27.750000, 0.000000, - 33.750000, 0.000000, 44.490234, -0.451172, 44.625000, 0.000000, 44.625000, 0.000000, - 52.593750, 0.000000, 58.593750, 0.000000, 68.255859, -0.451172, 65.109375, 0.000000, - 65.109375, 0.000000, 75.984375, 0.000000 - - - - - - - 마만만 - - - 0x00000000, 0x0000FFFF, 0x00000000, 0x0000FFFF, 0x0000FFFF, 0x00000000, 0x0000FFFF - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006 - - - - 0.000000, 0.000000, 9.000000, 0.000000, 9.000000, 0.000000, 18.000000, 0.000000, - 18.000000, 0.000000, 18.000000, 0.000000, 27.000000, 0.000000, 27.000000, 0.000000 - - - - - - - מָשְׁכֵנִיאַחֲרֶיךָנָּרוּצָההֱבִיאַנִיהַמֶּלֶךְחֲדָרָיונָגִילָהוְנִשְׂמְחָהבָּךְנַזְכִּירָהדֹדֶיךָמִיַּיִןמֵישָׁרִיםאֲהֵבוּךָ - - - 0x0000FFFF, 0x00000055, 0x0000FFFF, 0x0000004B, 0x0000001D, 0x00000097, 0x00000021, 0x00000094, - 0x0000001B, 0x0000002D, 0x00000027, 0x00000096, 0x0000003A, 0x0000009A, 0x0000FFFF, 0x00000066, - 0x00000027, 0x00000097, 0x0000002F, 0x00000030, 0x00000096, 0x00000027, 0x00000099, 0x0000FFFF, - 0x00000051, 0x00000096, 0x0000002F, 0x0000FFFF, 0x00000055, 0x00000027, 0x00000098, 0x0000001F, - 0x0000009C, 0x0000001F, 0x00000021, 0x0000009A, 0x0000003A, 0x00000027, 0x00000096, 0x0000FFFF, - 0x00000056, 0x00000092, 0x00000024, 0x00000099, 0x00000031, 0x0000FFFF, 0x00000054, 0x0000009A, - 0x0000FFFF, 0x00000043, 0x00000021, 0x0000009A, 0x00000025, 0x00000092, 0x0000002F, 0x00000092, - 0x0000FFFF, 0x00000067, 0x00000096, 0x00000031, 0x00000092, 0x00000023, 0x00000021, 0x0000009A, - 0x0000002B, 0x00000027, 0x00000096, 0x0000001E, 0x0000009A, 0x00000031, 0x00000023, 0x00000027, - 0x0000009A, 0x0000003A, 0x0000009A, 0x0000001F, 0x00000094, 0x00000025, 0x0000FFFF, 0x00000054, - 0x00000098, 0x0000002B, 0x00000098, 0x0000FFFF, 0x0000005D, 0x00000099, 0x00000021, 0x00000027, - 0x00000096, 0x00000031, 0x00000099, 0x0000001B, 0x00000027, 0x00000096, 0x0000001D, 0x00000093, - 0x00000021, 0x00000021, 0x0000009A, 0x00000038, 0x0000FFFF, 0x0000004B, 0x0000003A, 0x0000009A, - 0x0000FFFF, 0x0000005E, 0x0000FFFF, 0x00000055, 0x00000027, 0x00000098, 0x0000003A, 0x00000094, - 0x00000025, 0x00000099, 0x0000001B, 0x00000027, 0x00000096, 0x00000031, 0x00000097, 0x00000029, - 0x00000092, 0x0000FFFF, 0x00000066, 0x0000009A, 0x0000002F - - - - 0x0000007C, 0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, - 0x00000074, 0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, - 0x0000006C, 0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, - 0x00000064, 0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, - 0x0000005C, 0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, - 0x00000054, 0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, - 0x0000004C, 0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, - 0x00000044, 0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, - 0x0000003C, 0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, - 0x00000034, 0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, - 0x0000002C, 0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, - 0x00000024, 0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, - 0x0000001C, 0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, - 0x00000014, 0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, - 0x0000000C, 0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, - 0x00000004, 0x00000003, 0x00000002, 0x00000001, 0x00000000 - - - - 0.000000, 0.000000, 0.000000, 0.000000, 5.806641, 0.000000, 5.806641, 0.000000, - 9.087891, 0.000000, 18.679688, 0.000000, 15.251953, 0.000000, 25.365234, 0.000000, - 21.878906, 0.000000, 28.787109, 0.000000, 35.191406, 0.000000, 42.966797, 0.000000, - 38.279297, 0.000000, 47.982422, 0.000000, 44.085938, 0.000000, 44.085938, 0.000000, - 52.347656, 0.000000, 58.453125, 0.000000, 55.113281, 0.000000, 62.021484, 0.000000, - 66.292969, 0.000000, 64.886719, 0.000000, 69.292969, 0.000000, 67.886719, 0.000000, - 67.886719, 0.000000, 74.050781, 0.000000, 70.710938, 0.000000, 77.619141, 0.000000, - 77.619141, 0.000000, 83.425781, 0.000000, 90.527344, 0.000000, 86.513672, 0.000000, - 91.804688, 0.000000, 92.390625, 0.000000, 98.267578, 0.000000, 109.347656, 0.000000, - 104.894531, 0.000000, 110.701172, 0.000000, 116.250000, 0.000000, 113.701172, 0.000000, - 113.554688, 0.000000, 121.242188, 0.000000, 119.484375, 0.000000, 124.552734, 0.000000, - 122.677734, 0.000000, 126.679688, 0.000000, 126.679688, 0.000000, 135.210938, 0.000000, - 132.486328, 0.000000, 132.251953, 0.000000, 138.416016, 0.000000, 148.734375, 0.000000, - 145.042969, 0.000000, 155.308594, 0.000000, 151.968750, 0.000000, 162.773438, 0.000000, - 158.876953, 0.000000, 158.876953, 0.000000, 168.398438, 0.000000, 166.523438, 0.000000, - 172.546875, 0.000000, 170.525391, 0.000000, 173.689453, 0.000000, 182.718750, 0.000000, - 180.199219, 0.000000, 185.583984, 0.000000, 190.107422, 0.000000, 187.998047, 0.000000, - 194.132812, 0.000000, 192.257812, 0.000000, 196.259766, 0.000000, 199.423828, 0.000000, - 206.964844, 0.000000, 202.511719, 0.000000, 212.332031, 0.000000, 208.318359, 0.000000, - 217.886719, 0.000000, 214.195312, 0.000000, 221.121094, 0.000000, 221.121094, 0.000000, - 229.447266, 0.000000, 226.927734, 0.000000, 235.652344, 0.000000, 232.312500, 0.000000, - 232.312500, 0.000000, 242.648438, 0.000000, 239.220703, 0.000000, 245.847656, 0.000000, - 250.195312, 0.000000, 248.320312, 0.000000, 255.808594, 0.000000, 252.322266, 0.000000, - 259.230469, 0.000000, 265.042969, 0.000000, 262.083984, 0.000000, 271.675781, 0.000000, - 268.248047, 0.000000, 274.875000, 0.000000, 284.197266, 0.000000, 281.501953, 0.000000, - 287.250000, 0.000000, 287.250000, 0.000000, 290.531250, 0.000000, 298.212891, 0.000000, - 296.337891, 0.000000, 296.337891, 0.000000, 300.339844, 0.000000, 300.339844, 0.000000, - 306.146484, 0.000000, 313.687500, 0.000000, 309.234375, 0.000000, 318.732422, 0.000000, - 315.041016, 0.000000, 325.453125, 0.000000, 321.966797, 0.000000, 328.875000, 0.000000, - 333.222656, 0.000000, 331.347656, 0.000000, 338.044922, 0.000000, 335.349609, 0.000000, - 345.175781, 0.000000, 341.279297, 0.000000, 341.279297, 0.000000, 352.558594, 0.000000, - 349.218750, 0.000000, 356.126953, 0.000000 - - - - - - - Ţhiş iş a ţeşţ. - - - 0x00000107, 0x00000049, 0x0000004A, 0x00000104, 0x00000001, 0x0000004A, 0x00000104, 0x00000001, - 0x00000042, 0x00000001, 0x00000108, 0x00000046, 0x00000104, 0x00000108, 0x0000000F - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E - - - - 0.000000, 0.000000, 7.356000, 0.000000, 14.340000, 0.000000, 17.832001, 0.000000, - 22.920000, 0.000000, 25.920000, 0.000000, 29.412001, 0.000000, 34.500000, 0.000000, - 37.500000, 0.000000, 43.500000, 0.000000, 46.500000, 0.000000, 50.411999, 0.000000, - 56.160000, 0.000000, 61.248001, 0.000000, 65.160004, 0.000000, 68.160004, 0.000000 - - - - - - - Ţhiş iş a ţeşţ. - - - 0x00000127, 0x00000049, 0x0000004A, 0x00000126, 0x00000001, 0x0000004A, 0x00000126, 0x00000001, - 0x00000042, 0x00000001, 0x00000128, 0x00000046, 0x00000126, 0x00000128, 0x0000000F - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E - - - - 0.000000, 0.000000, 7.356000, 0.000000, 14.340000, 0.000000, 17.832001, 0.000000, - 22.920000, 0.000000, 25.920000, 0.000000, 29.412001, 0.000000, 34.500000, 0.000000, - 37.500000, 0.000000, 43.500000, 0.000000, 46.500000, 0.000000, 50.411999, 0.000000, - 56.160000, 0.000000, 61.248001, 0.000000, 65.160004, 0.000000, 68.160004, 0.000000 - - - - - - - فتح بینچ خلیج شیخ پہنچ - - - 0x0000003B, 0x00000344, 0x000001D5, 0x00000318, 0x00000349, 0x0000007C, 0x00000003, 0x0000003D, - 0x00000348, 0x000001D5, 0x00000346, 0x000000B5, 0x00000003, 0x0000003A, 0x00000348, 0x000001D5, - 0x000002E3, 0x00000344, 0x00000087, 0x00000003, 0x0000003B, 0x00000344, 0x000001D5, 0x00000348, - 0x000001E5, 0x00000347, 0x0000006E, 0x00000003, 0x0000003C, 0x00000345, 0x000001D5, 0x00000344, - 0x0000011D - - - - 0x00000015, 0x00000014, 0x00000014, 0x00000013, 0x00000012, 0x00000012, 0x00000011, 0x00000010, - 0x0000000F, 0x0000000F, 0x0000000E, 0x0000000E, 0x0000000D, 0x0000000C, 0x0000000B, 0x0000000B, - 0x0000000A, 0x00000009, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000006, 0x00000005, - 0x00000005, 0x00000004, 0x00000004, 0x00000003, 0x00000002, 0x00000001, 0x00000001, 0x00000000, - 0x00000000 - - - - 0.000000, 0.000000, 3.205078, -11.097656, 1.406250, 0.000000, 4.558594, -1.376953, - 9.421875, -5.273438, 7.505859, -6.843750, 11.537109, 0.000000, 12.726562, 0.000000, - 20.455078, -4.798828, 15.357422, 0.000000, 19.289062, -13.072266, 18.509766, -1.376953, - 22.552734, 0.000000, 23.742188, 0.000000, 30.246094, -4.798828, 25.148438, 0.000000, - 28.300781, -1.376953, 32.917969, -13.792969, 30.158203, -7.792969, 35.208984, 0.000000, - 36.398438, 0.000000, 39.603516, -11.097656, 37.804688, 0.000000, 45.632812, 3.181641, - 40.957031, -1.376953, 44.853516, -6.046875, 42.457031, -5.572266, 46.066406, 0.000000, - 47.255859, 0.000000, 49.376953, -11.396484, 48.662109, 0.000000, 52.769531, -14.332031, - 51.814453, -1.376953, 56.789062, 0.000000 - - - - - - - ഹോം - - - 0x00000040, 0x00000038, 0x00000039, 0x00000005 - - - - 0x00000001, 0x00000000, 0x00000001, 0x00000002 - - - - 0.000000, 0.000000, 6.386719, 0.000000, 20.660156, 0.000000, 26.496094, 0.000000, - 32.742188, 0.000000 - - - - - - - റ്1്',s - - - 0x00000000, 0x00000000, 0x00000014, 0x00000956, 0x00000000, 0x0000000A, 0x0000000F, 0x00000056 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000003, 0x00000004, 0x00000005, 0x00000006 - - - - 0.000000, 0.000000, 9.000000, 0.000000, 9.000000, 0.000000, 16.587891, 0.000000, - 16.587891, 0.000000, 25.587891, 0.000000, 28.335938, 0.000000, 47.132812, 0.000000, - 38.250000, 0.000000 - - - - - - - ണു് - - - 0x00000023, 0x0000003C, 0x00000045 - - - - 0x00000000, 0x00000001, 0x00000002 - - - - 0.000000, 0.000000, 15.117188, 0.000000, 18.503906, 0.000000, 18.503906, 0.000000 - - - - - - - 中華人民共和國 臺灣 - - - 0x00000292, 0x000024E8, 0x000002D1, 0x00001582, 0x000004A1, 0x00000650, 0x000007E2, 0x00000021, - 0x00002395, 0x00001896 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009 - - - - 0.000000, 0.000000, 12.000000, 0.000000, 24.000000, 0.000000, 36.000000, 0.000000, - 48.000000, 0.000000, 60.000000, 0.000000, 72.000000, 0.000000, 84.000000, 0.000000, - 90.000000, 0.000000, 102.000000, 0.000000, 114.000000, 0.000000 - - - - - - - ప్రకాష్ - - - 0x00000057, 0x0000023B, 0x0000FFFF, 0x00000125, 0x00000066, 0x00000241, 0x0000FFFF - - - - 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x00000004, 0x00000005, 0x00000006 - - - - 0.000000, 0.000000, 8.285156, 0.000000, 14.894531, 0.000000, 14.894531, 0.000000, - 21.503906, 0.000000, 25.136719, 0.000000, 33.421875, 0.000000, 33.421875, 0.000000 - - - - - - - บทที่๑พายุไซโคลนโดโรธีอาศัยอยู่ท่ามกลางทุ่งใหญ่ในแคนซัสกับลุงเฮนรีชาวไร่และป้าเอ็มภรรยาชาวไร่บ้านของพวกเขาหลังเล็กเพราะไม้สร้างบ้านต้องขนมาด้วยเกวียนเป็นระยะทางหลายไมล์ - - - 0x0000009D, 0x0000009A, 0x0000009A, 0x000000B8, 0x000000C9, 0x000000D2, 0x000000A1, 0x000000B5, - 0x000000A5, 0x000000BB, 0x000000C5, 0x0000008E, 0x000000C3, 0x00000087, 0x000000A8, 0x0000009C, - 0x000000C3, 0x00000097, 0x000000C3, 0x000000A6, 0x0000009B, 0x000000B8, 0x000000B0, 0x000000B5, - 0x000000AB, 0x000000B4, 0x000000A5, 0x000000B0, 0x000000A5, 0x000000BC, 0x0000006E, 0x0000009A, - 0x0000006E, 0x000000B5, 0x000000A4, 0x00000084, 0x000000A8, 0x000000B5, 0x0000008A, 0x0000009A, - 0x000000BB, 0x0000006E, 0x0000008A, 0x000000C4, 0x000000AE, 0x00000090, 0x0000006E, 0x000000C4, - 0x0000009C, 0x000000C2, 0x00000087, 0x0000009C, 0x0000008E, 0x000000B4, 0x000000AD, 0x00000084, - 0x000000B4, 0x0000009D, 0x000000A8, 0x000000BB, 0x0000008A, 0x000000C1, 0x000000B1, 0x0000009C, - 0x000000A6, 0x000000B8, 0x0000008D, 0x000000B5, 0x000000AA, 0x000000C5, 0x000000A6, 0x0000006E, - 0x000000C2, 0x000000A8, 0x000000B3, 0x0000009E, 0x0000006F, 0x000000B5, 0x000000C1, 0x000000B0, - 0x000000C8, 0x000000A4, 0x000000A3, 0x000000A6, 0x000000A6, 0x000000A5, 0x000000B5, 0x0000008D, - 0x000000B5, 0x000000AA, 0x000000C5, 0x000000A6, 0x0000006E, 0x0000009D, 0x0000006F, 0x000000B5, - 0x0000009C, 0x00000085, 0x000000B0, 0x0000008A, 0x000000A1, 0x000000AA, 0x00000084, 0x000000C1, - 0x00000085, 0x000000B5, 0x000000AE, 0x000000A8, 0x000000B4, 0x0000008A, 0x000000C1, 0x000000A8, - 0x000000C8, 0x00000084, 0x000000C1, 0x000000A1, 0x000000A6, 0x000000B5, 0x000000B3, 0x000000C5, - 0x000000A4, 0x0000006F, 0x000000AD, 0x000000A6, 0x0000006F, 0x000000B5, 0x0000008A, 0x0000009D, - 0x0000006F, 0x000000B5, 0x0000009C, 0x00000098, 0x0000006F, 0x000000B0, 0x0000008A, 0x00000085, - 0x0000009C, 0x000000A4, 0x000000B5, 0x00000097, 0x0000006F, 0x000000AA, 0x000000A5, 0x000000C1, - 0x00000084, 0x000000AA, 0x000000B8, 0x000000A5, 0x0000009C, 0x000000C1, 0x0000009E, 0x000000C8, - 0x0000009C, 0x000000A6, 0x000000B3, 0x000000A5, 0x000000B3, 0x0000009A, 0x000000B5, 0x0000008A, - 0x000000AE, 0x000000A8, 0x000000B5, 0x000000A5, 0x000000C5, 0x000000A4, 0x000000A8, 0x00000072 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, - 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003C, 0x0000003D, 0x0000003E, 0x0000003F, - 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, - 0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, - 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, - 0x00000058, 0x00000059, 0x0000005A, 0x0000005B, 0x0000005C, 0x0000005D, 0x0000005E, 0x0000005F, - 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, - 0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 0x0000006D, 0x0000006E, 0x0000006F, - 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, - 0x00000078, 0x00000079, 0x0000007A, 0x0000007B, 0x0000007C, 0x0000007D, 0x0000007E, 0x0000007F, - 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, - 0x00000088, 0x00000089, 0x0000008A, 0x0000008B, 0x0000008C, 0x0000008D, 0x0000008E, 0x0000008F, - 0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, - 0x00000098, 0x00000099, 0x0000009A, 0x0000009B, 0x0000009C, 0x0000009D, 0x0000009E, 0x0000009F, - 0x000000A0, 0x000000A1, 0x000000A2, 0x000000A3, 0x000000A4, 0x000000A5, 0x000000A6, 0x000000A7 - - - - 0.000000, 0.000000, 5.399414, 0.000000, 10.798828, 0.000000, 15.072266, 0.000000, - 15.072266, 0.000000, 16.198242, 0.000000, 21.046875, 0.000000, 26.616211, 0.000000, - 30.035156, 0.000000, 31.312500, 0.000000, 34.151367, 0.000000, 38.279297, 0.000000, - 43.558594, 0.000000, 47.663086, 0.000000, 52.438477, 0.000000, 57.178711, 0.000000, - 62.698242, 0.000000, 66.802734, 0.000000, 71.601562, 0.000000, 75.706055, 0.000000, - 79.810547, 0.000000, 84.029297, 0.000000, 84.369141, 0.000000, 89.097656, 0.000000, - 92.516602, 0.000000, 97.614258, 0.000000, 97.195312, 0.000000, 101.311523, 0.000000, - 106.040039, 0.000000, 107.375977, 0.000000, 108.326172, -0.084961, 110.156250, 0.000000, - 113.497070, -0.084961, 115.555664, 0.000000, 118.974609, 0.000000, 124.013672, 0.000000, - 128.765625, 0.000000, 133.505859, 0.000000, 136.924805, 0.000000, 140.704102, 0.000000, - 143.036133, 0.000000, 144.044922, -0.084961, 146.103516, 0.000000, 149.882812, 0.000000, - 153.553711, 0.000000, 159.158203, 0.000000, 163.377930, -0.084961, 165.421875, 0.000000, - 169.092773, 0.000000, 174.612305, 0.000000, 179.135742, 0.000000, 183.911133, 0.000000, - 189.430664, 0.000000, 194.879883, 0.000000, 194.709961, 0.000000, 199.989258, 0.000000, - 204.092773, -0.084961, 204.741211, 0.000000, 210.140625, 0.000000, 212.828125, 0.000000, - 214.880859, 0.000000, 218.660156, 0.000000, 220.675781, 0.000000, 225.128906, 0.000000, - 230.648438, 0.000000, 234.105469, 0.000000, 234.752930, 0.000000, 239.613281, 0.000000, - 243.032227, 0.000000, 247.280273, 0.000000, 251.408203, 0.000000, 253.932617, -0.084961, - 255.512695, 0.000000, 260.036133, 0.000000, 264.776367, 0.000000, 269.071289, 0.000000, - 272.704102, 0.000000, 274.470703, 0.000000, 277.889648, 0.000000, 279.905273, 0.000000, - 284.768555, 0.000000, 284.633789, 0.000000, 289.672852, 0.000000, 294.641602, 0.000000, - 298.746094, 0.000000, 302.850586, 0.000000, 306.966797, 0.000000, 310.385742, 0.000000, - 315.246094, 0.000000, 318.665039, 0.000000, 322.913086, 0.000000, 327.041016, 0.000000, - 329.565430, -0.084961, 331.145508, 0.000000, 335.911133, 0.000000, 336.544922, 0.000000, - 339.963867, 0.000000, 345.483398, 0.000000, 350.258789, 0.000000, 354.987305, 0.000000, - 358.766602, 0.000000, 364.335938, 0.000000, 368.583984, 0.000000, 373.335938, 0.000000, - 375.351562, 0.000000, 380.126953, 0.000000, 383.545898, 0.000000, 389.150391, 0.000000, - 394.306641, 0.000000, 393.890625, 0.000000, 397.669922, 0.000000, 399.685547, 0.000000, - 404.548828, 0.000000, 404.425781, 0.000000, 409.177734, 0.000000, 411.193359, 0.000000, - 416.762695, 0.000000, 420.867188, 0.000000, 424.286133, 0.000000, 428.581055, 0.000000, - 432.708984, 0.000000, 438.123047, 0.000000, 437.748047, 0.000000, 443.027344, 0.000000, - 446.976562, 0.000000, 447.131836, 0.000000, 450.550781, 0.000000, 454.330078, 0.000000, - 459.095703, 0.000000, 459.729492, 0.000000, 463.148438, 0.000000, 468.667969, 0.000000, - 473.847656, 0.000000, 473.478516, 0.000000, 478.207031, 0.000000, 481.986328, 0.000000, - 486.761719, 0.000000, 492.281250, 0.000000, 497.320312, 0.000000, 500.739258, 0.000000, - 505.860352, 0.000000, 505.538086, 0.000000, 509.786133, 0.000000, 513.902344, 0.000000, - 515.917969, 0.000000, 520.669922, 0.000000, 523.947266, 0.000000, 524.917969, 0.000000, - 529.034180, 0.000000, 534.553711, 0.000000, 536.569336, 0.000000, 540.846680, 0.000000, - 541.968750, 0.000000, 547.488281, 0.000000, 551.592773, 0.000000, 555.887695, 0.000000, - 560.003906, 0.000000, 564.298828, 0.000000, 569.698242, 0.000000, 573.117188, 0.000000, - 576.896484, 0.000000, 582.500977, 0.000000, 587.241211, 0.000000, 590.660156, 0.000000, - 594.776367, 0.000000, 598.904297, 0.000000, 603.943359, 0.000000, 608.894531, 0.000000, - 608.683594, 0.000000 - - - - - - - ක්‍රෙ ක්‍යෙ ක්‍ෂෙ ක්‍ෂ්‍යෙ ක්ෂෙ කර්‍මෙ ස්ට්‍රේ ස‍්සෙ ස්ස - - - 0x0000004A, 0x000001D5, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x0000004A, 0x00000018, - 0x0000008B, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x0000004A, 0x0000008A, 0x0000FFFF, 0x0000FFFF, - 0x0000FFFF, 0x00000003, 0x0000004A, 0x0000008A, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000008B, - 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000001D6, 0x0000FFFF, 0x0000004A, 0x0000003C, 0x00000003, - 0x00000018, 0x0000004A, 0x000001F8, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000A9, - 0x0000FFFF, 0x0000004A, 0x0000007A, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000003, - 0x0000004A, 0x00000203, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000A9, 0x0000FFFF, - 0x0000003D - - - - 0x00000004, 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000005, 0x0000000A, 0x00000006, - 0x00000007, 0x00000008, 0x00000009, 0x0000000B, 0x00000010, 0x0000000C, 0x0000000D, 0x0000000E, - 0x0000000F, 0x00000011, 0x00000019, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, - 0x00000017, 0x00000018, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001E, 0x0000001D, 0x0000001F, - 0x00000020, 0x00000025, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000026, 0x00000027, - 0x00000028, 0x0000002D, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, - 0x00000033, 0x0000002F, 0x00000030, 0x00000031, 0x00000032, 0x00000034, 0x00000035, 0x00000036, - 0x00000037 - - - - 0.000000, 0.000000, 8.520000, 0.000000, 19.224001, 0.000000, 19.224001, 0.000000, - 19.224001, 0.000000, 19.224001, 0.000000, 26.640001, 0.000000, 35.160004, 0.000000, - 45.864006, 0.000000, 51.936005, 0.000000, 51.936005, 0.000000, 51.936005, 0.000000, - 59.352005, 0.000000, 67.872009, 0.000000, 82.704010, 0.000000, 82.704010, 0.000000, - 82.704010, 0.000000, 82.704010, 0.000000, 90.120010, 0.000000, 98.640015, 0.000000, - 113.472015, 0.000000, 113.472015, 0.000000, 113.472015, 0.000000, 113.472015, 0.000000, - 119.544014, 0.000000, 119.544014, 0.000000, 119.544014, 0.000000, 126.960014, 0.000000, - 137.664017, 0.000000, 137.664017, 0.000000, 146.184021, 0.000000, 154.296021, 0.000000, - 161.712021, 0.000000, 172.416016, 0.000000, 180.936020, 0.000000, 189.552017, 0.000000, - 189.552017, 0.000000, 189.552017, 0.000000, 189.552017, 0.000000, 196.968018, 0.000000, - 205.584015, 0.000000, 205.584015, 0.000000, 214.104019, 0.000000, 222.720016, 0.000000, - 222.720016, 0.000000, 222.720016, 0.000000, 222.720016, 0.000000, 222.720016, 0.000000, - 230.136017, 0.000000, 238.656021, 0.000000, 254.784027, 0.000000, 254.784027, 0.000000, - 254.784027, 0.000000, 254.784027, 0.000000, 262.200012, 0.000000, 270.816010, 0.000000, - 270.816010, 0.000000, 279.432007, 0.000000 - - - - - - - ‭ﻲﺑﺮﻌﻟﺎﺑ - - - 0x0000FFFF, 0x00000206, 0x000001A5, 0x000001C2, 0x000001E0, 0x000001F3, 0x000001A2, 0x000001A5 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007 - - - - 0.000000, 0.000000, 0.000000, 0.000000, 5.759766, 0.000000, 7.980469, 0.000000, - 11.748047, 0.000000, 15.298828, 0.000000, 17.302734, 0.000000, 19.763672, 0.000000, - 21.984375, 0.000000 - - - - - - - ﻲﺑﺮﻌﻟﺎﺑ - - - 0x000001A5, 0x000001A2, 0x000001F3, 0x000001E0, 0x000001C2, 0x000001A5, 0x00000206 - - - - 0x00000006, 0x00000005, 0x00000004, 0x00000003, 0x00000002, 0x00000001, 0x00000000 - - - - 0.000000, 0.000000, 2.220703, 0.000000, 4.681641, 0.000000, 6.685547, 0.000000, - 10.236328, 0.000000, 14.003906, 0.000000, 16.224609, 0.000000, 21.984375, 0.000000 - - - - - - - ḤḤ - - - 0x000009A3, 0x000009A3 - - - - 0x00000000, 0x00000001 - - - - 0.000000, 0.000000, 8.666016, 0.000000, 17.332031, 0.000000 - - - - - - - र्य र्‌य - - - 0x00000099, 0x0000005B, 0x0000FFFF, 0x00000003, 0x0000009A, 0x00000051, 0x00000001, 0x00000099 - - - - 0x00000002, 0x00000000, 0x00000001, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007 - - - - 0.000000, 0.000000, 9.726562, 0.263672, 9.468750, 0.000000, 9.468750, 0.000000, - 15.468750, 0.000000, 25.130859, -0.451172, 21.984375, 0.000000, 21.984375, 0.000000, - 31.453125, 0.000000 - - - - - - - The quick brown fox jumps over the lazy dog. • Jackdaws love my big sphinx of quartz - - - 0x00000157, 0x0000FFFF, 0x00000048, 0x00000003, 0x00000054, 0x00000058, 0x0000004C, 0x00000046, - 0x0000004E, 0x00000003, 0x00000045, 0x00000055, 0x00000052, 0x0000005A, 0x00000051, 0x00000003, - 0x00000049, 0x00000052, 0x0000005B, 0x00000003, 0x0000004D, 0x00000058, 0x00000050, 0x00000053, - 0x00000056, 0x00000003, 0x00000052, 0x00000059, 0x00000048, 0x00000055, 0x00000003, 0x00000152, - 0x0000FFFF, 0x00000048, 0x00000003, 0x0000004F, 0x00000044, 0x0000005D, 0x0000005C, 0x00000003, - 0x00000047, 0x00000052, 0x0000004A, 0x00000011, 0x00000003, 0x00000087, 0x00000003, 0x0000002D, - 0x00000044, 0x00000046, 0x0000004E, 0x00000047, 0x00000044, 0x0000005A, 0x00000056, 0x00000003, - 0x0000004F, 0x00000052, 0x00000059, 0x00000048, 0x00000003, 0x00000050, 0x0000005C, 0x00000003, - 0x00000045, 0x0000004C, 0x0000004A, 0x00000003, 0x00000056, 0x00000053, 0x0000004B, 0x0000004C, - 0x00000051, 0x0000005B, 0x00000003, 0x00000052, 0x00000049, 0x00000003, 0x00000054, 0x00000058, - 0x00000044, 0x00000055, 0x00000057, 0x0000005D - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, - 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003C, 0x0000003D, 0x0000003E, 0x0000003F, - 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, - 0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, - 0x00000050, 0x00000051, 0x00000052, 0x00000053 - - - - 0.000000, 0.000000, 13.523438, 0.000000, 13.523438, 0.000000, 17.982422, 0.000000, - 21.316406, 0.000000, 27.134766, 0.000000, 33.861328, 0.000000, 37.412109, 0.000000, - 42.005859, 0.000000, 47.554688, 0.000000, 50.888672, 0.000000, 56.707031, 0.000000, - 61.705078, 0.000000, 66.849609, 0.000000, 74.378906, 0.000000, 81.152344, 0.000000, - 84.486328, 0.000000, 88.230469, 0.000000, 93.375000, 0.000000, 99.386719, 0.000000, - 102.720703, 0.000000, 105.914062, 0.000000, 112.640625, 0.000000, 122.109375, 0.000000, - 128.080078, 0.000000, 132.345703, 0.000000, 135.679688, 0.000000, 140.824219, 0.000000, - 146.232422, 0.000000, 150.691406, 0.000000, 155.689453, 0.000000, 159.023438, 0.000000, - 168.908203, 0.000000, 168.908203, 0.000000, 173.367188, 0.000000, 176.701172, 0.000000, - 179.900391, 0.000000, 186.058594, 0.000000, 190.998047, 0.000000, 197.501953, 0.000000, - 200.835938, 0.000000, 206.994141, 0.000000, 212.138672, 0.000000, 217.734375, 0.000000, - 220.212891, 0.000000, 223.546875, 0.000000, 230.214844, 0.000000, 233.548828, 0.000000, - 239.003906, 0.000000, 245.162109, 0.000000, 249.755859, 0.000000, 255.304688, 0.000000, - 261.462891, 0.000000, 267.621094, 0.000000, 275.150391, 0.000000, 279.416016, 0.000000, - 282.750000, 0.000000, 285.949219, 0.000000, 291.093750, 0.000000, 296.501953, 0.000000, - 300.960938, 0.000000, 304.294922, 0.000000, 313.763672, 0.000000, 320.267578, 0.000000, - 323.601562, 0.000000, 329.419922, 0.000000, 332.970703, 0.000000, 338.566406, 0.000000, - 341.900391, 0.000000, 346.166016, 0.000000, 352.136719, 0.000000, 358.523438, 0.000000, - 362.074219, 0.000000, 368.847656, 0.000000, 374.859375, 0.000000, 378.193359, 0.000000, - 383.337891, 0.000000, 387.082031, 0.000000, 390.416016, 0.000000, 396.234375, 0.000000, - 402.960938, 0.000000, 409.119141, 0.000000, 414.117188, 0.000000, 418.365234, 0.000000, - 423.304688, 0.000000 - - - - - - - Pack my bags with six dozen liquor jugs - - - 0x00000040, 0x000001F8, 0x00000203, 0x00000230, 0x00000003, 0x00000239, 0x00000274, 0x00000003, - 0x000001FE, 0x000001F8, 0x0000021D, 0x00000255, 0x00000003, 0x0000026C, 0x00000228, 0x0000025C, - 0x00000223, 0x00000003, 0x00000255, 0x00000228, 0x00000270, 0x00000003, 0x00000207, 0x00000244, - 0x0000027A, 0x00000210, 0x0000023D, 0x00000003, 0x00000235, 0x00000228, 0x0000024D, 0x00000264, - 0x00000244, 0x00000251, 0x00000003, 0x0000022C, 0x00000264, 0x0000021D, 0x00000255 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, - 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026 - - - - 0.000000, 0.000000, 12.630000, 0.000000, 21.180000, 0.000000, 27.600000, 0.000000, - 36.599998, 0.000000, 42.599998, 0.000000, 53.160000, 0.000000, 59.970001, 0.000000, - 65.970001, 0.000000, 73.620003, 0.000000, 82.170006, 0.000000, 89.370003, 0.000000, - 94.740005, 0.000000, 100.740005, 0.000000, 112.050003, 0.000000, 117.480003, 0.000000, - 123.420006, 0.000000, 131.400009, 0.000000, 137.400009, 0.000000, 142.770004, 0.000000, - 148.199997, 0.000000, 155.699997, 0.000000, 161.699997, 0.000000, 169.830002, 0.000000, - 177.330002, 0.000000, 184.020004, 0.000000, 190.169998, 0.000000, 198.000000, 0.000000, - 204.000000, 0.000000, 210.089996, 0.000000, 215.519989, 0.000000, 223.229996, 0.000000, - 230.940002, 0.000000, 238.440002, 0.000000, 244.290009, 0.000000, 250.290009, 0.000000, - 256.140015, 0.000000, 263.850006, 0.000000, 271.050018, 0.000000, 276.420013, 0.000000 - - - - - - - Li kien kien, li kieku kieku. - - - 0x0000000D, 0x00000024, 0x00000001, 0x00000026, 0x00000024, 0x00000020, 0x00000029, 0x00000001, - 0x00000026, 0x00000024, 0x00000020, 0x00000029, 0x000001D0, 0x00000001, 0x00000027, 0x00000024, - 0x00000001, 0x00000026, 0x00000024, 0x00000020, 0x00000026, 0x00000030, 0x00000001, 0x00000026, - 0x00000024, 0x00000020, 0x00000026, 0x00000030, 0x000001CF - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C - - - - 0.000000, 0.000000, 7.200000, 0.000000, 14.400000, 0.000000, 21.599998, 0.000000, - 28.799999, 0.000000, 36.000000, 0.000000, 43.200001, 0.000000, 50.400002, 0.000000, - 57.600002, 0.000000, 64.800003, 0.000000, 72.000000, 0.000000, 79.199997, 0.000000, - 86.399994, 0.000000, 93.599991, 0.000000, 100.799988, 0.000000, 107.999985, 0.000000, - 115.199982, 0.000000, 122.399979, 0.000000, 129.599976, 0.000000, 136.799973, 0.000000, - 143.999969, 0.000000, 151.199966, 0.000000, 158.399963, 0.000000, 165.599960, 0.000000, - 172.799957, 0.000000, 179.999954, 0.000000, 187.199951, 0.000000, 194.399948, 0.000000, - 201.599945, 0.000000, 208.799942, 0.000000 - - - - - - - Il-Mistoqsija oħt l-għerf. - - - 0x0000000A, 0x00000027, 0x00000210, 0x0000000E, 0x00000024, 0x0000002E, 0x0000002F, 0x0000002A, - 0x0000002C, 0x0000002E, 0x00000024, 0x00000025, 0x0000001C, 0x00000001, 0x0000002A, 0x0000011F, - 0x0000002F, 0x00000001, 0x00000027, 0x00000210, 0x00000022, 0x0000011F, 0x00000020, 0x0000002D, - 0x00000021, 0x000001FB - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019 - - - - 0.000000, 0.000000, 3.096000, 0.000000, 6.156000, 0.000000, 9.888000, 0.000000, - 18.552000, 0.000000, 21.504000, 0.000000, 26.532000, 0.000000, 30.467999, 0.000000, - 36.972000, 0.000000, 43.571999, 0.000000, 48.599998, 0.000000, 51.551998, 0.000000, - 54.515999, 0.000000, 60.660000, 0.000000, 63.084000, 0.000000, 69.587997, 0.000000, - 76.115997, 0.000000, 80.171997, 0.000000, 82.596001, 0.000000, 85.655998, 0.000000, - 89.388000, 0.000000, 95.435997, 0.000000, 101.963997, 0.000000, 107.916000, 0.000000, - 112.080002, 0.000000, 114.984001, 0.000000, 117.972000, 0.000000 - - - - - - - ༄༅།། ཏིན་ཏིན་གྱི་དཔའ་རྩལ - - - 0x00000145, 0x0000FFFF, 0x00000151, 0x00000151, 0x00000003, 0x0000046C, 0x00000BFD, 0x0000059A, - 0x0000014E, 0x0000046C, 0x00000BFD, 0x0000059A, 0x0000014E, 0x000002CA, 0x0000FFFF, 0x00000BFD, - 0x0000014E, 0x0000050E, 0x00000611, 0x00000848, 0x0000014E, 0x0000093C, 0x0000FFFF, 0x0000098B - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017 - - - - 0.000000, 0.000000, 14.906250, 0.000000, 14.906250, 0.000000, 17.648438, 0.000000, - 20.390625, 0.000000, 23.906250, 0.000000, 29.109375, 0.000000, 29.109375, 0.000000, - 34.171875, 0.000000, 35.929688, 0.000000, 41.132812, 0.000000, 41.132812, 0.000000, - 46.195312, 0.000000, 47.953125, 0.000000, 54.773438, 0.000000, 54.773438, 0.000000, - 54.773438, 0.000000, 56.531250, 0.000000, 61.875000, 0.000000, 67.570312, 0.000000, - 73.195312, 0.000000, 74.953125, 0.000000, 80.437500, 0.000000, 80.437500, 0.000000, - 87.328125, 0.000000 - - - - - - - ᄊᆞᆷ ᄒᆞᆫ글 ᄀᆞᇹ ᄫᆞᆼ - - - 0x000044FF, 0x00004707, 0x00004859, 0x00000005, 0x0000462B, 0x00004707, 0x00004785, 0x000019B2, - 0x00000005, 0x00004361, 0x00004707, 0x0000498D, 0x00000005, 0x000044C3, 0x00004707, 0x00004911 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F - - - - 0.000000, 0.000000, 12.000000, 0.000000, 12.000000, 0.000000, 12.000000, 0.000000, - 14.700000, 0.000000, 26.700001, 0.000000, 26.700001, 0.000000, 26.700001, 0.000000, - 38.700001, 0.000000, 41.400002, 0.000000, 53.400002, 0.000000, 53.400002, 0.000000, - 53.400002, 0.000000, 56.100002, 0.000000, 68.100006, 0.000000, 68.100006, 0.000000, - 68.100006, 0.000000 - - - - - - - के े - - - 0x00000901, 0x00000931, 0x00000003, 0x00000956, 0x00000931 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000003 - - - - 0.000000, 0.000000, 5.935547, 0.000000, 8.548828, 0.000000, 12.345703, 0.000000, - 17.085938, 0.000000, 18.345703, 0.000000 - - - - - - - अँग्रेज़ी - - - 0x000008F1, 0x000008EE, 0x000009CB, 0x0000FFFF, 0x0000FFFF, 0x00000931, 0x00000940, 0x0000FFFF, - 0x0000092A - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000003, 0x00000005, 0x00000006, 0x00000007, - 0x00000008 - - - - 0.000000, 0.000000, 9.076172, 0.000000, 9.076172, 0.000000, 16.025391, 0.000000, - 16.025391, 0.000000, 16.025391, 0.000000, 16.025391, 0.000000, 23.976562, 0.000000, - 23.976562, 0.000000, 27.304688, 0.000000 - - - - - - - To WAVA is easy, it’s the 1,452 other glyphs in the office I’m worried about! - - - 0x00000037, 0x00000052, 0x00000003, 0x0000003A, 0x00000024, 0x00000039, 0x00000024, 0x00000003, - 0x0000004C, 0x00000056, 0x00000003, 0x00000048, 0x00000044, 0x00000056, 0x0000005C, 0x0000000F, - 0x00000003, 0x0000004C, 0x00000057, 0x000000B6, 0x00000056, 0x00000003, 0x00000057, 0x0000004B, - 0x00000048, 0x00000003, 0x00000014, 0x0000000F, 0x00000017, 0x00000018, 0x00000015, 0x00000003, - 0x00000052, 0x00000057, 0x0000004B, 0x00000048, 0x00000055, 0x00000003, 0x0000004A, 0x0000004F, - 0x0000005C, 0x00000053, 0x0000004B, 0x00000056, 0x00000003, 0x0000004C, 0x00000051, 0x00000003, - 0x00000057, 0x0000004B, 0x00000048, 0x00000003, 0x00000052, 0x00000049, 0x00000049, 0x0000004C, - 0x00000046, 0x00000048, 0x00000003, 0x0000002C, 0x000000B6, 0x00000050, 0x00000003, 0x0000005A, - 0x00000052, 0x00000055, 0x00000055, 0x0000004C, 0x00000048, 0x00000047, 0x00000003, 0x00000044, - 0x00000045, 0x00000052, 0x00000058, 0x00000057, 0x00000004 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, - 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003C, 0x0000003D, 0x0000003E, 0x0000003F, - 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, - 0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C - - - - 0.000000, 0.000000, 6.000000, 0.000000, 12.673828, 0.000000, 16.007812, 0.000000, - 26.888672, 0.000000, 34.001953, 0.000000, 41.115234, 0.000000, 48.457031, 0.000000, - 51.791016, 0.000000, 54.457031, 0.000000, 60.457031, 0.000000, 63.791016, 0.000000, - 70.464844, 0.000000, 77.138672, 0.000000, 83.138672, 0.000000, 88.248047, 0.000000, - 91.582031, 0.000000, 94.916016, 0.000000, 97.582031, 0.000000, 100.916016, 0.000000, - 103.365234, 0.000000, 109.365234, 0.000000, 112.699219, 0.000000, 116.033203, 0.000000, - 122.707031, 0.000000, 129.380859, 0.000000, 132.714844, 0.000000, 139.388672, 0.000000, - 142.722656, 0.000000, 149.396484, 0.000000, 156.070312, 0.000000, 162.744141, 0.000000, - 166.078125, 0.000000, 172.751953, 0.000000, 176.085938, 0.000000, 182.759766, 0.000000, - 189.433594, 0.000000, 193.429688, 0.000000, 196.763672, 0.000000, 203.437500, 0.000000, - 206.103516, 0.000000, 212.103516, 0.000000, 218.777344, 0.000000, 225.451172, 0.000000, - 231.451172, 0.000000, 234.785156, 0.000000, 237.451172, 0.000000, 244.125000, 0.000000, - 247.458984, 0.000000, 250.792969, 0.000000, 257.466797, 0.000000, 264.140625, 0.000000, - 267.474609, 0.000000, 274.148438, 0.000000, 277.265625, 0.000000, 280.599609, 0.000000, - 283.265625, 0.000000, 289.265625, 0.000000, 295.939453, 0.000000, 299.273438, 0.000000, - 302.607422, 0.000000, 305.273438, 0.000000, 315.269531, 0.000000, 318.603516, 0.000000, - 327.269531, 0.000000, 333.943359, 0.000000, 337.939453, 0.000000, 341.935547, 0.000000, - 344.601562, 0.000000, 351.275391, 0.000000, 357.949219, 0.000000, 361.283203, 0.000000, - 367.957031, 0.000000, 374.630859, 0.000000, 381.304688, 0.000000, 387.978516, 0.000000, - 391.312500, 0.000000, 394.646484, 0.000000 - - - - - - - To WAVA is easy, it’s the 1,452 other glyphs in the office I’m worried about! - - - 0x00000037, 0x00000052, 0x00000003, 0x0000003A, 0x00000024, 0x00000039, 0x00000024, 0x00000003, - 0x0000004C, 0x00000056, 0x00000003, 0x00000048, 0x00000044, 0x00000056, 0x0000005C, 0x0000000F, - 0x00000003, 0x0000004C, 0x00000057, 0x000000B6, 0x00000056, 0x00000003, 0x00000057, 0x0000004B, - 0x00000048, 0x00000003, 0x00000014, 0x0000000F, 0x00000017, 0x00000018, 0x00000015, 0x00000003, - 0x00000052, 0x00000057, 0x0000004B, 0x00000048, 0x00000055, 0x00000003, 0x0000004A, 0x0000004F, - 0x0000005C, 0x00000053, 0x0000004B, 0x00000056, 0x00000003, 0x0000004C, 0x00000051, 0x00000003, - 0x00000057, 0x0000004B, 0x00000048, 0x00000003, 0x00000052, 0x00000049, 0x00000049, 0x0000004C, - 0x00000046, 0x00000048, 0x00000003, 0x0000002C, 0x000000B6, 0x00000050, 0x00000003, 0x0000005A, - 0x00000052, 0x00000055, 0x00000055, 0x0000004C, 0x00000048, 0x00000047, 0x00000003, 0x00000044, - 0x00000045, 0x00000052, 0x00000058, 0x00000057, 0x00000004 - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, - 0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, - 0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, - 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, - 0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, - 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, - 0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003C, 0x0000003D, 0x0000003E, 0x0000003F, - 0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, - 0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C - - - - 0.000000, 0.000000, 6.000000, 0.000000, 12.673828, 0.000000, 16.007812, 0.000000, - 26.888672, 0.000000, 34.001953, 0.000000, 41.115234, 0.000000, 48.457031, 0.000000, - 51.791016, 0.000000, 54.457031, 0.000000, 60.457031, 0.000000, 63.791016, 0.000000, - 70.464844, 0.000000, 77.138672, 0.000000, 83.138672, 0.000000, 88.248047, 0.000000, - 91.582031, 0.000000, 94.916016, 0.000000, 97.582031, 0.000000, 100.916016, 0.000000, - 103.365234, 0.000000, 109.365234, 0.000000, 112.699219, 0.000000, 116.033203, 0.000000, - 122.707031, 0.000000, 129.380859, 0.000000, 132.714844, 0.000000, 139.388672, 0.000000, - 142.722656, 0.000000, 149.396484, 0.000000, 156.070312, 0.000000, 162.744141, 0.000000, - 166.078125, 0.000000, 172.751953, 0.000000, 176.085938, 0.000000, 182.759766, 0.000000, - 189.433594, 0.000000, 193.429688, 0.000000, 196.763672, 0.000000, 203.437500, 0.000000, - 206.103516, 0.000000, 212.103516, 0.000000, 218.777344, 0.000000, 225.451172, 0.000000, - 231.451172, 0.000000, 234.785156, 0.000000, 237.451172, 0.000000, 244.125000, 0.000000, - 247.458984, 0.000000, 250.792969, 0.000000, 257.466797, 0.000000, 264.140625, 0.000000, - 267.474609, 0.000000, 274.148438, 0.000000, 277.265625, 0.000000, 280.599609, 0.000000, - 283.265625, 0.000000, 289.265625, 0.000000, 295.939453, 0.000000, 299.273438, 0.000000, - 302.607422, 0.000000, 305.273438, 0.000000, 315.269531, 0.000000, 318.603516, 0.000000, - 327.269531, 0.000000, 333.943359, 0.000000, 337.939453, 0.000000, 341.935547, 0.000000, - 344.601562, 0.000000, 351.275391, 0.000000, 357.949219, 0.000000, 361.283203, 0.000000, - 367.957031, 0.000000, 374.630859, 0.000000, 381.304688, 0.000000, 387.978516, 0.000000, - 391.312500, 0.000000, 394.646484, 0.000000 - - - - - - - Orient Bug - - - 0x00000032, 0x00000055, 0x0000004C, 0x00000048, 0x00000051, 0x00000057, 0x00000003, 0x00000025, - 0x00000058, 0x0000004A - - - - 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, - 0x00000008, 0x00000009 - - - - 0.000000, 0.000000, 9.445312, 0.000000, 14.378906, 0.000000, 17.712891, 0.000000, - 25.095703, 0.000000, 32.701172, 0.000000, 37.406250, 0.000000, 41.220703, 0.000000, - 49.453125, 0.000000, 57.058594, 0.000000, 64.675781, 0.000000 - - - - diff --git a/icu4c/source/test/testdata/rbbitst.txt b/icu4c/source/test/testdata/rbbitst.txt index 7d77588ef97..781ce068be7 100644 --- a/icu4c/source/test/testdata/rbbitst.txt +++ b/icu4c/source/test/testdata/rbbitst.txt @@ -169,18 +169,9 @@ # #•\u0e40\u0e01•\u0e44\u0301\u0e23\u0302\u0303•\u0e40•\u0e40\u0e02•\u0e02• • -# -# ICU-13637 and CLDR-10994 - Indic Grapheme Cluster Boundary changes to support aksaras -# New rule: LinkingConsonant ExtCccZwj* Virama ExtCccZwj* × LinkingConsonant -# Sample Chars: LinkingConsonant: \u0915 -# Virama: \u094d [also Extend] -# ExtCccZWJ: \u0308 -# Extend but not ExtCCCZWJ \u093A - -•\u0915\u094d\u0915• -•\u0915\u0308\u0308\u094d\u0308\u0308\u0915• -•\u0915\u0308\u0308\u094d\u0308\u0308•\u0041• -•\u0915\u0308\u0308\u094d\u093A\u093A•\u0915• +# From L2/14-131, §3.2; made into a single EGC by UTC-179-C31. +# This test would have caught ICU-22956. +•સૻ્સૻ• # # From cldr/common/testData/segmentation/graphemeCluster/TestSegmenter-Bengali.txt @@ -1583,7 +1574,7 @@ Bangkok)• -•Can't<200> •have<200> •breaks<200> •in<200> •xx<200>:•yy<200> •or<200> •struct.field<200> \ +•Can't<200> •have<200> •breaks<200> •in<200> •xx:yy<200> •or<200> •struct.field<200> \ •for<200> •CS<200>-•types<200>.• •\uFF92\uFF76\uFF9E<400> • •xx<200>@•yy<200>.• @@ -2223,3 +2214,7 @@ Bangkok)• •« Complex »« chaining » • •« .618 »• # Interaction with the ICU tailoring to break before such numbers. +# A hyphen following non-breaking space that carries an intervening combining +# mark is treated as word-initial; by LB20a it has no break opportunity after +# it. A bug in ICU 76 incorrectly handled that case (ICU-22986). +• ̄-k• \ No newline at end of file diff --git a/icu4c/source/test/testdata/structLocale.txt b/icu4c/source/test/testdata/structLocale.txt index e808de227c0..6e4a18b9559 100644 --- a/icu4c/source/test/testdata/structLocale.txt +++ b/icu4c/source/test/testdata/structLocale.txt @@ -1545,6 +1545,10 @@ structLocale:table(nofallback){ "", "", } + ZWG{ + "", + "", + } ZWL{ "", "", @@ -4039,6 +4043,14 @@ structLocale:table(nofallback){ many{""} other{""} } + ZWG{ + zero{""} + one{""} + two{""} + few{""} + many{""} + other{""} + } ZWL{ zero{""} one{""} diff --git a/icu4c/source/tools/ctestfw/tstdtmod.cpp b/icu4c/source/tools/ctestfw/tstdtmod.cpp index 649065164b4..66ab79a7db5 100644 --- a/icu4c/source/tools/ctestfw/tstdtmod.cpp +++ b/icu4c/source/tools/ctestfw/tstdtmod.cpp @@ -18,6 +18,11 @@ TestLog::~TestLog() {} +IcuTestErrorCode::IcuTestErrorCode(TestLog &callingTestClass, const char *callingTestName) + : errorCode(U_ZERO_ERROR), + testClass(callingTestClass), testName(callingTestName), scopeMessage() { +} + IcuTestErrorCode::~IcuTestErrorCode() { // Safe because our errlog() does not throw exceptions. if(isFailure()) { @@ -25,6 +30,22 @@ IcuTestErrorCode::~IcuTestErrorCode() { } } +UErrorCode IcuTestErrorCode::reset() { + UErrorCode code = errorCode; + errorCode = U_ZERO_ERROR; + return code; +} + +void IcuTestErrorCode::assertSuccess() const { + if(isFailure()) { + handleFailure(); + } +} + +const char* IcuTestErrorCode::errorName() const { + return u_errorName(errorCode); +} + UBool IcuTestErrorCode::errIfFailureAndReset() { if(isFailure()) { errlog(false, u"expected success", nullptr); @@ -103,10 +124,11 @@ UBool IcuTestErrorCode::expectErrorAndReset(UErrorCode expectedError, const char } void IcuTestErrorCode::setScope(const char* message) { - scopeMessage.remove().append({ message, -1, US_INV }); + UnicodeString us(message, -1, US_INV); + scopeMessage = us; } -void IcuTestErrorCode::setScope(const UnicodeString& message) { +void IcuTestErrorCode::setScope(std::u16string_view message) { scopeMessage = message; } @@ -114,12 +136,12 @@ void IcuTestErrorCode::handleFailure() const { errlog(false, u"(handleFailure)", nullptr); } -void IcuTestErrorCode::errlog(UBool dataErr, const UnicodeString& mainMessage, const char* extraMessage) const { +void IcuTestErrorCode::errlog(UBool dataErr, std::u16string_view mainMessage, const char* extraMessage) const { UnicodeString msg(testName, -1, US_INV); msg.append(u' ').append(mainMessage); msg.append(u" but got error: ").append(UnicodeString(errorName(), -1, US_INV)); - if (!scopeMessage.isEmpty()) { + if (!scopeMessage.empty()) { msg.append(u" scope: ").append(scopeMessage); } diff --git a/icu4c/source/tools/ctestfw/unicode/testlog.h b/icu4c/source/tools/ctestfw/unicode/testlog.h index a7ffbc60848..1b5494bc3fe 100644 --- a/icu4c/source/tools/ctestfw/unicode/testlog.h +++ b/icu4c/source/tools/ctestfw/unicode/testlog.h @@ -13,8 +13,9 @@ #ifndef U_TESTFW_TESTLOG #define U_TESTFW_TESTLOG -#include "unicode/errorcode.h" -#include "unicode/unistr.h" +#include +#include +#include "unicode/utypes.h" #include "unicode/testtype.h" /** Facilitates internal logging of data driven test service @@ -24,18 +25,35 @@ class T_CTEST_EXPORT_API TestLog { public: virtual ~TestLog(); - virtual void errln( const UnicodeString &message ) = 0; - virtual void logln( const UnicodeString &message ) = 0; - virtual void dataerrln( const UnicodeString &message ) = 0; + virtual void errln(std::u16string_view message) = 0; + virtual void logln(std::u16string_view message) = 0; + virtual void dataerrln(std::u16string_view message) = 0; virtual const char* getTestDataPath(UErrorCode& err) = 0; }; -class T_CTEST_EXPORT_API IcuTestErrorCode : public ErrorCode { +// Note: The IcuTestErrorCode used to be a subclass of ErrorCode, but that made it not usable for +// unit tests that work without U_SHOW_CPLUSPLUS_API. +// So instead we *copy* the ErrorCode API. + +class T_CTEST_EXPORT_API IcuTestErrorCode { public: - IcuTestErrorCode(TestLog &callingTestClass, const char *callingTestName) - : testClass(callingTestClass), testName(callingTestName), scopeMessage() {} + IcuTestErrorCode(const IcuTestErrorCode&) = delete; + IcuTestErrorCode& operator=(const IcuTestErrorCode&) = delete; + + IcuTestErrorCode(TestLog &callingTestClass, const char *callingTestName); virtual ~IcuTestErrorCode(); + // ErrorCode API + operator UErrorCode & () { return errorCode; } + operator UErrorCode * () { return &errorCode; } + UBool isSuccess() const { return U_SUCCESS(errorCode); } + UBool isFailure() const { return U_FAILURE(errorCode); } + UErrorCode get() const { return errorCode; } + void set(UErrorCode value) { errorCode=value; } + UErrorCode reset(); + void assertSuccess() const; + const char* errorName() const; + // Returns true if isFailure(). UBool errIfFailureAndReset(); UBool errIfFailureAndReset(const char *fmt, ...); @@ -46,17 +64,18 @@ public: /** Sets an additional message string to be appended to failure output. */ void setScope(const char* message); - void setScope(const UnicodeString& message); + void setScope(std::u16string_view message); protected: - virtual void handleFailure() const override; + virtual void handleFailure() const; private: + UErrorCode errorCode; TestLog &testClass; const char *const testName; - UnicodeString scopeMessage; + std::u16string scopeMessage; - void errlog(UBool dataErr, const UnicodeString& mainMessage, const char* extraMessage) const; + void errlog(UBool dataErr, std::u16string_view mainMessage, const char* extraMessage) const; }; #endif diff --git a/icu4c/source/tools/icuexportdata/icuexportdata.cpp b/icu4c/source/tools/icuexportdata/icuexportdata.cpp index 0a96c9e0e62..dea5d3ace64 100644 --- a/icu4c/source/tools/icuexportdata/icuexportdata.cpp +++ b/icu4c/source/tools/icuexportdata/icuexportdata.cpp @@ -489,12 +489,29 @@ FILE* prepareOutputFile(const char* basename) { #if !UCONFIG_NO_NORMALIZATION -struct PendingDescriptor { +class PendingDescriptor { +public: UChar32 scalar; - uint32_t descriptor; + uint32_t descriptorOrFlags; + // If false, we use the above fields only. If true, descriptor only + // contains the two highest-bit flags and the rest is computed later + // from the fields below. + UBool complex; UBool supplementary; + UBool onlyNonStartersInTrail; + uint32_t len; + uint32_t offset; + + PendingDescriptor(UChar32 scalar, uint32_t descriptor); + PendingDescriptor(UChar32 scalar, uint32_t flags, UBool supplementary, UBool onlyNonStartersInTrail, uint32_t len, uint32_t offset); }; +PendingDescriptor::PendingDescriptor(UChar32 scalar, uint32_t descriptor) + : scalar(scalar), descriptorOrFlags(descriptor), complex(false), supplementary(false), onlyNonStartersInTrail(false), len(0), offset(0) {} + +PendingDescriptor::PendingDescriptor(UChar32 scalar, uint32_t flags, UBool supplementary, UBool onlyNonStartersInTrail, uint32_t len, uint32_t offset) + : scalar(scalar), descriptorOrFlags(flags), complex(true), supplementary(supplementary), onlyNonStartersInTrail(onlyNonStartersInTrail), len(len), offset(offset) {} + void writeCanonicalCompositions(USet* backwardCombiningStarters) { IcuToolErrorCode status("icuexportdata: computeCanonicalCompositions"); const char* basename = "compositions"; @@ -557,21 +574,18 @@ void writeDecompositionTables(const char* basename, const uint16_t* ptr16, size_ fclose(f); } -void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16, USet* uset, USet* reference, const std::vector& pendingTrieInsertions, char16_t passthroughCap) { - IcuToolErrorCode status("icuexportdata: writeDecompositionData"); - FILE* f = prepareOutputFile(basename); - - // Zero is a magic number that means the character decomposes to itself. - LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); - +void pendingInsertionsToTrie(const char* basename, UMutableCPTrie* trie, const std::vector& pendingTrieInsertions, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16) { + IcuToolErrorCode status("icuexportdata: pendingInsertionsToTrie"); // Iterate backwards to insert lower code points in the trie first in case it matters // for trie block allocation. for (int32_t i = pendingTrieInsertions.size() - 1; i >= 0; --i) { const PendingDescriptor& pending = pendingTrieInsertions[i]; - uint32_t additional = 0; - if (!(pending.descriptor & 0xFFFC0000)) { - uint32_t offset = pending.descriptor & 0xFFF; + if (pending.complex) { + uint32_t additional = 0; + uint32_t offset = pending.offset; + uint32_t len = pending.len; if (!pending.supplementary) { + len -= 2; if (offset >= baseSize16) { // This is a offset to supplementary 16-bit data. We have // 16-bit base data and 32-bit base data before. However, @@ -579,6 +593,7 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t additional = baseSize32; } } else { + len -= 1; if (offset >= baseSize32) { // This is an offset to supplementary 32-bit data. We have 16-bit // base data, 32-bit base data, and 16-bit supplementary data before. @@ -591,21 +606,55 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t additional = baseSize16; } } + // +1 to make offset always non-zero + offset += 1; if (offset + additional > 0xFFF) { status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } + if (len > 7) { + status.set(U_INTERNAL_PROGRAM_ERROR); + handleError(status, __LINE__, basename); + } + umutablecptrie_set(trie, pending.scalar, pending.descriptorOrFlags | (uint32_t(pending.onlyNonStartersInTrail) << 4) | len | (offset + additional) << 16, status); + } else { + umutablecptrie_set(trie, pending.scalar, pending.descriptorOrFlags, status); } - // It turns out it's better to swap the halves compared to the initial - // idea in order to put special marker values close to zero so that - // an important marker value becomes 1, so it's efficient to compare - // "1 or 0". Unfortunately, going through all the code to swap - // things is too error prone, so let's do the swapping here in one - // place. - uint32_t oldTrieValue = pending.descriptor + additional; - uint32_t swappedTrieValue = (oldTrieValue >> 16) | (oldTrieValue << 16); - umutablecptrie_set(builder.getAlias(), pending.scalar, swappedTrieValue, status); } +} + +/// Marker that the decomposition does not round trip via NFC. +const uint32_t NON_ROUND_TRIP_MASK = (1 << 30); + +/// Marker that the first character of the decomposition can combine +/// backwards. +const uint32_t BACKWARD_COMBINING_MASK = (1 << 31); + +void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16, USet* uset, USet* reference, const std::vector& pendingTrieInsertions, const std::vector& nfdPendingTrieInsertions, char16_t passthroughCap) { + IcuToolErrorCode status("icuexportdata: writeDecompositionData"); + FILE* f = prepareOutputFile(basename); + + // Zero is a magic number that means the character decomposes to itself. + LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); + + if (uprv_strcmp(basename, "uts46d") != 0) { + // Make surrogates decompose to U+FFFD. Don't do this for UTS 46, since this + // optimization is only used by the UTF-16 slice mode, and UTS 46 is not + // supported in slice modes (which do not support ignorables). + // Mark these as potentially backward-combining, to make lead surrogates + // for non-BMP characters that are backward-combining count as + // backward-combining just in case, though the backward-combiningness + // is not actually being looked at today. + umutablecptrie_setRange(builder.getAlias(), 0xD800, 0xDFFF, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK | 0xFFFD, status); + } + + // Add a marker value for Hangul syllables + umutablecptrie_setRange(builder.getAlias(), 0xAC00, 0xD7A3, 1, status); + + // First put the NFD data in the trie, to be partially overwritten in the NFKD and UTS 46 cases. + // This is easier that changing the logic that computes the pending insertions. + pendingInsertionsToTrie(basename, builder.getAlias(), nfdPendingTrieInsertions, baseSize16, baseSize32, supplementSize16); + pendingInsertionsToTrie(basename, builder.getAlias(), pendingTrieInsertions, baseSize16, baseSize32, supplementSize16); LocalUCPTriePointer utrie(umutablecptrie_buildImmutable( builder.getAlias(), trieType, @@ -613,6 +662,7 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t status)); handleError(status, __LINE__, basename); + // The ICU4X side has changed enough this whole block of expectation checking might be more appropriate to remove. if (reference) { if (uset_contains(reference, 0xFF9E) || uset_contains(reference, 0xFF9F) || !uset_contains(reference, 0x0345)) { // NFD expectations don't hold. The set must not contain the half-width @@ -628,13 +678,9 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t USet* iotaSubscript = uset_openEmpty(); uset_add(iotaSubscript, 0x0345); - uint8_t flags = 0; - USet* halfWidthCheck = uset_cloneAsThawed(uset); uset_removeAll(halfWidthCheck, reference); - if (uset_equals(halfWidthCheck, halfWidthVoicing)) { - flags |= 1; - } else if (!uset_isEmpty(halfWidthCheck)) { + if (!uset_equals(halfWidthCheck, halfWidthVoicing) && !uset_isEmpty(halfWidthCheck)) { // The result was neither empty nor contained exactly // the two half-width voicing marks. The ICU4X // normalizer doesn't know how to deal with this case. @@ -655,72 +701,14 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t uset_close(iotaSubscript); uset_close(halfWidthVoicing); - - fprintf(f, "flags = 0x%X\n", flags); - fprintf(f, "cap = 0x%X\n", passthroughCap); } + fprintf(f, "cap = 0x%X\n", passthroughCap); fprintf(f, "[trie]\n"); usrc_writeUCPTrie(f, "trie", utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); fclose(f); handleError(status, __LINE__, basename); } -// Special marker for the NFKD form of U+FDFA -const int32_t FDFA_MARKER = 3; - -// Special marker for characters whose decomposition starts with a non-starter -// and the decomposition isn't the character itself. -const int32_t SPECIAL_NON_STARTER_DECOMPOSITION_MARKER = 2; - -// Special marker for starters that decompose to themselves but that may -// combine backwards under canonical composition -const int32_t BACKWARD_COMBINING_STARTER_MARKER = 1; - -/// Marker that a complex decomposition isn't round-trippable -/// under re-composition. -/// -/// TODO: When taking a data format break, swap this around with -/// `BACKWARD_COMBINING_STARTER_DECOMPOSITION_MARKER`. -const uint32_t NON_ROUND_TRIP_MARKER = 1; - -/// Marker that a complex decomposition starts with a starter -/// that can combine backwards. -/// -/// TODO: When taking a data format break, swap this around with -/// `NON_ROUND_TRIP_MARKER` to use the same bit as with characters -/// that decompose to self but can combine backwards. -const uint32_t BACKWARD_COMBINING_STARTER_DECOMPOSITION_MARKER = 2; - -UBool permissibleBmpPair(UBool knownToRoundTrip, UChar32 c, UChar32 second) { - if (knownToRoundTrip) { - return true; - } - // Nuktas, Hebrew presentation forms and polytonic Greek with oxia - // are special-cased in ICU4X. - if (c >= 0xFB1D && c <= 0xFB4E) { - // Hebrew presentation forms - return true; - } - if (c >= 0x1F71 && c <= 0x1FFB) { - // Polytonic Greek with oxia - return true; - } - if ((second & 0x7F) == 0x3C && second >= 0x0900 && second <= 0x0BFF) { - // Nukta - return true; - } - // To avoid more branchiness, 4 characters that decompose to - // a BMP starter followed by a BMP non-starter are excluded - // from being encoded directly into the trie value and are - // handled as complex decompositions instead. These are: - // U+0F76 TIBETAN VOWEL SIGN VOCALIC R - // U+0F78 TIBETAN VOWEL SIGN VOCALIC L - // U+212B ANGSTROM SIGN - // U+2ADC FORKING - return false; -} - - // Find the slice `needle` within `storage` and return its index, failing which, // append all elements of `needle` to `storage` and return the index of it at the end. template @@ -749,6 +737,8 @@ size_t findOrAppend(std::vector& storage, const UChar32* needle, size_t needl // Computes data for canonical decompositions +// See components/normalizer/trie-value-format.md in the ICU4X repo +// for documentation of the trie value format. void computeDecompositions(const char* basename, const USet* backwardCombiningStarters, std::vector& storage16, @@ -814,12 +804,23 @@ void computeDecompositions(const char* basename, // Surrogate continue; } + if (c == 0xFFFD) { + // REPLACEMENT CHARACTER + // This character is a starter that decomposes to self, + // so without a special case here it would end up as + // passthrough-eligible in all normalizations forms. + // However, in the potentially-ill-formed UTF-8 case + // UTF-8 errors return U+FFFD from the iterator, and + // errors need to be treated as ineligible for + // passthrough on the slice fast path. By giving + // U+FFFD a trie value whose flags make it ineligible + // for passthrough avoids a specific U+FFFD branch on + // the passthrough fast path. + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK}); + continue; + } UnicodeString src; UnicodeString dst; - // True if we're building non-NFD or we're building NFD but - // the `c` round trips to NFC. - // False if we're building NFD and `c` does not round trip to NFC. - UBool nonNfdOrRoundTrips = true; src.append(c); if (mainNormalizer != nfdNormalizer) { UnicodeString inter; @@ -827,39 +828,12 @@ void computeDecompositions(const char* basename, nfdNormalizer->normalize(inter, dst, status); } else { nfdNormalizer->normalize(src, dst, status); - UnicodeString nfc; - nfcNormalizer->normalize(dst, nfc, status); - nonNfdOrRoundTrips = (src == nfc); - } - if (uts46) { - // Work around https://unicode-org.atlassian.net/browse/ICU-22658 - // TODO: Remove the workaround after data corresponding to - // https://www.unicode.org/L2/L2024/24061.htm#179-C36 lands - // for Unicode 16. - switch (c) { - case 0x2F868: - dst.truncate(0); - dst.append(static_cast(0x36FC)); - break; - case 0x2F874: - dst.truncate(0); - dst.append(static_cast(0x5F53)); - break; - case 0x2F91F: - dst.truncate(0); - dst.append(static_cast(0x243AB)); - break; - case 0x2F95F: - dst.truncate(0); - dst.append(static_cast(0x7AEE)); - break; - case 0x2F9BF: - dst.truncate(0); - dst.append(static_cast(0x45D7)); - break; - } } + UnicodeString nfc; + nfcNormalizer->normalize(dst, nfc, status); + UBool roundTripsViaCanonicalComposition = (src == nfc); + int32_t len = dst.toUTF32(utf32, DECOMPOSITION_BUFFER_SIZE, status); if (!len || (len == 1 && utf32[0] == 0xFFFD && c != 0xFFFD)) { @@ -880,7 +854,7 @@ void computeDecompositions(const char* basename, compositionPassthroughBound = c; uset_add(decompositionStartsWithNonStarter, c); if (src != dst) { - if (c == 0x0340 || c == 0x0341 || c == 0x0343 || c == 0x0344 || c == 0x0F73 || c == 0x0F75 || c == 0x0F81 || c == 0xFF9E || c == 0xFF9F) { + if (c == 0x0340 || c == 0x0341 || c == 0x0343 || c == 0x0344 || c == 0x0F73 || c == 0x0F75 || c == 0x0F81 || (c == 0xFF9E && utf32[0] == 0x3099) || (c == 0xFF9F && utf32[0] == 0x309A)) { specialNonStarterDecomposition = true; } else { // A character whose decomposition starts with a non-starter and isn't the same as the character itself and isn't already hard-coded into ICU4X. @@ -893,18 +867,6 @@ void computeDecompositions(const char* basename, startsWithBackwardCombiningStarter = true; uset_add(decompositionStartsWithBackwardCombiningStarter, c); } - if (c != BACKWARD_COMBINING_STARTER_MARKER && len == 1 && utf32[0] == BACKWARD_COMBINING_STARTER_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } - if (c != SPECIAL_NON_STARTER_DECOMPOSITION_MARKER && len == 1 && utf32[0] == SPECIAL_NON_STARTER_DECOMPOSITION_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } - if (c != FDFA_MARKER && len == 1 && utf32[0] == FDFA_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } if (mainNormalizer != nfdNormalizer) { UnicodeString nfd; nfdNormalizer->normalize(src, nfd, status); @@ -913,24 +875,29 @@ void computeDecompositions(const char* basename, } decompositionPassthroughBound = c; compositionPassthroughBound = c; - } else if (firstCombiningClass) { + } + if (firstCombiningClass) { len = 1; if (specialNonStarterDecomposition) { - utf32[0] = SPECIAL_NON_STARTER_DECOMPOSITION_MARKER; // magic value + // Special marker + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK | 0xD900 | u_getCombiningClass(c)}); } else { // Use the surrogate range to store the canonical combining class - utf32[0] = 0xD800 | static_cast(firstCombiningClass); + // XXX: Should non-started that decompose to self be marked as non-round-trippable in + // case such semantics turn out to be more useful for `NON_ROUND_TRIP_MASK`? + pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_MASK | 0xD800 | static_cast(firstCombiningClass)}); } + continue; } else { if (src == dst) { if (startsWithBackwardCombiningStarter) { - pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_STARTER_MARKER << 16, false}); + pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_MASK}); } continue; } decompositionPassthroughBound = c; // ICU4X hard-codes ANGSTROM SIGN - if (c != 0x212B) { + if (c != 0x212B && mainNormalizer == nfdNormalizer) { UnicodeString raw; if (!nfdNormalizer->getRawDecomposition(c, raw)) { // We're always supposed to have a non-recursive decomposition @@ -978,7 +945,7 @@ void computeDecompositions(const char* basename, } } } - if (!nonNfdOrRoundTrips) { + if (!roundTripsViaCanonicalComposition) { compositionPassthroughBound = c; } if (!len) { @@ -986,7 +953,7 @@ void computeDecompositions(const char* basename, status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } - pendingTrieInsertions.push_back({c, 0xFFFFFFFF, false}); + pendingTrieInsertions.push_back({c, uint32_t(0xFFFFFFFF)}); } else if (len == 1 && ((utf32[0] >= 0x1161 && utf32[0] <= 0x1175) || (utf32[0] >= 0x11A8 && utf32[0] <= 0x11C2))) { // Singleton decompositions to conjoining jamo. if (mainNormalizer == nfdNormalizer) { @@ -994,16 +961,18 @@ void computeDecompositions(const char* basename, status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } - pendingTrieInsertions.push_back({c, static_cast(utf32[0]) << 16, false}); + pendingTrieInsertions.push_back({c, static_cast(utf32[0]) | NON_ROUND_TRIP_MASK | (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0)}); } else if (!startsWithBackwardCombiningStarter && len == 1 && utf32[0] <= 0xFFFF) { - pendingTrieInsertions.push_back({c, static_cast(utf32[0]) << 16, false}); - } else if (!startsWithBackwardCombiningStarter && + pendingTrieInsertions.push_back({c, static_cast(utf32[0]) | NON_ROUND_TRIP_MASK | (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0)}); + } else if (c != 0x212B && // ANGSTROM SIGN is special to make the Harfbuzz case branch less in the more common case. + !startsWithBackwardCombiningStarter && len == 2 && - utf32[0] <= 0xFFFF && - utf32[1] <= 0xFFFF && + utf32[0] <= 0x7FFF && + utf32[1] <= 0x7FFF && + utf32[0] > 0x1F && + utf32[1] > 0x1F && !u_getCombiningClass(utf32[0]) && - u_getCombiningClass(utf32[1]) && - permissibleBmpPair(nonNfdOrRoundTrips, c, utf32[1])) { + u_getCombiningClass(utf32[1])) { for (int32_t i = 0; i < len; ++i) { if (((utf32[i] == 0x0345) && (uprv_strcmp(basename, "uts46d") == 0)) || utf32[i] == 0xFF9E || utf32[i] == 0xFF9F) { // Assert that iota subscript and half-width voicing marks never occur in these @@ -1012,7 +981,7 @@ void computeDecompositions(const char* basename, handleError(status, __LINE__, basename); } } - pendingTrieInsertions.push_back({c, (static_cast(utf32[0]) << 16) | static_cast(utf32[1]), false}); + pendingTrieInsertions.push_back({c, static_cast(utf32[0]) | (static_cast(utf32[1]) << 15) | (roundTripsViaCanonicalComposition ? 0 : NON_ROUND_TRIP_MASK)}); } else { UBool supplementary = false; UBool nonInitialStarter = false; @@ -1046,73 +1015,38 @@ void computeDecompositions(const char* basename, if (len > LONGEST_ENCODABLE_LENGTH_16 || !len || len == 1) { if (len == 18 && c == 0xFDFA) { // Special marker for the one character whose decomposition - // is too long. - pendingTrieInsertions.push_back({c, FDFA_MARKER << 16, supplementary}); + // is too long. (Too long even if we took the fourth bit into use!) + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | 1}); continue; } else { + // Note: There's a fourth bit available, but let's error out + // if it's ever needed so that it doesn't get used without + // updating docs. status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } } } else if (len > LONGEST_ENCODABLE_LENGTH_32 || !len) { + // Note: There's a fourth bit available, but let's error out + // if it's ever needed so that it doesn't get used without + // updating docs. status.set(U_INTERNAL_PROGRAM_ERROR); handleError(status, __LINE__, basename); } - // Complex decomposition - // Format for 16-bit value: - // 15..13: length minus two for 16-bit case and length minus one for - // the 32-bit case. Length 8 needs to fit in three bits in - // the 16-bit case, and this way the value is future-proofed - // up to 9 in the 16-bit case. Zero is unused and length one - // in the 16-bit case goes directly into the trie. - // 12: 1 if all trailing characters are guaranteed non-starters, - // 0 if no guarantees about non-starterness. - // Note: The bit choice is this way around to allow for - // dynamically falling back to not having this but instead - // having one more bit for length by merely choosing - // different masks. - // 11..0: Start offset in storage. The offset is to the logical - // sequence of scalars16, scalars32, supplementary_scalars16, - // supplementary_scalars32. - uint32_t descriptor = static_cast(!nonInitialStarter) << 12; - if (!supplementary) { - descriptor |= (static_cast(len) - 2) << 13; - } else { - descriptor |= (static_cast(len) - 1) << 13; - } - if (descriptor & 0xFFF) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } + size_t index = 0; if (!supplementary) { index = findOrAppend(storage16, utf32, len); } else { index = findOrAppend(storage32, utf32, len); } - if (index > 0xFFF) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } - descriptor |= static_cast(index); - if (!descriptor || descriptor > 0xFFFF) { - // > 0xFFFF should never happen if the code above is correct. - // == 0 should not happen due to the nature of the data. - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, __LINE__, basename); - } - uint32_t nonRoundTripMarker = 0; - if (!nonNfdOrRoundTrips) { - nonRoundTripMarker = (NON_ROUND_TRIP_MARKER << 16); - } - uint32_t canCombineBackwardsMarker = 0; - if (startsWithBackwardCombiningStarter) { - canCombineBackwardsMarker = (BACKWARD_COMBINING_STARTER_DECOMPOSITION_MARKER << 16); - } - pendingTrieInsertions.push_back({c, descriptor | nonRoundTripMarker | canCombineBackwardsMarker, supplementary}); + pendingTrieInsertions.push_back({c, (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0) | (roundTripsViaCanonicalComposition ? 0 : NON_ROUND_TRIP_MASK), supplementary, !nonInitialStarter, uint32_t(len), uint32_t(index)}); } } if (storage16.size() + storage32.size() > 0xFFF) { + // We actually have 14 bits available, but let's error out so + // that docs can be updated when taking a reserved bit out of + // potential future flag usage. status.set(U_INTERNAL_PROGRAM_ERROR); } if (f) { @@ -1489,9 +1423,9 @@ int exportNorm() { uint32_t supplementSize16 = storage16.size() - baseSize16; uint32_t supplementSize32 = storage32.size() - baseSize32; - writeDecompositionData("nfd", baseSize16, baseSize32, supplementSize16, nfdDecompositionStartsWithNonStarter, nullptr, nfdPendingTrieInsertions, static_cast(nfcBound)); - writeDecompositionData("nfkd", baseSize16, baseSize32, supplementSize16, nfkdDecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, nfkdPendingTrieInsertions, static_cast(nfkcBound)); - writeDecompositionData("uts46d", baseSize16, baseSize32, supplementSize16, uts46DecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, uts46PendingTrieInsertions, static_cast(uts46Bound)); + writeDecompositionData("nfd", baseSize16, baseSize32, supplementSize16, nfdDecompositionStartsWithNonStarter, nullptr, nfdPendingTrieInsertions, nfdPendingTrieInsertions, static_cast(nfcBound)); + writeDecompositionData("nfkd", baseSize16, baseSize32, supplementSize16, nfkdDecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, nfkdPendingTrieInsertions, nfdPendingTrieInsertions, static_cast(nfkcBound)); + writeDecompositionData("uts46d", baseSize16, baseSize32, supplementSize16, uts46DecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, uts46PendingTrieInsertions, nfdPendingTrieInsertions, static_cast(uts46Bound)); writeDecompositionTables("nfdex", storage16.data(), baseSize16, storage32.data(), baseSize32); writeDecompositionTables("nfkdex", storage16.data() + baseSize16, supplementSize16, storage32.data() + baseSize32, supplementSize32); diff --git a/icu4c/source/tools/makeconv/makeconv.cpp b/icu4c/source/tools/makeconv/makeconv.cpp index 2156248eaf3..0298cf350e3 100644 --- a/icu4c/source/tools/makeconv/makeconv.cpp +++ b/icu4c/source/tools/makeconv/makeconv.cpp @@ -684,7 +684,7 @@ createConverter(ConvData *data, const char *converterName, UErrorCode *pErrorCod } else if( data->ucm->ext->mappingsLength>0 && - !ucm_checkBaseExt(states, data->ucm->base, data->ucm->ext, data->ucm->ext, false) + !ucm_checkBaseExt(states, data->ucm->base, data->ucm->ext, data->ucm->ext, 0) ) { *pErrorCode=U_INVALID_TABLE_FORMAT; } else if(data->ucm->base->flagsType&UCM_FLAGS_EXPLICIT) { @@ -804,7 +804,7 @@ createConverter(ConvData *data, const char *converterName, UErrorCode *pErrorCod } else if( !ucm_checkValidity(data->ucm->ext, baseStates) || - !ucm_checkBaseExt(baseStates, baseData.ucm->base, data->ucm->ext, data->ucm->ext, false) + !ucm_checkBaseExt(baseStates, baseData.ucm->base, data->ucm->ext, data->ucm->ext, 0) ) { *pErrorCode=U_INVALID_TABLE_FORMAT; } else { diff --git a/icu4c/source/tools/toolutil/ucm.cpp b/icu4c/source/tools/toolutil/ucm.cpp index 923041a53f6..824362a6939 100644 --- a/icu4c/source/tools/toolutil/ucm.cpp +++ b/icu4c/source/tools/toolutil/ucm.cpp @@ -310,7 +310,7 @@ enum { static uint8_t checkBaseExtUnicode(UCMStates *baseStates, UCMTable *base, UCMTable *ext, - UBool moveToExt, UBool intersectBase) { + UBool moveToExt, int8_t intersectBase) { (void)baseStates; UCMapping *mb, *me, *mbLimit, *meLimit; @@ -416,7 +416,7 @@ checkBaseExtUnicode(UCMStates *baseStates, UCMTable *base, UCMTable *ext, static uint8_t checkBaseExtBytes(UCMStates *baseStates, UCMTable *base, UCMTable *ext, - UBool moveToExt, UBool intersectBase) { + UBool moveToExt, int8_t intersectBase) { UCMapping *mb, *me; int32_t *baseMap, *extMap; int32_t b, e, bLimit, eLimit, cmp; @@ -556,7 +556,7 @@ ucm_checkValidity(UCMTable *table, UCMStates *baseStates) { U_CAPI UBool U_EXPORT2 ucm_checkBaseExt(UCMStates *baseStates, UCMTable *base, UCMTable *ext, UCMTable *moveTarget, - UBool intersectBase) { + int8_t intersectBase) { uint8_t result; /* if we have an extension table, we must always use precision flags */ @@ -735,7 +735,7 @@ ucm_separateMappings(UCMFile *ucm, UBool isSISO) { } if(needsMove) { ucm_moveMappings(ucm->base, ucm->ext); - return ucm_checkBaseExt(&ucm->states, ucm->base, ucm->ext, ucm->ext, false); + return ucm_checkBaseExt(&ucm->states, ucm->base, ucm->ext, ucm->ext, 0); } else { ucm_sortTable(ucm->base); return true; diff --git a/icu4c/source/tools/toolutil/ucm.h b/icu4c/source/tools/toolutil/ucm.h index 8ea90604d47..8f78b52e968 100644 --- a/icu4c/source/tools/toolutil/ucm.h +++ b/icu4c/source/tools/toolutil/ucm.h @@ -227,7 +227,7 @@ ucm_checkValidity(UCMTable *ext, UCMStates *baseStates); */ U_CAPI UBool U_EXPORT2 ucm_checkBaseExt(UCMStates *baseStates, UCMTable *base, UCMTable *ext, - UCMTable *moveTarget, UBool intersectBase); + UCMTable *moveTarget, int8_t intersectBase); U_CAPI void U_EXPORT2 ucm_printTable(UCMTable *table, FILE *f, UBool byUnicode); diff --git a/icu4j/demos/pom.xml b/icu4j/demos/pom.xml index 2990cca0a02..52ef383562a 100644 --- a/icu4j/demos/pom.xml +++ b/icu4j/demos/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT demos diff --git a/icu4j/extract-data-files.bat b/icu4j/extract-data-files.bat new file mode 100644 index 00000000000..585194ab04e --- /dev/null +++ b/icu4j/extract-data-files.bat @@ -0,0 +1,99 @@ +@echo off +rem Copyright (C) 2023 and later: Unicode, Inc. and others. +rem License & terms of use: http://www.unicode.org/copyright.html + +rem Check that all the .jar files are present + +cd %icu4j_root% + +set JAR_FILE=main\shared\data\icudata.jar +if exist %JAR_FILE% goto icutzdata + echo Missing %JAR_FILE% + goto:EOF + +:icutzdata +set JAR_FILE=main\shared\data\icutzdata.jar +if exist %JAR_FILE% goto testdata + echo Missing %JAR_FILE% + goto:EOF + +:testdata +set JAR_FILE=main\shared\data\testdata.jar +if exist %JAR_FILE% goto alljarsok + echo Missing %JAR_FILE% + goto:EOF + +:alljarsok + +rem Unpack the pre-built .jar files with data only + +echo Unpacking icudata.jar +cd %icu4j_root% +rd /s/q main\core\src\main\resources\com\ibm\icu\impl\data\icudata +rem jar cannot extract to folder, and /C does now seem to work on Windows. +rem We have to switch folder explicitly +cd main\core\src\main\resources +jar xf %icu4j_root%\main\shared\data\icudata.jar +rd /s/q META-INF +cd %icu4j_root% + +echo Moving charset data +rd /s/q main\charset\src\main\resources\com\ibm\icu\impl\data\icudata +md main\charset\src\main\resources\com\ibm\icu\impl\data\icudata +move main\core\src\main\resources\com\ibm\icu\impl\data\icudata\*.cnv main\charset\src\main\resources\com\ibm\icu\impl\data\icudata\ +move main\core\src\main\resources\com\ibm\icu\impl\data\icudata\cnvalias.icu main\charset\src\main\resources\com\ibm\icu\impl\data\icudata\ + +echo Moving currency data +rd /s/q main\currdata\src\main\resources\com\ibm\icu\impl\data\icudata +md main\currdata\src\main\resources\com\ibm\icu\impl\data\icudata +move main\core\src\main\resources\com\ibm\icu\impl\data\icudata\curr main\currdata\src\main\resources\com\ibm\icu\impl\data\icudata\curr + +echo Moving collate data +rd /s/q main\collate\src\main\resources\com\ibm\icu\impl\data\icudata +md main\collate\src\main\resources\com\ibm\icu\impl\data\icudata +move main\core\src\main\resources\com\ibm\icu\impl\data\icudata\coll main\collate\src\main\resources\com\ibm\icu\impl\data\icudata\coll + +echo Moving langdata data +rd /s/q main\langdata\src\main\resources\com\ibm\icu\impl\data\icudata +md main\langdata\src\main\resources\com\ibm\icu\impl\data\icudata +move main\core\src\main\resources\com\ibm\icu\impl\data\icudata\lang main\langdata\src\main\resources\com\ibm\icu\impl\data\icudata\lang + +echo Moving regiondata data +rd /s/q main\regiondata\src\main\resources\com\ibm\icu\impl\data\icudata +md main\regiondata\src\main\resources\com\ibm\icu\impl\data\icudata +move main\core\src\main\resources\com\ibm\icu\impl\data\icudata\region main\regiondata\src\main\resources\com\ibm\icu\impl\data\icudata\region + +echo Moving translit data +rd /s/q main\translit\src\main\resources\com\ibm\icu\impl\data\icudata +md main\translit\src\main\resources\com\ibm\icu\impl\data\icudata +move main\core\src\main\resources\com\ibm\icu\impl\data\icudata\translit main\translit\src\main\resources\com\ibm\icu\impl\data\icudata\translit + +echo Unpacking icutzdata.jar +rem This unzips together with other existing core files +rem So we don't remove the folder +cd %icu4j_root%\main\core\src\main\resources +jar xf %icu4j_root%\main\shared\data\icutzdata.jar +rd /s/q META-INF + +echo Unpacking testdata.jar +cd %icu4j_root% +rd /s/q main\core\src\test\resources\com\ibm\icu\dev\data\testdata +cd main\core\src\test\resources +jar xf %icu4j_root%\main\shared\data\testdata.jar +rd /s/q META-INF +cd %icu4j_root% + +echo Removing jar files +echo icudata.jar +del main\shared\data\icudata.jar +echo icutzdata.jar +del main\shared\data\icutzdata.jar +echo testdata.jar +del main\shared\data\testdata.jar + +rem remove shared folder, if empty +rd /q main\shared\data +rd /q main\shared + +echo DONE +:EOF diff --git a/icu4j/main/charset/pom.xml b/icu4j/main/charset/pom.xml index 7b705d9a1fb..e754aec46d5 100644 --- a/icu4j/main/charset/pom.xml +++ b/icu4j/main/charset/pom.xml @@ -8,11 +8,12 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml icu4j-charset + ICU4J Charset Provider icu4j-charset is a supplemental library for icu4j, implementing Java Charset SPI. ${proj.url} diff --git a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestCharset.java b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestCharset.java index f42a9f87a37..1f9fc626169 100644 --- a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestCharset.java +++ b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestCharset.java @@ -802,8 +802,8 @@ public class TestCharset extends TestFmwk { int[] badposindices = new int[n]; int[] malfindices = new int[n]; int[] unmapindices = new int[n]; - ArrayList pass = new ArrayList(); - ArrayList exempt = new ArrayList(); + ArrayList pass = new ArrayList<>(); + ArrayList exempt = new ArrayList<>(); outer: for (int conv=0; conv map = Charset.availableCharsets(); + Set keySet = map.keySet(); + Iterator iter = keySet.iterator(); while(iter.hasNext()){ logln("Charset name: "+iter.next().toString()); } diff --git a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestConversion.java b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestConversion.java index 46ce39e44d2..c5803726112 100644 --- a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestConversion.java +++ b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestConversion.java @@ -110,8 +110,8 @@ public class TestConversion extends TestFmwk { String testName = td.getName().toString(); // Iterate through and get each of the test case to process - for (Iterator iter = td.getDataIterator(); iter.hasNext();) { - DataMap testcase = (DataMap) iter.next(); + for (Iterator iter = td.getDataIterator(); iter.hasNext();) { + DataMap testcase = iter.next(); if (testName.equalsIgnoreCase("toUnicode")) { TestToUnicode(testcase, testToUnicode); diff --git a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestSelection.java b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestSelection.java index 4ba80fed1c3..4a74ed06037 100644 --- a/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestSelection.java +++ b/icu4j/main/charset/src/test/java/com/ibm/icu/dev/test/charset/TestSelection.java @@ -127,7 +127,7 @@ public class TestSelection extends TestFmwk { /* This test is to provide better code coverage for CharsetSelector */ @Test public void TestCharsetSelectorCodeCoverage() { - List emptyList = new ArrayList(); + List emptyList = new ArrayList<>(); UnicodeSet nonEmptySet = new UnicodeSet(); nonEmptySet.add(0x0001, 0x0FFF); diff --git a/icu4j/main/collate/pom.xml b/icu4j/main/collate/pom.xml index 0cdfd25e6d0..78eadff0bb1 100644 --- a/icu4j/main/collate/pom.xml +++ b/icu4j/main/collate/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java index f67c9d8ddf4..72a38b8e8d6 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java @@ -52,7 +52,7 @@ public class AlphabeticIndexTest extends TestFmwk { private static final String ARROW = "\u2192"; private static final boolean DEBUG = ICUDebug.enabled("alphabeticindex"); - public static Set KEY_LOCALES = new LinkedHashSet(Arrays.asList( + public static Set KEY_LOCALES = new LinkedHashSet<>(Arrays.asList( "en", "es", "de", "fr", "ja", "it", "tr", "pt", "zh", "nl", "pl", "ar", "ru", "zh_Hant", "ko", "th", "sv", "fi", "da", "he", "nb", "el", "hr", "bg", "sk", "lt", "vi", "lv", "sr", @@ -224,7 +224,7 @@ public class AlphabeticIndexTest extends TestFmwk { final String probe = test[1]; final String expectedLabel = test[2]; alphabeticIndex.addRecord(probe, 1); - List labels = alphabeticIndex.getBucketLabels(); + List labels = alphabeticIndex.getBucketLabels(); logln(labels.toString()); Bucket bucket = find(alphabeticIndex, probe); assertEquals("locale " + test[0] + " name=" + probe + " in bucket", @@ -246,7 +246,7 @@ public class AlphabeticIndexTest extends TestFmwk { @Test public void TestFirstCharacters() { - AlphabeticIndex alphabeticIndex = new AlphabeticIndex(Locale.ENGLISH); + AlphabeticIndex alphabeticIndex = new AlphabeticIndex<>(Locale.ENGLISH); RuleBasedCollator collator = alphabeticIndex.getCollator(); collator.setStrength(Collator.IDENTICAL); Collection firsts = alphabeticIndex.getFirstCharactersInScripts(); @@ -316,7 +316,7 @@ public class AlphabeticIndexTest extends TestFmwk { locales.addAll(Arrays.asList(ULocale.getAvailableLocales())); for (ULocale locale : locales) { try { - AlphabeticIndex alphabeticIndex = new AlphabeticIndex(locale); + AlphabeticIndex alphabeticIndex = new AlphabeticIndex<>(locale); alphabeticIndex.addRecord("hi", "HI"); for (Bucket bucket : alphabeticIndex) { @SuppressWarnings("unused") @@ -331,7 +331,7 @@ public class AlphabeticIndexTest extends TestFmwk { @Test public void TestSetGetSpecialLabels() { - AlphabeticIndex index = new AlphabeticIndex(Locale.GERMAN).addLabels(new Locale("ru")); + AlphabeticIndex index = new AlphabeticIndex(Locale.GERMAN).addLabels(new Locale("ru")); index.setUnderflowLabel("__"); index.setInflowLabel("--"); index.setOverflowLabel("^^"); @@ -339,7 +339,7 @@ public class AlphabeticIndexTest extends TestFmwk { assertEquals("inflow label", "--", index.getInflowLabel()); assertEquals("overflow label", "^^", index.getOverflowLabel()); - ImmutableIndex ii = index.buildImmutableIndex(); + ImmutableIndex ii = index.buildImmutableIndex(); assertEquals("0 -> underflow", "__", ii.getBucket(ii.getBucketIndex("0")).getLabel()); assertEquals("Ω -> inflow", "--", ii.getBucket(ii.getBucketIndex("Ω")).getLabel()); assertEquals("字 -> overflow", "^^", ii.getBucket(ii.getBucketIndex("字")).getLabel()); @@ -357,7 +357,7 @@ public class AlphabeticIndexTest extends TestFmwk { }; for (Object[] test : tests) { int expected = (Integer) test[0]; - AlphabeticIndex alphabeticIndex = new AlphabeticIndex((ULocale)test[1]); + AlphabeticIndex alphabeticIndex = new AlphabeticIndex<>((ULocale)test[1]); for (int i = 2; i < test.length; ++i) { if (test[i] instanceof ULocale) { alphabeticIndex.addLabels((ULocale)test[i]); @@ -365,7 +365,7 @@ public class AlphabeticIndexTest extends TestFmwk { alphabeticIndex.addLabels((UnicodeSet)test[i]); } } - Counter counter = new Counter(); + Counter counter = new Counter<>(); for (Bucket bucket : alphabeticIndex) { LabelType labelType = bucket.getLabelType(); counter.add(labelType, 1); @@ -375,7 +375,7 @@ public class AlphabeticIndexTest extends TestFmwk { assertEquals(LabelType.INFLOW + "\t" + printList, expected, counter.get(LabelType.INFLOW)); if (expected != counter.get(LabelType.INFLOW)) { // for debugging - AlphabeticIndex indexCharacters2 = new AlphabeticIndex((ULocale)test[1]); + AlphabeticIndex indexCharacters2 = new AlphabeticIndex<>((ULocale)test[1]); for (int i = 2; i < test.length; ++i) { if (test[i] instanceof ULocale) { indexCharacters2.addLabels((ULocale)test[i]); @@ -398,7 +398,7 @@ public class AlphabeticIndexTest extends TestFmwk { // Create a simple index where the values for the strings are Integers, and add the strings AlphabeticIndex index = new AlphabeticIndex(desiredLocale).addLabels(additionalLocale); int counter = 0; - Counter itemCount = new Counter(); + Counter itemCount = new Counter<>(); for (String item : test) { index.addRecord(item, counter++); itemCount.add(item, 1); @@ -524,7 +524,7 @@ public class AlphabeticIndexTest extends TestFmwk { private Counter getKeys(AlphabeticIndex.Bucket entry) { Counter keys = new Counter(); - for (AlphabeticIndex.Record x : entry) { + for (AlphabeticIndex.Record x : entry) { String key = x.getName().toString(); keys.add(key, 1); } @@ -536,7 +536,7 @@ public class AlphabeticIndexTest extends TestFmwk { for (String[] localeAndIndexCharacters : localeAndIndexCharactersLists) { ULocale locale = new ULocale(localeAndIndexCharacters[0]); String expectedIndexCharacters = "\u2026:" + localeAndIndexCharacters[1] + ":\u2026"; - Collection alphabeticIndex = new AlphabeticIndex(locale).getBucketLabels(); + Collection alphabeticIndex = new AlphabeticIndex<>(locale).getBucketLabels(); // Join the elements of the list to a string with delimiter ":" StringBuilder sb = new StringBuilder(); @@ -561,7 +561,7 @@ public class AlphabeticIndexTest extends TestFmwk { ULocale[] list = ULocale.getAvailableLocales(); // get keywords combinations // don't bother with multiple combinations at this point - List keywords = new ArrayList(); + List keywords = new ArrayList<>(); keywords.add(""); String[] collationValues = Collator.getKeywordValues("collation"); @@ -570,8 +570,7 @@ public class AlphabeticIndexTest extends TestFmwk { } for (int i = 0; i < list.length; ++i) { - for (Iterator it = keywords.iterator(); it.hasNext();) { - String collationValue = (String) it.next(); + for (String collationValue : keywords) { String localeString = list[i].toString(); if (!KEY_LOCALES.contains(localeString)) continue; // TODO change in exhaustive ULocale locale = new ULocale(localeString + collationValue); @@ -584,13 +583,13 @@ public class AlphabeticIndexTest extends TestFmwk { continue; } boolean isUnihan = collationValue.contains("unihan"); - AlphabeticIndex alphabeticIndex = new AlphabeticIndex(locale); + AlphabeticIndex alphabeticIndex = new AlphabeticIndex<>(locale); if (isUnihan) { // Unihan tailorings have a label per radical, and there are at least 214, // if not more when simplified radicals are distinguished. alphabeticIndex.setMaxLabelCount(500); } - final Collection mainChars = alphabeticIndex.getBucketLabels(); + final Collection mainChars = alphabeticIndex.getBucketLabels(); String mainCharString = mainChars.toString(); if (mainCharString.length() > 500) { mainCharString = mainCharString.substring(0,500) + "..."; @@ -687,7 +686,7 @@ public class AlphabeticIndexTest extends TestFmwk { @Test public void TestFirstScriptCharacters() { Collection firstCharacters = - new AlphabeticIndex(ULocale.ENGLISH).getFirstCharactersInScripts(); + new AlphabeticIndex<>(ULocale.ENGLISH).getFirstCharactersInScripts(); Collection expectedFirstCharacters = firstStringsInScript((RuleBasedCollator) Collator.getInstance(ULocale.ROOT)); Collection diff = new TreeSet(firstCharacters); diff.removeAll(expectedFirstCharacters); @@ -923,7 +922,7 @@ public class AlphabeticIndexTest extends TestFmwk { public void TestHaniFirst() { RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(ULocale.ROOT); coll.setReorderCodes(UScript.HAN); - AlphabeticIndex index = new AlphabeticIndex(coll); + AlphabeticIndex index = new AlphabeticIndex<>(coll); assertEquals("getBucketCount()", 1, index.getBucketCount()); // ... (underflow only) index.addLabels(Locale.ENGLISH); assertEquals("getBucketCount()", 28, index.getBucketCount()); // ... A-Z ... @@ -947,7 +946,7 @@ public class AlphabeticIndexTest extends TestFmwk { public void TestPinyinFirst() { RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(ULocale.CHINESE); coll.setReorderCodes(UScript.HAN); - AlphabeticIndex index = new AlphabeticIndex(coll); + AlphabeticIndex index = new AlphabeticIndex<>(coll); assertEquals("getBucketCount()", 28, index.getBucketCount()); // ... A-Z ... index.addLabels(Locale.CHINESE); assertEquals("getBucketCount()", 28, index.getBucketCount()); // ... A-Z ... @@ -969,10 +968,10 @@ public class AlphabeticIndexTest extends TestFmwk { */ @Test public void TestSchSt() { - AlphabeticIndex index = new AlphabeticIndex(ULocale.GERMAN); + AlphabeticIndex index = new AlphabeticIndex<>(ULocale.GERMAN); index.addLabels(new UnicodeSet("[Æ{Sch*}{St*}]")); // ... A Æ B-R S Sch St T-Z ... - ImmutableIndex immIndex = index.buildImmutableIndex(); + ImmutableIndex immIndex = index.buildImmutableIndex(); assertEquals("getBucketCount()", 31, index.getBucketCount()); assertEquals("immutable getBucketCount()", 31, immIndex.getBucketCount()); String[][] testCases = new String[][] { @@ -1028,8 +1027,8 @@ public class AlphabeticIndexTest extends TestFmwk { */ @Test public void TestChineseZhuyin() { - AlphabeticIndex index = new AlphabeticIndex(ULocale.forLanguageTag("zh-u-co-zhuyin")); - ImmutableIndex immIndex = index.buildImmutableIndex(); + AlphabeticIndex index = new AlphabeticIndex<>(ULocale.forLanguageTag("zh-u-co-zhuyin")); + ImmutableIndex immIndex = index.buildImmutableIndex(); assertEquals("getBucketCount()", 38, immIndex.getBucketCount()); // ... ㄅ ㄆ ㄇ ㄈ ㄉ -- ㄩ ... assertEquals("label 1", "ㄅ", immIndex.getBucket(1).getLabel()); assertEquals("label 2", "ㄆ", immIndex.getBucket(2).getLabel()); @@ -1040,8 +1039,8 @@ public class AlphabeticIndexTest extends TestFmwk { @Test public void TestJapaneseKanji() { - AlphabeticIndex index = new AlphabeticIndex(ULocale.JAPANESE); - AlphabeticIndex.ImmutableIndex immIndex = index.buildImmutableIndex(); + AlphabeticIndex index = new AlphabeticIndex<>(ULocale.JAPANESE); + AlphabeticIndex.ImmutableIndex immIndex = index.buildImmutableIndex(); // There are no index characters for Kanji in the Japanese standard collator. // They should all go into the overflow bucket. final int[] kanji = { 0x4E9C, 0x95C7, 0x4E00, 0x58F1 }; @@ -1061,17 +1060,17 @@ public class AlphabeticIndexTest extends TestFmwk { // The AlphabeticIndex constructor used to throw an exception // because it cloned the collator (which preserves frozenness) // and set the clone's strength to PRIMARY. - AlphabeticIndex index = new AlphabeticIndex(coll); + AlphabeticIndex index = new AlphabeticIndex<>(coll); assertEquals("same strength as input Collator", Collator.IDENTICAL, index.getCollator().getStrength()); } @Test public void TestChineseUnihan() { - AlphabeticIndex index = new AlphabeticIndex(new ULocale("zh-u-co-unihan")); + AlphabeticIndex index = new AlphabeticIndex<>(new ULocale("zh-u-co-unihan")); index.setMaxLabelCount(500); // ICU 54 default is 99. assertEquals("getMaxLabelCount()", 500, index.getMaxLabelCount()); // code coverage - AlphabeticIndex.ImmutableIndex immIndex = index.buildImmutableIndex(); + AlphabeticIndex.ImmutableIndex immIndex = index.buildImmutableIndex(); int bucketCount = immIndex.getBucketCount(); if(bucketCount < 216) { // There should be at least an underflow and overflow label, @@ -1095,8 +1094,8 @@ public class AlphabeticIndexTest extends TestFmwk { @Test public void testAddLabels_Locale() { - AlphabeticIndex ulocaleIndex = new AlphabeticIndex(ULocale.CANADA); - AlphabeticIndex localeIndex = new AlphabeticIndex(Locale.CANADA); + AlphabeticIndex ulocaleIndex = new AlphabeticIndex<>(ULocale.CANADA); + AlphabeticIndex localeIndex = new AlphabeticIndex<>(Locale.CANADA); ulocaleIndex.addLabels(ULocale.SIMPLIFIED_CHINESE); localeIndex.addLabels(Locale.SIMPLIFIED_CHINESE); assertEquals("getBucketLables() results of ulocaleIndex and localeIndex differ", @@ -1171,12 +1170,12 @@ public class AlphabeticIndexTest extends TestFmwk { } private void checkHasBuckets(Locale locale, int script) { - AlphabeticIndex.ImmutableIndex index = + AlphabeticIndex.ImmutableIndex index = new AlphabeticIndex(locale).buildImmutableIndex(); String loc = locale.toString(); assertTrue(loc + " at least 3 buckets", index.getBucketCount() >= 3); - AlphabeticIndex.Bucket bucket = index.getBucket(1); - assertEquals(loc + " real bucket", AlphabeticIndex.Bucket.LabelType.NORMAL, + AlphabeticIndex.Bucket bucket = index.getBucket(1); + assertEquals(loc + " real bucket", LabelType.NORMAL, bucket.getLabelType()); assertEquals(loc + " expected script", script, UScript.getScript(bucket.getLabel().codePointAt(0))); diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationMiscTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationMiscTest.java index f8ef4f98218..54b0ce0825c 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationMiscTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationMiscTest.java @@ -2256,7 +2256,7 @@ public class CollationMiscTest extends TestFmwk { } } - Set foundValues = new TreeSet(Arrays.asList(values)); + Set foundValues = new TreeSet<>(Arrays.asList(values)); for (int i = 0; i < locales.length; ++i) { for (int j = 0; j < values.length; ++j) { diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationRegressionTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationRegressionTest.java index 33b24a3e16c..855b11ff7f5 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationRegressionTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationRegressionTest.java @@ -1072,7 +1072,7 @@ public class CollationRegressionTest extends TestFmwk { String text = "T\u00f6ne"; // o-umlaut CollationElementIterator iter = coll.getCollationElementIterator(text); - List elements = new ArrayList(); + List elements = new ArrayList<>(); int elem; // Iterate forward and collect all of the elements into a Vector @@ -1084,7 +1084,7 @@ public class CollationRegressionTest extends TestFmwk { iter.reset(); int index = elements.size() - 1; while ((elem = iter.previous()) != CollationElementIterator.NULLORDER) { - int expect = ((Integer)elements.get(index)).intValue(); + int expect = (elements.get(index)).intValue(); if (elem != expect) { errln("Mismatch at index " + index diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationServiceTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationServiceTest.java index 8ed39d72d33..6e40d5c133d 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationServiceTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/collator/CollationServiceTest.java @@ -131,9 +131,9 @@ public class CollationServiceTest extends TestFmwk { class CollatorInfo { ULocale locale; Collator collator; - Map displayNames; // locale -> string + Map displayNames; // locale -> string - CollatorInfo(ULocale locale, Collator collator, Map displayNames) { + CollatorInfo(ULocale locale, Collator collator, Map displayNames) { this.locale = locale; this.collator = collator; this.displayNames = displayNames; @@ -142,7 +142,7 @@ public class CollationServiceTest extends TestFmwk { String getDisplayName(ULocale displayLocale) { String name = null; if (displayNames != null) { - name = (String)displayNames.get(displayLocale); + name = displayNames.get(displayLocale); } if (name == null) { name = locale.getDisplayName(displayLocale); @@ -152,11 +152,11 @@ public class CollationServiceTest extends TestFmwk { } class TestFactory extends CollatorFactory { - private Map map; - private Set ids; + private Map map; + private Set ids; TestFactory(CollatorInfo[] info) { - map = new HashMap(); + map = new HashMap<>(); for (int i = 0; i < info.length; ++i) { CollatorInfo ci = info[i]; map.put(ci.locale, ci); @@ -165,7 +165,7 @@ public class CollationServiceTest extends TestFmwk { @Override public Collator createCollator(ULocale loc) { - CollatorInfo ci = (CollatorInfo)map.get(loc); + CollatorInfo ci = map.get(loc); if (ci != null) { return ci.collator; } @@ -174,7 +174,7 @@ public class CollationServiceTest extends TestFmwk { @Override public String getDisplayName(ULocale objectLocale, ULocale displayLocale) { - CollatorInfo ci = (CollatorInfo)map.get(objectLocale); + CollatorInfo ci = map.get(objectLocale); if (ci != null) { return ci.getDisplayName(displayLocale); } @@ -182,12 +182,12 @@ public class CollationServiceTest extends TestFmwk { } @Override - public Set getSupportedLocaleIDs() { + public Set getSupportedLocaleIDs() { if (ids == null) { - HashSet set = new HashSet(); - Iterator iter = map.keySet().iterator(); + HashSet set = new HashSet<>(); + Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { - ULocale locale = (ULocale)iter.next(); + ULocale locale = iter.next(); String id = locale.toString(); set.add(id); } @@ -212,7 +212,7 @@ public class CollationServiceTest extends TestFmwk { // use CollatorFactory getDisplayName(ULocale, ULocale) for coverage @Override - public Set getSupportedLocaleIDs() { + public Set getSupportedLocaleIDs() { return delegate.getSupportedLocaleIDs(); } } @@ -220,7 +220,7 @@ public class CollationServiceTest extends TestFmwk { ULocale fu_FU = new ULocale("fu_FU"); ULocale fu_FU_FOO = new ULocale("fu_FU_FOO"); - Map fuFUNames = new HashMap(); + Map fuFUNames = new HashMap<>(); fuFUNames.put(fu_FU, "ze leetle bunny Fu-Fu"); fuFUNames.put(fu_FU_FOO, "zee leetel bunny Foo-Foo"); fuFUNames.put(ULocale.US, "little bunny Foo Foo"); diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/format/GlobalizationPreferencesTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/format/GlobalizationPreferencesTest.java index 503b9c18eac..84d533e6c75 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/format/GlobalizationPreferencesTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/format/GlobalizationPreferencesTest.java @@ -166,7 +166,7 @@ public class GlobalizationPreferencesTest extends TestFmwk { // setLocales(ULocale[]) logln("Call setLocales(List) after frozen"); bSet = true; - ArrayList list = new ArrayList(1); + ArrayList list = new ArrayList<>(1); list.add(new ULocale("fr_FR")); try { gp.setLocales(list); @@ -274,7 +274,7 @@ public class GlobalizationPreferencesTest extends TestFmwk { // setLocales(List) for (int i = 0; i < INPUT_LOCALEIDS.length; i++) { String[] localeStrings = INPUT_LOCALEIDS[i]; - ArrayList locales = new ArrayList(); + ArrayList locales = new ArrayList<>(); StringBuffer sb = new StringBuffer(); for (int j = 0; j < localeStrings.length; j++) { locales.add(new ULocale(localeStrings[j])); @@ -288,7 +288,7 @@ public class GlobalizationPreferencesTest extends TestFmwk { gp.reset(); gp.setLocales(locales); - List resultLocales = gp.getLocales(); + List resultLocales = gp.getLocales(); if (resultLocales.size() != RESULTS_LOCALEIDS[i].length) { errln("FAIL: Number of locales mismatch - GP:" + resultLocales.size() + " Expected:" + RESULTS_LOCALEIDS[i].length); @@ -322,7 +322,7 @@ public class GlobalizationPreferencesTest extends TestFmwk { gp.reset(); gp.setLocales(localeArray); - List resultLocales = gp.getLocales(); + List resultLocales = gp.getLocales(); if (resultLocales.size() != RESULTS_LOCALEIDS[i].length) { errln("FAIL: Number of locales mismatch - GP:" + resultLocales.size() + " Expected:" + RESULTS_LOCALEIDS[i].length); @@ -1004,11 +1004,11 @@ public class GlobalizationPreferencesTest extends TestFmwk { ULocale loc_peo = new ULocale("peo"); // Locale list - fr_FR_Paris - ArrayList locales1 = new ArrayList(1); + ArrayList locales1 = new ArrayList<>(1); locales1.add(loc_fr_FR_Paris); // Locale list - ain, fr_FR_Paris - ArrayList locales2 = new ArrayList(2); + ArrayList locales2 = new ArrayList<>(2); locales2.add(loc_peo); locales2.add(loc_fr_FR_Paris); @@ -1200,7 +1200,7 @@ public class GlobalizationPreferencesTest extends TestFmwk { } // Set locale - fr, fr_CA, fr_FR - ArrayList lcls = new ArrayList(3); + ArrayList lcls = new ArrayList<>(3); lcls.add(new ULocale("fr")); lcls.add(new ULocale("fr_CA")); lcls.add(new ULocale("fr_FR")); diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/LocaleAliasCollationTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/LocaleAliasCollationTest.java index 8f1f43fc976..b9428743a32 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/LocaleAliasCollationTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/LocaleAliasCollationTest.java @@ -39,7 +39,7 @@ public class LocaleAliasCollationTest extends com.ibm.icu.dev.test.TestFmwk { private static final int _LOCALE_NUMBER = _LOCALES.length; private ULocale[] available = null; - private HashMap availableMap = new HashMap(); + private HashMap availableMap = new HashMap<>(); private static final ULocale _DEFAULT_LOCALE = ULocale.US; public LocaleAliasCollationTest() { diff --git a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/ULocaleCollationTest.java b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/ULocaleCollationTest.java index d4ca74fd03a..4eae21bc52f 100644 --- a/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/ULocaleCollationTest.java +++ b/icu4j/main/collate/src/test/java/com/ibm/icu/dev/test/util/ULocaleCollationTest.java @@ -150,9 +150,9 @@ public class ULocaleCollationTest extends TestFmwk { */ void checkObject(String requestedLocale, Object obj, String expReqValid, String expValidActual) { - Class[] getLocaleParams = new Class[] { ULocale.Type.class }; + Class[] getLocaleParams = new Class[] { ULocale.Type.class }; try { - Class cls = obj.getClass(); + Class cls = obj.getClass(); Method getLocale = cls.getMethod("getLocale", getLocaleParams); ULocale valid = (ULocale) getLocale.invoke(obj, new Object[] { ULocale.VALID_LOCALE }); diff --git a/icu4j/main/common_tests/pom.xml b/icu4j/main/common_tests/pom.xml index e5b051c14c5..47e37993789 100644 --- a/icu4j/main/common_tests/pom.xml +++ b/icu4j/main/common_tests/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java index 04f6a9c2283..3469c626c15 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java @@ -135,9 +135,9 @@ public class DataDrivenCalendarTest extends CoreTestFmwk { // DateFormat fmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee"); // Start the processing int n = 0; - for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { + for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { ++n; - DataMap currentCase = (DataMap) iter.next(); + DataMap currentCase = iter.next(); String caseString = "["+testData.getName()+"#"+n+" "+"]"; String locale = testSetting = currentCase.getString("locale"); @@ -180,7 +180,7 @@ public class DataDrivenCalendarTest extends CoreTestFmwk { boolean useDate = false; - for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { + for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { ++n; DataMap currentCase = (DataMap) iter.next(); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java index 8afcf8cf6cf..819cf1da6e3 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java @@ -86,10 +86,10 @@ public class DataDrivenFormatTest extends CoreTestFmwk { DateFormat basicFmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee"); int n = 0; - for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { + for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { ++n; long now = System.currentTimeMillis(); - DataMap currentCase = (DataMap) iter.next(); + DataMap currentCase = iter.next(); String caseString = "["+testData.getName()+"#"+n+(fmt?"format":"parse")+"]"; String locale = currentCase.getString("locale"); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DateFormatTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DateFormatTest.java index f972ee709cd..5bdf2faabfb 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DateFormatTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/DateFormatTest.java @@ -3533,7 +3533,7 @@ public class DateFormatTest extends CoreTestFmwk { int patidx = 0; while (true) { - Map map = acit.getAttributes(); + Map map = acit.getAttributes(); int limit = acit.getRunLimit(); if (map.isEmpty()) { // Must be pattern literal - '~' @@ -3544,10 +3544,10 @@ public class DateFormatTest extends CoreTestFmwk { acit.next(); } } else { - Set keySet = map.keySet(); + Set keySet = map.keySet(); if (keySet.size() == 1) { // Check the attribute - Iterator keyIterator = keySet.iterator(); + Iterator keyIterator = keySet.iterator(); DateFormat.Field attr = (DateFormat.Field)keyIterator.next(); if (!DATEFORMAT_FIELDS[patidx].equals(attr)) { errln("FAIL: The attribute at " + acit.getIndex() + " in patterns[" + i + "" + @@ -3577,7 +3577,7 @@ public class DateFormatTest extends CoreTestFmwk { ChineseDateFormat cdf = new ChineseDateFormat("y'x'G-Ml-d", ULocale.US); acit = cdf.formatToCharacterIterator(nonLeapMonthDate); - Set keys = acit.getAllAttributeKeys(); + Set keys = acit.getAllAttributeKeys(); if (keys.contains(ChineseDateFormat.Field.IS_LEAP_MONTH)) { errln("FAIL: separate IS_LEAP_MONTH field should not be present for a Chinese calendar non-leap date" + cdf.format(nonLeapMonthDate)); @@ -4744,7 +4744,7 @@ public class DateFormatTest extends CoreTestFmwk { @Test public void TestDotAndAtLeniency() { for (ULocale locale : Arrays.asList(ULocale.ENGLISH, ULocale.FRENCH)) { - List tests = new ArrayList(); + List tests = new ArrayList<>(); for (int dateStyle = DateFormat.FULL; dateStyle <= DateFormat.SHORT; ++dateStyle) { DateFormat dateFormat = DateFormat.getDateInstance(dateStyle, locale); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/IntlTestDecimalFormatAPIC.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/IntlTestDecimalFormatAPIC.java index 2cb92a4d09e..3fb5fcbe563 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/IntlTestDecimalFormatAPIC.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/IntlTestDecimalFormatAPIC.java @@ -459,7 +459,7 @@ public class IntlTestDecimalFormatAPIC extends CoreTestFmwk { /** * compares two vectors regardless of the order of their elements */ - private static boolean compare(List vector1, List vector2) { + private static boolean compare(List vector1, List vector2) { return vector1.size() == vector2.size() && vector1.containsAll(vector2); } @@ -478,7 +478,7 @@ public class IntlTestDecimalFormatAPIC extends CoreTestFmwk { int start = iterator.getRunStart(); int end = iterator.getRunLimit(); - Iterator it = iterator.getAttributes().keySet().iterator(); + Iterator it = iterator.getAttributes().keySet().iterator(); while (it.hasNext()) { AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute) it .next(); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitCompatibilityTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitCompatibilityTest.java new file mode 100644 index 00000000000..69f9eef13b2 --- /dev/null +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitCompatibilityTest.java @@ -0,0 +1,2766 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* + ******************************************************************************* + * Copyright (C) 2013-2016, International Business Machines Corporation and + * others. All Rights Reserved. + ******************************************************************************* + */ +package com.ibm.icu.dev.test.format; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import com.ibm.icu.dev.test.CoreTestFmwk; +import com.ibm.icu.util.MeasureUnit; + +/** + * This class contains only compatibility tests generated by MeasureUnitGeneratorTest. + * Do not add any other tests here. + */ +@RunWith(JUnit4.class) +public class MeasureUnitCompatibilityTest extends CoreTestFmwk { + + @Test + public void TestCompatible53() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.DEGREE, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.ACRE, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.MILLISECOND, + MeasureUnit.CENTIMETER, + MeasureUnit.FOOT, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MILE, + MeasureUnit.MILLIMETER, + MeasureUnit.PICOMETER, + MeasureUnit.YARD, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.OUNCE, + MeasureUnit.POUND, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.WATT, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.MILLIBAR, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.LITER, + MeasureUnit.YEAR, + MeasureUnit.MONTH, + MeasureUnit.WEEK, + MeasureUnit.DAY, + MeasureUnit.HOUR, + MeasureUnit.MINUTE, + MeasureUnit.SECOND, + }; + assertEquals("", 46, units.length); + } + + @Test + public void TestCompatible54() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.ACRE, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.DAY, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.YEAR, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.CALORIE, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.CARAT, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KARAT, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.KELVIN, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.GALLON, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 121, units.length); + } + + @Test + public void TestCompatible55() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.ACRE, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.DAY, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.YEAR, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.CALORIE, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.CARAT, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KARAT, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.GALLON, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 122, units.length); + } + + @Test + public void TestCompatible56() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.YEAR, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.CALORIE, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.CARAT, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KARAT, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.GALLON, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 129, units.length); + } + + @Test + public void TestCompatible57() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.YEAR, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.CALORIE, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.CARAT, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 134, units.length); + } + + @Test + public void TestCompatible58() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + // MeasureUnit.EAST, + // MeasureUnit.NORTH, + // MeasureUnit.SOUTH, + // MeasureUnit.WEST, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.YEAR, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.CALORIE, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.CARAT, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 134, units.length); + } + + @Test + public void TestCompatible59() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.YEAR, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.CALORIE, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.CARAT, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 135, units.length); + } + + // Note that TestCompatible60(), TestCompatible61(), TestCompatible62() + // would be the same as TestCompatible59(), no need to add them. + + @Test + public void TestCompatible63() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.YEAR, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.CALORIE, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.CARAT, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 139, units.length); + } + + @Test + public void TestCompatible64() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 161, units.length); + } + + @Test + public void TestCompatible65() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.DECADE, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.THERM_US, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.DOT_PER_CENTIMETER, + MeasureUnit.DOT_PER_INCH, + MeasureUnit.EM, + MeasureUnit.MEGAPIXEL, + MeasureUnit.PIXEL, + MeasureUnit.PIXEL_PER_CENTIMETER, + MeasureUnit.PIXEL_PER_INCH, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.BAR, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.PASCAL, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 172, units.length); + } + + @Test + public void TestCompatible68() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.DECADE, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.THERM_US, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.DOT, + MeasureUnit.DOT_PER_CENTIMETER, + MeasureUnit.DOT_PER_INCH, + MeasureUnit.EM, + MeasureUnit.MEGAPIXEL, + MeasureUnit.PIXEL, + MeasureUnit.PIXEL_PER_CENTIMETER, + MeasureUnit.PIXEL_PER_INCH, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.EARTH_RADIUS, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.CANDELA, + MeasureUnit.LUMEN, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAIN, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.BAR, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.PASCAL, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.DESSERT_SPOON, + MeasureUnit.DESSERT_SPOON_IMPERIAL, + MeasureUnit.DRAM, + MeasureUnit.DROP, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.JIGGER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINCH, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.QUART_IMPERIAL, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 184, units.length); + } + + @Test + public void TestCompatible69() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.DECADE, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.THERM_US, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.DOT, + MeasureUnit.DOT_PER_CENTIMETER, + MeasureUnit.DOT_PER_INCH, + MeasureUnit.EM, + MeasureUnit.MEGAPIXEL, + MeasureUnit.PIXEL, + MeasureUnit.PIXEL_PER_CENTIMETER, + MeasureUnit.PIXEL_PER_INCH, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.EARTH_RADIUS, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.CANDELA, + MeasureUnit.LUMEN, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAIN, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.BAR, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.PASCAL, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.DESSERT_SPOON, + MeasureUnit.DESSERT_SPOON_IMPERIAL, + MeasureUnit.DRAM, + MeasureUnit.DROP, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.JIGGER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINCH, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.QUART_IMPERIAL, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 185, units.length); + } + + @Test + public void TestCompatible70() { // TestCompatible71 would be identical + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.ITEM, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.DECADE, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.THERM_US, + MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.DOT, + MeasureUnit.DOT_PER_CENTIMETER, + MeasureUnit.DOT_PER_INCH, + MeasureUnit.EM, + MeasureUnit.MEGAPIXEL, + MeasureUnit.PIXEL, + MeasureUnit.PIXEL_PER_CENTIMETER, + MeasureUnit.PIXEL_PER_INCH, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.EARTH_RADIUS, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.CANDELA, + MeasureUnit.LUMEN, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAIN, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.METRIC_TON, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.BAR, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.PASCAL, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.DESSERT_SPOON, + MeasureUnit.DESSERT_SPOON_IMPERIAL, + MeasureUnit.DRAM, + MeasureUnit.DROP, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.JIGGER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINCH, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.QUART_IMPERIAL, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 187, units.length); + } + + // TestCompatible71 would be identical to TestCompatible70, + // no need to add it + + @Test + public void TestCompatible72() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.ITEM, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.DECADE, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.QUARTER, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.THERM_US, + MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.DOT, + MeasureUnit.DOT_PER_CENTIMETER, + MeasureUnit.DOT_PER_INCH, + MeasureUnit.EM, + MeasureUnit.MEGAPIXEL, + MeasureUnit.PIXEL, + MeasureUnit.PIXEL_PER_CENTIMETER, + MeasureUnit.PIXEL_PER_INCH, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.EARTH_RADIUS, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.CANDELA, + MeasureUnit.LUMEN, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAIN, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.TONNE, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.BAR, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.PASCAL, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.DESSERT_SPOON, + MeasureUnit.DESSERT_SPOON_IMPERIAL, + MeasureUnit.DRAM, + MeasureUnit.DROP, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.JIGGER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINCH, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.QUART_IMPERIAL, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 188, units.length); + } + + @Test + public void TestCompatible73() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.ITEM, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.DECADE, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.QUARTER, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.THERM_US, + MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.DOT, + MeasureUnit.DOT_PER_CENTIMETER, + MeasureUnit.DOT_PER_INCH, + MeasureUnit.EM, + MeasureUnit.MEGAPIXEL, + MeasureUnit.PIXEL, + MeasureUnit.PIXEL_PER_CENTIMETER, + MeasureUnit.PIXEL_PER_INCH, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.EARTH_RADIUS, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.CANDELA, + MeasureUnit.LUMEN, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAIN, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.TONNE, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.BAR, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.PASCAL, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.BEAUFORT, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.DESSERT_SPOON, + MeasureUnit.DESSERT_SPOON_IMPERIAL, + MeasureUnit.DRAM, + MeasureUnit.DROP, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.JIGGER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINCH, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.QUART_IMPERIAL, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 189, units.length); + } + + @Test + public void TestCompatible74() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.ITEM, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.DECADE, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.QUARTER, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.THERM_US, + MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.DOT, + MeasureUnit.DOT_PER_CENTIMETER, + MeasureUnit.DOT_PER_INCH, + MeasureUnit.EM, + MeasureUnit.MEGAPIXEL, + MeasureUnit.PIXEL, + MeasureUnit.PIXEL_PER_CENTIMETER, + MeasureUnit.PIXEL_PER_INCH, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.EARTH_RADIUS, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.CANDELA, + MeasureUnit.LUMEN, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAIN, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.TONNE, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.BAR, + MeasureUnit.GASOLINE_ENERGY_DENSITY, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.PASCAL, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.BEAUFORT, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.DESSERT_SPOON, + MeasureUnit.DESSERT_SPOON_IMPERIAL, + MeasureUnit.DRAM, + MeasureUnit.DROP, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.JIGGER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINCH, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.QUART_IMPERIAL, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 190, units.length); + } + + @Test + public void TestCompatible76() { + MeasureUnit[] units = { + MeasureUnit.G_FORCE, + MeasureUnit.METER_PER_SECOND_SQUARED, + MeasureUnit.ARC_MINUTE, + MeasureUnit.ARC_SECOND, + MeasureUnit.DEGREE, + MeasureUnit.RADIAN, + MeasureUnit.REVOLUTION_ANGLE, + MeasureUnit.ACRE, + MeasureUnit.DUNAM, + MeasureUnit.HECTARE, + MeasureUnit.SQUARE_CENTIMETER, + MeasureUnit.SQUARE_FOOT, + MeasureUnit.SQUARE_INCH, + MeasureUnit.SQUARE_KILOMETER, + MeasureUnit.SQUARE_METER, + MeasureUnit.SQUARE_MILE, + MeasureUnit.SQUARE_YARD, + MeasureUnit.ITEM, + MeasureUnit.KARAT, + MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, + MeasureUnit.MILLIGRAM_PER_DECILITER, + MeasureUnit.MILLIMOLE_PER_LITER, + MeasureUnit.MOLE, + MeasureUnit.PERCENT, + MeasureUnit.PERMILLE, + MeasureUnit.PART_PER_MILLION, + MeasureUnit.PERMYRIAD, + MeasureUnit.LITER_PER_100KILOMETERS, + MeasureUnit.LITER_PER_KILOMETER, + MeasureUnit.MILE_PER_GALLON, + MeasureUnit.MILE_PER_GALLON_IMPERIAL, + MeasureUnit.BIT, + MeasureUnit.BYTE, + MeasureUnit.GIGABIT, + MeasureUnit.GIGABYTE, + MeasureUnit.KILOBIT, + MeasureUnit.KILOBYTE, + MeasureUnit.MEGABIT, + MeasureUnit.MEGABYTE, + MeasureUnit.PETABYTE, + MeasureUnit.TERABIT, + MeasureUnit.TERABYTE, + MeasureUnit.CENTURY, + MeasureUnit.DAY, + MeasureUnit.DAY_PERSON, + MeasureUnit.DECADE, + MeasureUnit.HOUR, + MeasureUnit.MICROSECOND, + MeasureUnit.MILLISECOND, + MeasureUnit.MINUTE, + MeasureUnit.MONTH, + MeasureUnit.MONTH_PERSON, + MeasureUnit.NANOSECOND, + MeasureUnit.NIGHT, + MeasureUnit.QUARTER, + MeasureUnit.SECOND, + MeasureUnit.WEEK, + MeasureUnit.WEEK_PERSON, + MeasureUnit.YEAR, + MeasureUnit.YEAR_PERSON, + MeasureUnit.AMPERE, + MeasureUnit.MILLIAMPERE, + MeasureUnit.OHM, + MeasureUnit.VOLT, + MeasureUnit.BRITISH_THERMAL_UNIT, + MeasureUnit.CALORIE, + MeasureUnit.ELECTRONVOLT, + MeasureUnit.FOODCALORIE, + MeasureUnit.JOULE, + MeasureUnit.KILOCALORIE, + MeasureUnit.KILOJOULE, + MeasureUnit.KILOWATT_HOUR, + MeasureUnit.THERM_US, + MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, + MeasureUnit.NEWTON, + MeasureUnit.POUND_FORCE, + MeasureUnit.GIGAHERTZ, + MeasureUnit.HERTZ, + MeasureUnit.KILOHERTZ, + MeasureUnit.MEGAHERTZ, + MeasureUnit.DOT, + MeasureUnit.DOT_PER_CENTIMETER, + MeasureUnit.DOT_PER_INCH, + MeasureUnit.EM, + MeasureUnit.MEGAPIXEL, + MeasureUnit.PIXEL, + MeasureUnit.PIXEL_PER_CENTIMETER, + MeasureUnit.PIXEL_PER_INCH, + MeasureUnit.ASTRONOMICAL_UNIT, + MeasureUnit.CENTIMETER, + MeasureUnit.DECIMETER, + MeasureUnit.EARTH_RADIUS, + MeasureUnit.FATHOM, + MeasureUnit.FOOT, + MeasureUnit.FURLONG, + MeasureUnit.INCH, + MeasureUnit.KILOMETER, + MeasureUnit.LIGHT_YEAR, + MeasureUnit.METER, + MeasureUnit.MICROMETER, + MeasureUnit.MILE, + MeasureUnit.MILE_SCANDINAVIAN, + MeasureUnit.MILLIMETER, + MeasureUnit.NANOMETER, + MeasureUnit.NAUTICAL_MILE, + MeasureUnit.PARSEC, + MeasureUnit.PICOMETER, + MeasureUnit.POINT, + MeasureUnit.SOLAR_RADIUS, + MeasureUnit.YARD, + MeasureUnit.CANDELA, + MeasureUnit.LUMEN, + MeasureUnit.LUX, + MeasureUnit.SOLAR_LUMINOSITY, + MeasureUnit.CARAT, + MeasureUnit.DALTON, + MeasureUnit.EARTH_MASS, + MeasureUnit.GRAIN, + MeasureUnit.GRAM, + MeasureUnit.KILOGRAM, + MeasureUnit.MICROGRAM, + MeasureUnit.MILLIGRAM, + MeasureUnit.OUNCE, + MeasureUnit.OUNCE_TROY, + MeasureUnit.POUND, + MeasureUnit.SOLAR_MASS, + MeasureUnit.STONE, + MeasureUnit.TON, + MeasureUnit.TONNE, + MeasureUnit.GIGAWATT, + MeasureUnit.HORSEPOWER, + MeasureUnit.KILOWATT, + MeasureUnit.MEGAWATT, + MeasureUnit.MILLIWATT, + MeasureUnit.WATT, + MeasureUnit.ATMOSPHERE, + MeasureUnit.BAR, + MeasureUnit.GASOLINE_ENERGY_DENSITY, + MeasureUnit.HECTOPASCAL, + MeasureUnit.INCH_HG, + MeasureUnit.KILOPASCAL, + MeasureUnit.MEGAPASCAL, + MeasureUnit.MILLIBAR, + MeasureUnit.MILLIMETER_OF_MERCURY, + MeasureUnit.PASCAL, + MeasureUnit.POUND_PER_SQUARE_INCH, + MeasureUnit.BEAUFORT, + MeasureUnit.KILOMETER_PER_HOUR, + MeasureUnit.KNOT, + MeasureUnit.LIGHT_SPEED, + MeasureUnit.METER_PER_SECOND, + MeasureUnit.MILE_PER_HOUR, + MeasureUnit.CELSIUS, + MeasureUnit.FAHRENHEIT, + MeasureUnit.GENERIC_TEMPERATURE, + MeasureUnit.KELVIN, + MeasureUnit.NEWTON_METER, + MeasureUnit.POUND_FOOT, + MeasureUnit.ACRE_FOOT, + MeasureUnit.BARREL, + MeasureUnit.BUSHEL, + MeasureUnit.CENTILITER, + MeasureUnit.CUBIC_CENTIMETER, + MeasureUnit.CUBIC_FOOT, + MeasureUnit.CUBIC_INCH, + MeasureUnit.CUBIC_KILOMETER, + MeasureUnit.CUBIC_METER, + MeasureUnit.CUBIC_MILE, + MeasureUnit.CUBIC_YARD, + MeasureUnit.CUP, + MeasureUnit.CUP_METRIC, + MeasureUnit.DECILITER, + MeasureUnit.DESSERT_SPOON, + MeasureUnit.DESSERT_SPOON_IMPERIAL, + MeasureUnit.DRAM, + MeasureUnit.DROP, + MeasureUnit.FLUID_OUNCE, + MeasureUnit.FLUID_OUNCE_IMPERIAL, + MeasureUnit.GALLON, + MeasureUnit.GALLON_IMPERIAL, + MeasureUnit.HECTOLITER, + MeasureUnit.JIGGER, + MeasureUnit.LITER, + MeasureUnit.MEGALITER, + MeasureUnit.MILLILITER, + MeasureUnit.PINCH, + MeasureUnit.PINT, + MeasureUnit.PINT_METRIC, + MeasureUnit.QUART, + MeasureUnit.QUART_IMPERIAL, + MeasureUnit.TABLESPOON, + MeasureUnit.TEASPOON, + }; + assertEquals("", 192, units.length); + } + + /* + * This class contains only compatibility tests generated by MeasureUnitGeneratorTest. + * Do not add any other tests here. + */ +} diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitGeneratorTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitGeneratorTest.java new file mode 100644 index 00000000000..82e22c146cd --- /dev/null +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitGeneratorTest.java @@ -0,0 +1,843 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* + ******************************************************************************* + * Copyright (C) 2013-2016, International Business Machines Corporation and + * others. All Rights Reserved. + ******************************************************************************* + */ +package com.ibm.icu.dev.test.format; + +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TreeMap; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import com.ibm.icu.dev.test.CoreTestFmwk; +import com.ibm.icu.impl.Pair; +import com.ibm.icu.util.MeasureUnit; +import com.ibm.icu.util.NoUnit; +import com.ibm.icu.util.VersionInfo; + +/** + * This is not a real test class. It is only used to + * generate updated unit tests code based on new CLDR data. + * Do not add any other tests here. + * + * See https://unicode-org.github.io/icu/processes/release/tasks/updating-measure-unit.html + * for information on how to update with each new release. + * @author markdavis + */ +@RunWith(JUnit4.class) +public class MeasureUnitGeneratorTest extends CoreTestFmwk { + + private static class OrderedPair, S extends Comparable> extends Pair implements Comparable> { + + private OrderedPair(F first, S second) { + super(first, second); + } + + private static , S extends Comparable> OrderedPair of(F first, S second) { + if (first == null || second == null) { + throw new IllegalArgumentException("OrderedPair.of requires non null values."); + } + return new OrderedPair<>(first, second); + } + + @Override + public int compareTo(OrderedPair other) { + int result = first.compareTo(other.first); + if (result != 0) { + return result; + } + return second.compareTo(other.second); + } + } + + private static final HashSet DRAFT_VERSION_SET = new HashSet<>(); + + private static final HashSet TIME_CODES = new HashSet<>(); + + private static final String[][] JAVA_VERSIONS = { + {"G_FORCE", "53"}, + {"DEGREE", "53"}, + {"ARC_MINUTE", "53"}, + {"ARC_SECOND", "53"}, + {"ACRE", "53"}, + {"HECTARE", "53"}, + {"SQUARE_FOOT", "53"}, + {"SQUARE_KILOMETER", "53"}, + {"SQUARE_METER", "53"}, + {"SQUARE_MILE", "53"}, + {"MILLISECOND", "53"}, + {"CENTIMETER", "53"}, + {"FOOT", "53"}, + {"INCH", "53"}, + {"KILOMETER", "53"}, + {"LIGHT_YEAR", "53"}, + {"METER", "53"}, + {"MILE", "53"}, + {"MILLIMETER", "53"}, + {"PICOMETER", "53"}, + {"YARD", "53"}, + {"GRAM", "53"}, + {"KILOGRAM", "53"}, + {"OUNCE", "53"}, + {"POUND", "53"}, + {"HORSEPOWER", "53"}, + {"KILOWATT", "53"}, + {"WATT", "53"}, + {"HECTOPASCAL", "53"}, + {"INCH_HG", "53"}, + {"MILLIBAR", "53"}, + {"KILOMETER_PER_HOUR", "53"}, + {"METER_PER_SECOND", "53"}, + {"MILE_PER_HOUR", "53"}, + {"CELSIUS", "53"}, + {"FAHRENHEIT", "53"}, + {"CUBIC_KILOMETER", "53"}, + {"CUBIC_MILE", "53"}, + {"LITER", "53"}, + {"YEAR", "53"}, + {"MONTH", "53"}, + {"WEEK", "53"}, + {"DAY", "53"}, + {"HOUR", "53"}, + {"MINUTE", "53"}, + {"SECOND", "53"}, + {"METER_PER_SECOND_SQUARED", "54"}, + {"RADIAN", "54"}, + {"SQUARE_CENTIMETER", "54"}, + {"SQUARE_INCH", "54"}, + {"SQUARE_YARD", "54"}, + {"LITER_PER_KILOMETER", "54"}, + {"MILE_PER_GALLON", "54"}, + {"BIT", "54"}, + {"BYTE", "54"}, + {"GIGABIT", "54"}, + {"GIGABYTE", "54"}, + {"KILOBIT", "54"}, + {"KILOBYTE", "54"}, + {"MEGABIT", "54"}, + {"MEGABYTE", "54"}, + {"TERABIT", "54"}, + {"TERABYTE", "54"}, + {"MICROSECOND", "54"}, + {"NANOSECOND", "54"}, + {"AMPERE", "54"}, + {"MILLIAMPERE", "54"}, + {"OHM", "54"}, + {"VOLT", "54"}, + {"CALORIE", "54"}, + {"FOODCALORIE", "54"}, + {"JOULE", "54"}, + {"KILOCALORIE", "54"}, + {"KILOJOULE", "54"}, + {"KILOWATT_HOUR", "54"}, + {"GIGAHERTZ", "54"}, + {"HERTZ", "54"}, + {"KILOHERTZ", "54"}, + {"MEGAHERTZ", "54"}, + {"ASTRONOMICAL_UNIT", "54"}, + {"DECIMETER", "54"}, + {"FATHOM", "54"}, + {"FURLONG", "54"}, + {"MICROMETER", "54"}, + {"NANOMETER", "54"}, + {"NAUTICAL_MILE", "54"}, + {"PARSEC", "54"}, + {"LUX", "54"}, + {"CARAT", "54"}, + {"METRIC_TON", "54"}, + {"MICROGRAM", "54"}, + {"MILLIGRAM", "54"}, + {"OUNCE_TROY", "54"}, + {"STONE", "54"}, + {"TON", "54"}, + {"GIGAWATT", "54"}, + {"MEGAWATT", "54"}, + {"MILLIWATT", "54"}, + {"MILLIMETER_OF_MERCURY", "54"}, + {"POUND_PER_SQUARE_INCH", "54"}, + {"KARAT", "54"}, + {"KELVIN", "54"}, + {"ACRE_FOOT", "54"}, + {"BUSHEL", "54"}, + {"CENTILITER", "54"}, + {"CUBIC_CENTIMETER", "54"}, + {"CUBIC_FOOT", "54"}, + {"CUBIC_INCH", "54"}, + {"CUBIC_METER", "54"}, + {"CUBIC_YARD", "54"}, + {"CUP", "54"}, + {"DECILITER", "54"}, + {"FLUID_OUNCE", "54"}, + {"GALLON", "54"}, + {"HECTOLITER", "54"}, + {"MEGALITER", "54"}, + {"MILLILITER", "54"}, + {"PINT", "54"}, + {"QUART", "54"}, + {"TABLESPOON", "54"}, + {"TEASPOON", "54"}, + {"GENERIC_TEMPERATURE", "56"}, + {"REVOLUTION_ANGLE", "56"}, + {"LITER_PER_100KILOMETERS", "56"}, + {"CENTURY", "56"}, + {"MILE_SCANDINAVIAN", "56"}, + {"KNOT", "56"}, + {"CUP_METRIC", "56"}, + {"PINT_METRIC", "56"}, + {"MILLIGRAM_PER_DECILITER", "57"}, + {"MILLIMOLE_PER_LITER", "57"}, + {"PART_PER_MILLION", "57"}, + {"MILE_PER_GALLON_IMPERIAL", "57"}, + {"GALLON_IMPERIAL", "57"}, + {"POINT", "59"}, + {"PERCENT", "63"}, + {"PERMILLE", "63"}, + {"PETABYTE", "63"}, + {"ATMOSPHERE", "63"}, + {"DUNAM", "64"}, + {"MOLE", "64"}, + {"PERMYRIAD", "64"}, + {"DAY_PERSON", "64"}, + {"MONTH_PERSON", "64"}, + {"WEEK_PERSON", "64"}, + {"YEAR_PERSON", "64"}, + {"BRITISH_THERMAL_UNIT", "64"}, + {"ELECTRONVOLT", "64"}, + {"NEWTON", "64"}, + {"POUND_FORCE", "64"}, + {"SOLAR_RADIUS", "64"}, + {"SOLAR_LUMINOSITY", "64"}, + {"DALTON", "64"}, + {"EARTH_MASS", "64"}, + {"SOLAR_MASS", "64"}, + {"KILOPASCAL", "64"}, + {"MEGAPASCAL", "64"}, + {"NEWTON_METER", "64"}, + {"POUND_FOOT", "64"}, + {"BARREL", "64"}, + {"FLUID_OUNCE_IMPERIAL", "64"}, + {"DECADE", "65"}, + {"THERM_US", "65"}, + {"DOT_PER_CENTIMETER", "65"}, + {"DOT_PER_INCH", "65"}, + {"EM", "65"}, + {"MEGAPIXEL", "65"}, + {"PIXEL", "65"}, + {"PIXEL_PER_CENTIMETER", "65"}, + {"PIXEL_PER_INCH", "65"}, + {"BAR", "65"}, + {"PASCAL", "65"}, + {"DOT", "68"}, + {"EARTH_RADIUS", "68"}, + {"CANDELA", "68"}, + {"LUMEN", "68"}, + {"GRAIN", "68"}, + {"DESSERT_SPOON", "68"}, + {"DESSERT_SPOON_IMPERIAL", "68"}, + {"DRAM", "68"}, + {"DROP", "68"}, + {"JIGGER", "68"}, + {"PINCH", "68"}, + {"QUART_IMPERIAL", "68"}, + {"MILLIGRAM_OFGLUCOSE_PER_DECILITER", "69"}, + {"ITEM", "70"}, + {"KILOWATT_HOUR_PER_100_KILOMETER", "70"}, + {"QUARTER", "72"}, + {"TONNE", "72"}, + {"BEAUFORT", "73"}, + {"GASOLINE_ENERGY_DENSITY", "74"}, + }; + + private static final HashMap JAVA_VERSION_MAP = new HashMap<>(); + + // modify certain CLDR unit names before generating functions + // that create/get the corresponding MeasureUnit objects + private static final Map CLDR_NAME_REMAP = new HashMap<>(); + + static { + TIME_CODES.add("year"); + TIME_CODES.add("month"); + TIME_CODES.add("week"); + TIME_CODES.add("day"); + TIME_CODES.add("hour"); + TIME_CODES.add("minute"); + TIME_CODES.add("second"); + for (String[] funcNameAndVersion : JAVA_VERSIONS) { + JAVA_VERSION_MAP.put(funcNameAndVersion[0], funcNameAndVersion[1]); + } + + // CLDR_NAME_REMAP entries + // The first two fix overly-generic CLDR unit names + CLDR_NAME_REMAP.put("revolution", "revolution-angle"); + CLDR_NAME_REMAP.put("generic", "generic-temperature"); + // The next seven map updated CLDR 37 names back to their + // old form in order to preserve the old function names + CLDR_NAME_REMAP.put("meter-per-square-second", "meter-per-second-squared"); + CLDR_NAME_REMAP.put("permillion", "part-per-million"); + CLDR_NAME_REMAP.put("liter-per-100-kilometer", "liter-per-100kilometers"); + CLDR_NAME_REMAP.put("inch-ofhg", "inch-hg"); + CLDR_NAME_REMAP.put("millimeter-ofhg", "millimeter-of-mercury"); + CLDR_NAME_REMAP.put("pound-force-per-square-inch", "pound-per-square-inch"); + CLDR_NAME_REMAP.put("pound-force-foot", "pound-foot"); + } + + private static final String ICU_ROOT = findIcuRoot(); + + private static String findIcuRoot() { + URL x = MeasureUnitGeneratorTest.class.getResource("."); + String classFile = x.getFile(); + int idx = classFile.indexOf("/icu4j/main/common_tests/target/"); + if (idx != -1) { + return classFile.substring(0, idx); + } else { + return "${icuroot}"; + } + } + + @Test + public void generateUnitTestsUpdate() throws IOException { + // various generateXXX calls go here, see + // docs/processes/release/tasks/updating-measure-unit.md + // use this test to run each of the following in succession + if (System.getProperty("generateMeasureUnitUpdate") != null) { + final String icuVersion = Integer.toString(VersionInfo.ICU_VERSION.getMajor()); + System.out.println(); + System.out.println("WARNING: open the pairs of files listed below and copy code fragments, not full files!"); + System.out.println("Some kind of diff tool / editor would work best."); + + generateConstants(icuVersion); // update generated MeasureUnit constants + generateBackwardCompatibilityTest(icuVersion); // create TestCompatible + generateCXXHConstants(icuVersion); // update generated createXXX methods + generateCXXConstants(); // update generated code + generateCXXBackwardCompatibilityTest(icuVersion); // create TestCompatible + updateJAVAVersions(icuVersion); // JAVA_VERSIONS + } + } + + private static Map> getUnitsToPerParts() { + TreeMap> allUnits = getAllUnits(); + Map> unitsToPerStrings = + new HashMap<>(); + Map namesToUnits = new HashMap<>(); + for (Map.Entry> entry : allUnits.entrySet()) { + String type = entry.getKey(); + // Currency types are always atomic units, so we can skip these + if (type.equals("currency")) { + continue; + } + for (MeasureUnit unit : entry.getValue()) { + String javaName = toJAVAName(unit); + String[] nameParts = javaName.split("_PER_"); + if (nameParts.length == 1) { + namesToUnits.put(nameParts[0], unit); + } else if (nameParts.length == 2) { + unitsToPerStrings.put(unit, Pair.of(nameParts[0], nameParts[1])); + } + } + } + Map> unitsToPerUnits = + new HashMap<>(); + for (Map.Entry> entry : unitsToPerStrings.entrySet()) { + Pair perStrings = entry.getValue(); + MeasureUnit unit = namesToUnits.get(perStrings.first); + MeasureUnit perUnit = namesToUnits.get(perStrings.second); + if (unit != null && perUnit != null) { + unitsToPerUnits.put(entry.getKey(), Pair.of(unit, perUnit)); + } + } + return unitsToPerUnits; + } + + private static void generateCXXHConstants(String thisVersion) throws IOException { + String fullOutputPath = "${icuroot}/icu4c/source/i18n/unicode/measunit.h"; + try (PrintStream out = createAndStartOutputFile(fullOutputPath)) { + Map seen = new HashMap<>(); + out.println("// Start generated createXXX methods"); + out.println(); + TreeMap> allUnits = getAllUnits(); + for (Map.Entry> entry : allUnits.entrySet()) { + String type = entry.getKey(); + if (type.equals("currency")) { + continue; + } + for (MeasureUnit unit : entry.getValue()) { + String code = unit.getSubtype(); + String name = toCamelCase(unit); + String javaName = toJAVAName(unit); + checkForDup(seen, name, unit); + if (isDraft(javaName)) { + out.println("#ifndef U_HIDE_DRAFT_API"); + } + out.println(" /**"); + out.println(" * Returns by pointer, unit of " + type + ": " + code + "."); + out.println(" * Caller owns returned value and must free it."); + out.printf(" * Also see {@link #get%s()}.\n", name); + out.println(" * @param status ICU error code."); + if (isDraft(javaName)) { + out.println(" * @draft ICU " + getVersion(javaName, thisVersion)); + } else { + out.println(" * @stable ICU " + getVersion(javaName, thisVersion)); + } + out.println(" */"); + out.printf(" static MeasureUnit *create%s(UErrorCode &status);\n", name); + out.println(); + out.println(" /**"); + out.println(" * Returns by value, unit of " + type + ": " + code + "."); + out.printf(" * Also see {@link #create%s()}.\n", name); + String getterVersion = getVersion(javaName, thisVersion); + if (Integer.parseInt(getterVersion) < 64) { + getterVersion = "64"; + } + if (isDraft(javaName)) { + out.println(" * @draft ICU " + getterVersion); + } else { + out.println(" * @stable ICU " + getterVersion); + } + out.println(" */"); + out.printf(" static MeasureUnit get%s();\n", name); + if (isDraft(javaName)) { + out.println("#endif /* U_HIDE_DRAFT_API */"); + } + out.println(""); + // Hack: METRIC-TON unit changed its name from "metric-ton" to "tonne" + // In order to preserve the existing APIs for "metric-ton" we need to + // add those APIs manually + if (name.equals("Tonne")) { + addCXXHForMetricTon(out); + } + } + } + out.println("// End generated createXXX methods"); + } + } + + // Add the headers for "metric-ton" + // The tool won't create them any more + private static void addCXXHForMetricTon(PrintStream out) { + out.println(" /**"); + out.println(" * Returns by pointer, unit of mass: metric-ton"); + out.println(" * (renamed to tonne in CLDR 42 / ICU 72)."); + out.println(" * Caller owns returned value and must free it."); + out.println(" * Note: In ICU 74 this will be deprecated in favor of"); + out.println(" * createTonne(), which is currently draft but will"); + out.println(" * become stable in ICU 74, and which uses the preferred naming."); + out.println(" * Also see {@link #getMetricTon()} and {@link #createTonne()}."); + out.println(" * @param status ICU error code."); + out.println(" * @stable ICU 54"); + out.println(" */"); + out.println(" static MeasureUnit *createMetricTon(UErrorCode &status);"); + out.println(""); + out.println(" /**"); + out.println(" * Returns by value, unit of mass: metric-ton"); + out.println(" * (renamed to tonne in CLDR 42 / ICU 72)."); + out.println(" * Note: In ICU 74 this will be deprecated in favor of"); + out.println(" * getTonne(), which is currently draft but will"); + out.println(" * become stable in ICU 74, and which uses the preferred naming."); + out.println(" * Also see {@link #createMetricTon()} and {@link #getTonne()}."); + out.println(" * @stable ICU 64"); + out.println(" */"); + out.println(" static MeasureUnit getMetricTon();"); + out.println(""); + } + + private static void checkForDup( + Map seen, String name, MeasureUnit unit) { + if (seen.containsKey(name)) { + throw new RuntimeException("\nCollision!!" + unit + ", " + seen.get(name)); + } else { + seen.put(name, unit); + } + } + + private static void updateJAVAVersions(String thisVersion) throws IOException { + String fullOutputPath = "${icuroot}/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitGeneratorTest.java"; + try (PrintStream out = createAndStartOutputFile(fullOutputPath)) { + out.println(); + Map seen = new HashMap<>(); + TreeMap> allUnits = getAllUnits(); + for (Map.Entry> entry : allUnits.entrySet()) { + String type = entry.getKey(); + if (type.equals("currency")) { + continue; + } + for (MeasureUnit unit : entry.getValue()) { + String javaName = toJAVAName(unit); + checkForDup(seen, javaName, unit); + if (!JAVA_VERSION_MAP.containsKey(javaName)) { + out.printf(" {\"%s\", \"%s\"},\n", javaName, thisVersion); + } + } + } + } + } + + + private static TreeMap> getAllUnits() { + final Comparator measureUnitComparator = + (MeasureUnit o1, MeasureUnit o2) -> o1.getSubtype().compareTo(o2.getSubtype()); + TreeMap> allUnits = new TreeMap<>(); + for (String type : MeasureUnit.getAvailableTypes()) { + ArrayList units = new ArrayList<>(MeasureUnit.getAvailable(type)); + Collections.sort(units, measureUnitComparator); + allUnits.put(type, units); + } + return allUnits; + } + + private static void generateCXXConstants() throws IOException { + String fullOutputPath = "${icuroot}/icu4c/source/i18n/measunit.cpp"; + try (PrintStream out = createAndStartOutputFile(fullOutputPath)) { + out.println("// Start generated code for measunit.cpp"); + out.println(""); + TreeMap> allUnits = getAllUnits(); + + // Hack: for C++, add base unit here, but ignore them when printing the create methods. + // Also keep track of the base unit offset to make the C++ default constructor faster. + allUnits.put("none", Arrays.asList(new MeasureUnit[] {NoUnit.BASE})); + int baseTypeIdx = -1; + int baseSubTypeIdx = -1; + + out.println("// Maps from Type ID to offset in gSubTypes."); + out.println("static const int32_t gOffsets[] = {"); + int index = 0; + int typeCount = 0; + int currencyIndex = -1; + for (Map.Entry> entry : allUnits.entrySet()) { + out.printf(" %d,\n", index); + if (entry.getKey() == "currency") { + currencyIndex = typeCount; + } + typeCount++; + index += entry.getValue().size(); + } + assertTrue("currency present", currencyIndex >= 0); + out.printf(" %d\n", index); + out.println("};"); + out.println(); + out.println("static const int32_t kCurrencyOffset = " + currencyIndex + ";"); + out.println(); + out.println("// Must be sorted alphabetically."); + out.println("static const char * const gTypes[] = {"); + boolean first = true; + for (Map.Entry> entry : allUnits.entrySet()) { + if (!first) { + out.println(","); + } + out.print(" \"" + entry.getKey() + "\""); + first = false; + } + out.println(); + out.println("};"); + out.println(); + out.println("// Must be grouped by type and sorted alphabetically within each type."); + out.println("static const char * const gSubTypes[] = {"); + first = true; + int offset = 0; + int typeIdx = 0; + Map measureUnitToOffset = new HashMap<>(); + Map> measureUnitToTypeSubType = + new HashMap<>(); + for (Map.Entry> entry : allUnits.entrySet()) { + int subTypeIdx = 0; + for (MeasureUnit unit : entry.getValue()) { + if (!first) { + out.println(","); + } + if (unit != null) { + out.print(" \"" + unit.getSubtype() + "\""); + } else { + assertEquals("unit only null for \"none\" type", "none", entry.getKey()); + out.print(" \"\""); + } + first = false; + measureUnitToOffset.put(unit, offset); + measureUnitToTypeSubType.put(unit, Pair.of(typeIdx, subTypeIdx)); + if (unit == NoUnit.BASE) { + baseTypeIdx = typeIdx; + baseSubTypeIdx = subTypeIdx; + } + offset++; + subTypeIdx++; + } + typeIdx++; + } + out.println(); + out.println("};"); + out.println(); + + // Build unit per unit offsets to corresponding type sub types sorted by + // unit first and then per unit. + TreeMap, Pair> unitPerUnitOffsetsToTypeSubType + = new TreeMap<>(); + for (Map.Entry> entry + : getUnitsToPerParts().entrySet()) { + Pair unitPerUnit = entry.getValue(); + unitPerUnitOffsetsToTypeSubType.put( + OrderedPair.of( + measureUnitToOffset.get(unitPerUnit.first), + measureUnitToOffset.get(unitPerUnit.second)), + measureUnitToTypeSubType.get(entry.getKey())); + } + + // Print out the fast-path for the default constructor + out.println("// Shortcuts to the base unit in order to make the default constructor fast"); + out.println("static const int32_t kBaseTypeIdx = " + baseTypeIdx + ";"); + out.println("static const int32_t kBaseSubTypeIdx = " + baseSubTypeIdx + ";"); + out.println(); + + Map seen = new HashMap<>(); + for (Map.Entry> entry : allUnits.entrySet()) { + + String type = entry.getKey(); + if (type.equals("currency") || type.equals("none")) { + continue; + } + for (MeasureUnit unit : entry.getValue()) { + String name = toCamelCase(unit); + Pair typeSubType = measureUnitToTypeSubType.get(unit); + if (typeSubType == null) { + throw new IllegalStateException(); + } + checkForDup(seen, name, unit); + out.printf("MeasureUnit *MeasureUnit::create%s(UErrorCode &status) {\n", name); + out.printf(" return MeasureUnit::create(%d, %d, status);\n", + typeSubType.first, typeSubType.second); + out.println("}"); + out.println(); + out.printf("MeasureUnit MeasureUnit::get%s() {\n", name); + out.printf(" return MeasureUnit(%d, %d);\n", + typeSubType.first, typeSubType.second); + out.println("}"); + out.println(); + // Hack: METRIC-TON unit changed its name from "metric-ton" to "tonne" + // In order to preserve the existing APIs for "metric-ton" we need to + // add those APIs manually + if (name.equals("Tonne")) { + addCXXForMetricTon(typeSubType, out); + } + } + } + out.println("// End generated code for measunit.cpp"); + } + } + + // Add the API skeletons for "metric-ton" + // The tool won't create them any more + private static void addCXXForMetricTon(Pair typeSubType, PrintStream out) { + String name = "MetricTon"; + out.printf("MeasureUnit *MeasureUnit::create%s(UErrorCode &status) {\n", name); + out.printf(" return MeasureUnit::create(%d, %d, status);\n", + typeSubType.first, typeSubType.second); + out.println("}"); + out.println(); + out.printf("MeasureUnit MeasureUnit::get%s() {\n", name); + out.printf(" return MeasureUnit(%d, %d);\n", + typeSubType.first, typeSubType.second); + out.println("}"); + out.println(); + } + + private static String toCamelCase(MeasureUnit unit) { + StringBuilder result = new StringBuilder(); + boolean caps = true; + String code = unit.getSubtype(); + + String replacement = CLDR_NAME_REMAP.get(code); + if (replacement != null) { + code = replacement; + } + + int len = code.length(); + for (int i = 0; i < len; i++) { + char ch = code.charAt(i); + if (ch == '-') { + caps = true; + } else if (Character.isDigit(ch)) { + caps = true; + result.append(ch); + } else if (caps) { + result.append(Character.toUpperCase(ch)); + caps = false; + } else { + result.append(ch); + } + } + return result.toString(); + } + + private static boolean isTypeHidden(String type) { + return "currency".equals(type); + } + + private static void generateBackwardCompatibilityTest(String version) throws IOException { + String fullOutputPath = "${icuroot}/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitCompatibilityTest.java"; + try (PrintStream out = createAndStartOutputFile(fullOutputPath)) { + Map seen = new HashMap<>(); + out.println(); + out.printf(" @Test\n"); + out.printf(" public void TestCompatible%s() {\n", version.replace(".", "_")); + out.println(" MeasureUnit[] units = {"); + TreeMap> allUnits = getAllUnits(); + int count = 0; + for (Map.Entry> entry : allUnits.entrySet()) { + if (isTypeHidden(entry.getKey())) { + continue; + } + for (MeasureUnit unit : entry.getValue()) { + String javaName = toJAVAName(unit); + checkForDup(seen, javaName, unit); + out.printf(" MeasureUnit.%s,\n", javaName); + count++; + } + } + out.println(" };"); + out.printf(" assertEquals(\"\", %d, units.length);\n", count); + out.println(" }"); + } + } + + private static void generateCXXBackwardCompatibilityTest(String version) throws IOException { + String fullOutputPath = "${icuroot}/icu4c/source/test/intltest/measfmttest.cpp"; + try (PrintStream out = createAndStartOutputFile(fullOutputPath)) { + out.println(); + Map seen = new HashMap<>(); + out.printf("void MeasureFormatTest::TestCompatible%s() {\n", version.replace(".", "_")); + out.println(" UErrorCode status = U_ZERO_ERROR;"); + out.println(" LocalPointer measureUnit;"); + out.println(" MeasureUnit measureUnitValue;"); + TreeMap> allUnits = getAllUnits(); + for (Map.Entry> entry : allUnits.entrySet()) { + if (isTypeHidden(entry.getKey())) { + continue; + } + for (MeasureUnit unit : entry.getValue()) { + String camelCase = toCamelCase(unit); + checkForDup(seen, camelCase, unit); + out.printf(" measureUnit.adoptInstead(MeasureUnit::create%s(status));\n", camelCase); + out.printf(" measureUnitValue = MeasureUnit::get%s();\n", camelCase); + } + } + out.println(" assertSuccess(\"\", status);"); + out.println("}"); + } + } + + private static String toJAVAName(MeasureUnit unit) { + String code = unit.getSubtype(); + String type = unit.getType(); + + String replacement = CLDR_NAME_REMAP.get(code); + if (replacement != null) { + code = replacement; + } + + String name = code.toUpperCase(Locale.ENGLISH).replace("-", "_"); + if (type.equals("angle")) { + if (code.equals("minute") || code.equals("second")) { + name = "ARC_" + name; + } + } + return name; + } + + private static void generateConstants(String thisVersion) throws IOException { + String fullOutputPath = "${icuroot}/icu4j/main/core/src/main/java/com/ibm/icu/util/MeasureUnit.java"; + try (PrintStream out = createAndStartOutputFile(fullOutputPath)) { + out.println(" // Start generated MeasureUnit constants"); + out.println(); + Map seen = new HashMap<>(); + TreeMap> allUnits = getAllUnits(); + for (Map.Entry> entry : allUnits.entrySet()) { + String type = entry.getKey(); + if (isTypeHidden(type)) { + continue; + } + for (MeasureUnit unit : entry.getValue()) { + String name = toJAVAName(unit); + String code = unit.getSubtype(); + checkForDup(seen, name, unit); + out.println(" /**"); + out.println(" * Constant for unit of " + type + + ": " + + code); + // Special case JAVA had old constants for time from before. + if ("duration".equals(type) && TIME_CODES.contains(code)) { + out.println(" * @stable ICU 4.0"); + } + else if (isDraft(name)) { + out.println(" * @draft ICU " + getVersion(name, thisVersion)); + } else { + out.println(" * @stable ICU " + getVersion(name, thisVersion)); + } + out.println(" */"); + if ("duration".equals(type) && TIME_CODES.contains(code)) { + out.println(" public static final TimeUnit " + name + " = (TimeUnit) MeasureUnit.internalGetInstance(\"" + + type + + "\", \"" + + code + + "\");"); + } else { + out.println(" public static final MeasureUnit " + name + " = MeasureUnit.internalGetInstance(\"" + + type + + "\", \"" + + code + + "\");"); + } + out.println(); + } + } + out.println(" // End generated MeasureUnit constants"); + } + } + + private static String getVersion(String javaName, String thisVersion) { + String version = JAVA_VERSION_MAP.get(javaName); + if (version == null) { + return thisVersion; + } + return version; + } + + private static boolean isDraft(String javaName) { + String version = JAVA_VERSION_MAP.get(javaName); + if (version == null) { + return true; + } + return DRAFT_VERSION_SET.contains(version); + } + + private static PrintStream createAndStartOutputFile(String fullOutputFileName) throws IOException { + if (fullOutputFileName.startsWith("${icuroot}")) { + fullOutputFileName = fullOutputFileName.replace("${icuroot}", ICU_ROOT); + } + File outputFile = new File("target", new File(fullOutputFileName).getName()); + System.out.printf("%nCopy the generated code fragments from / to\n %s \\\n %s%n", + outputFile.getAbsoluteFile(), fullOutputFileName); + + return new PrintStream(outputFile, "utf-8"); + } + + /* + * This is not a real test class. It is only used to + *generate updated unit tests code based on new CLDR data. + * Do not add any other tests here. + */ +} diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitTest.java index fbc50fc5010..01c9295c223 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/MeasureUnitTest.java @@ -18,15 +18,12 @@ import java.lang.reflect.Field; import java.text.FieldPosition; import java.text.ParseException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -38,7 +35,6 @@ import org.junit.runners.JUnit4; import com.ibm.icu.dev.test.CoreTestFmwk; import com.ibm.icu.dev.test.serializable.FormatHandler; import com.ibm.icu.dev.test.serializable.SerializableTestUtility; -import com.ibm.icu.impl.Pair; import com.ibm.icu.impl.Utility; import com.ibm.icu.impl.units.MeasureUnitImpl; import com.ibm.icu.math.BigDecimal; @@ -55,3021 +51,11 @@ import com.ibm.icu.util.TimeUnitAmount; import com.ibm.icu.util.ULocale; /** - * See https://sites.google.com/site/icusite/processes/release/tasks/standards?pli=1 - * for information on how to update with each new release. - * @author markdavis + * This file contains regular unit tests. */ @RunWith(JUnit4.class) public class MeasureUnitTest extends CoreTestFmwk { - static class OrderedPair extends Pair implements Comparable> { - - OrderedPair(F first, S second) { - super(first, second); - } - - public static OrderedPair of(F first, S second) { - if (first == null || second == null) { - throw new IllegalArgumentException("OrderedPair.of requires non null values."); - } - return new OrderedPair<>(first, second); - } - - @Override - public int compareTo(OrderedPair other) { - int result = first.compareTo(other.first); - if (result != 0) { - return result; - } - return second.compareTo(other.second); - } - } - - private static final String[] DRAFT_VERSIONS = {"75", "76"}; - - private static final HashSet DRAFT_VERSION_SET = new HashSet<>(); - - private static final HashSet TIME_CODES = new HashSet<>(); - - private static final String[][] JAVA_VERSIONS = { - {"G_FORCE", "53"}, - {"DEGREE", "53"}, - {"ARC_MINUTE", "53"}, - {"ARC_SECOND", "53"}, - {"ACRE", "53"}, - {"HECTARE", "53"}, - {"SQUARE_FOOT", "53"}, - {"SQUARE_KILOMETER", "53"}, - {"SQUARE_METER", "53"}, - {"SQUARE_MILE", "53"}, - {"MILLISECOND", "53"}, - {"CENTIMETER", "53"}, - {"FOOT", "53"}, - {"INCH", "53"}, - {"KILOMETER", "53"}, - {"LIGHT_YEAR", "53"}, - {"METER", "53"}, - {"MILE", "53"}, - {"MILLIMETER", "53"}, - {"PICOMETER", "53"}, - {"YARD", "53"}, - {"GRAM", "53"}, - {"KILOGRAM", "53"}, - {"OUNCE", "53"}, - {"POUND", "53"}, - {"HORSEPOWER", "53"}, - {"KILOWATT", "53"}, - {"WATT", "53"}, - {"HECTOPASCAL", "53"}, - {"INCH_HG", "53"}, - {"MILLIBAR", "53"}, - {"KILOMETER_PER_HOUR", "53"}, - {"METER_PER_SECOND", "53"}, - {"MILE_PER_HOUR", "53"}, - {"CELSIUS", "53"}, - {"FAHRENHEIT", "53"}, - {"CUBIC_KILOMETER", "53"}, - {"CUBIC_MILE", "53"}, - {"LITER", "53"}, - {"YEAR", "53"}, - {"MONTH", "53"}, - {"WEEK", "53"}, - {"DAY", "53"}, - {"HOUR", "53"}, - {"MINUTE", "53"}, - {"SECOND", "53"}, - {"METER_PER_SECOND_SQUARED", "54"}, - {"RADIAN", "54"}, - {"SQUARE_CENTIMETER", "54"}, - {"SQUARE_INCH", "54"}, - {"SQUARE_YARD", "54"}, - {"LITER_PER_KILOMETER", "54"}, - {"MILE_PER_GALLON", "54"}, - {"BIT", "54"}, - {"BYTE", "54"}, - {"GIGABIT", "54"}, - {"GIGABYTE", "54"}, - {"KILOBIT", "54"}, - {"KILOBYTE", "54"}, - {"MEGABIT", "54"}, - {"MEGABYTE", "54"}, - {"TERABIT", "54"}, - {"TERABYTE", "54"}, - {"MICROSECOND", "54"}, - {"NANOSECOND", "54"}, - {"AMPERE", "54"}, - {"MILLIAMPERE", "54"}, - {"OHM", "54"}, - {"VOLT", "54"}, - {"CALORIE", "54"}, - {"FOODCALORIE", "54"}, - {"JOULE", "54"}, - {"KILOCALORIE", "54"}, - {"KILOJOULE", "54"}, - {"KILOWATT_HOUR", "54"}, - {"GIGAHERTZ", "54"}, - {"HERTZ", "54"}, - {"KILOHERTZ", "54"}, - {"MEGAHERTZ", "54"}, - {"ASTRONOMICAL_UNIT", "54"}, - {"DECIMETER", "54"}, - {"FATHOM", "54"}, - {"FURLONG", "54"}, - {"MICROMETER", "54"}, - {"NANOMETER", "54"}, - {"NAUTICAL_MILE", "54"}, - {"PARSEC", "54"}, - {"LUX", "54"}, - {"CARAT", "54"}, - {"METRIC_TON", "54"}, - {"MICROGRAM", "54"}, - {"MILLIGRAM", "54"}, - {"OUNCE_TROY", "54"}, - {"STONE", "54"}, - {"TON", "54"}, - {"GIGAWATT", "54"}, - {"MEGAWATT", "54"}, - {"MILLIWATT", "54"}, - {"MILLIMETER_OF_MERCURY", "54"}, - {"POUND_PER_SQUARE_INCH", "54"}, - {"KARAT", "54"}, - {"KELVIN", "54"}, - {"ACRE_FOOT", "54"}, - {"BUSHEL", "54"}, - {"CENTILITER", "54"}, - {"CUBIC_CENTIMETER", "54"}, - {"CUBIC_FOOT", "54"}, - {"CUBIC_INCH", "54"}, - {"CUBIC_METER", "54"}, - {"CUBIC_YARD", "54"}, - {"CUP", "54"}, - {"DECILITER", "54"}, - {"FLUID_OUNCE", "54"}, - {"GALLON", "54"}, - {"HECTOLITER", "54"}, - {"MEGALITER", "54"}, - {"MILLILITER", "54"}, - {"PINT", "54"}, - {"QUART", "54"}, - {"TABLESPOON", "54"}, - {"TEASPOON", "54"}, - {"GENERIC_TEMPERATURE", "56"}, - {"REVOLUTION_ANGLE", "56"}, - {"LITER_PER_100KILOMETERS", "56"}, - {"CENTURY", "56"}, - {"MILE_SCANDINAVIAN", "56"}, - {"KNOT", "56"}, - {"CUP_METRIC", "56"}, - {"PINT_METRIC", "56"}, - {"MILLIGRAM_PER_DECILITER", "57"}, - {"MILLIMOLE_PER_LITER", "57"}, - {"PART_PER_MILLION", "57"}, - {"MILE_PER_GALLON_IMPERIAL", "57"}, - {"GALLON_IMPERIAL", "57"}, - {"POINT", "59"}, - {"PERCENT", "63"}, - {"PERMILLE", "63"}, - {"PETABYTE", "63"}, - {"ATMOSPHERE", "63"}, - {"DUNAM", "64"}, - {"MOLE", "64"}, - {"PERMYRIAD", "64"}, - {"DAY_PERSON", "64"}, - {"MONTH_PERSON", "64"}, - {"WEEK_PERSON", "64"}, - {"YEAR_PERSON", "64"}, - {"BRITISH_THERMAL_UNIT", "64"}, - {"ELECTRONVOLT", "64"}, - {"NEWTON", "64"}, - {"POUND_FORCE", "64"}, - {"SOLAR_RADIUS", "64"}, - {"SOLAR_LUMINOSITY", "64"}, - {"DALTON", "64"}, - {"EARTH_MASS", "64"}, - {"SOLAR_MASS", "64"}, - {"KILOPASCAL", "64"}, - {"MEGAPASCAL", "64"}, - {"NEWTON_METER", "64"}, - {"POUND_FOOT", "64"}, - {"BARREL", "64"}, - {"FLUID_OUNCE_IMPERIAL", "64"}, - {"DECADE", "65"}, - {"THERM_US", "65"}, - {"DOT_PER_CENTIMETER", "65"}, - {"DOT_PER_INCH", "65"}, - {"EM", "65"}, - {"MEGAPIXEL", "65"}, - {"PIXEL", "65"}, - {"PIXEL_PER_CENTIMETER", "65"}, - {"PIXEL_PER_INCH", "65"}, - {"BAR", "65"}, - {"PASCAL", "65"}, - {"DOT", "68"}, - {"EARTH_RADIUS", "68"}, - {"CANDELA", "68"}, - {"LUMEN", "68"}, - {"GRAIN", "68"}, - {"DESSERT_SPOON", "68"}, - {"DESSERT_SPOON_IMPERIAL", "68"}, - {"DRAM", "68"}, - {"DROP", "68"}, - {"JIGGER", "68"}, - {"PINCH", "68"}, - {"QUART_IMPERIAL", "68"}, - {"MILLIGRAM_OFGLUCOSE_PER_DECILITER", "69"}, - {"ITEM", "70"}, - {"KILOWATT_HOUR_PER_100_KILOMETER", "70"}, - {"QUARTER", "72"}, - {"TONNE", "72"}, - {"BEAUFORT", "73"}, - {"GASOLINE_ENERGY_DENSITY", "74"}, - }; - - private static final HashMap JAVA_VERSION_MAP = new HashMap<>(); - - // modify certain CLDR unit names before generating functions - // that create/get the corresponding MeasureUnit objects - private static final Map CLDR_NAME_REMAP = new HashMap(); - - static { - TIME_CODES.add("year"); - TIME_CODES.add("month"); - TIME_CODES.add("week"); - TIME_CODES.add("day"); - TIME_CODES.add("hour"); - TIME_CODES.add("minute"); - TIME_CODES.add("second"); - for (String verNum : DRAFT_VERSIONS) { - DRAFT_VERSION_SET.add(verNum); - } - for (String[] funcNameAndVersion : JAVA_VERSIONS) { - JAVA_VERSION_MAP.put(funcNameAndVersion[0], funcNameAndVersion[1]); - } - - // CLDR_NAME_REMAP entries - // The first two fix overly-generic CLDR unit names - CLDR_NAME_REMAP.put("revolution", "revolution-angle"); - CLDR_NAME_REMAP.put("generic", "generic-temperature"); - // The next seven map updated CLDR 37 names back to their - // old form in order to preserve the old function names - CLDR_NAME_REMAP.put("meter-per-square-second", "meter-per-second-squared"); - CLDR_NAME_REMAP.put("permillion", "part-per-million"); - CLDR_NAME_REMAP.put("liter-per-100-kilometer", "liter-per-100kilometers"); - CLDR_NAME_REMAP.put("inch-ofhg", "inch-hg"); - CLDR_NAME_REMAP.put("millimeter-ofhg", "millimeter-of-mercury"); - CLDR_NAME_REMAP.put("pound-force-per-square-inch", "pound-per-square-inch"); - CLDR_NAME_REMAP.put("pound-force-foot", "pound-foot"); - } - - @Test - public void testZZZ() { - // various generateXXX calls go here, see - // docs/processes/release/tasks/updating-measure-unit.md - // use this test to run each of the following in succession - //generateConstants("76"); // for MeasureUnit.java, update generated MeasureUnit constants - //generateBackwardCompatibilityTest("76"); // for MeasureUnitTest.java, create TestCompatible74 - //generateCXXHConstants("76"); // for measunit.h, update generated createXXX methods - //generateCXXConstants(); // for measunit.cpp, update generated code - //generateCXXBackwardCompatibilityTest("74"); // for measfmttest.cpp, create TestCompatible74 - //updateJAVAVersions("74"); // for MeasureUnitTest.java, JAVA_VERSIONS - } - - @Test - public void TestCompatible53() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.DEGREE, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.ACRE, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.MILLISECOND, - MeasureUnit.CENTIMETER, - MeasureUnit.FOOT, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MILE, - MeasureUnit.MILLIMETER, - MeasureUnit.PICOMETER, - MeasureUnit.YARD, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.OUNCE, - MeasureUnit.POUND, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.WATT, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.MILLIBAR, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.LITER, - MeasureUnit.YEAR, - MeasureUnit.MONTH, - MeasureUnit.WEEK, - MeasureUnit.DAY, - MeasureUnit.HOUR, - MeasureUnit.MINUTE, - MeasureUnit.SECOND, - }; - assertEquals("", 46, units.length); - } - - @Test - public void TestCompatible54() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.ACRE, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.DAY, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.YEAR, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.CALORIE, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.CARAT, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KARAT, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.KELVIN, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.GALLON, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 121, units.length); - } - - @Test - public void TestCompatible55() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.ACRE, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.DAY, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.YEAR, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.CALORIE, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.CARAT, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KARAT, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.GALLON, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 122, units.length); - } - - @Test - public void TestCompatible56() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.YEAR, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.CALORIE, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.CARAT, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KARAT, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.GALLON, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 129, units.length); - } - - @Test - public void TestCompatible57() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.YEAR, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.CALORIE, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.CARAT, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 134, units.length); - } - - @Test - public void TestCompatible58() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - // MeasureUnit.EAST, - // MeasureUnit.NORTH, - // MeasureUnit.SOUTH, - // MeasureUnit.WEST, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.YEAR, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.CALORIE, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.CARAT, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 134, units.length); - } - - @Test - public void TestCompatible59() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.YEAR, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.CALORIE, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.CARAT, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 135, units.length); - } - - // Note that TestCompatible60(), TestCompatible61(), TestCompatible62() - // would be the same as TestCompatible59(), no need to add them. - - @Test - public void TestCompatible63() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.YEAR, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.CALORIE, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.CARAT, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 139, units.length); - } - - @Test - public void TestCompatible64() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 161, units.length); - } - - @Test - public void TestCompatible65() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.DECADE, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.THERM_US, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.DOT_PER_CENTIMETER, - MeasureUnit.DOT_PER_INCH, - MeasureUnit.EM, - MeasureUnit.MEGAPIXEL, - MeasureUnit.PIXEL, - MeasureUnit.PIXEL_PER_CENTIMETER, - MeasureUnit.PIXEL_PER_INCH, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.BAR, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.PASCAL, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 172, units.length); - } - - @Test - public void TestCompatible68() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.DECADE, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.THERM_US, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.DOT, - MeasureUnit.DOT_PER_CENTIMETER, - MeasureUnit.DOT_PER_INCH, - MeasureUnit.EM, - MeasureUnit.MEGAPIXEL, - MeasureUnit.PIXEL, - MeasureUnit.PIXEL_PER_CENTIMETER, - MeasureUnit.PIXEL_PER_INCH, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.EARTH_RADIUS, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.CANDELA, - MeasureUnit.LUMEN, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAIN, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.BAR, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.PASCAL, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.DESSERT_SPOON, - MeasureUnit.DESSERT_SPOON_IMPERIAL, - MeasureUnit.DRAM, - MeasureUnit.DROP, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.JIGGER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINCH, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.QUART_IMPERIAL, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 184, units.length); - } - - @Test - public void TestCompatible69() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.DECADE, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.THERM_US, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.DOT, - MeasureUnit.DOT_PER_CENTIMETER, - MeasureUnit.DOT_PER_INCH, - MeasureUnit.EM, - MeasureUnit.MEGAPIXEL, - MeasureUnit.PIXEL, - MeasureUnit.PIXEL_PER_CENTIMETER, - MeasureUnit.PIXEL_PER_INCH, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.EARTH_RADIUS, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.CANDELA, - MeasureUnit.LUMEN, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAIN, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.BAR, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.PASCAL, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.DESSERT_SPOON, - MeasureUnit.DESSERT_SPOON_IMPERIAL, - MeasureUnit.DRAM, - MeasureUnit.DROP, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.JIGGER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINCH, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.QUART_IMPERIAL, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 185, units.length); - } - - @Test - public void TestCompatible70() { // TestCompatible71 would be identical - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.ITEM, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.DECADE, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.THERM_US, - MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.DOT, - MeasureUnit.DOT_PER_CENTIMETER, - MeasureUnit.DOT_PER_INCH, - MeasureUnit.EM, - MeasureUnit.MEGAPIXEL, - MeasureUnit.PIXEL, - MeasureUnit.PIXEL_PER_CENTIMETER, - MeasureUnit.PIXEL_PER_INCH, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.EARTH_RADIUS, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.CANDELA, - MeasureUnit.LUMEN, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAIN, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.METRIC_TON, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.BAR, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.PASCAL, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.DESSERT_SPOON, - MeasureUnit.DESSERT_SPOON_IMPERIAL, - MeasureUnit.DRAM, - MeasureUnit.DROP, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.JIGGER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINCH, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.QUART_IMPERIAL, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 187, units.length); - } - - // TestCompatible71 would be identical to TestCompatible70, - // no need to add it - - @Test - public void TestCompatible72() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.ITEM, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.DECADE, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.QUARTER, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.THERM_US, - MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.DOT, - MeasureUnit.DOT_PER_CENTIMETER, - MeasureUnit.DOT_PER_INCH, - MeasureUnit.EM, - MeasureUnit.MEGAPIXEL, - MeasureUnit.PIXEL, - MeasureUnit.PIXEL_PER_CENTIMETER, - MeasureUnit.PIXEL_PER_INCH, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.EARTH_RADIUS, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.CANDELA, - MeasureUnit.LUMEN, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAIN, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.TONNE, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.BAR, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.PASCAL, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.DESSERT_SPOON, - MeasureUnit.DESSERT_SPOON_IMPERIAL, - MeasureUnit.DRAM, - MeasureUnit.DROP, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.JIGGER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINCH, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.QUART_IMPERIAL, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 188, units.length); - } - - @Test - public void TestCompatible73() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.ITEM, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.DECADE, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.QUARTER, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.THERM_US, - MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.DOT, - MeasureUnit.DOT_PER_CENTIMETER, - MeasureUnit.DOT_PER_INCH, - MeasureUnit.EM, - MeasureUnit.MEGAPIXEL, - MeasureUnit.PIXEL, - MeasureUnit.PIXEL_PER_CENTIMETER, - MeasureUnit.PIXEL_PER_INCH, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.EARTH_RADIUS, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.CANDELA, - MeasureUnit.LUMEN, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAIN, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.TONNE, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.BAR, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.PASCAL, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.BEAUFORT, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.DESSERT_SPOON, - MeasureUnit.DESSERT_SPOON_IMPERIAL, - MeasureUnit.DRAM, - MeasureUnit.DROP, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.JIGGER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINCH, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.QUART_IMPERIAL, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 189, units.length); - } - - @Test - public void TestCompatible74() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.ITEM, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.DECADE, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.QUARTER, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.THERM_US, - MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.DOT, - MeasureUnit.DOT_PER_CENTIMETER, - MeasureUnit.DOT_PER_INCH, - MeasureUnit.EM, - MeasureUnit.MEGAPIXEL, - MeasureUnit.PIXEL, - MeasureUnit.PIXEL_PER_CENTIMETER, - MeasureUnit.PIXEL_PER_INCH, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.EARTH_RADIUS, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.CANDELA, - MeasureUnit.LUMEN, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAIN, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.TONNE, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.BAR, - MeasureUnit.GASOLINE_ENERGY_DENSITY, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.PASCAL, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.BEAUFORT, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.DESSERT_SPOON, - MeasureUnit.DESSERT_SPOON_IMPERIAL, - MeasureUnit.DRAM, - MeasureUnit.DROP, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.JIGGER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINCH, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.QUART_IMPERIAL, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 190, units.length); - } - - public void TestCompatible76() { - MeasureUnit[] units = { - MeasureUnit.G_FORCE, - MeasureUnit.METER_PER_SECOND_SQUARED, - MeasureUnit.ARC_MINUTE, - MeasureUnit.ARC_SECOND, - MeasureUnit.DEGREE, - MeasureUnit.RADIAN, - MeasureUnit.REVOLUTION_ANGLE, - MeasureUnit.ACRE, - MeasureUnit.DUNAM, - MeasureUnit.HECTARE, - MeasureUnit.SQUARE_CENTIMETER, - MeasureUnit.SQUARE_FOOT, - MeasureUnit.SQUARE_INCH, - MeasureUnit.SQUARE_KILOMETER, - MeasureUnit.SQUARE_METER, - MeasureUnit.SQUARE_MILE, - MeasureUnit.SQUARE_YARD, - MeasureUnit.ITEM, - MeasureUnit.KARAT, - MeasureUnit.MILLIGRAM_OFGLUCOSE_PER_DECILITER, - MeasureUnit.MILLIGRAM_PER_DECILITER, - MeasureUnit.MILLIMOLE_PER_LITER, - MeasureUnit.MOLE, - MeasureUnit.PERCENT, - MeasureUnit.PERMILLE, - MeasureUnit.PART_PER_MILLION, - MeasureUnit.PERMYRIAD, - MeasureUnit.LITER_PER_100KILOMETERS, - MeasureUnit.LITER_PER_KILOMETER, - MeasureUnit.MILE_PER_GALLON, - MeasureUnit.MILE_PER_GALLON_IMPERIAL, - MeasureUnit.BIT, - MeasureUnit.BYTE, - MeasureUnit.GIGABIT, - MeasureUnit.GIGABYTE, - MeasureUnit.KILOBIT, - MeasureUnit.KILOBYTE, - MeasureUnit.MEGABIT, - MeasureUnit.MEGABYTE, - MeasureUnit.PETABYTE, - MeasureUnit.TERABIT, - MeasureUnit.TERABYTE, - MeasureUnit.CENTURY, - MeasureUnit.DAY, - MeasureUnit.DAY_PERSON, - MeasureUnit.DECADE, - MeasureUnit.HOUR, - MeasureUnit.MICROSECOND, - MeasureUnit.MILLISECOND, - MeasureUnit.MINUTE, - MeasureUnit.MONTH, - MeasureUnit.MONTH_PERSON, - MeasureUnit.NANOSECOND, - MeasureUnit.NIGHT, - MeasureUnit.QUARTER, - MeasureUnit.SECOND, - MeasureUnit.WEEK, - MeasureUnit.WEEK_PERSON, - MeasureUnit.YEAR, - MeasureUnit.YEAR_PERSON, - MeasureUnit.AMPERE, - MeasureUnit.MILLIAMPERE, - MeasureUnit.OHM, - MeasureUnit.VOLT, - MeasureUnit.BRITISH_THERMAL_UNIT, - MeasureUnit.CALORIE, - MeasureUnit.ELECTRONVOLT, - MeasureUnit.FOODCALORIE, - MeasureUnit.JOULE, - MeasureUnit.KILOCALORIE, - MeasureUnit.KILOJOULE, - MeasureUnit.KILOWATT_HOUR, - MeasureUnit.THERM_US, - MeasureUnit.KILOWATT_HOUR_PER_100_KILOMETER, - MeasureUnit.NEWTON, - MeasureUnit.POUND_FORCE, - MeasureUnit.GIGAHERTZ, - MeasureUnit.HERTZ, - MeasureUnit.KILOHERTZ, - MeasureUnit.MEGAHERTZ, - MeasureUnit.DOT, - MeasureUnit.DOT_PER_CENTIMETER, - MeasureUnit.DOT_PER_INCH, - MeasureUnit.EM, - MeasureUnit.MEGAPIXEL, - MeasureUnit.PIXEL, - MeasureUnit.PIXEL_PER_CENTIMETER, - MeasureUnit.PIXEL_PER_INCH, - MeasureUnit.ASTRONOMICAL_UNIT, - MeasureUnit.CENTIMETER, - MeasureUnit.DECIMETER, - MeasureUnit.EARTH_RADIUS, - MeasureUnit.FATHOM, - MeasureUnit.FOOT, - MeasureUnit.FURLONG, - MeasureUnit.INCH, - MeasureUnit.KILOMETER, - MeasureUnit.LIGHT_YEAR, - MeasureUnit.METER, - MeasureUnit.MICROMETER, - MeasureUnit.MILE, - MeasureUnit.MILE_SCANDINAVIAN, - MeasureUnit.MILLIMETER, - MeasureUnit.NANOMETER, - MeasureUnit.NAUTICAL_MILE, - MeasureUnit.PARSEC, - MeasureUnit.PICOMETER, - MeasureUnit.POINT, - MeasureUnit.SOLAR_RADIUS, - MeasureUnit.YARD, - MeasureUnit.CANDELA, - MeasureUnit.LUMEN, - MeasureUnit.LUX, - MeasureUnit.SOLAR_LUMINOSITY, - MeasureUnit.CARAT, - MeasureUnit.DALTON, - MeasureUnit.EARTH_MASS, - MeasureUnit.GRAIN, - MeasureUnit.GRAM, - MeasureUnit.KILOGRAM, - MeasureUnit.MICROGRAM, - MeasureUnit.MILLIGRAM, - MeasureUnit.OUNCE, - MeasureUnit.OUNCE_TROY, - MeasureUnit.POUND, - MeasureUnit.SOLAR_MASS, - MeasureUnit.STONE, - MeasureUnit.TON, - MeasureUnit.TONNE, - MeasureUnit.GIGAWATT, - MeasureUnit.HORSEPOWER, - MeasureUnit.KILOWATT, - MeasureUnit.MEGAWATT, - MeasureUnit.MILLIWATT, - MeasureUnit.WATT, - MeasureUnit.ATMOSPHERE, - MeasureUnit.BAR, - MeasureUnit.GASOLINE_ENERGY_DENSITY, - MeasureUnit.HECTOPASCAL, - MeasureUnit.INCH_HG, - MeasureUnit.KILOPASCAL, - MeasureUnit.MEGAPASCAL, - MeasureUnit.MILLIBAR, - MeasureUnit.MILLIMETER_OF_MERCURY, - MeasureUnit.PASCAL, - MeasureUnit.POUND_PER_SQUARE_INCH, - MeasureUnit.BEAUFORT, - MeasureUnit.KILOMETER_PER_HOUR, - MeasureUnit.KNOT, - MeasureUnit.LIGHT_SPEED, - MeasureUnit.METER_PER_SECOND, - MeasureUnit.MILE_PER_HOUR, - MeasureUnit.CELSIUS, - MeasureUnit.FAHRENHEIT, - MeasureUnit.GENERIC_TEMPERATURE, - MeasureUnit.KELVIN, - MeasureUnit.NEWTON_METER, - MeasureUnit.POUND_FOOT, - MeasureUnit.ACRE_FOOT, - MeasureUnit.BARREL, - MeasureUnit.BUSHEL, - MeasureUnit.CENTILITER, - MeasureUnit.CUBIC_CENTIMETER, - MeasureUnit.CUBIC_FOOT, - MeasureUnit.CUBIC_INCH, - MeasureUnit.CUBIC_KILOMETER, - MeasureUnit.CUBIC_METER, - MeasureUnit.CUBIC_MILE, - MeasureUnit.CUBIC_YARD, - MeasureUnit.CUP, - MeasureUnit.CUP_METRIC, - MeasureUnit.DECILITER, - MeasureUnit.DESSERT_SPOON, - MeasureUnit.DESSERT_SPOON_IMPERIAL, - MeasureUnit.DRAM, - MeasureUnit.DROP, - MeasureUnit.FLUID_OUNCE, - MeasureUnit.FLUID_OUNCE_IMPERIAL, - MeasureUnit.GALLON, - MeasureUnit.GALLON_IMPERIAL, - MeasureUnit.HECTOLITER, - MeasureUnit.JIGGER, - MeasureUnit.LITER, - MeasureUnit.MEGALITER, - MeasureUnit.MILLILITER, - MeasureUnit.PINCH, - MeasureUnit.PINT, - MeasureUnit.PINT_METRIC, - MeasureUnit.QUART, - MeasureUnit.QUART_IMPERIAL, - MeasureUnit.TABLESPOON, - MeasureUnit.TEASPOON, - }; - assertEquals("", 193, units.length); - } - @Test public void TestExamplesInDocs() { MeasureFormat fmtFr = MeasureFormat.getInstance( @@ -3969,7 +955,7 @@ public class MeasureUnitTest extends CoreTestFmwk { @Test public void testCLDRUnitAvailability() { Set knownUnits = new HashSet<>(); - Class cMeasureUnit, cTimeUnit; + Class cMeasureUnit, cTimeUnit; try { cMeasureUnit = Class.forName("com.ibm.icu.util.MeasureUnit"); cTimeUnit = Class.forName("com.ibm.icu.util.TimeUnit"); @@ -4041,163 +1027,6 @@ public class MeasureUnitTest extends CoreTestFmwk { } } - // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code - // for MeasureFormat during the release process. - static Map> getUnitsToPerParts() { - TreeMap> allUnits = getAllUnits(); - Map> unitsToPerStrings = - new HashMap<>(); - Map namesToUnits = new HashMap<>(); - for (Map.Entry> entry : allUnits.entrySet()) { - String type = entry.getKey(); - // Currency types are always atomic units, so we can skip these - if (type.equals("currency")) { - continue; - } - for (MeasureUnit unit : entry.getValue()) { - String javaName = toJAVAName(unit); - String[] nameParts = javaName.split("_PER_"); - if (nameParts.length == 1) { - namesToUnits.put(nameParts[0], unit); - } else if (nameParts.length == 2) { - unitsToPerStrings.put(unit, Pair.of(nameParts[0], nameParts[1])); - } - } - } - Map> unitsToPerUnits = - new HashMap<>(); - for (Map.Entry> entry : unitsToPerStrings.entrySet()) { - Pair perStrings = entry.getValue(); - MeasureUnit unit = namesToUnits.get(perStrings.first); - MeasureUnit perUnit = namesToUnits.get(perStrings.second); - if (unit != null && perUnit != null) { - unitsToPerUnits.put(entry.getKey(), Pair.of(unit, perUnit)); - } - } - return unitsToPerUnits; - } - - // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code - // for MeasureFormat during the release process. - static void generateCXXHConstants(String thisVersion) { - Map seen = new HashMap<>(); - System.out.println("// Start generated createXXX methods"); - System.out.println(); - TreeMap> allUnits = getAllUnits(); - for (Map.Entry> entry : allUnits.entrySet()) { - String type = entry.getKey(); - if (type.equals("currency")) { - continue; - } - for (MeasureUnit unit : entry.getValue()) { - String code = unit.getSubtype(); - String name = toCamelCase(unit); - String javaName = toJAVAName(unit); - checkForDup(seen, name, unit); - if (isDraft(javaName)) { - System.out.println("#ifndef U_HIDE_DRAFT_API"); - } - System.out.println(" /**"); - System.out.println(" * Returns by pointer, unit of " + type + ": " + code + "."); - System.out.println(" * Caller owns returned value and must free it."); - System.out.printf(" * Also see {@link #get%s()}.\n", name); - System.out.println(" * @param status ICU error code."); - if (isDraft(javaName)) { - System.out.println(" * @draft ICU " + getVersion(javaName, thisVersion)); - } else { - System.out.println(" * @stable ICU " + getVersion(javaName, thisVersion)); - } - System.out.println(" */"); - System.out.printf(" static MeasureUnit *create%s(UErrorCode &status);\n", name); - System.out.println(); - System.out.println(" /**"); - System.out.println(" * Returns by value, unit of " + type + ": " + code + "."); - System.out.printf(" * Also see {@link #create%s()}.\n", name); - String getterVersion = getVersion(javaName, thisVersion); - if (Integer.parseInt(getterVersion) < 64) { - getterVersion = "64"; - } - if (isDraft(javaName)) { - System.out.println(" * @draft ICU " + getterVersion); - } else { - System.out.println(" * @stable ICU " + getterVersion); - } - System.out.println(" */"); - System.out.printf(" static MeasureUnit get%s();\n", name); - if (isDraft(javaName)) { - System.out.println("#endif /* U_HIDE_DRAFT_API */"); - } - System.out.println(""); - // Hack: METRIC-TON unit changed its name from "metric-ton" to "tonne" - // In order to preserve the existing APIs for "metric-ton" we need to - // add those APIs manually - if (name.equals("Tonne")) { - addCXXHForMetricTon(); - } - } - } - System.out.println("// End generated createXXX methods"); - } - - // Add the headers for "metric-ton" - // The tool won't create them any more - private static void addCXXHForMetricTon() { - System.out.println(" /**"); - System.out.println(" * Returns by pointer, unit of mass: metric-ton"); - System.out.println(" * (renamed to tonne in CLDR 42 / ICU 72)."); - System.out.println(" * Caller owns returned value and must free it."); - System.out.println(" * Note: In ICU 74 this will be deprecated in favor of"); - System.out.println(" * createTonne(), which is currently draft but will"); - System.out.println(" * become stable in ICU 74, and which uses the preferred naming."); - System.out.println(" * Also see {@link #getMetricTon()} and {@link #createTonne()}."); - System.out.println(" * @param status ICU error code."); - System.out.println(" * @stable ICU 54"); - System.out.println(" */"); - System.out.println(" static MeasureUnit *createMetricTon(UErrorCode &status);"); - System.out.println(""); - System.out.println(" /**"); - System.out.println(" * Returns by value, unit of mass: metric-ton"); - System.out.println(" * (renamed to tonne in CLDR 42 / ICU 72)."); - System.out.println(" * Note: In ICU 74 this will be deprecated in favor of"); - System.out.println(" * getTonne(), which is currently draft but will"); - System.out.println(" * become stable in ICU 74, and which uses the preferred naming."); - System.out.println(" * Also see {@link #createMetricTon()} and {@link #getTonne()}."); - System.out.println(" * @stable ICU 64"); - System.out.println(" */"); - System.out.println(" static MeasureUnit getMetricTon();"); - System.out.println(""); - } - - private static void checkForDup( - Map seen, String name, MeasureUnit unit) { - if (seen.containsKey(name)) { - throw new RuntimeException("\nCollision!!" + unit + ", " + seen.get(name)); - } else { - seen.put(name, unit); - } - } - - // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code - // for MeasureFormat during the release process. - static void updateJAVAVersions(String thisVersion) { - System.out.println(); - Map seen = new HashMap<>(); - TreeMap> allUnits = getAllUnits(); - for (Map.Entry> entry : allUnits.entrySet()) { - String type = entry.getKey(); - if (type.equals("currency")) { - continue; - } - for (MeasureUnit unit : entry.getValue()) { - String javaName = toJAVAName(unit); - checkForDup(seen, javaName, unit); - if (!JAVA_VERSION_MAP.containsKey(javaName)) { - System.out.printf(" {\"%s\", \"%s\"},\n", javaName, thisVersion); - } - } - } - } - static TreeMap> getAllUnits() { TreeMap> allUnits = new TreeMap<>(); for (String type : MeasureUnit.getAvailableTypes()) { @@ -4217,323 +1046,6 @@ public class MeasureUnitTest extends CoreTestFmwk { return allUnits; } - // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code - // for MeasureFormat during the release process. - static void generateCXXConstants() { - System.out.println("// Start generated code for measunit.cpp"); - System.out.println(""); - TreeMap> allUnits = getAllUnits(); - - // Hack: for C++, add base unit here, but ignore them when printing the create methods. - // Also keep track of the base unit offset to make the C++ default constructor faster. - allUnits.put("none", Arrays.asList(new MeasureUnit[] {NoUnit.BASE})); - int baseTypeIdx = -1; - int baseSubTypeIdx = -1; - - System.out.println("// Maps from Type ID to offset in gSubTypes."); - System.out.println("static const int32_t gOffsets[] = {"); - int index = 0; - int typeCount = 0; - int currencyIndex = -1; - for (Map.Entry> entry : allUnits.entrySet()) { - System.out.printf(" %d,\n", index); - if (entry.getKey() == "currency") { - currencyIndex = typeCount; - } - typeCount++; - index += entry.getValue().size(); - } - assertTrue("currency present", currencyIndex >= 0); - System.out.printf(" %d\n", index); - System.out.println("};"); - System.out.println(); - System.out.println("static const int32_t kCurrencyOffset = " + currencyIndex + ";"); - System.out.println(); - System.out.println("// Must be sorted alphabetically."); - System.out.println("static const char * const gTypes[] = {"); - boolean first = true; - for (Map.Entry> entry : allUnits.entrySet()) { - if (!first) { - System.out.println(","); - } - System.out.print(" \"" + entry.getKey() + "\""); - first = false; - } - System.out.println(); - System.out.println("};"); - System.out.println(); - System.out.println("// Must be grouped by type and sorted alphabetically within each type."); - System.out.println("static const char * const gSubTypes[] = {"); - first = true; - int offset = 0; - int typeIdx = 0; - Map measureUnitToOffset = new HashMap<>(); - Map> measureUnitToTypeSubType = - new HashMap<>(); - for (Map.Entry> entry : allUnits.entrySet()) { - int subTypeIdx = 0; - for (MeasureUnit unit : entry.getValue()) { - if (!first) { - System.out.println(","); - } - if (unit != null) { - System.out.print(" \"" + unit.getSubtype() + "\""); - } else { - assertEquals("unit only null for \"none\" type", "none", entry.getKey()); - System.out.print(" \"\""); - } - first = false; - measureUnitToOffset.put(unit, offset); - measureUnitToTypeSubType.put(unit, Pair.of(typeIdx, subTypeIdx)); - if (unit == NoUnit.BASE) { - baseTypeIdx = typeIdx; - baseSubTypeIdx = subTypeIdx; - } - offset++; - subTypeIdx++; - } - typeIdx++; - } - System.out.println(); - System.out.println("};"); - System.out.println(); - - // Build unit per unit offsets to corresponding type sub types sorted by - // unit first and then per unit. - TreeMap, Pair> unitPerUnitOffsetsToTypeSubType - = new TreeMap<>(); - for (Map.Entry> entry - : getUnitsToPerParts().entrySet()) { - Pair unitPerUnit = entry.getValue(); - unitPerUnitOffsetsToTypeSubType.put( - OrderedPair.of( - measureUnitToOffset.get(unitPerUnit.first), - measureUnitToOffset.get(unitPerUnit.second)), - measureUnitToTypeSubType.get(entry.getKey())); - } - - // Print out the fast-path for the default constructor - System.out.println("// Shortcuts to the base unit in order to make the default constructor fast"); - System.out.println("static const int32_t kBaseTypeIdx = " + baseTypeIdx + ";"); - System.out.println("static const int32_t kBaseSubTypeIdx = " + baseSubTypeIdx + ";"); - System.out.println(); - - Map seen = new HashMap<>(); - for (Map.Entry> entry : allUnits.entrySet()) { - - String type = entry.getKey(); - if (type.equals("currency") || type.equals("none")) { - continue; - } - for (MeasureUnit unit : entry.getValue()) { - String name = toCamelCase(unit); - Pair typeSubType = measureUnitToTypeSubType.get(unit); - if (typeSubType == null) { - throw new IllegalStateException(); - } - checkForDup(seen, name, unit); - System.out.printf("MeasureUnit *MeasureUnit::create%s(UErrorCode &status) {\n", name); - System.out.printf(" return MeasureUnit::create(%d, %d, status);\n", - typeSubType.first, typeSubType.second); - System.out.println("}"); - System.out.println(); - System.out.printf("MeasureUnit MeasureUnit::get%s() {\n", name); - System.out.printf(" return MeasureUnit(%d, %d);\n", - typeSubType.first, typeSubType.second); - System.out.println("}"); - System.out.println(); - // Hack: METRIC-TON unit changed its name from "metric-ton" to "tonne" - // In order to preserve the existing APIs for "metric-ton" we need to - // add those APIs manually - if (name.equals("Tonne")) { - addCXXForMetricTon(typeSubType); - } - } - } - System.out.println("// End generated code for measunit.cpp"); - } - - // Add the API skeletons for "metric-ton" - // The tool won't create them any more - private static void addCXXForMetricTon(Pair typeSubType) { - String name = "MetricTon"; - System.out.printf("MeasureUnit *MeasureUnit::create%s(UErrorCode &status) {\n", name); - System.out.printf(" return MeasureUnit::create(%d, %d, status);\n", - typeSubType.first, typeSubType.second); - System.out.println("}"); - System.out.println(); - System.out.printf("MeasureUnit MeasureUnit::get%s() {\n", name); - System.out.printf(" return MeasureUnit(%d, %d);\n", - typeSubType.first, typeSubType.second); - System.out.println("}"); - System.out.println(); - } - - private static String toCamelCase(MeasureUnit unit) { - StringBuilder result = new StringBuilder(); - boolean caps = true; - String code = unit.getSubtype(); - - String replacement = CLDR_NAME_REMAP.get(code); - if (replacement != null) { - code = replacement; - } - - int len = code.length(); - for (int i = 0; i < len; i++) { - char ch = code.charAt(i); - if (ch == '-') { - caps = true; - } else if (Character.isDigit(ch)) { - caps = true; - result.append(ch); - } else if (caps) { - result.append(Character.toUpperCase(ch)); - caps = false; - } else { - result.append(ch); - } - } - return result.toString(); - } - - static boolean isTypeHidden(String type) { - return "currency".equals(type); - } - - // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code - // for MeasureFormat during the release process. - static void generateBackwardCompatibilityTest(String version) { - Map seen = new HashMap<>(); - System.out.println(); - System.out.printf(" public void TestCompatible%s() {\n", version.replace(".", "_")); - System.out.println(" MeasureUnit[] units = {"); - TreeMap> allUnits = getAllUnits(); - int count = 0; - for (Map.Entry> entry : allUnits.entrySet()) { - if (isTypeHidden(entry.getKey())) { - continue; - } - for (MeasureUnit unit : entry.getValue()) { - String javaName = toJAVAName(unit); - checkForDup(seen, javaName, unit); - System.out.printf(" MeasureUnit.%s,\n", javaName); - count++; - } - } - System.out.println(" };"); - System.out.printf(" assertEquals(\"\", %d, units.length);\n", count); - System.out.println(" }"); - } - - // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code - // for MeasureFormat during the release process. - static void generateCXXBackwardCompatibilityTest(String version) { - System.out.println(); - Map seen = new HashMap<>(); - System.out.printf("void MeasureFormatTest::TestCompatible%s() {\n", version.replace(".", "_")); - System.out.println(" UErrorCode status = U_ZERO_ERROR;"); - System.out.println(" LocalPointer measureUnit;"); - System.out.println(" MeasureUnit measureUnitValue;"); - TreeMap> allUnits = getAllUnits(); - for (Map.Entry> entry : allUnits.entrySet()) { - if (isTypeHidden(entry.getKey())) { - continue; - } - for (MeasureUnit unit : entry.getValue()) { - String camelCase = toCamelCase(unit); - checkForDup(seen, camelCase, unit); - System.out.printf(" measureUnit.adoptInstead(MeasureUnit::create%s(status));\n", camelCase); - System.out.printf(" measureUnitValue = MeasureUnit::get%s();\n", camelCase); - } - } - System.out.println(" assertSuccess(\"\", status);"); - System.out.println("}"); - } - - static String toJAVAName(MeasureUnit unit) { - String code = unit.getSubtype(); - String type = unit.getType(); - - String replacement = CLDR_NAME_REMAP.get(code); - if (replacement != null) { - code = replacement; - } - - String name = code.toUpperCase(Locale.ENGLISH).replace("-", "_"); - if (type.equals("angle")) { - if (code.equals("minute") || code.equals("second")) { - name = "ARC_" + name; - } - } - return name; - } - - // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code - // for MeasureFormat during the release process. - static void generateConstants(String thisVersion) { - System.out.println(" // Start generated MeasureUnit constants"); - System.out.println(); - Map seen = new HashMap<>(); - TreeMap> allUnits = getAllUnits(); - for (Map.Entry> entry : allUnits.entrySet()) { - String type = entry.getKey(); - if (isTypeHidden(type)) { - continue; - } - for (MeasureUnit unit : entry.getValue()) { - String name = toJAVAName(unit); - String code = unit.getSubtype(); - checkForDup(seen, name, unit); - System.out.println(" /**"); - System.out.println(" * Constant for unit of " + type + - ": " + - code); - // Special case JAVA had old constants for time from before. - if ("duration".equals(type) && TIME_CODES.contains(code)) { - System.out.println(" * @stable ICU 4.0"); - } - else if (isDraft(name)) { - System.out.println(" * @draft ICU " + getVersion(name, thisVersion)); - } else { - System.out.println(" * @stable ICU " + getVersion(name, thisVersion)); - } - System.out.println(" */"); - if ("duration".equals(type) && TIME_CODES.contains(code)) { - System.out.println(" public static final TimeUnit " + name + " = (TimeUnit) MeasureUnit.internalGetInstance(\"" + - type + - "\", \"" + - code + - "\");"); - } else { - System.out.println(" public static final MeasureUnit " + name + " = MeasureUnit.internalGetInstance(\"" + - type + - "\", \"" + - code + - "\");"); - } - System.out.println(); - } - } - System.out.println(" // End generated MeasureUnit constants"); - } - - private static String getVersion(String javaName, String thisVersion) { - String version = JAVA_VERSION_MAP.get(javaName); - if (version == null) { - return thisVersion; - } - return version; - } - - private static boolean isDraft(String javaName) { - String version = JAVA_VERSION_MAP.get(javaName); - if (version == null) { - return true; - } - return DRAFT_VERSION_SET.contains(version); - } - public void checkStreamingEquality(T item) { try { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); @@ -4927,7 +1439,7 @@ public class MeasureUnitTest extends CoreTestFmwk { if (unit.getType() == "currency") { continue; } - + if (unit.getIdentifier().equals("portion-per-1e9")) { logKnownIssue("ICU-22781", "Handle concentr/perbillion in ICU"); continue; diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberFormatTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberFormatTest.java index 87790d10380..138200357fc 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberFormatTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberFormatTest.java @@ -3181,7 +3181,7 @@ public class NumberFormatTest extends CoreTestFmwk { double expected = 12345; DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); DecimalFormat fmt = new DecimalFormat("#.#", sym); - ArrayList errors = new ArrayList(); + ArrayList errors = new ArrayList<>(); ParseThreadJB5358[] threads = new ParseThreadJB5358[numThreads]; for (int i = 0; i < numThreads; i++) { @@ -3198,7 +3198,7 @@ public class NumberFormatTest extends CoreTestFmwk { if (errors.size() != 0) { StringBuffer errBuf = new StringBuffer(); for (int i = 0; i < errors.size(); i++) { - errBuf.append((String)errors.get(i)); + errBuf.append(errors.get(i)); errBuf.append("\n"); } errln("FAIL: " + errBuf); @@ -3209,9 +3209,9 @@ public class NumberFormatTest extends CoreTestFmwk { private final DecimalFormat decfmt; private final String numstr; private final double expect; - private final ArrayList errors; + private final ArrayList errors; - public ParseThreadJB5358(DecimalFormat decfmt, String numstr, double expect, ArrayList errors) { + public ParseThreadJB5358(DecimalFormat decfmt, String numstr, double expect, ArrayList errors) { this.decfmt = decfmt; this.numstr = numstr; this.expect = expect; @@ -4793,7 +4793,7 @@ public class NumberFormatTest extends CoreTestFmwk { while (iterator.getIndex() != iterator.getEndIndex()) { int start = iterator.getRunStart(); int end = iterator.getRunLimit(); - Iterator it = iterator.getAttributes().keySet().iterator(); + Iterator it = iterator.getAttributes().keySet().iterator(); AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute) it.next(); // For positions with both INTEGER and GROUPING attributes, we want the GROUPING attribute. if (it.hasNext() && attribute.equals(NumberFormat.Field.INTEGER)) { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberRegressionTests.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberRegressionTests.java index 08da26d398d..3cd021fd45b 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberRegressionTests.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/NumberRegressionTests.java @@ -1835,6 +1835,11 @@ public class NumberRegressionTests extends CoreTestFmwk { } Locale.setDefault(savedLocale); } + + @Test + public void test22983LongFraction() { + DecimalFormat format = new DecimalFormat("0.0000000000000001"); + } } class myformat implements Serializable diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java index 52c182b45ce..099af383e4f 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/PluralRulesTest.java @@ -29,7 +29,6 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.TreeMap; @@ -168,8 +167,8 @@ public class PluralRulesTest extends CoreTestFmwk { { "a:n in 3 .. 10 , 13 .. 19 ,", ParseException.class }, }; for (Object[] shouldFailTest : shouldFail) { String rules = (String) shouldFailTest[0]; - Class exception = shouldFailTest.length < 2 ? null : (Class) shouldFailTest[1]; - Class actualException = null; + Class exception = shouldFailTest.length < 2 ? null : (Class) shouldFailTest[1]; + Class actualException = null; try { PluralRules.parseDescription(rules); } catch (Exception e) { @@ -279,8 +278,8 @@ public class PluralRulesTest extends CoreTestFmwk { // Collect actual (oldSamples) and expected (expectedSamplesList) into the // same concrete collection for comparison purposes. - ArrayList oldSamplesList = new ArrayList(oldSamples); - ArrayList expectedSamplesList = new ArrayList(Arrays.asList(expected)); + ArrayList oldSamplesList = new ArrayList<>(oldSamples); + ArrayList expectedSamplesList = new ArrayList<>(Arrays.asList(expected)); if (!assertEquals("getOldSamples; " + keyword + "; " + description, expectedSamplesList, oldSamplesList)) { @@ -329,7 +328,7 @@ public class PluralRulesTest extends CoreTestFmwk { "a:2,3,5,6,7,13,15,16,17", "a: n in 2..6,3..7", "a:2,3,4,5,6,7", }; private String[] getTargetStrings(String targets) { - List list = new ArrayList(50); + List list = new ArrayList<>(50); String[] valSets = Utility.split(targets, ';'); for (int i = 0; i < valSets.length; ++i) { String[] temp = Utility.split(valSets[i], ':'); @@ -459,7 +458,7 @@ public class PluralRulesTest extends CoreTestFmwk { keywordToRule.put(keyword, singleRule); } - Map collisionTest = new LinkedHashMap(); + Map collisionTest = new LinkedHashMap<>(); // get all of the sample ranges from all of the samples Stream ranges = samples.stream() @@ -474,7 +473,7 @@ public class PluralRulesTest extends CoreTestFmwk { items.forEach(item -> { collisionTest.clear(); - for (Entry entry : keywordToRule.entrySet()) { + for (Map.Entry entry : keywordToRule.entrySet()) { PluralRules rule = entry.getValue(); String foundKeyword = rule.select(item); if (foundKeyword.equals("other")) { @@ -724,7 +723,7 @@ public class PluralRulesTest extends CoreTestFmwk { @Test public void testAvailableULocales() { ULocale[] locales = factory.getAvailableULocales(); - Set localeSet = new HashSet(); + Set localeSet = new HashSet<>(); localeSet.addAll(Arrays.asList(locales)); assertEquals("locales are unique in list", locales.length, localeSet.size()); @@ -1072,7 +1071,7 @@ public class PluralRulesTest extends CoreTestFmwk { } Collection values; if (valueList == null || valueList.length() == 0) { - values = Collections.EMPTY_SET; + values = Collections.emptySet(); } else if ("null".equals(valueList)) { values = null; } else { @@ -1186,7 +1185,7 @@ public class PluralRulesTest extends CoreTestFmwk { @Test public void TestKeywords() { - Set possibleKeywords = new LinkedHashSet(Arrays.asList("zero", "one", "two", "few", "many", "other")); + Set possibleKeywords = new LinkedHashSet<>(Arrays.asList("zero", "one", "two", "few", "many", "other")); DecimalQuantity ONE_INTEGER = DecimalQuantity_DualStorageBCD.fromExponentString("1"); Object[][][] tests = { // format is locale, explicits, then triples of keyword, status, unique value. @@ -1205,7 +1204,7 @@ public class PluralRulesTest extends CoreTestFmwk { // NumberType numberType = (NumberType) test[1]; Set explicits = (Set) test[0][1]; PluralRules pluralRules = factory.forLocale(locale); - LinkedHashSet remaining = new LinkedHashSet(possibleKeywords); + LinkedHashSet remaining = new LinkedHashSet<>(possibleKeywords); for (int i = 1; i < test.length; ++i) { Object[] row = test[i]; String keyword = (String) row[0]; @@ -1536,7 +1535,7 @@ public class PluralRulesTest extends CoreTestFmwk { setsToRules.put(set, pr); data.put(pr, locale); } - for (Entry, Set> entry1 : setsToRules.keyValuesSet()) { + for (Map.Entry, Set> entry1 : setsToRules.keyValuesSet()) { Set set = entry1.getKey(); Set rules = entry1.getValue(); System.out.println("\n // " + set); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TestMessageFormat.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TestMessageFormat.java index a6fd6eb381d..9e9029bf5c8 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TestMessageFormat.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TestMessageFormat.java @@ -1001,7 +1001,7 @@ public class TestMessageFormat extends CoreTestFmwk { // This tests passing named arguments instead of numbers to format(). @Test public void testFormatNamedArguments() { - Map arguments = new HashMap(); + Map arguments = new HashMap<>(); arguments.put("startDate", new Date(871068000000L)); StringBuffer result = new StringBuffer(); @@ -1035,7 +1035,7 @@ public class TestMessageFormat extends CoreTestFmwk { String source = "abc =sep= def"; try { - Map fmt_map = msg.parseToMap(source); + Map fmt_map = msg.parseToMap(source); if (fmt_map.keySet().size() != 2) { errln("*** MSG parse (ustring, count, err) count err."); } else { @@ -1047,7 +1047,7 @@ public class TestMessageFormat extends CoreTestFmwk { } ParsePosition pp = new ParsePosition(0); - Map fmt_map = msg.parseToMap(source, pp); + Map fmt_map = msg.parseToMap(source, pp); if (pp.getIndex()==0 || fmt_map==null) { errln("*** MSG parse (ustring, parsepos., count) error."); } else { @@ -1061,7 +1061,7 @@ public class TestMessageFormat extends CoreTestFmwk { pp.setIndex(0); - Map fmta = (Map) msg.parseObject( source, pp ); + Map fmta = (Map) msg.parseObject( source, pp ); if (pp.getIndex() == 0) { errln("*** MSG parse (ustring, Object, parsepos ) error."); } else { @@ -1229,7 +1229,7 @@ public class TestMessageFormat extends CoreTestFmwk { errln("should not use named arguments"); } - Map map12 = new HashMap(); + Map map12 = new HashMap<>(); map12.put("1", "one"); map12.put("2", "two"); @@ -1240,7 +1240,7 @@ public class TestMessageFormat extends CoreTestFmwk { } try { - Map mapResult = mf.parseToMap(target); + Map mapResult = mf.parseToMap(target); if (!map12.equals(mapResult)) { errln("expected " + map12 + " but got " + mapResult); } @@ -1248,7 +1248,7 @@ public class TestMessageFormat extends CoreTestFmwk { errln("unexpected exception: " + e.getMessage()); } - Map map10 = new HashMap(); + Map map10 = new HashMap<>(); map10.put("1", "one"); map10.put("0", "zero"); target = "X:{2} Y:one"; @@ -1259,7 +1259,7 @@ public class TestMessageFormat extends CoreTestFmwk { DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM); DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM); - Map fmtMap = new HashMap(); + Map fmtMap = new HashMap<>(); fmtMap.put("1", dateFormat); fmtMap.put("2", timeFormat); mf.setFormatsByArgumentName(fmtMap); @@ -1272,7 +1272,7 @@ public class TestMessageFormat extends CoreTestFmwk { // expect this } - Map argMap = new HashMap(); + Map argMap = new HashMap<>(); argMap.put("1", date); argMap.put("2", date); target = "X:5:17:00\u202FAM Y:Dec 17, 1990"; @@ -1291,7 +1291,7 @@ public class TestMessageFormat extends CoreTestFmwk { "other {Ce sont # fichiers}} dans la liste.", new ULocale("fr")); Object objArray[] = {0L}; - HashMap objMap = new HashMap(); + HashMap objMap = new HashMap<>(); objMap.put("argument", objArray[0]); String result = msgFmt.format(objArray); if (!result.equals("C'est 0,0 fichier dans la liste.")) { @@ -1316,7 +1316,7 @@ public class TestMessageFormat extends CoreTestFmwk { "sont # fichiers}} dans la liste.", new ULocale("fr")); Object objArray[] = {0L}; - HashMap objMap = new HashMap(); + HashMap objMap = new HashMap<>(); objMap.put("argument", objArray[0]); String result = mfNum.format(objArray); if (!result.equals(mfAlpha.format(objMap))) { @@ -1339,7 +1339,7 @@ public class TestMessageFormat extends CoreTestFmwk { "zavodov}} in the directory.", new ULocale("uk")); Object objArray[] = {4L}; - HashMap objMap = new HashMap(); + HashMap objMap = new HashMap<>(); objMap.put("argument", objArray[0]); String result = mfNum.format(objArray); if (!result.equals(mfAlpha.format(objMap))) { @@ -1586,12 +1586,12 @@ public class TestMessageFormat extends CoreTestFmwk { final SimpleDateFormat dateFormat = new SimpleDateFormat("'year:'yy 'month:'MM 'day:'dd"); dateFormat.setTimeZone(TimeZone.getTimeZone("Etc/GMT")); ms.setFormatByArgumentName("date", dateFormat); - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("number", 1234); map.put("date", new Date(0,0,0)); String result = ms.format(map); assertEquals("setFormatByArgumentName", "1234.000 year:99 month:12 day:31", result); - Set formatNames = ms.getArgumentNames(); + Set formatNames = ms.getArgumentNames(); assertEquals("Format Names match", formatNames, map.keySet()); assertEquals("Decimal", decimalFormat, ms.getFormatByArgumentName("number")); assertEquals("Date", dateFormat, ms.getFormatByArgumentName("date")); @@ -1619,7 +1619,7 @@ public class TestMessageFormat extends CoreTestFmwk { Object[] args0 = new Object[] { "tmp", new Date(1184777888000L), 15, 2 }; - HashMap args1 = new HashMap(); + HashMap args1 = new HashMap<>(); args1.put("arg0", "tmp"); args1.put("arg1", new Date(1184777888000L)); args1.put("arg2", 15); @@ -1680,12 +1680,12 @@ public class TestMessageFormat extends CoreTestFmwk { AttributedCharacterIterator expectedAcit = expectedAttributedStrings[i].getIterator(); // Check available attributes - Set attrSet = acit.getAllAttributeKeys(); - Set expectedAttrSet = expectedAcit.getAllAttributeKeys(); + Set attrSet = acit.getAllAttributeKeys(); + Set expectedAttrSet = expectedAcit.getAllAttributeKeys(); if (attrSet.size() != expectedAttrSet.size()) { errln("FAIL: Number of attribute keys is " + attrSet.size() + " expected: " + expectedAttrSet.size()); } - Iterator attrIterator = attrSet.iterator(); + Iterator attrIterator = attrSet.iterator(); while (attrIterator.hasNext()) { AttributedCharacterIterator.Attribute attr = (AttributedCharacterIterator.Attribute) attrIterator .next(); @@ -1708,16 +1708,16 @@ public class TestMessageFormat extends CoreTestFmwk { buf.append(c); expectedAcit.setIndex(indexExp); - Map attrs = acit.getAttributes(); - Map attrsExp = expectedAcit.getAttributes(); + Map attrs = acit.getAttributes(); + Map attrsExp = expectedAcit.getAttributes(); if (attrs.size() != attrsExp.size()) { errln("FAIL: Number of attributes associated with index " + index + " is " + attrs.size() + " expected: " + attrsExp.size()); } else { // Check all attributes at the index - Iterator entryIterator = attrsExp.entrySet().iterator(); + Iterator> entryIterator = attrsExp.entrySet().iterator(); while (entryIterator.hasNext()) { - Map.Entry entry = (Map.Entry) entryIterator.next(); + Map.Entry entry = entryIterator.next(); if (attrs.containsKey(entry.getKey())) { Object value = attrs.get(entry.getKey()); assertEquals("Attribute value at index " + index, entry.getValue(), value); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TimeZoneFormatTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TimeZoneFormatTest.java index dacde3f74c8..4b60d594cb5 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TimeZoneFormatTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/format/TimeZoneFormatTest.java @@ -275,10 +275,10 @@ public class TimeZoneFormatTest extends CoreTestFmwk { } else { // Specific or generic: raw offset must be preserved. if (inOffsets[0] != outOffsets[0] ) { - if ((LOCALES[locidx].toString().equals("tg") || LOCALES[locidx].toString().equals("tg_TJ")) - && logKnownIssue("ICU-22857", "Time zone round test fails for tg/tg_TJ")) { - continue; - } + if ((LOCALES[locidx].toString().equals("tg") || LOCALES[locidx].toString().equals("tg_TJ")) + && logKnownIssue("ICU-22857", "Time zone round test fails for tg/tg_TJ")) { + continue; + } if (JDKTZ && tzids[tzidx].startsWith("SystemV/")) { // JDK uses rule SystemV for these zones while // ICU handles these zones as aliases of existing time zones @@ -1233,7 +1233,7 @@ public class TimeZoneFormatTest extends CoreTestFmwk { long date = System.currentTimeMillis(); TimeZoneNames.Factory factory; try { - Class cls = Class.forName("com.ibm.icu.text.TimeZoneNames$DefaultTimeZoneNames$FactoryImpl"); + Class cls = Class.forName("com.ibm.icu.text.TimeZoneNames$DefaultTimeZoneNames$FactoryImpl"); factory = (Factory) cls.newInstance(); } catch (Exception e) { errln("Could not create class DefaultTimeZoneNames.FactoryImpl: " + e.getClass() + ": " + e.getMessage()); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java index 28dbbe617be..746e0ebddb1 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java @@ -5900,7 +5900,7 @@ public class NumberFormatterApiTest extends CoreTestFmwk { // We require that the upper bounds all be 999 inclusive. // The lower bound may be either -1, 0, or 1. - Set methodsWithLowerBound1 = new HashSet(); + Set methodsWithLowerBound1 = new HashSet<>(); methodsWithLowerBound1.add("fixedSignificantDigits"); methodsWithLowerBound1.add("minSignificantDigits"); methodsWithLowerBound1.add("maxSignificantDigits"); @@ -5914,7 +5914,7 @@ public class NumberFormatterApiTest extends CoreTestFmwk { // maxFraction // minMaxFraction // zeroFillTo - Set methodsWithLowerBoundN1 = new HashSet(); + Set methodsWithLowerBoundN1 = new HashSet<>(); methodsWithLowerBoundN1.add("truncateAt"); // Some of the methods require an object to be called upon. diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CompatibilityTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CompatibilityTest.java index 2ee07bf2db0..02fb6a231c6 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CompatibilityTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CompatibilityTest.java @@ -126,7 +126,7 @@ public class CompatibilityTest extends CoreTestFmwk } private List getFileList(URL dataURL) throws IOException { - List classList = new ArrayList(); + List classList = new ArrayList<>(); File topDir = new File(dataURL.getPath()); File dataDirs[] = topDir.listFiles(new FileFilter() { @@ -157,7 +157,7 @@ public class CompatibilityTest extends CoreTestFmwk } private List getJarList(URL jarURL) throws IOException { - List classList = new ArrayList(); + List classList = new ArrayList<>(); String prefix = jarURL.getPath(); int ix = prefix.indexOf("!/"); @@ -175,7 +175,7 @@ public class CompatibilityTest extends CoreTestFmwk JarURLConnection conn = (JarURLConnection) jarURL.openConnection(); jarFile = conn.getJarFile(); - Enumeration entries = jarFile.entries(); + Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); if (!entry.isDirectory()) { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CoverageTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CoverageTest.java index 2518fa99645..fc38420e941 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CoverageTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/CoverageTest.java @@ -32,7 +32,7 @@ public class CoverageTest extends CoreTestFmwk { @Test @Parameters(method="generateClassList") public void testSerialization(String className) throws ClassNotFoundException, IOException { - Class c = Class.forName(className); + Class c = Class.forName(className); int m = c.getModifiers(); Handler classHandler = SerializableTestUtility.getHandler(className); diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/FormatHandler.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/FormatHandler.java index bb71dd1afd9..0b51cf53237 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/FormatHandler.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/FormatHandler.java @@ -67,8 +67,8 @@ public class FormatHandler * of ICU4J to another. To guard against this, we store the following canned * data into the test objects we create. */ - static HashMap cannedMonthNames = new HashMap(); - static HashMap cannedShortMonthNames = new HashMap(); + static HashMap cannedMonthNames = new HashMap<>(); + static HashMap cannedShortMonthNames = new HashMap<>(); static String en_CA_MonthNames[] = { "January", @@ -742,7 +742,7 @@ public class FormatHandler * of ICU4J to another. To guard against this, we store the following canned * data into the test objects we create. */ - static HashMap cannedDecimalFormatSymbols = new HashMap(); + static HashMap cannedDecimalFormatSymbols = new HashMap<>(); static String en_CA_StringSymbols[] = { "$", @@ -1582,7 +1582,7 @@ public class FormatHandler "%%lenient-parse:\n" + "& ':' = '.' = ' ' = '-';\n"; - HashMap cannedData = new HashMap(); + HashMap cannedData = new HashMap<>(); { cannedData.put("en_CA/SpelloutRules", en_SpelloutRules); @@ -1880,7 +1880,7 @@ public class FormatHandler public static class DateFormatHandler implements SerializableTestUtility.Handler { - static HashMap cannedPatterns = new HashMap(); + static HashMap cannedPatterns = new HashMap<>(); static Date fixedDate; { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableChecker.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableChecker.java index 16578b768be..4ad003e85a8 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableChecker.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableChecker.java @@ -34,7 +34,7 @@ import com.ibm.icu.impl.URLHandler; */ public class SerializableChecker implements URLHandler.URLVisitor { - private static Class serializable; + private static Class serializable; //private static Class throwable; private String path = null; @@ -90,7 +90,7 @@ public class SerializableChecker implements URLHandler.URLVisitor } try { - Class c = Class.forName(className); + Class c = Class.forName(className); int m = c.getModifiers(); if (serializable.isAssignableFrom(c) /*&& @@ -172,10 +172,10 @@ public class SerializableChecker implements URLHandler.URLVisitor public static void main(String[] args) { - List argList = Arrays.asList(args); + List argList = Arrays.asList(args); String path = null; - for (Iterator it = argList.iterator(); it.hasNext(); /*anything?*/) { + for (Iterator it = argList.iterator(); it.hasNext(); /*anything?*/) { String arg = (String) it.next(); if (arg.equals("-w")) { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableTestUtility.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableTestUtility.java index d92b8335cbf..1c38ac7e265 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableTestUtility.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/serializable/SerializableTestUtility.java @@ -66,7 +66,7 @@ import com.ibm.icu.util.VTimeZone; * Window - Preferences - Java - Code Style - Code Templates */ public class SerializableTestUtility { - private static Class serializable; + private static Class serializable; static { try { serializable = Class.forName("java.io.Serializable"); @@ -772,7 +772,7 @@ public class SerializableTestUtility { } } - private static HashMap map = new HashMap(); + private static HashMap map = new HashMap<>(); static { map.put("com.ibm.icu.util.TimeZone", new TimeZoneHandler()); @@ -914,7 +914,7 @@ public class SerializableTestUtility { } static List getSerializationClassList(Object caller) throws IOException { - List classList = new ArrayList(); + List classList = new ArrayList<>(); Enumeration urlEnum = caller.getClass().getClassLoader().getResources("com/ibm/icu"); while (urlEnum.hasMoreElements()) { URL url = urlEnum.nextElement(); @@ -951,7 +951,7 @@ public class SerializableTestUtility { if (className.startsWith("com.ibm.icu.dev.")) { return; } - Class c; + Class c; try { c = Class.forName(className); } catch (ClassNotFoundException e) { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/CurrencyTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/CurrencyTest.java index 26c0615997b..c0ea610f448 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/CurrencyTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/CurrencyTest.java @@ -799,7 +799,7 @@ public class CurrencyTest extends CoreTestFmwk { }; String[] ALL = Currency.getKeywordValuesForLocale("currency", ULocale.getDefault(), false); - HashSet ALLSET = new HashSet(); + HashSet ALLSET = new HashSet<>(); for (int i = 0; i < ALL.length; i++) { ALLSET.add(ALL[i]); } diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUResourceBundleTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUResourceBundleTest.java index 6b270de7cbe..7a3f92ab5b4 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUResourceBundleTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUResourceBundleTest.java @@ -53,9 +53,9 @@ public final class ICUResourceBundleTest extends CoreTestFmwk { // It does not work well in eclipse plug-in test because of class loader configuration?? // For now, specify resource path explicitly in this test case //Enumeration en = testLoader.getResources("META-INF"); - Enumeration en = testLoader.getResources("com.ibm.icu.dev.data"); + Enumeration en = testLoader.getResources("com.ibm.icu.dev.data"); for(;en.hasMoreElements();) { - URL url = (URL)en.nextElement(); + URL url = en.nextElement(); if (url == null) { warnln("could not load resource data"); return; @@ -903,7 +903,7 @@ public final class ICUResourceBundleTest extends CoreTestFmwk { @Override protected UResourceBundle getParent() {return null;} @Override - public Enumeration getKeys() {return null;} + public Enumeration getKeys() {return null;} @Override protected Object handleGetObject(String aKey) {return null;} } @@ -965,7 +965,7 @@ public final class ICUResourceBundleTest extends CoreTestFmwk { } //reset the default ULocale.setDefault(defaultLocale); - Enumeration keys = bundle.getKeys(); + Enumeration keys = bundle.getKeys(); int i=0; while(keys.hasMoreElements()){ logln("key: "+ keys.nextElement()); @@ -1198,7 +1198,7 @@ public final class ICUResourceBundleTest extends CoreTestFmwk { // enrure is that we don't crash with a StackOverflowError when trying to retrieve the bundle } ULocale.setDefault(oldDefaultLocale); - } + } @Test public void TestPersonUnits() { diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTest.java index e6232671216..9b5bbab819f 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTest.java @@ -18,7 +18,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.SortedMap; @@ -71,7 +70,7 @@ public class ICUServiceTest extends CoreTestFmwk * the locale as the comparator to sort the display names, and null for * the matchID. */ - public SortedMap getDisplayNames(ICUService service) { + public SortedMap getDisplayNames(ICUService service) { ULocale locale = ULocale.getDefault(); Collator col = Collator.getInstance(locale.toLocale()); return service.getDisplayNames(locale, col, null); @@ -82,7 +81,7 @@ public class ICUServiceTest extends CoreTestFmwk * uses the default collator for the locale as the comparator to * sort the display names, and null for the matchID. */ - public SortedMap getDisplayNames(ICUService service, ULocale locale) { + public SortedMap getDisplayNames(ICUService service, ULocale locale) { Collator col = Collator.getInstance(locale.toLocale()); return service.getDisplayNames(locale, col, null); } @@ -91,7 +90,7 @@ public class ICUServiceTest extends CoreTestFmwk * uses the default collator for the locale as the comparator to * sort the display names. */ - public SortedMap getDisplayNames(ICUService service, ULocale locale, String matchID) { + public SortedMap getDisplayNames(ICUService service, ULocale locale, String matchID) { Collator col = Collator.getInstance(locale.toLocale()); return service.getDisplayNames(locale, col, matchID); } @@ -136,7 +135,7 @@ public class ICUServiceTest extends CoreTestFmwk confirmIdentical("3) en_US_BAR -> en_US", result, singleton0); // get a list of the factories, should be two - List factories = service.factories(); + List factories = service.factories(); confirmIdentical("4) factory size", factories.size(), 2); // register a new object with yet another locale @@ -194,7 +193,7 @@ public class ICUServiceTest extends CoreTestFmwk confirmIdentical("17) get invisible", result, singleton4); // should not be able to locate invisible services - Set ids = service.getVisibleIDs(); + Set ids = service.getVisibleIDs(); confirmBoolean("18) find invisible", !ids.contains("en_US_BAR")); service.reset(); @@ -207,7 +206,7 @@ public class ICUServiceTest extends CoreTestFmwk } @Override - public void updateVisibleIDs(Map unusedResult) { + public void updateVisibleIDs(Map unusedResult) { } @Override @@ -249,13 +248,13 @@ public class ICUServiceTest extends CoreTestFmwk // iterate over the visual ids returned by the multiple factory { - Set vids = service.getVisibleIDs(); - Iterator iter = vids.iterator(); + Set vids = service.getVisibleIDs(); + Iterator iter = vids.iterator(); int count = 0; while (iter.hasNext()) { - ++count; - String id = (String)iter.next(); - logln(" " + id + " --> " + service.get(id)); + ++count; + String id = (String)iter.next(); + logln(" " + id + " --> " + service.get(id)); } // four visible ids confirmIdentical("25) visible ids", count, 4); @@ -263,13 +262,13 @@ public class ICUServiceTest extends CoreTestFmwk // iterate over the display names { - Map dids = getDisplayNames(service, ULocale.GERMANY); - Iterator iter = dids.entrySet().iterator(); + Map dids = getDisplayNames(service, ULocale.GERMANY); + Iterator> iter = dids.entrySet().iterator(); int count = 0; while (iter.hasNext()) { - ++count; - Entry e = (Entry)iter.next(); - logln(" " + e.getKey() + " -- > " + e.getValue()); + ++count; + Map.Entry e = iter.next(); + logln(" " + e.getKey() + " -- > " + e.getValue()); } // four display names, in german confirmIdentical("26) display names", count, 4); @@ -294,13 +293,13 @@ public class ICUServiceTest extends CoreTestFmwk // this time, we have seven display names // Rad dude's surfer gal 'replaces' later's surfer gal { - Map dids = getDisplayNames(service); - Iterator iter = dids.entrySet().iterator(); + Map dids = getDisplayNames(service); + Iterator> iter = dids.entrySet().iterator(); int count = 0; while (iter.hasNext()) { - ++count; - Entry e = (Entry)iter.next(); - logln(" " + e.getKey() + " --> " + e.getValue()); + ++count; + Map.Entry e = iter.next(); + logln(" " + e.getKey() + " --> " + e.getValue()); } // seven display names, in spanish confirmIdentical("29) display names", count, 7); @@ -372,11 +371,11 @@ public class ICUServiceTest extends CoreTestFmwk */ { - Set xids = service.getVisibleIDs(); - Iterator iter = xids.iterator(); + Set xids = service.getVisibleIDs(); + Iterator iter = xids.iterator(); while (iter.hasNext()) { - String xid = (String)iter.next(); - logln(xid + "? " + service.get(xid)); + String xid = (String)iter.next(); + logln(xid + "? " + service.get(xid)); } logln("valleygirl? " + service.get("en_US_VALLEY_GIRL")); @@ -426,26 +425,26 @@ public class ICUServiceTest extends CoreTestFmwk // list the display names in reverse order { logln("display names in reverse order: " + - service.getDisplayNames(ULocale.US, new Comparator() { - @Override + service.getDisplayNames(ULocale.US, new Comparator() { + @Override public int compare(Object lhs, Object rhs) { - return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs); - } - })); + return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs); + } + })); } // get all the display names of these resources // this should be fast since the display names were cached. { - logln("service display names for de_DE"); - Map names = getDisplayNames(service, new ULocale("de_DE")); + logln("service display names for de_DE"); + Map names = getDisplayNames(service, new ULocale("de_DE")); StringBuffer buf = new StringBuffer("{"); - Iterator iter = names.entrySet().iterator(); + Iterator> iter = names.entrySet().iterator(); while (iter.hasNext()) { - Entry e = (Entry)iter.next(); - String name = (String)e.getKey(); - String id = (String)e.getValue(); - buf.append("\n " + name + " --> " + id); + Map.Entry e = iter.next(); + String name = e.getKey(); + String id = e.getValue(); + buf.append("\n " + name + " --> " + id); } buf.append("\n}"); logln(buf.toString()); @@ -466,12 +465,12 @@ public class ICUServiceTest extends CoreTestFmwk for (int i = 0; i < idNames.length; ++i) { String idName = idNames[i]; buf.append("\n --- " + idName + " ---"); - Map names = getDisplayNames(service, new ULocale(idName)); - Iterator iter = names.entrySet().iterator(); + Map names = getDisplayNames(service, new ULocale(idName)); + Iterator> iter = names.entrySet().iterator(); while (iter.hasNext()) { - Entry e = (Entry)iter.next(); - String name = (String)e.getKey(); - String id = (String)e.getValue(); + Map.Entry e = iter.next(); + String name = e.getKey(); + String id = e.getValue(); buf.append("\n " + name + " --> " + id); } } @@ -550,13 +549,13 @@ public class ICUServiceTest extends CoreTestFmwk } static class TestLocaleKeyFactory extends LocaleKeyFactory { - protected final Set ids; + protected final Set ids; protected final String factoryID; public TestLocaleKeyFactory(String[] ids, String factoryID) { super(VISIBLE, factoryID); - this.ids = Collections.unmodifiableSet(new HashSet(Arrays.asList(ids))); + this.ids = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(ids))); this.factoryID = factoryID + ": "; } @@ -566,7 +565,7 @@ public class ICUServiceTest extends CoreTestFmwk } @Override - protected Set getSupportedIDs() { + protected Set getSupportedIDs() { return ids; } } @@ -626,19 +625,19 @@ public class ICUServiceTest extends CoreTestFmwk public static String valley = californio + "_VALLEY"; public static String surfer = californio + "_SURFER"; public static String geek = californio + "_GEEK"; - public static Set supportedIDs; + public static Set supportedIDs; static { - HashSet result = new HashSet(); + HashSet result = new HashSet<>(); result.addAll(ICUResourceBundle.getAvailableLocaleNameSet()); - result.add(californio); - result.add(valley); - result.add(surfer); - result.add(geek); + result.add(californio); + result.add(valley); + result.add(surfer); + result.add(geek); supportedIDs = Collections.unmodifiableSet(result); } @Override - public Set getSupportedIDs() { + public Set getSupportedIDs() { return supportedIDs; } @@ -745,15 +744,13 @@ public class ICUServiceTest extends CoreTestFmwk target = service.get("za_PPP"); confirmEqual("test with ja locale", "japanese", target); - Set ids = service.getVisibleIDs(); - for (Iterator iter = ids.iterator(); iter.hasNext();) { - logln("id: " + iter.next()); + for (String id : service.getVisibleIDs()) { + logln("id: " + id); } ULocale.setDefault(loc); - ids = service.getVisibleIDs(); - for (Iterator iter = ids.iterator(); iter.hasNext();) { - logln("id: " + iter.next()); + for (String id : service.getVisibleIDs()) { + logln("id: " + id); } target = service.get("za_PPP"); @@ -772,8 +769,8 @@ public class ICUServiceTest extends CoreTestFmwk { int n = 0; - List factories = service.factories(); - Iterator iter = factories.iterator(); + List factories = service.factories(); + Iterator iter = factories.iterator(); while (iter.hasNext()) { logln("[" + n++ + "] " + iter.next()); } @@ -783,14 +780,14 @@ public class ICUServiceTest extends CoreTestFmwk // since we're using locale keys, we should get all and only the es locales // hmmm, the default toString function doesn't print in sorted order for TreeMap { - SortedMap map = service.getDisplayNames(ULocale.US, - new Comparator() { - @Override - public int compare(Object lhs, Object rhs) { + SortedMap map = service.getDisplayNames(ULocale.US, + new Comparator() { + @Override + public int compare(Object lhs, Object rhs) { return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs); - } - }, - "es"); + } + }, + "es"); logln("es display names in reverse order " + map); } @@ -817,7 +814,7 @@ public class ICUServiceTest extends CoreTestFmwk } @Override - public void updateVisibleIDs(Map result) { + public void updateVisibleIDs(Map result) { result.put("greeting", this); } @@ -950,13 +947,13 @@ public class ICUServiceTest extends CoreTestFmwk logln("obj: " + lkf.create(lkey, null)); logln(lkf.getDisplayName("foo", null)); logln(lkf.getDisplayName("bar", null)); - lkf.updateVisibleIDs(new HashMap()); + lkf.updateVisibleIDs(new HashMap<>()); LocaleKeyFactory invisibleLKF = new LKFSubclass(false); logln("obj: " + invisibleLKF.create(lkey, null)); logln(invisibleLKF.getDisplayName("foo", null)); logln(invisibleLKF.getDisplayName("bar", null)); - invisibleLKF.updateVisibleIDs(new HashMap()); + invisibleLKF.updateVisibleIDs(new HashMap<>()); // ResourceBundleFactory ICUResourceBundleFactory rbf = new ICUResourceBundleFactory(); @@ -1027,8 +1024,8 @@ public class ICUServiceTest extends CoreTestFmwk } @Override - protected Set getSupportedIDs() { - return Collections.EMPTY_SET; + protected Set getSupportedIDs() { + return Collections.emptySet(); } } } diff --git a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/LocaleDataTest.java b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/LocaleDataTest.java index 473bbff0eb9..4c82d1fdbbc 100644 --- a/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/LocaleDataTest.java +++ b/icu4j/main/common_tests/src/test/java/com/ibm/icu/dev/test/util/LocaleDataTest.java @@ -199,7 +199,7 @@ public class LocaleDataTest extends CoreTestFmwk{ @Test public void TestExemplarSet(){ - HashSet testedExemplars = new HashSet(); + HashSet testedExemplars = new HashSet<>(); int equalCount = 0; for(int i=0; i testedExemplars = new HashSet<>(); for(int i=0; i[] getLocaleParams = new Class[] { ULocale.Type.class }; try { - Class cls = obj.getClass(); + Class cls = obj.getClass(); Method getLocale = cls.getMethod("getLocale", getLocaleParams); ULocale valid = (ULocale) getLocale.invoke(obj, new Object[] { ULocale.VALID_LOCALE }); @@ -1490,12 +1490,12 @@ public class ULocaleTest extends CoreTestFmwk { logln("Testing locale " + localeID + " ..."); ULocale loc = new ULocale(localeID); - Iterator it = loc.getKeywords(); - Iterator it2 = ULocale.getKeywords(localeID); + Iterator it = loc.getKeywords(); + Iterator it2 = ULocale.getKeywords(localeID); //it and it2 are not equal here. No way to verify their equivalence yet. while(it.hasNext()) { - String key = (String)it.next(); - String key2 = (String)it2.next(); + String key = it.next(); + String key2 = it2.next(); if (!key.equals(key2)) { errln("FAIL: static and non-static getKeywords returned different results."); } @@ -1678,7 +1678,8 @@ public class ULocaleTest extends CoreTestFmwk { } //Hashtables for storing expected display of keys/types of locale in English and Chinese - private static Map[] h = new Map[2]; + @SuppressWarnings("unchecked") + private static Map[] h = new Map[2]; private static final String ACCEPT_LANGUAGE_TESTS[][] = { /*# result fallback? */ @@ -3659,9 +3660,9 @@ public class ULocaleTest extends CoreTestFmwk { "zh_Hant_TW", "zh_TW" }, { - "und_Hant_CN", - "zh_Hant_CN", - "zh_Hant_CN" + "und_Hant_CN", + "yue_Hant_CN", + "yue_Hant_CN" }, { "und_Hant_TW", "zh_Hant_TW", @@ -4162,14 +4163,18 @@ public class ULocaleTest extends CoreTestFmwk { "und_US", "en_Latn_US", "en" - } + }, { + "th@x=private", + "th_Thai_TH@x=private", + "th@x=private", + }, { + "und@x=private", + "en_Latn_US@x=private", + "en@x=private", + } }; for (int i = 0; i < full_data.length; i++) { - if (full_data[i][0].equals("und_Hant_CN") && - logKnownIssue("CLDR-17981", "und_Hant_CN changed expected result for Likely Subtags")) { - continue; - } ULocale org = new ULocale(full_data[i][0]); ULocale res = ULocale.addLikelySubtags(org); String exp = full_data[i][1]; @@ -5718,14 +5723,14 @@ public class ULocaleTest extends CoreTestFmwk { assertEquals("addLikelySubtags(" + test.source + ") should be unchanged", l, ULocale.addLikelySubtags(l)); } else { - if ( ( test.source.equals("und-Latn-MU") || test.source.equals("und-Latn-RS") || test.source.equals("und-Latn-SL") - || test.source.equals("und-Latn-TK") || test.source.equals("und-Latn-ZM") ) - && logKnownIssue("CLDR-17981", "und_Hant_CN changed expected result for Likely Subtags") ) { - return; - } - assertEquals("addLikelySubtags(" + test.source + ")", - test.addLikely, ULocale.addLikelySubtags(l).toLanguageTag()); - } + if ( ( test.source.equals("und-Latn-MU") || test.source.equals("und-Latn-RS") || test.source.equals("und-Latn-SL") + || test.source.equals("und-Latn-TK") || test.source.equals("und-Latn-ZM") ) + && logKnownIssue("CLDR-18002", "Incorrect Likely Subtags for some entries modified in CLDR 46") ) { + return; + } + assertEquals("addLikelySubtags(" + test.source + ")", + test.addLikely, ULocale.addLikelySubtags(l).toLanguageTag()); + } if (test.removeFavorRegion.equals("FAIL")) { assertEquals("minimizeSubtags(" + test.source + ") should be unchanged", l, ULocale.minimizeSubtags(l)); diff --git a/icu4j/main/core/pom.xml b/icu4j/main/core/pom.xml index 5385b791fdd..0760367795b 100644 --- a/icu4j/main/core/pom.xml +++ b/icu4j/main/core/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/impl/LocaleFallbackData.java b/icu4j/main/core/src/main/java/com/ibm/icu/impl/LocaleFallbackData.java index 22626f4121d..7686eb131ad 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/impl/LocaleFallbackData.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/impl/LocaleFallbackData.java @@ -318,7 +318,7 @@ class LocaleFallbackData { t.put("gon", "Deva"); t.put("got", "Goth"); t.put("gra", "Deva"); - t.put("grc", "Cprt"); + t.put("grc", "Grek"); t.put("grt", "Beng"); t.put("gru", "Ethi"); t.put("gu", "Gujr"); @@ -409,7 +409,7 @@ class LocaleFallbackData { t.put("ka", "Geor"); t.put("kaa", "Cyrl"); t.put("kap", "Cyrl"); - t.put("kaw", "Kawi"); + t.put("kaw", "Bali"); t.put("kbd", "Cyrl"); t.put("kbg", "Tibt"); t.put("kbu", "Arab"); diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/impl/number/DecimalQuantity_DualStorageBCD.java b/icu4j/main/core/src/main/java/com/ibm/icu/impl/number/DecimalQuantity_DualStorageBCD.java index 414f62938eb..947d134ddd5 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/impl/number/DecimalQuantity_DualStorageBCD.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/impl/number/DecimalQuantity_DualStorageBCD.java @@ -167,7 +167,14 @@ public final class DecimalQuantity_DualStorageBCD extends DecimalQuantity_Abstra @Override protected void shiftLeft(int numDigits) { - if (!usingBytes && precision + numDigits > 16) { + // https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19 + // If the promoted type of the left-hand operand is long, then only the + // six lowest-order bits of the right-hand operand are used as the shift + // distance. It is as if the right-hand operand were subjected to a bitwise + // logical AND operator & (§15.22.1) with the mask value 0x3f (0b111111). + // The shift distance actually used is therefore always in the range 0 to + // 63, inclusive. + if (!usingBytes && precision + numDigits >= 16) { switchStorage(); } if (usingBytes) { diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/text/BreakIteratorFactory.java b/icu4j/main/core/src/main/java/com/ibm/icu/text/BreakIteratorFactory.java index c78f36ed638..4ab6ccc0aac 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/text/BreakIteratorFactory.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/text/BreakIteratorFactory.java @@ -150,7 +150,7 @@ final class BreakIteratorFactory extends BreakIterator.BreakIteratorServiceShim String typeKey = typeKeyExt.isEmpty() ? KIND_NAMES[kind] : KIND_NAMES[kind] + typeKeyExt; brkfname = rb.getStringWithFallback("boundaries/" + typeKey); String rulesFileName = ICUData.ICU_BRKITR_NAME+ '/' + brkfname; - bytes = ICUBinary.getData(rulesFileName); + bytes = ICUBinary.getRequiredData(rulesFileName); } catch (Exception e) { throw new MissingResourceException(e.toString(),"",""); diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/util/Calendar.java b/icu4j/main/core/src/main/java/com/ibm/icu/util/Calendar.java index 47e4d6a205f..0eefb4a16b3 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/util/Calendar.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/util/Calendar.java @@ -13,6 +13,7 @@ import java.io.ObjectOutputStream; import java.io.Serializable; import java.text.StringCharacterIterator; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.Locale; import java.util.MissingResourceException; @@ -1355,9 +1356,9 @@ public abstract class Calendar implements Serializable, Cloneable, Comparablestamp[], an internal array. * @serial */ - private transient int nextStamp = MINIMUM_USER_STAMP; + private transient byte nextStamp = MINIMUM_USER_STAMP; /* Max value for stamp allowable before recalculation */ - private static int STAMP_MAX = 10000; + private static byte STAMP_MAX = Byte.MAX_VALUE; // the internal serial version which says which version was written // - 0 (default) for version up to JDK 1.1.5 @@ -1684,7 +1685,7 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable * @deprecated This API is ICU internal only. */ @Deprecated - public static final String ICU_DATA_VERSION_PATH = "76b"; + public static final String ICU_DATA_VERSION_PATH = "77b"; /** * Data version in ICU4J. @@ -584,7 +584,7 @@ public final class VersionInfo implements Comparable UNICODE_15_1 = getInstance(15, 1, 0, 0); UNICODE_16_0 = getInstance(16, 0, 0, 0); - ICU_VERSION = getInstance(76, 1, 0, 0); + ICU_VERSION = getInstance(77, 0, 1, 0); ICU_DATA_VERSION = ICU_VERSION; UNICODE_VERSION = UNICODE_16_0; diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af.res index eacfc8e7731..8696170c0d0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af_NA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af_NA.res index a998d761db1..70720a81bf6 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af_NA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af_NA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af_ZA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af_ZA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af_ZA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/af_ZA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/agq.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/agq.res index d7716c3b4e4..c11c02c71e5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/agq.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/agq.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/agq_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/agq_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/agq_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/agq_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ak.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ak.res index 521698011a4..31662ad9535 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ak.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ak.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ak_GH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ak_GH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ak_GH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ak_GH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/am.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/am.res index e2d7da6fcb3..58ec13daa2e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/am.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/am.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/am_ET.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/am_ET.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/am_ET.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/am_ET.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar.res index 3ebe5bbd692..18c3f8190dc 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_001.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_001.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_001.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_001.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_AE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_AE.res index 7a4092c6d75..eddab00c4f2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_AE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_AE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_BH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_BH.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_BH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_BH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_DJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_DJ.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_DJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_DJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_DZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_DZ.res index 67efabbe669..cae4e27d285 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_DZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_DZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_EG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_EG.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_EG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_EG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_EH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_EH.res index 140edc4e386..488ff77210f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_EH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_EH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_ER.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_ER.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_ER.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_ER.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_IL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_IL.res index c9b3c4773ba..1facba62017 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_IL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_IL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_IQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_IQ.res index 7e70764f7b7..23aa1a813a0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_IQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_IQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_JO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_JO.res index 7eefc2f129a..7a4719bd689 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_JO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_JO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_KM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_KM.res index 78f79cec474..1e211b0a625 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_KM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_KM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_KW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_KW.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_KW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_KW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_LB.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_LB.res index 6c35dee2c37..55dfc5c175f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_LB.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_LB.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_LY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_LY.res index 94f0f39bf75..c64a485ed59 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_LY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_LY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_MA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_MA.res index 9ca8382a505..fa699da2fb8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_MA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_MA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_MR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_MR.res index c8b1548226f..72ea8b471b6 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_MR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_MR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_OM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_OM.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_OM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_OM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_PS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_PS.res index 7eefc2f129a..7a4719bd689 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_PS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_PS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_QA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_QA.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_QA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_QA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SA.res index d798816c3e3..05611da9001 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SD.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SO.res index 804508bde50..f010af6a334 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SS.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SY.res index 7eefc2f129a..7a4719bd689 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_SY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_TD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_TD.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_TD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_TD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_TN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_TN.res index 67efabbe669..cae4e27d285 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_TN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_TN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_YE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_YE.res index f2743563e38..376867609be 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_YE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ar_YE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ars.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ars.res index 41f765b35a6..e2208b508ab 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ars.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ars.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/as.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/as.res index ff36738464c..b60b706fc39 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/as.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/as.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/as_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/as_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/as_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/as_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/asa.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/asa.res index 41ce0eb00d6..32893465a91 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/asa.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/asa.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/asa_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/asa_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/asa_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/asa_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ast.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ast.res index de3f33d674a..92db5c77e63 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ast.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ast.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ast_ES.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ast_ES.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ast_ES.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ast_ES.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az.res index 7640a947a77..c62c3aeec21 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_AZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_AZ.res index b1000001214..fa0201ec775 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_AZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_AZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Cyrl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Cyrl.res index a192aa4262a..7128f34db08 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Cyrl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Cyrl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Cyrl_AZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Cyrl_AZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Cyrl_AZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Cyrl_AZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Latn.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Latn_AZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Latn_AZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Latn_AZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/az_Latn_AZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bas.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bas.res index eba3309d916..d19ae275eba 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bas.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bas.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bas_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bas_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bas_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bas_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/be.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/be.res index b455480d1d0..92ec3a43d67 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/be.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/be.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/be_BY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/be_BY.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/be_BY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/be_BY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bem.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bem.res index 667efcdfc67..a4c6c2bfd80 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bem.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bem.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bem_ZM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bem_ZM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bem_ZM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bem_ZM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bez.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bez.res index 93cdd0afe5f..0b5da6583df 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bez.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bez.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bez_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bez_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bez_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bez_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bg.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bg.res index f7a6acaa299..14b5b624e91 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bg.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bg.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bg_BG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bg_BG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bg_BG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bg_BG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bgc.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bgc.res index 762d73e6e3f..f79636bcc90 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bgc.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bgc.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bgc_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bgc_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bgc_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bgc_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bho.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bho.res index 3eb91bf94cd..6eb153a5f7f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bho.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bho.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bho_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bho_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bho_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bho_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/blo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/blo.res index ff29834d87b..81948a85e36 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/blo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/blo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/blo_BJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/blo_BJ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/blo_BJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/blo_BJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bm.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bm.res index 33f0bbf9633..e6d8d14f776 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bm.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bm.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bm_ML.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bm_ML.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bm_ML.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bm_ML.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn.res index 89324d7fc93..c461c442f32 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn_BD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn_BD.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn_BD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn_BD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn_IN.res index bcb7256776d..9804aab5c67 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bn_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo.res index f38b44d34e9..1910c3548ff 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo_CN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo_IN.res index 9b9e03419e9..84b35c5c68d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bo_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/br.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/br.res index 17c7d6a9832..45a275d4601 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/br.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/br.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/br_FR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/br_FR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/br_FR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/br_FR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/char.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/char.brk index 16a9aceee89..fd22a1c22e5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/char.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/char.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/fi.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/fi.res deleted file mode 100644 index 30775c77faa..00000000000 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/fi.res and /dev/null differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk index 8d0172d055c..fea6eaaf279 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_cj.brk index dbbbc0dfbae..1f8d5552424 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_cj.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_cj.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose.brk index 9f77680c283..5ddccb23944 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_cj.brk index 4199ddeda1c..b890ebe13fe 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_cj.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_cj.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk index bebfe7285a2..14aa5b32f8d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_loose_phrase_cj.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal.brk index 0229e2cb2f2..f5df704f492 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_cj.brk index 9b13706bfb5..0c912e83e75 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_cj.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_cj.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_phrase_cj.brk index 7cbc6998771..208baf36649 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_phrase_cj.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_normal_phrase_cj.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_phrase_cj.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_phrase_cj.brk index b9f1fa48e7d..c627f2f2d60 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_phrase_cj.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/line_phrase_cj.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/res_index.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/res_index.res index d09052f87c6..1def2eb4d0f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/res_index.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/res_index.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/sv.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/sv.res deleted file mode 100644 index 30775c77faa..00000000000 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/sv.res and /dev/null differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word.brk index e3c17fdcbc6..0b99e3ca97e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word_POSIX.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word_POSIX.brk index cada1d7983b..cb01e517597 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word_POSIX.brk and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word_POSIX.brk differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word_fi_sv.brk b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word_fi_sv.brk deleted file mode 100644 index 0b99e3ca97e..00000000000 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brkitr/word_fi_sv.brk and /dev/null differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brx.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brx.res index 60482adb861..d8be6e29592 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brx.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brx.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brx_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brx_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brx_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/brx_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs.res index d33b5740e41..4e1002511fa 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_BA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_BA.res index 5f27eb60fca..5f1fcfdcb09 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_BA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_BA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Cyrl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Cyrl.res index eeabbea31de..dc6be742b2a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Cyrl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Cyrl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Cyrl_BA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Cyrl_BA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Cyrl_BA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Cyrl_BA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Latn.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Latn_BA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Latn_BA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Latn_BA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/bs_Latn_BA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca.res index 748b7638750..817aa097465 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_AD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_AD.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_AD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_AD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_ES.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_ES.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_ES.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_ES.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_FR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_FR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_FR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_FR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_IT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_IT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_IT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ca_IT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp.res index d1301bf3de3..c3faea9dbf4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp_BD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp_BD.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp_BD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp_BD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ccp_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ce.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ce.res index a95fe5c4b74..79faaf62790 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ce.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ce.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ce_RU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ce_RU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ce_RU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ce_RU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ceb.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ceb.res index 69ec8515f9d..4a4d9f548ad 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ceb.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ceb.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ceb_PH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ceb_PH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ceb_PH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ceb_PH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cgg.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cgg.res index b8a48226f43..182556fc969 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cgg.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cgg.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cgg_UG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cgg_UG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cgg_UG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cgg_UG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/chr.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/chr.res index 0537c5ed56a..f6454314bf9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/chr.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/chr.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/chr_US.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/chr_US.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/chr_US.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/chr_US.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb.res index a1231e9c18e..5befb9cea6c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb_IQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb_IQ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb_IQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb_IQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb_IR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb_IR.res index 8a561be0431..5c2f6151958 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb_IR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ckb_IR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cs.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cs.res index b3cefdb8c60..f85c2039485 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cs.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cs.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cs_CZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cs_CZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cs_CZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cs_CZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/csw.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/csw.res index e87f36012d6..eb5296d0100 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/csw.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/csw.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/csw_CA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/csw_CA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/csw_CA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/csw_CA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cv.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cv.res index 051e456dd1d..e6acc649a06 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cv.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cv.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cv_RU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cv_RU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cv_RU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cv_RU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cy.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cy.res index ea43cd445dc..4316f47793c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cy.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cy.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cy_GB.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cy_GB.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cy_GB.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/cy_GB.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da.res index ffdbfe10f76..693fede4fdb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da_DK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da_DK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da_DK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da_DK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da_GL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da_GL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da_GL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/da_GL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dav.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dav.res index 8c5bee0cb13..bfb76b233f8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dav.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dav.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dav_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dav_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dav_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dav_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de.res index 6fc0dfb6878..98140ec879f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_AT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_AT.res index acb133a7885..f0c7eea0ddc 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_AT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_AT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_BE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_BE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_BE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_BE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_CH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_CH.res index b5f311cb29d..ed3f9f311f7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_CH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_CH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_DE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_DE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_DE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_DE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_IT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_IT.res index abe9ae0a411..5691bcfe4c7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_IT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_IT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_LI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_LI.res index 9c1d94cf409..2938ada80db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_LI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_LI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_LU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_LU.res index c0deced64ff..597038fc612 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_LU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/de_LU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dje.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dje.res index 49fe2a3e4c8..815be99645d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dje.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dje.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dje_NE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dje_NE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dje_NE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dje_NE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/doi.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/doi.res index bc62b509a33..01e382a8bcb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/doi.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/doi.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/doi_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/doi_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/doi_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/doi_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dsb.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dsb.res index d2f198f6276..1639a78f1e1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dsb.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dsb.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dsb_DE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dsb_DE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dsb_DE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dsb_DE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dua.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dua.res index 2a3468caecb..687bad0b911 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dua.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dua.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dua_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dua_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dua_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dua_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dyo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dyo.res index 6fdc2511eac..bb0a8b35493 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dyo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dyo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dyo_SN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dyo_SN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dyo_SN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dyo_SN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dz.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dz.res index b634bf51f00..daab81305c4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dz.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dz.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dz_BT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dz_BT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dz_BT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/dz_BT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ebu.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ebu.res index 30fa0caefa3..8190bbbdfff 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ebu.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ebu.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ebu_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ebu_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ebu_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ebu_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee.res index c3b7933d047..85c81507086 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee_GH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee_GH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee_GH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee_GH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee_TG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee_TG.res index 5379bc3fb38..1939d461d95 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee_TG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ee_TG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el.res index e01b13f200f..019d9d7423e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el_CY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el_CY.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el_CY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el_CY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el_GR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el_GR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el_GR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/el_GR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en.res index acfbc935806..8f136a02328 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_001.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_001.res index 89179158ff6..863db29829d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_001.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_001.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_150.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_150.res index 8b0627c7271..44cb3e148d6 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_150.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_150.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AE.res index 48f360e2d45..f1a6a88fa4f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AG.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AI.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AS.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AT.res index 4e0c74032c4..1292850ca0a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AU.res index 24cdcde44a9..83c7d2d849b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_AU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BB.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BB.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BB.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BB.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BE.res index e1f0191fd04..d34884080e2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BI.res index 43fec6be649..ff832a6bb38 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BM.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BS.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BW.res index 0468ad6c832..f0aa6af0ce7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BZ.res index df403687b1d..a55fbb51610 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_BZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CA.res index e82638b03e9..d2582bd0abf 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CC.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CH.res index fdb3c17caa5..53c4c13f609 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CK.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CM.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CX.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CX.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CX.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CX.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CY.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_CY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DE.res index c9522830b5c..a1a8cadeb5e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DG.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DK.res index 757bf7bcc62..b8e821409e9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DM.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_DM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ER.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ER.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ER.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ER.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FI.res index 80b3ea8c032..10947570ffd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FJ.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FK.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FM.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_FM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GB.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GB.res index 8d16e84be76..d870837b28d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GB.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GB.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GD.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GG.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GH.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GI.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GM.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GY.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_GY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_HK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_HK.res index 0284f87edb6..3d8dd17de43 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_HK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_HK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ID.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ID.res index 2f7a89a3ae8..f224aca011f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ID.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ID.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IE.res index e94f180eb5c..4256de14b15 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IL.res index 68d25de2d3f..28addf2119c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IM.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IN.res index c40b83e49af..131205e8fd5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IO.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_IO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_JE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_JE.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_JE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_JE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_JM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_JM.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_JM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_JM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KE.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KI.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KN.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KY.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_KY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LC.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LR.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LS.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_LS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MG.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MO.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MP.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MP.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MP.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MP.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MS.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MT.res index b4a9305a2b3..062d3f7ff98 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MU.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MV.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MV.res index 88ed30a7b56..0dc52d62c55 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MV.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MV.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MW.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MY.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_MY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NA.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NF.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NG.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NH.res index 1694b3630a5..169b2f19826 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NL.res index 6e9da40eadd..c6e5d8ff9b5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NR.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NU.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NZ.res index f3e095ca901..6785d1cc6b0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_NZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PG.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PK.res index 2d86cd24726..ce1967f98ac 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PN.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PW.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_PW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_RH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_RH.res index 8383a6ba82d..5fa62d0996b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_RH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_RH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_RW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_RW.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_RW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_RW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SB.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SB.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SB.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SB.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SC.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SD.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SE.res index 38222b43d38..ecf983957f2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SG.res index d3cc80f78ed..8270c2ff351 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SH.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SI.res index 6fa7e7e3398..224fc62d0e9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SL.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SS.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SX.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SX.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SX.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SX.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SZ.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_SZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TC.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TK.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TO.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TT.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TV.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TV.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TV.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TV.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TZ.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_UG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_UG.res index 9f1a0160b78..b2dab598da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_UG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_UG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_UM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_UM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_UM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_UM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_US.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_US.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_US.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_US.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_US_POSIX.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_US_POSIX.res index d8a0b9cf5c3..7f423456fc9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_US_POSIX.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_US_POSIX.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VC.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VG.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VI.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VU.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_VU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_WS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_WS.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_WS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_WS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZA.res index a975245dacc..43301d9950d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZM.res index 2ccbaea5e2b..a966a3f5c29 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZW.res index cbc742dc593..d312798b648 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/en_ZW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eo.res index 315cee13ca7..c2ec883b97a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eo_001.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eo_001.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eo_001.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eo_001.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es.res index 909f264923b..b416694d441 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_419.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_419.res index e41dd8fc8d6..932b04b3b85 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_419.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_419.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_AR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_AR.res index 7635f787a56..390ace42a99 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_AR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_AR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BO.res index ecd1c9115cf..69e9bccd4dd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BR.res index d7ebec68aad..746cc1ea0a5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BZ.res index d7ebec68aad..746cc1ea0a5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_BZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CL.res index b310dff61d9..5b549983737 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CO.res index 5f8e28f3993..d99093e713f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CR.res index 80a48f48a46..a7c972fea3b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CU.res index 5f1c7aa2167..fd2bd7b4522 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_CU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_DO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_DO.res index 5a0081541fd..faa0b5dd815 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_DO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_DO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_EA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_EA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_EA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_EA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_EC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_EC.res index 4b0a4229d97..ec46af44fee 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_EC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_EC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_ES.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_ES.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_ES.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_ES.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_GQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_GQ.res index b9ee4c877c6..ab9be64dc21 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_GQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_GQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_GT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_GT.res index f8e5c8ac4df..8d0de798b5a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_GT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_GT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_HN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_HN.res index a14c6dea907..5ad964f4c6e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_HN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_HN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_IC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_IC.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_IC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_IC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_MX.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_MX.res index 68be7fd856d..fe92e725d30 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_MX.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_MX.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_NI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_NI.res index f70bcf0806b..30ffb37875e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_NI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_NI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PA.res index 560a5e984ad..cc00b9dddd7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PE.res index bf1d9e35e30..39964f91226 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PH.res index 0a4c78a1b93..ed1b68343b2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PR.res index 6faea37ac85..1a11a0bfc2f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PY.res index ab4aef89411..fcca5ee53af 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_PY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_SV.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_SV.res index 598f727c9e0..9b2d6539e9d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_SV.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_SV.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_US.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_US.res index d81d9a75a64..23d1ec6aaed 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_US.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_US.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_UY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_UY.res index 4527c566825..ad571d0bb5a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_UY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_UY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_VE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_VE.res index 7ee2b17b2dc..3b7812c47ba 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_VE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/es_VE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/et.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/et.res index fcbabe6ed08..640356e632f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/et.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/et.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/et_EE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/et_EE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/et_EE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/et_EE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eu.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eu.res index 9e3e94ece32..a7cf66add20 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eu.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eu.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eu_ES.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eu_ES.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eu_ES.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/eu_ES.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ewo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ewo.res index 70484ba4c1e..6dc9cb81b23 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ewo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ewo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ewo_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ewo_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ewo_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ewo_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa.res index 80af7159e6b..e9b2880752e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa_AF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa_AF.res index 8d417a9b5c1..11602ba6dc4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa_AF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa_AF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa_IR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa_IR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa_IR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fa_IR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff.res index c57257f5124..a4e9ca19364 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm.res index 12584fa0adc..a2ff047c83e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_BF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_BF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_BF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_BF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GH.res index 088c051766c..34db985660b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GM.res index 088c051766c..34db985660b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_GW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_LR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_LR.res index 088c051766c..34db985660b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_LR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_LR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_MR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_MR.res index 088c051766c..34db985660b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_MR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_MR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_NE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_NE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_NE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_NE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_NG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_NG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_NG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_NG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_SL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_SL.res index 088c051766c..34db985660b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_SL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_SL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_SN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_SN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_SN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Adlm_SN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_CM.res index 2cf5541de42..578dd497ed0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_GN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_GN.res index b1037593e9d..0c54fea6d0c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_GN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_GN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_BF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_BF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_BF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_BF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GH.res index 343b006b28b..f1e16c71fdb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GM.res index 343b006b28b..f1e16c71fdb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_GW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_LR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_LR.res index 343b006b28b..f1e16c71fdb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_LR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_LR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_MR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_MR.res index 343b006b28b..f1e16c71fdb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_MR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_MR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_NE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_NE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_NE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_NE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_NG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_NG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_NG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_NG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_SL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_SL.res index 343b006b28b..f1e16c71fdb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_SL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_SL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_SN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_SN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_SN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_Latn_SN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_MR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_MR.res index c628567bc1e..ca0977fbc35 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_MR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_MR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_SN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_SN.res index ba001d727ed..0bd574c9612 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_SN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ff_SN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fi.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fi.res index 2a0132984b5..115a751cee2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fi.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fi.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fi_FI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fi_FI.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fi_FI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fi_FI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fil.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fil.res index 5c909204181..45a3fdb349e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fil.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fil.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fil_PH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fil_PH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fil_PH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fil_PH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo.res index 730329ed7dc..0f44c70de03 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo_DK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo_DK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo_DK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo_DK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo_FO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo_FO.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo_FO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fo_FO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr.res index a941b930179..1ba99a8b148 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BE.res index f03cc62b94e..75c3a46a1f7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BI.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BJ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_BL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CA.res index c678911ba81..88e954c43b5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CD.res index 425b94fc759..4bdaf1052b8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CH.res index c69b74bd259..fa1513da1f1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CI.res index 090e92e280d..ff0e526c69e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CM.res index 072f622ec61..457d7600017 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_DJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_DJ.res index f5441651138..86f9b14f8db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_DJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_DJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_DZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_DZ.res index f5441651138..86f9b14f8db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_DZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_DZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_FR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_FR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_FR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_FR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GP.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GP.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GP.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GP.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GQ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_GQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_HT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_HT.res index fff62b4ecf6..333bdeac0da 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_HT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_HT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_KM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_KM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_KM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_KM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_LU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_LU.res index 20025c8b394..6c3eb8f57ef 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_LU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_LU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MA.res index 1df152917c0..0d3c3b22af3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MC.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_ML.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_ML.res index 4d2b3e41eb2..07ec3495022 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_ML.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_ML.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MQ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MR.res index f5441651138..86f9b14f8db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_MU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_NC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_NC.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_NC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_NC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_NE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_NE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_NE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_NE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_PF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_PF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_PF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_PF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_PM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_PM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_PM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_PM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_RE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_RE.res index de934a1eb64..828fbfdafe4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_RE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_RE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_RW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_RW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_RW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_RW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SC.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SN.res index f7980fa13b8..a9c452d44c8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SY.res index f5441651138..86f9b14f8db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_SY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TD.res index f5441651138..86f9b14f8db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TN.res index f5441651138..86f9b14f8db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_TN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_VU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_VU.res index f5441651138..86f9b14f8db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_VU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_VU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_WF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_WF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_WF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_WF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_YT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_YT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_YT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fr_YT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fur.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fur.res index e4fd5c27138..22227803409 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fur.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fur.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fur_IT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fur_IT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fur_IT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fur_IT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fy.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fy.res index 0d8d4cab14d..1047b09acba 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fy.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fy.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fy_NL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fy_NL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fy_NL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/fy_NL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga.res index 2d44e3c1204..54e473e0214 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga_GB.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga_GB.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga_GB.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga_GB.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga_IE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga_IE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga_IE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ga_IE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gaa.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gaa.res index 9a8368306e0..1f07ade51da 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gaa.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gaa.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gaa_GH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gaa_GH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gaa_GH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gaa_GH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gd.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gd.res index c6a62f4190e..aee429af639 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gd.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gd.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gd_GB.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gd_GB.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gd_GB.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gd_GB.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gl.res index b7bc463d147..3e75b49a65a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gl_ES.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gl_ES.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gl_ES.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gl_ES.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw.res index 5665d146eac..7d4d2c7ad07 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_CH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_CH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_CH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_CH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_FR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_FR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_FR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_FR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_LI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_LI.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_LI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gsw_LI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gu.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gu.res index 9cb8679f5b9..b4b94df09bc 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gu.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gu.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gu_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gu_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gu_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gu_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/guz.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/guz.res index 1152b27cd66..e475c539ca8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/guz.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/guz.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/guz_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/guz_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/guz_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/guz_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gv.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gv.res index 609f29e4d73..09a31351f1e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gv.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gv.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gv_IM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gv_IM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gv_IM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/gv_IM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha.res index 5f2a32d5dcf..70c3e091dcd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_GH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_GH.res index f317f2e77b1..c2513f5d837 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_GH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_GH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_NE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_NE.res index c9951f40fd4..dc5a79fca20 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_NE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_NE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_NG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_NG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_NG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ha_NG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/haw.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/haw.res index be0b0ea3b8b..256558f08db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/haw.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/haw.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/haw_US.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/haw_US.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/haw_US.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/haw_US.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/he.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/he.res index a26f28f5606..e9462e4f21e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/he.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/he.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/he_IL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/he_IL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/he_IL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/he_IL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi.res index 9289ccd98a6..99b9438ad31 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_Latn.res index bfd9a2ab08e..3666bbcf4e9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_Latn_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_Latn_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_Latn_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hi_Latn_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr.res index f128ed0689c..01ec07653ec 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr_BA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr_BA.res index 1c095b1a683..7709912744d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr_BA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr_BA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr_HR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr_HR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr_HR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hr_HR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hsb.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hsb.res index 74999fbbb5a..245417ff5d1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hsb.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hsb.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hsb_DE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hsb_DE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hsb_DE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hsb_DE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hu.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hu.res index 367fdf3e4c4..25d439bba0a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hu.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hu.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hu_HU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hu_HU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hu_HU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hu_HU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hy.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hy.res index e091ca54722..350f5299a4e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hy.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hy.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hy_AM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hy_AM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hy_AM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/hy_AM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ia.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ia.res index f7678610353..8802921e65c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ia.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ia.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ia_001.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ia_001.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ia_001.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ia_001.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/id.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/id.res index be6a3ff8da9..72f48558a3b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/id.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/id.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/id_ID.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/id_ID.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/id_ID.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/id_ID.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ie.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ie.res index 1e3be89c195..28ebf09aa45 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ie.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ie.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ie_EE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ie_EE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ie_EE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ie_EE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ig.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ig.res index 2b0357085cb..1140e40038b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ig.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ig.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ig_NG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ig_NG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ig_NG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ig_NG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ii.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ii.res index 429b7ec94d9..65999c0294f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ii.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ii.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ii_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ii_CN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ii_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ii_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/in.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/in.res index 5ef4ac89dc7..54157434ed9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/in.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/in.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/in_ID.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/in_ID.res index 2de60b27a86..a6c9e4d7321 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/in_ID.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/in_ID.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/is.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/is.res index 8cb17f3c8de..fb142cc8f6d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/is.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/is.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/is_IS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/is_IS.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/is_IS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/is_IS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it.res index 8c2e7ebc16a..e5574db1681 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_CH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_CH.res index b58a02f8fa6..a937ca84bdc 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_CH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_CH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_IT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_IT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_IT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_IT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_SM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_SM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_SM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_SM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_VA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_VA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_VA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/it_VA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/iw.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/iw.res index e787ec28ab6..325af74876b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/iw.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/iw.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/iw_IL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/iw_IL.res index 47e725e455d..361c38980ef 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/iw_IL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/iw_IL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja.res index 70b6d16b72b..0c8b66cdb73 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja_JP.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja_JP.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja_JP.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja_JP.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja_JP_TRADITIONAL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja_JP_TRADITIONAL.res index 7726f6f65f3..2dda9857675 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja_JP_TRADITIONAL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ja_JP_TRADITIONAL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jgo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jgo.res index 675be75968d..c6ddc438fb6 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jgo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jgo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jgo_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jgo_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jgo_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jgo_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jmc.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jmc.res index 130a33c4151..ef7c62859fa 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jmc.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jmc.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jmc_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jmc_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jmc_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jmc_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jv.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jv.res index 9bf7db7fe86..435a9762fb3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jv.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jv.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jv_ID.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jv_ID.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jv_ID.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/jv_ID.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ka.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ka.res index 5628ab2d28b..8dd3f2528e1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ka.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ka.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ka_GE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ka_GE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ka_GE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ka_GE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kab.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kab.res index 3fbb2c8e20c..2bb9dc4a807 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kab.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kab.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kab_DZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kab_DZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kab_DZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kab_DZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kam.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kam.res index 029935490ca..eac67a2dbf1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kam.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kam.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kam_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kam_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kam_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kam_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kde.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kde.res index 58e444749c8..7fec0dbe3ca 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kde.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kde.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kde_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kde_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kde_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kde_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kea.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kea.res index fc02e879cae..4353973299c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kea.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kea.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kea_CV.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kea_CV.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kea_CV.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kea_CV.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kgp.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kgp.res index 6cac942ca1c..c1413733515 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kgp.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kgp.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kgp_BR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kgp_BR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kgp_BR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kgp_BR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/khq.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/khq.res index 26a041e387e..ab18926b1c2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/khq.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/khq.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/khq_ML.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/khq_ML.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/khq_ML.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/khq_ML.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ki.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ki.res index edcc1518567..ad95caa2296 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ki.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ki.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ki_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ki_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ki_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ki_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk.res index d8d6348c86e..55fbbb2c95b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_Cyrl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_Cyrl.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_Cyrl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_Cyrl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_Cyrl_KZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_Cyrl_KZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_Cyrl_KZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_Cyrl_KZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_KZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_KZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_KZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kk_KZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kkj.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kkj.res index c473bdad193..1e30fcce8f9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kkj.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kkj.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kkj_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kkj_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kkj_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kkj_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kl.res index 05c1b1fe203..de4676cfadc 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kl_GL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kl_GL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kl_GL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kl_GL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kln.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kln.res index f565e442f49..40fc6bfd343 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kln.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kln.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kln_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kln_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kln_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kln_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/km.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/km.res index 5c04c020faa..9d55088f949 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/km.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/km.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/km_KH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/km_KH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/km_KH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/km_KH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kn.res index f547034d00d..caf6505bb37 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kn_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kn_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kn_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kn_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko.res index 43992ccb2ec..048f7973dc7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_CN.res index 907fd352385..697b0d56d0a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_KP.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_KP.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_KP.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_KP.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_KR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_KR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_KR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ko_KR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok.res index 0d9a10f007f..9cba409972e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Deva.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Deva.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Deva.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Deva.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Deva_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Deva_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Deva_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Deva_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Latn.res index 4caea98495c..66b9febca95 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Latn_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Latn_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Latn_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kok_Latn_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks.res index 06315cdf56c..948ba5379e9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Arab.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Arab.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Arab.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Arab.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Arab_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Arab_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Arab_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Arab_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Deva.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Deva.res index 4b6ba098176..e56ddbf3e76 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Deva.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Deva.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Deva_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Deva_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Deva_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_Deva_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_IN.res index 454f5a924c5..2f981af103e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ks_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksb.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksb.res index cefe266b4ea..e7d88d76afe 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksb.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksb.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksb_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksb_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksb_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksb_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksf.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksf.res index 3f698841be4..af632a5cec6 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksf.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksf.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksf_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksf_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksf_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksf_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksh.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksh.res index 1180c851ebc..e81d792191a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksh.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksh.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksh_DE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksh_DE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksh_DE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ksh_DE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ku.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ku.res index 5ba56228bf8..774ce4708a2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ku.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ku.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ku_TR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ku_TR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ku_TR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ku_TR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kw.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kw.res index 9eed311517d..fd8fb8d41d3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kw.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kw.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kw_GB.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kw_GB.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kw_GB.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kw_GB.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv.res index 1694c4ca311..5adef5a579b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Deva.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Deva.res index de195334596..b7c495eccf9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Deva.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Deva.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Deva_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Deva_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Deva_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Deva_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_IN.res index 49a7830471a..de496e6c8f5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Latn.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Latn_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Latn_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Latn_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Latn_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Orya.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Orya.res index 5c43f40ef11..0d75612009f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Orya.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Orya.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Orya_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Orya_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Orya_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Orya_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Telu.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Telu.res index 1ed512aae49..f59312a1921 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Telu.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Telu.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Telu_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Telu_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Telu_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/kxv_Telu_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ky.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ky.res index b707b270f00..a0f0036a4c0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ky.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ky.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ky_KG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ky_KG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ky_KG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ky_KG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lag.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lag.res index eb711d4367c..076e7d18220 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lag.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lag.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lag_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lag_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lag_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lag_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/langInfo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/langInfo.res index 7bc1f866e53..7c5dce6d5db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/langInfo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/langInfo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lb.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lb.res index 016f2340b29..4d1a9c9e06c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lb.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lb.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lb_LU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lb_LU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lb_LU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lb_LU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lg.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lg.res index 8f3aad00631..270a61ddc77 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lg.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lg.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lg_UG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lg_UG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lg_UG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lg_UG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lij.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lij.res index a9d6ed6a111..f02af587988 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lij.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lij.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lij_IT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lij_IT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lij_IT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lij_IT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lkt.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lkt.res index 48877a86e0a..32105f4997a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lkt.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lkt.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lkt_US.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lkt_US.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lkt_US.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lkt_US.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lmo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lmo.res index d41a5f48307..ca168cd8f60 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lmo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lmo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lmo_IT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lmo_IT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lmo_IT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lmo_IT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln.res index acbaf5f6a09..ebf8d27622d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_AO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_AO.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_AO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_AO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CD.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ln_CG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lo.res index 6b906b035b9..53d5aba5dbc 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lo_LA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lo_LA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lo_LA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lo_LA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc.res index 93989d87556..7575bb6393c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc_IQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc_IQ.res index dac13eff381..2ee7b4f06db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc_IQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc_IQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc_IR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc_IR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc_IR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lrc_IR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lt.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lt.res index ee4a72ce8b8..c3a494c6fb1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lt.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lt.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lt_LT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lt_LT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lt_LT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lt_LT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lu.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lu.res index 239ee38b544..ec8b3db5641 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lu.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lu.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lu_CD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lu_CD.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lu_CD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lu_CD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luo.res index 96c856526a7..1e939652e1f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luo_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luo_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luo_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luo_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luy.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luy.res index ae55fe92039..3675880f171 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luy.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luy.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luy_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luy_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luy_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/luy_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lv.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lv.res index 40d6ed86b1b..f3eb78c8b19 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lv.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lv.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lv_LV.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lv_LV.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lv_LV.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/lv_LV.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mai.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mai.res index d69d2e4813d..b7b0d60dd3d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mai.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mai.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mai_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mai_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mai_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mai_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas.res index 48e0fdbc7c6..97dbbd590bf 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mas_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mer.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mer.res index e84cf19e37e..0c571d61811 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mer.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mer.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mer_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mer_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mer_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mer_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mfe.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mfe.res index 1f41b991ae6..bca9ccc785d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mfe.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mfe.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mfe_MU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mfe_MU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mfe_MU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mfe_MU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mg.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mg.res index a7a67fc8efe..3271ffd422e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mg.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mg.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mg_MG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mg_MG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mg_MG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mg_MG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgh.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgh.res index acad9450da4..757f709081c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgh.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgh.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgh_MZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgh_MZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgh_MZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgh_MZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgo.res index f0118487a3f..b8a68e80451 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgo_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgo_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgo_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mgo_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mi.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mi.res index bc7d64ec54b..128fea86af8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mi.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mi.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mi_NZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mi_NZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mi_NZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mi_NZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mk.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mk.res index 2c1c18f17e7..7dc2c7c568f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mk.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mk.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mk_MK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mk_MK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mk_MK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mk_MK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ml.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ml.res index 96acf9e8375..a7e2cb61bcb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ml.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ml.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ml_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ml_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ml_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ml_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mn.res index 7a59f2c45e9..30fe9d6e2ea 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mn_MN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mn_MN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mn_MN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mn_MN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni.res index c570032abea..78a60b0fc20 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_Beng.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_Beng.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_Beng.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_Beng.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_Beng_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_Beng_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_Beng_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_Beng_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_IN.res index eaa505aeb40..3bbd1c4d354 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mni_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mo.res index 853e72e7526..b031d322df1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mr.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mr.res index b2fd2cd6e7e..1d52e793740 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mr.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mr.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mr_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mr_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mr_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mr_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms.res index 692d0ff020a..430d5c8034a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_BN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_BN.res index ee9f07c415e..eb966929c50 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_BN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_BN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_ID.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_ID.res index a82f67a98f1..24deda4c58b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_ID.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_ID.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_MY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_MY.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_MY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_MY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_SG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_SG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_SG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ms_SG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mt.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mt.res index c6c566aabaa..0c4e351db37 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mt.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mt.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mt_MT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mt_MT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mt_MT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mt_MT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mua.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mua.res index 92df6f9476c..976757e87e0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mua.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mua.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mua_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mua_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mua_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mua_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/my.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/my.res index bfb530aef9f..fbb02b1aad3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/my.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/my.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/my_MM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/my_MM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/my_MM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/my_MM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mzn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mzn.res index d84e6c6d0bf..1264d5c969d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mzn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mzn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mzn_IR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mzn_IR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mzn_IR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/mzn_IR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/naq.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/naq.res index 9a3fbd696fe..d67b7dd74fa 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/naq.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/naq.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/naq_NA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/naq_NA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/naq_NA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/naq_NA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb.res index 76c53ffc4af..1010d471719 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb_NO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb_NO.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb_NO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb_NO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb_SJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb_SJ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb_SJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nb_SJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nd.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nd.res index b13b3f2e659..cb0a4d817f7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nd.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nd.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nd_ZW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nd_ZW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nd_ZW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nd_ZW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds.res index 7a4f7f62024..18508241276 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds_DE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds_DE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds_DE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds_DE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds_NL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds_NL.res index f5b11bd9d72..cb77668f015 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds_NL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nds_NL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne.res index a7a512fc099..8afc45d3ac1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne_IN.res index ade1c586b30..5d789fda6ba 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne_NP.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne_NP.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne_NP.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ne_NP.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl.res index cc4c3d4d38b..79626fe83db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_AW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_AW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_AW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_AW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_BE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_BE.res index 286f16ed934..b0d4dde833f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_BE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_BE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_BQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_BQ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_BQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_BQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_CW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_CW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_CW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_CW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_NL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_NL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_NL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_NL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_SR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_SR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_SR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_SR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_SX.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_SX.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_SX.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nl_SX.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nmg.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nmg.res index b8b53cd76a1..85d1a541237 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nmg.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nmg.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nmg_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nmg_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nmg_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nmg_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nn.res index baa12b28f62..721f982dcc5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nn_NO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nn_NO.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nn_NO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nn_NO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nnh.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nnh.res index e19c164e36b..ed21b9c1327 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nnh.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nnh.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nnh_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nnh_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nnh_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nnh_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no.res index 0e3ca6d7ada..c505d42ca68 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no_NO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no_NO.res index aef5fc0483a..ceafb536bcd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no_NO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no_NO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no_NO_NY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no_NO_NY.res index 9e5b008288a..f3954e163bf 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no_NO_NY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/no_NO_NY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nqo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nqo.res index 5f65c18a899..4a27bc01ee8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nqo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nqo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nqo_GN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nqo_GN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nqo_GN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nqo_GN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nso.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nso.res index 32fe6e6d9e5..b3bf7e6619b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nso.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nso.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nso_ZA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nso_ZA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nso_ZA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nso_ZA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nus.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nus.res index f6b89e54f70..b73090e7592 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nus.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nus.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nus_SS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nus_SS.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nus_SS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nus_SS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nyn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nyn.res index ee6d62517c5..4353f638aef 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nyn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nyn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nyn_UG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nyn_UG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nyn_UG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/nyn_UG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc.res index 53308b87e31..9d4cdae6e65 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc_ES.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc_ES.res index 00103f64d6b..da5fce8a94d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc_ES.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc_ES.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc_FR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc_FR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc_FR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/oc_FR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om.res index d0244ab7bff..470a86f0305 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om_ET.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om_ET.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om_ET.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om_ET.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om_KE.res index 62382bcaa40..f971317442e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/om_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/or.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/or.res index 11c865d09f4..d9ac0a052b0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/or.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/or.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/or_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/or_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/or_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/or_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os.res index 13b195ac2af..d866e5e6fa8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os_GE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os_GE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os_GE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os_GE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os_RU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os_RU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os_RU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/os_RU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa.res index a534491622e..d5c4d9633f1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Arab.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Arab.res index 43c2e49b71a..18317fff7a1 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Arab.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Arab.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Arab_PK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Arab_PK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Arab_PK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Arab_PK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Guru.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Guru.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Guru.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Guru.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Guru_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Guru_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Guru_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_Guru_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_IN.res index 9e6cf7ca5ef..6e88e453669 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_PK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_PK.res index 244ef58027e..65ee86d1bd7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_PK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pa_PK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pcm.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pcm.res index 1e94f16b0c2..2f90c9a462c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pcm.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pcm.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pcm_NG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pcm_NG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pcm_NG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pcm_NG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pl.res index 4ca39417dc6..9d5f4907a0c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pl_PL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pl_PL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pl_PL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pl_PL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pool.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pool.res index da206ed84f6..bc8d2b9c252 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pool.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pool.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/prg.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/prg.res index 4c8c7d26df2..ae4e077b94c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/prg.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/prg.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/prg_PL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/prg_PL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/prg_PL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/prg_PL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps.res index 8bdab78ad7d..11be75b6763 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps_AF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps_AF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps_AF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps_AF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps_PK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps_PK.res index 3b6e6f26267..e6ccaa754fc 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps_PK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ps_PK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt.res index cc3252f9be9..a158a701889 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_AO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_AO.res index fe9d5557465..ae0ecad584b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_AO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_AO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_BR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_BR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_BR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_BR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_CH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_CH.res index 470591ea6a4..95b4fc0406c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_CH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_CH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_CV.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_CV.res index 470591ea6a4..95b4fc0406c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_CV.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_CV.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_GQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_GQ.res index 470591ea6a4..95b4fc0406c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_GQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_GQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_GW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_GW.res index 470591ea6a4..95b4fc0406c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_GW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_GW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_LU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_LU.res index 470591ea6a4..95b4fc0406c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_LU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_LU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_MO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_MO.res index 9d2810079b5..5a6ec404135 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_MO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_MO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_MZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_MZ.res index 470591ea6a4..95b4fc0406c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_MZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_MZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_PT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_PT.res index a50dfc131ad..b7f61b3da00 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_PT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_PT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_ST.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_ST.res index 470591ea6a4..95b4fc0406c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_ST.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_ST.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_TL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_TL.res index 470591ea6a4..95b4fc0406c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_TL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/pt_TL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu.res index c12ececf442..af681ae5af0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_BO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_BO.res index bbae8e54330..4a90902701d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_BO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_BO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_EC.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_EC.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_EC.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_EC.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_PE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_PE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_PE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/qu_PE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/raj.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/raj.res index e0617892d62..0a498217b2d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/raj.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/raj.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/raj_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/raj_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/raj_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/raj_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rm.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rm.res index 761b23a23c0..dde942e2e55 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rm.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rm.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rm_CH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rm_CH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rm_CH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rm_CH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rn.res index 56ec380b288..eebcd2fa7d8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rn_BI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rn_BI.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rn_BI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rn_BI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro.res index 0e6ad86eb34..cf9f5207c1d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro_MD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro_MD.res index 3120ec97e75..95e7b32caf8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro_MD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro_MD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro_RO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro_RO.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro_RO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ro_RO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rof.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rof.res index 173b7b99c9f..695c7ace5ab 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rof.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rof.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rof_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rof_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rof_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rof_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/root.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/root.res index 4e8483fac93..68d21fdc557 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/root.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/root.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru.res index b52eccf7955..dda9e4c6ba4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_BY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_BY.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_BY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_BY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_KG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_KG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_KG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_KG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_KZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_KZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_KZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_KZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_MD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_MD.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_MD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_MD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_RU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_RU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_RU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_RU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_UA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_UA.res index 82144137490..0ad685b8959 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_UA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ru_UA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rw.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rw.res index 0ab2c8207bd..7cffb019696 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rw.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rw.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rw_RW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rw_RW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rw_RW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rw_RW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rwk.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rwk.res index 02616384ed6..34c09300856 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rwk.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rwk.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rwk_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rwk_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rwk_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/rwk_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sa.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sa.res index 5cb6e4cec68..5e261f6f2cd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sa.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sa.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sa_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sa_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sa_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sa_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sah.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sah.res index 526c12b4ada..07cbd7c98a9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sah.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sah.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sah_RU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sah_RU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sah_RU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sah_RU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/saq.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/saq.res index d41bdd6d3e5..3a82a3ebd1d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/saq.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/saq.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/saq_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/saq_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/saq_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/saq_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat.res index 6ad1fc1ca10..33d1d514670 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_IN.res index 50569ec83ea..99590e3e819 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_Olck.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_Olck.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_Olck.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_Olck.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_Olck_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_Olck_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_Olck_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sat_Olck_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sbp.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sbp.res index c5f7de4be1c..6b057c77fdb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sbp.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sbp.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sbp_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sbp_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sbp_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sbp_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sc.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sc.res index 38213ad4071..86f98d6b8f3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sc.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sc.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sc_IT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sc_IT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sc_IT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sc_IT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd.res index b2952690bdc..27ec93f05ec 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Arab.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Arab.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Arab.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Arab.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Arab_PK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Arab_PK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Arab_PK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Arab_PK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Deva.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Deva.res index 5abc2fa43ed..288cd0b3137 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Deva.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Deva.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Deva_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Deva_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Deva_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_Deva_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_IN.res index e06401d81a1..dfe126849dd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_PK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_PK.res index b830eb8eb38..4a6e24b2103 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_PK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sd_PK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se.res index ac65c2e9cd5..8628d176b25 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_FI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_FI.res index 832fa2e9c29..d68a0ae6eb6 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_FI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_FI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_NO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_NO.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_NO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_NO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_SE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_SE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_SE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/se_SE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/seh.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/seh.res index b7503d4e460..306aed91df0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/seh.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/seh.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/seh_MZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/seh_MZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/seh_MZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/seh_MZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ses.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ses.res index 90d2b8d814c..836031bd5cb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ses.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ses.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ses_ML.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ses_ML.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ses_ML.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ses_ML.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sg.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sg.res index 11710c8a759..f08637d8122 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sg.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sg.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sg_CF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sg_CF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sg_CF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sg_CF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh.res index 7e2ac1711f4..44e9bd93544 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_BA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_BA.res index 396e666fed9..b290f14835c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_BA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_BA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_CS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_CS.res index 5658dd54c1a..874b89695d2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_CS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_CS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_YU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_YU.res index 5658dd54c1a..874b89695d2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_YU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sh_YU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi.res index 9519deaa0dd..a67cd5f621a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Latn.res index f5b8ee04781..566623fa3f2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Latn_MA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Latn_MA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Latn_MA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Latn_MA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_MA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_MA.res index d29c374f3e4..0be9b363b10 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_MA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_MA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Tfng.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Tfng.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Tfng.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Tfng.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Tfng_MA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Tfng_MA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Tfng_MA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/shi_Tfng_MA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/si.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/si.res index 6a478c87ab0..410a11c22e2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/si.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/si.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/si_LK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/si_LK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/si_LK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/si_LK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sk.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sk.res index 2e45083a1d6..313e0f3fd86 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sk.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sk.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sk_SK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sk_SK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sk_SK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sk_SK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sl.res index 0e2c489982a..c3808f475ec 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sl_SI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sl_SI.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sl_SI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sl_SI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/smn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/smn.res index 27b883947a0..8d8855a37d5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/smn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/smn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/smn_FI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/smn_FI.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/smn_FI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/smn_FI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sn.res index 487e62f4804..a14ec3f9b66 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sn_ZW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sn_ZW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sn_ZW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sn_ZW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so.res index 51e890aa093..ae56fafd2c5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_DJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_DJ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_DJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_DJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_ET.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_ET.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_ET.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_ET.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_KE.res index ce0de015a9d..c39dcba19ff 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_SO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_SO.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_SO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/so_SO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq.res index 7d143b958a5..5b5212b6f77 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_AL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_AL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_AL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_AL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_MK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_MK.res index 61f469b37f0..aab66eaebf2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_MK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_MK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_XK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_XK.res index 61f469b37f0..aab66eaebf2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_XK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sq_XK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr.res index 61ad763ccf8..d4f58b60fce 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_BA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_BA.res index 7e302ce1527..a19f78c53bd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_BA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_BA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_CS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_CS.res index 0f66203ed10..37c342d4e71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_CS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_CS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_BA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_BA.res index d42c34e6647..20cfd6440b3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_BA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_BA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_CS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_CS.res index 0e50633fde2..b659e8978c8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_CS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_CS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_ME.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_ME.res index 8ef735fdb20..ebd450be29e 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_ME.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_ME.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_RS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_RS.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_RS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_RS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_XK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_XK.res index 1f6a0b72f93..5f76f197229 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_XK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_XK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_YU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_YU.res index 0e50633fde2..b659e8978c8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_YU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Cyrl_YU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn.res index e2004d8bcc0..2fe3e248934 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_BA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_BA.res index 271df91478d..2678525db25 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_BA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_BA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_CS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_CS.res index 5658dd54c1a..874b89695d2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_CS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_CS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_ME.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_ME.res index 8fab0d6ca75..9781e9da3b7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_ME.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_ME.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_RS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_RS.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_RS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_RS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_XK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_XK.res index 5860f2423b9..c185d166e0c 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_XK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_XK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_YU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_YU.res index 5658dd54c1a..874b89695d2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_YU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_Latn_YU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_ME.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_ME.res index c9c5a931dcf..3e00a14d960 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_ME.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_ME.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_RS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_RS.res index 0e50633fde2..b659e8978c8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_RS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_RS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_XK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_XK.res index e11edf8d280..775b55f9499 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_XK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_XK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_YU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_YU.res index 0f66203ed10..37c342d4e71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_YU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sr_YU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st.res index 4115fe74c2a..15c0dbdd422 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st_LS.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st_LS.res index 865a131d67b..9dfb1881000 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st_LS.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st_LS.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st_ZA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st_ZA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st_ZA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/st_ZA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su.res index b73e7b217f1..b5ffa0b3cad 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_ID.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_ID.res index ab692c1d19b..ed77777e2ef 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_ID.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_ID.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_Latn.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_Latn_ID.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_Latn_ID.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_Latn_ID.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/su_Latn_ID.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/supplementalData.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/supplementalData.res index 06ecdb9bdc2..f85c9d20cbf 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/supplementalData.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/supplementalData.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv.res index 36b03a2db86..84a539c99d0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_AX.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_AX.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_AX.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_AX.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_FI.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_FI.res index 7a502e4ef43..4f763124cfe 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_FI.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_FI.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_SE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_SE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_SE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sv_SE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw.res index bd3fe3aac7e..ce5242adbe4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_CD.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_CD.res index ee37fea5e79..0be848429a6 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_CD.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_CD.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_KE.res index e609b2f7218..016bc9eb9e5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_UG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_UG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_UG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/sw_UG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr.res index 67bf4765d23..b3f6b6c20d4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr_IQ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr_IQ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr_IQ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr_IQ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr_SY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr_SY.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr_SY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/syr_SY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/szl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/szl.res index 231a9cee70f..45e2c1baf27 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/szl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/szl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/szl_PL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/szl_PL.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/szl_PL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/szl_PL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta.res index 7e490bf3137..457be5122cc 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_LK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_LK.res index 24b317d0ab5..9c88e7be05d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_LK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_LK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_MY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_MY.res index 861997c4e0b..2e23f027673 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_MY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_MY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_SG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_SG.res index 861997c4e0b..2e23f027673 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_SG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ta_SG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/te.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/te.res index 8317937d0b4..3e2ae6391a7 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/te.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/te.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/te_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/te_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/te_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/te_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo.res index 352916797a3..26e805456c0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo_KE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo_KE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo_KE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo_KE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo_UG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo_UG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo_UG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/teo_UG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tg.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tg.res index 4a3920a5e55..3a4b3727da3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tg.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tg.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tg_TJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tg_TJ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tg_TJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tg_TJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th.res index bcf588810a7..28c6d6c1343 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th_TH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th_TH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th_TH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th_TH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th_TH_TRADITIONAL.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th_TH_TRADITIONAL.res index ea3726e9137..5678d30207f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th_TH_TRADITIONAL.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/th_TH_TRADITIONAL.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti.res index 88feae4ed74..31420783431 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti_ER.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti_ER.res index 850f2061f7d..ef6c0e46aba 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti_ER.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti_ER.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti_ET.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti_ET.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti_ET.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ti_ET.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tk.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tk.res index 27cfa08f1ad..54cbee70644 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tk.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tk.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tk_TM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tk_TM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tk_TM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tk_TM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tl.res index 1f12fe5c961..48217d1d6a0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tl_PH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tl_PH.res index 2ff85684d37..6bea58d261d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tl_PH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tl_PH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn.res index efad2426a06..d740ff15211 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn_BW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn_BW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn_BW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn_BW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn_ZA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn_ZA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn_ZA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tn_ZA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/to.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/to.res index 086be86618b..d7726f43016 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/to.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/to.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/to_TO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/to_TO.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/to_TO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/to_TO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tok.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tok.res index 7120f59c7b2..ecb5190d655 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tok.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tok.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tok_001.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tok_001.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tok_001.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tok_001.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr.res index b0d04b09376..6fd3724c3ed 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr_CY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr_CY.res index 0fae2cb2298..105673fae4f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr_CY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr_CY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr_TR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr_TR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr_TR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tr_TR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tt.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tt.res index 366b1b3dd2d..c5f17768ff3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tt.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tt.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tt_RU.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tt_RU.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tt_RU.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tt_RU.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/twq.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/twq.res index 6b434769484..881f57a9ec0 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/twq.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/twq.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/twq_NE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/twq_NE.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/twq_NE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/twq_NE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tzm.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tzm.res index 6af5289ef16..027f966c4f9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tzm.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tzm.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tzm_MA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tzm_MA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tzm_MA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/tzm_MA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ug.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ug.res index bb638a55cd4..870a5e3fc22 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ug.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ug.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ug_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ug_CN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ug_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ug_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uk.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uk.res index 54944315304..fc535e8f291 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uk.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uk.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uk_UA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uk_UA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uk_UA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uk_UA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur.res index 778632c5dbe..9c2f2968d97 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur_IN.res index bc0712852b8..310b186bf48 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur_PK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur_PK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur_PK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/ur_PK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz.res index 054e7ade0af..e0089ec54dd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_AF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_AF.res index 7f535fae780..e72ee4e3560 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_AF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_AF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Arab.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Arab.res index e3f06fb1e43..0917af3c913 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Arab.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Arab.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Arab_AF.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Arab_AF.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Arab_AF.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Arab_AF.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Cyrl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Cyrl.res index d42e9128cd9..e4b6f7ab765 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Cyrl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Cyrl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Cyrl_UZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Cyrl_UZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Cyrl_UZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Cyrl_UZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Latn.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Latn_UZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Latn_UZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Latn_UZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_Latn_UZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_UZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_UZ.res index 093711df66a..4586c80d2db 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_UZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/uz_UZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai.res index 3ff8e249ab0..5eaab2b36a5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_LR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_LR.res index e245aff09f4..e739b188868 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_LR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_LR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Latn.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Latn.res index ce3b8504ac2..4276a490c54 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Latn.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Latn.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Latn_LR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Latn_LR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Latn_LR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Latn_LR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Vaii.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Vaii.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Vaii.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Vaii.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Vaii_LR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Vaii_LR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Vaii_LR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vai_Vaii_LR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vec.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vec.res index 53b2aec8969..3e8d9bcbd1a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vec.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vec.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vec_IT.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vec_IT.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vec_IT.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vec_IT.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vi.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vi.res index be1a9d909f1..01c03ed10a3 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vi.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vi.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vi_VN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vi_VN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vi_VN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vi_VN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vmw.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vmw.res index 38f3456237b..b1b20f89852 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vmw.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vmw.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vmw_MZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vmw_MZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vmw_MZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vmw_MZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vun.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vun.res index 130a33c4151..ef7c62859fa 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vun.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vun.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vun_TZ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vun_TZ.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vun_TZ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/vun_TZ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wae.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wae.res index 62b44925c69..e8c5fa68ac9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wae.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wae.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wae_CH.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wae_CH.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wae_CH.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wae_CH.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wo.res index 9f4f698135c..18cf43a229a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wo_SN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wo_SN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wo_SN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/wo_SN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xh.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xh.res index 2b6cf649123..c599e059efb 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xh.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xh.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xh_ZA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xh_ZA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xh_ZA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xh_ZA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xnr.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xnr.res index f55fabc2e36..9b4ff760e02 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xnr.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xnr.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xnr_IN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xnr_IN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xnr_IN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xnr_IN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xog.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xog.res index f606063db84..604eefc965b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xog.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xog.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xog_UG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xog_UG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xog_UG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/xog_UG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yav.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yav.res index dc1aa265679..895d30b2aed 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yav.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yav.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yav_CM.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yav_CM.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yav_CM.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yav_CM.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yi.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yi.res index 14d5dc22d36..d779afa4c0f 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yi.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yi.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yi_UA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yi_UA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yi_UA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yi_UA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo.res index dc4462d39b4..6b98d132e02 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo_BJ.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo_BJ.res index 49a92f2c66c..4320d4bcda4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo_BJ.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo_BJ.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo_NG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo_NG.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo_NG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yo_NG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl.res index a9ab101a911..8568d91e138 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_BR.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_BR.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_BR.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_BR.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_CO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_CO.res index d9c820c19f5..88028a49229 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_CO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_CO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_VE.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_VE.res index d9c820c19f5..88028a49229 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_VE.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yrl_VE.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue.res index 605c1dfac1e..c3c604698d5 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_CN.res index e46dde13cb6..19c7dbd440a 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_HK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_HK.res index 12dc5b3437c..8f357fab8fe 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_HK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_HK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hans.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hans.res index 2b2157220c1..8393d9604b9 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hans.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hans.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hans_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hans_CN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hans_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hans_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant_CN.res index 4ba7afe9dc5..c61a93e9889 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant_HK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant_HK.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant_HK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/yue_Hant_HK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/za.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/za.res index 077093d928f..8f2e3c4f021 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/za.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/za.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/za_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/za_CN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/za_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/za_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zgh.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zgh.res index 13387c057ac..e658ff5c08d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zgh.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zgh.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zgh_MA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zgh_MA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zgh_MA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zgh_MA.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh.res index 14ede531315..c190634be6b 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_CN.res index 7d034a33c94..7a65a63cba4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_HK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_HK.res index 5432af5b41d..78a02d45ed8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_HK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_HK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_CN.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_CN.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_CN.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_CN.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_HK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_HK.res index 4908183ada9..22bc1aa06dd 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_HK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_HK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_MO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_MO.res index 27db776823c..d57a1ad5028 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_MO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_MO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_MY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_MY.res index 2ab864446c9..ad033ef80f8 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_MY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_MY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_SG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_SG.res index 4f7d1bc838f..a483a4195ab 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_SG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hans_SG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant.res index a19146c8794..071fc2c1872 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_HK.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_HK.res index 340064a9172..67b471aedaf 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_HK.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_HK.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_MO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_MO.res index 93d9e1b72ef..e4f297e3b1d 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_MO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_MO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_MY.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_MY.res index ba416165173..fc3907f8105 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_MY.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_MY.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_TW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_TW.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_TW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_Hant_TW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_MO.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_MO.res index 31d7867ce41..937656bf7e2 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_MO.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_MO.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_SG.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_SG.res index decf716d681..dd56d84a0b4 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_SG.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_SG.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_TW.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_TW.res index 21697f2d611..76a3f56fa31 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_TW.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zh_TW.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zu.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zu.res index ef49488311b..9c8243a2024 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zu.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zu.res differ diff --git a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zu_ZA.res b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zu_ZA.res index 4ba7afe9dc5..250728c7c71 100644 Binary files a/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zu_ZA.res and b/icu4j/main/core/src/main/resources/com/ibm/icu/impl/data/icudata/zu_ZA.res differ diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ModuleTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ModuleTest.java index a229fe49dd6..b371b6aa61b 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ModuleTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ModuleTest.java @@ -70,7 +70,7 @@ public class ModuleTest { Iterator tIter = m.getTestDataIterator(); while (tIter.hasNext()) { TestData t = tIter.next(); - for (Iterator siter = t.getSettingsIterator(); siter.hasNext();) { + for (Iterator siter = t.getSettingsIterator(); siter.hasNext();) { DataMap settings = (DataMap) siter.next(); list.add(new TestDataPair(t, settings)); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ResourceModule.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ResourceModule.java index 97dc7947803..0ee8c4fb5a4 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ResourceModule.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/ResourceModule.java @@ -103,9 +103,9 @@ class ResourceModule implements TestDataModule { return new UResourceTestData(defaultHeader, testData.get(testName)); } - public Iterator getTestDataIterator() { - return new IteratorAdapter(testData){ - protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { + public Iterator getTestDataIterator() { + return new IteratorAdapter(testData){ + protected TestData prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { return new UResourceTestData(defaultHeader, nextRes); } }; @@ -116,11 +116,12 @@ class ResourceModule implements TestDataModule { * and return various data-driven test object for next() call * * @author Raymond Yang + * @param */ - private abstract static class IteratorAdapter implements Iterator{ + private abstract static class IteratorAdapter implements Iterator{ private UResourceBundle res; private UResourceBundleIterator itr; - private Object preparedNextElement = null; + private T preparedNextElement = null; // fix a strange behavior for UResourceBundleIterator for // UResourceBundle.STRING. It support hasNext(), but does // not support next() now. @@ -178,9 +179,9 @@ class ResourceModule implements TestDataModule { } } - public Object next(){ + public T next(){ if (hasNext()) { - Object t = preparedNextElement; + T t = preparedNextElement; preparedNextElement = null; return t; } else { @@ -190,7 +191,7 @@ class ResourceModule implements TestDataModule { /** * To prepare data-driven test object for next() call, should not return null */ - abstract protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatError; + abstract protected T prepareNext(UResourceBundle nextRes) throws DataModuleFormatError; } @@ -327,21 +328,21 @@ class ResourceModule implements TestDataModule { return info == null ? null : new UTableResource(info); } - public Iterator getSettingsIterator() { + public Iterator getSettingsIterator() { assert_is (settings.getType() == UResourceBundle.ARRAY); - return new IteratorAdapter(settings){ - protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { + return new IteratorAdapter(settings){ + protected DataMap prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { return new UTableResource(nextRes); } }; } - public Iterator getDataIterator() { + public Iterator getDataIterator() { // unfortunately, assert_is (data.getType() == UResourceBundle.ARRAY || data.getType() == UResourceBundle.STRING); - return new IteratorAdapter(data){ - protected Object prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { + return new IteratorAdapter(data){ + protected DataMap prepareNext(UResourceBundle nextRes) throws DataModuleFormatError { return new UArrayResource(header, nextRes); } }; @@ -370,7 +371,7 @@ class ResourceModule implements TestDataModule { } private static class UArrayResource implements DataMap{ - private Map theMap; + private Map theMap; UArrayResource(UResourceBundle theHeader, UResourceBundle theData) throws DataModuleFormatError{ assert_is (theHeader != null && theData != null); String[] header; @@ -378,7 +379,7 @@ class ResourceModule implements TestDataModule { header = getStringArrayHelper(theHeader); if (theData.getSize() != header.length) throw new DataModuleFormatError("The count of Header and Data is mismatch."); - theMap = new HashMap(); + theMap = new HashMap<>(); for (int i = 0; i < header.length; i++) { if(theData.getType()==UResourceBundle.ARRAY){ theMap.put(header[i], theData.get(i)); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestBoilerplate.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestBoilerplate.java index 730c9f3d938..c809f4f4d12 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestBoilerplate.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestBoilerplate.java @@ -129,12 +129,12 @@ public abstract class TestBoilerplate extends TestFmwk { * @return clone */ protected T _clone(T a) throws Exception { - Class aClass = a.getClass(); + Class aClass = a.getClass(); try { Method cloner = aClass.getMethod("clone", (Class[])null); return (T) cloner.invoke(a,(Object[])null); } catch (NoSuchMethodException e) { - Constructor constructor = aClass.getConstructor(new Class[] {aClass}); + Constructor constructor = aClass.getConstructor(new Class[] {aClass}); return (T) constructor.newInstance(new Object[]{a}); } } @@ -150,26 +150,25 @@ public abstract class TestBoilerplate extends TestFmwk { return false; } - public static boolean verifySetsIdentical(AbstractTestLog here, Set values1, Set values2) { + public static boolean verifySetsIdentical(AbstractTestLog here, Set values1, Set values2) { if (values1.equals(values2)) return true; - Set temp; + Set temp; TestFmwk.errln("Values differ:"); TestFmwk.errln("UnicodeMap - HashMap"); - temp = new TreeSet(values1); + temp = new TreeSet<>(values1); temp.removeAll(values2); TestFmwk.errln(show(temp)); TestFmwk.errln("HashMap - UnicodeMap"); - temp = new TreeSet(values2); + temp = new TreeSet<>(values2); temp.removeAll(values1); TestFmwk.errln(show(temp)); return false; } - - public static String show(Map m) { + + public static String show(Map m) { StringBuilder buffer = new StringBuilder(); - for (Iterator it = m.keySet().iterator(); it.hasNext();) { - Object key = it.next(); - buffer.append(key + "=>" + m.get(key) + "\r\n"); + for (Map.Entry e : m.entrySet()) { + buffer.append(e.getKey() + "=>" + e.getValue() + "\r\n"); } return buffer.toString(); } @@ -184,11 +183,11 @@ public abstract class TestBoilerplate extends TestFmwk { } return result; } - - public static String show(Collection c) { + + public static String show(Collection c) { StringBuilder buffer = new StringBuilder(); - for (Iterator it = c.iterator(); it.hasNext();) { - buffer.append(it.next() + "\r\n"); + for (T item : c) { + buffer.append(item + "\r\n"); } return buffer.toString(); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestDataModule.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestDataModule.java index 1e2ca94efdf..997375ba818 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestDataModule.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/TestDataModule.java @@ -36,7 +36,7 @@ public interface TestDataModule { /** * @return Iterator */ - public Iterator getTestDataIterator(); + public Iterator getTestDataIterator(); public static class Factory{ @@ -74,11 +74,11 @@ public interface TestDataModule { /** * @return Iterator */ - public Iterator getSettingsIterator(); + public Iterator getSettingsIterator(); /** * @return Iterator */ - public Iterator getDataIterator(); + public Iterator getDataIterator(); } /** diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapBoilerplateTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapBoilerplateTest.java index 8118a3c2fbf..7c540f1ba19 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapBoilerplateTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapBoilerplateTest.java @@ -17,7 +17,7 @@ import com.ibm.icu.impl.UnicodeMap; /** * Moved from UnicodeMapTest */ -public class UnicodeMapBoilerplateTest extends TestBoilerplate { +public class UnicodeMapBoilerplateTest extends TestBoilerplate> { private static String[] TEST_VALUES = {"A", "B", "C", "D", "E", "F"}; @@ -32,7 +32,7 @@ public class UnicodeMapBoilerplateTest extends TestBoilerplate { /* (non-Javadoc) * @see com.ibm.icu.dev.test.TestBoilerplate#_hasSameBehavior(java.lang.Object, java.lang.Object) */ - protected boolean _hasSameBehavior(UnicodeMap a, UnicodeMap b) { + protected boolean _hasSameBehavior(UnicodeMap a, UnicodeMap b) { // we are pretty confident in the equals method, so won't bother with this right now. return true; } @@ -40,9 +40,9 @@ public class UnicodeMapBoilerplateTest extends TestBoilerplate { /* (non-Javadoc) * @see com.ibm.icu.dev.test.TestBoilerplate#_addTestObject(java.util.List) */ - protected boolean _addTestObject(List list) { + protected boolean _addTestObject(List> list) { if (list.size() > 30) return false; - UnicodeMap result = new UnicodeMap(); + UnicodeMap result = new UnicodeMap<>(); for (int i = 0; i < 50; ++i) { int start = random.nextInt(25); String value = TEST_VALUES[random.nextInt(TEST_VALUES.length)]; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapTest.java index b1144aed93b..400380d433f 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/UnicodeMapTest.java @@ -13,7 +13,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; import java.util.Random; import java.util.Set; import java.util.SortedMap; @@ -46,7 +45,7 @@ public class UnicodeMapTest extends TestFmwk { @Test public void TestIterations() { - UnicodeMap foo = new UnicodeMap(); + UnicodeMap foo = new UnicodeMap<>(); checkToString(foo, ""); foo.put(3, 6d).put(5, 10d); checkToString(foo, "0003=6.0\n0005=10.0\n"); @@ -64,7 +63,7 @@ public class UnicodeMapTest extends TestFmwk { public void checkToString(UnicodeMap foo, String expected) { StringJoiner joiner = new StringJoiner("\n"); - for (UnicodeMap.EntryRange range : foo.entryRanges()) { + for (UnicodeMap.EntryRange range : foo.entryRanges()) { joiner.add(range.toString()); } assertEquals("EntryRange", expected, joiner.toString() + (foo.size() == 0 ? "" : "\n")); @@ -73,30 +72,30 @@ public class UnicodeMapTest extends TestFmwk { @Test public void TestRemove() { - UnicodeMap foo = new UnicodeMap() - .putAll(0x20, 0x29, -2d) - .put("abc", 3d) - .put("xy", 2d) - .put("mark", 4d) - .freeze(); - UnicodeMap fii = new UnicodeMap() - .putAll(0x21, 0x25, -2d) - .putAll(0x26, 0x28, -3d) - .put("abc", 3d) - .put("mark", 999d) - .freeze(); + UnicodeMap foo = new UnicodeMap() + .putAll(0x20, 0x29, -2d) + .put("abc", 3d) + .put("xy", 2d) + .put("mark", 4d) + .freeze(); + UnicodeMap fii = new UnicodeMap() + .putAll(0x21, 0x25, -2d) + .putAll(0x26, 0x28, -3d) + .put("abc", 3d) + .put("mark", 999d) + .freeze(); - UnicodeMap afterFiiRemoval = new UnicodeMap() - .put(0x20, -2d) - .putAll(0x26, 0x29, -2d) - .put("xy", 2d) - .put("mark", 4d) - .freeze(); + UnicodeMap afterFiiRemoval = new UnicodeMap() + .put(0x20, -2d) + .putAll(0x26, 0x29, -2d) + .put("xy", 2d) + .put("mark", 4d) + .freeze(); - UnicodeMap afterFiiRetained = new UnicodeMap() - .putAll(0x21, 0x25, -2d) - .put("abc", 3d) - .freeze(); + UnicodeMap afterFiiRetained = new UnicodeMap() + .putAll(0x21, 0x25, -2d) + .put("abc", 3d) + .freeze(); UnicodeMap test = new UnicodeMap().putAll(foo) .removeAll(fii); @@ -117,7 +116,7 @@ public class UnicodeMapTest extends TestFmwk { me.remove(0x10FFFF); int iterations = 100000; - SortedMap test = new TreeMap(); + SortedMap test = new TreeMap<>(); Random rand = new Random(0); String other; @@ -178,17 +177,16 @@ public class UnicodeMapTest extends TestFmwk { return test; } - Set temp = new HashSet(); /** * @param me * @param stayWithMe */ private void checkEquals(UnicodeMap me, SortedMap stayWithMe) { - temp.clear(); - for (Entry e : me.entrySet()) { + Set> temp = new HashSet<>(); + for (Map.Entry e : me.entrySet()) { temp.add(e); } - Set> entrySet = stayWithMe.entrySet(); + Set> entrySet = stayWithMe.entrySet(); if (!entrySet.equals(temp)) { logln(me.entrySet().toString()); logln(me.toString()); @@ -260,8 +258,8 @@ public class UnicodeMapTest extends TestFmwk { @Test public void TestModify() { Random random = new Random(0); - UnicodeMap unicodeMap = new UnicodeMap(); - HashMap hashMap = new HashMap(); + UnicodeMap unicodeMap = new UnicodeMap<>(); + HashMap hashMap = new HashMap<>(); String[] values = {null, "the", "quick", "brown", "fox"}; for (int count = 1; count <= MODIFY_TEST_ITERATIONS; ++count) { String value = values[random.nextInt(values.length)]; @@ -291,10 +289,10 @@ public class UnicodeMapTest extends TestFmwk { } } - private boolean hasSameValues(UnicodeMap unicodeMap, HashMap hashMap) { + private boolean hasSameValues(UnicodeMap unicodeMap, HashMap hashMap) { for (int i = 0; i < MODIFY_TEST_LIMIT; ++i) { - Object unicodeMapValue = unicodeMap.getValue(i); - Object hashMapValue = hashMap.get(i); + String unicodeMapValue = unicodeMap.getValue(i); + String hashMapValue = hashMap.get(i); if (unicodeMapValue != hashMapValue) { return false; } @@ -304,7 +302,7 @@ public class UnicodeMapTest extends TestFmwk { @Test public void TestCloneAsThawed11721 () { - UnicodeMap test = new UnicodeMap().put("abc", 3).freeze(); + UnicodeMap test = new UnicodeMap().put("abc", 3).freeze(); UnicodeMap copy = test.cloneAsThawed(); copy.put("def", 4); assertEquals("original-abc", (Integer) 3, test.get("abc")); @@ -326,7 +324,7 @@ public class UnicodeMapTest extends TestFmwk { // do random change to both, then compare random.setSeed(12345); // reproducible results logln("Comparing against HashMap"); - UnicodeMap map1 = new UnicodeMap(); + UnicodeMap map1 = new UnicodeMap<>(); Map map2 = new HashMap(); for (int counter = 0; counter < ITERATIONS; ++counter) { int start = random.nextInt(LIMIT); @@ -349,7 +347,7 @@ public class UnicodeMapTest extends TestFmwk { @Test public void TestUnicodeMapGeneralCategory() { logln("Setting General Category"); - UnicodeMap map1 = new UnicodeMap(); + UnicodeMap map1 = new UnicodeMap<>(); Map map2 = new HashMap(); //Map map3 = new TreeMap(); map1 = new UnicodeMap(); @@ -396,11 +394,11 @@ public class UnicodeMapTest extends TestFmwk { @Test public void TestAUnicodeMap2() { - UnicodeMap foo = new UnicodeMap(); + UnicodeMap foo = new UnicodeMap<>(); @SuppressWarnings("unused") int hash = foo.hashCode(); // make sure doesn't NPE @SuppressWarnings("unused") - Set fii = foo.stringKeys(); // make sure doesn't NPE + Set fii = foo.stringKeys(); // make sure doesn't NPE } @Test @@ -413,13 +411,13 @@ public class UnicodeMapTest extends TestFmwk { ; Map target = new HashMap(); foo1.addInverseTo(target); - UnicodeMap reverse = new UnicodeMap().putAllInverse(target); + UnicodeMap reverse = new UnicodeMap().putAllInverse(target); assertEquals("", foo1, reverse); } private void checkNext(UnicodeMap map1, Map map2, int limit) { logln("Comparing nextRange"); - Map localMap = new TreeMap(); + Map localMap = new TreeMap<>(); UnicodeMapIterator mi = new UnicodeMapIterator(map1); while (mi.nextRange()) { logln(Utility.hex(mi.codepoint) + ".." + Utility.hex(mi.codepointEnd) + " => " + mi.value); @@ -432,7 +430,7 @@ public class UnicodeMapTest extends TestFmwk { logln("Comparing next"); mi.reset(); - localMap = new TreeMap(); + localMap = new TreeMap<>(); // String lastValue = null; while (mi.next()) { // if (!UnicodeMap.areEqual(lastValue, mi.value)) { @@ -460,11 +458,11 @@ public class UnicodeMapTest extends TestFmwk { } } - void checkMap(Map m1, Map m2) { + void checkMap(Map m1, Map m2) { if (m1.equals(m2)) return; StringBuilder buffer = new StringBuilder(); - Set m1entries = m1.entrySet(); - Set m2entries = m2.entrySet(); + Set> m1entries = m1.entrySet(); + Set> m2entries = m2.entrySet(); getEntries("\r\nIn First, and not Second", m1entries, m2entries, buffer, 20); getEntries("\r\nIn Second, and not First", m2entries, m1entries, buffer, 20); errln(buffer.toString()); @@ -482,7 +480,7 @@ public class UnicodeMapTest extends TestFmwk { if (result != 0) return result; return compare2(a.getValue(), b.getValue()); } - private int compare2(T o1, T o2) { + private > int compare2(T o1, T o2) { if (o1 == o2) return 0; if (o1 == null) return -1; if (o2 == null) return 1; @@ -495,7 +493,7 @@ public class UnicodeMapTest extends TestFmwk { m1_m2.addAll(m1entries); m1_m2.removeAll(m2entries); buffer.append(title + ": " + m1_m2.size() + "\r\n"); - for (Entry entry : m1_m2) { + for (Map.Entry entry : m1_m2) { if (limit-- < 0) return; buffer.append(entry.getKey()).append(" => ") .append(entry.getValue()).append("\r\n"); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/bigdec/DiagBigDecimalTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/bigdec/DiagBigDecimalTest.java index 2395167c627..f7dd5ce0212 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/bigdec/DiagBigDecimalTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/bigdec/DiagBigDecimalTest.java @@ -21,7 +21,6 @@ import com.ibm.icu.dev.test.CoreTestFmwk; import com.ibm.icu.dev.test.TestFmwk; import com.ibm.icu.dev.test.TestUtil; import com.ibm.icu.dev.test.TestUtil.JavaVendor; -import com.ibm.icu.math.BigDecimal; /* ------------------------------------------------------------------ */ /* Decimal diagnostic tests mfc */ diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java index 746b5b08bd3..5e247ad8050 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java @@ -2193,7 +2193,7 @@ public class CalendarRegressionTest extends CoreTestFmwk { }; String[] ALL = Calendar.getKeywordValuesForLocale("calendar", ULocale.getDefault(), false); - HashSet ALLSET = new HashSet(); + HashSet ALLSET = new HashSet<>(); for (int i = 0; i < ALL.length; i++) { if (ALL[i] == "unknown") { errln("Calendar.getKeywordValuesForLocale should not return \"unknown\""); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarTestFmwk.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarTestFmwk.java index fc9f33eed39..f04ce436720 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarTestFmwk.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/CalendarTestFmwk.java @@ -241,7 +241,7 @@ public class CalendarTestFmwk extends CoreTestFmwk { // Keep a record of minima and maxima that we actually see. // These are kept in an array of arrays of hashes. - Map[][] limits = new Map[fieldsToTest.length][2]; + Map[][] limits = new Map[fieldsToTest.length][2]; Object nub = new Object(); // Meaningless placeholder // This test can run for a long time; show progress. @@ -273,10 +273,10 @@ public class CalendarTestFmwk extends CoreTestFmwk { // Fetch the hash for this field and keep track of the // minima and maxima. - Map[] h = limits[j]; + Map[] h = limits[j]; if (h[0] == null) { - h[0] = new HashMap(); - h[1] = new HashMap(); + h[0] = new HashMap<>(); + h[1] = new HashMap<>(); } h[0].put(minActual, nub); h[1].put(maxActual, nub); @@ -311,7 +311,7 @@ public class CalendarTestFmwk extends CoreTestFmwk { int f = fieldsToTest[j]; buf.setLength(0); buf.append(FIELD_NAME[f]); - Map[] h = limits[j]; + Map[] h = limits[j]; boolean fullRangeSeen = true; for (int k=0; k<2; ++k) { int rangeLow = (k==0) ? diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/PersianTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/PersianTest.java index 3333349c94c..79b991e62da 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/PersianTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/calendar/PersianTest.java @@ -15,6 +15,7 @@ import org.junit.runners.JUnit4; import com.ibm.icu.util.Calendar; import com.ibm.icu.util.PersianCalendar; +import com.ibm.icu.util.TimeZone; import com.ibm.icu.util.ULocale; @RunWith(JUnit4.class) @@ -143,4 +144,439 @@ public class PersianTest extends CalendarTestFmwk { new StubCalendar(); } + + // Test data copy from + // https://github.com/unicode-org/icu4x/blob/main/components/calendar/src/persian.rs#L299 + final int[] PERSIAN_TEST_CASE_1 = { + // rd, year, month, day + 656786, 1178, 1, 1, + 664224, 1198, 5, 10, + 671401, 1218, 1, 7, + 694799, 1282, 1, 29, + 702806, 1304, 1, 1, + 704424, 1308, 6, 3, + 708842, 1320, 7, 7, + 709409, 1322, 1, 29, + 709580, 1322, 7, 14, + 727274, 1370, 12, 27, + 728714, 1374, 12, 6, + 739330, 1403, 12, 30, + 739331, 1404, 1, 1, + 744313, 1417, 8, 19, + 763436, 1469, 12, 30, + 763437, 1470, 1, 1, + 764652, 1473, 4, 28, + 775123, 1501, 12, 29, + 775488, 1502, 12, 29, + 775487, 1502, 12, 28, + 775488, 1502, 12, 29, + 775489, 1503, 1, 1, + 775490, 1503, 1, 2, + 1317873, 2987, 12, 29, + 1317874, 2988, 1, 1, + 1317875, 2988, 1, 2, + }; + + @Test + public void TestPersianJulianDayToYMD() { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran"), + new ULocale("fa_IR@calendar=persian")); + for (int i = 0; i < PERSIAN_TEST_CASE_1.length;) { + int rd = PERSIAN_TEST_CASE_1[i++]; + int year = PERSIAN_TEST_CASE_1[i++]; + int month = PERSIAN_TEST_CASE_1[i++]; + int day = PERSIAN_TEST_CASE_1[i++]; + int jday = rd + 1721425; + cal.clear(); + cal.set(Calendar.JULIAN_DAY, jday); + int actualYear = cal.get(Calendar.YEAR); + int actualMonth = cal.get(Calendar.MONTH)+1; + int actualDay = cal.get(Calendar.DAY_OF_MONTH); + if (actualYear != year || actualMonth != month || actualDay != day) { + errln("Fail: rd " + rd + " = jday " + jday + " -> expect Persian(" + + year + "/" + month + "/" + day + ") " + + "actual Persian(" + actualYear + "/" + actualMonth + "/" + actualDay + ")"); + } + } + } + + @Test + public void TestPersianYMDToJulianDay() { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran"), + new ULocale("fa_IR@calendar=persian")); + for (int i = 0; i < PERSIAN_TEST_CASE_1.length;) { + int rd = PERSIAN_TEST_CASE_1[i++]; + int year = PERSIAN_TEST_CASE_1[i++]; + int month = PERSIAN_TEST_CASE_1[i++]; + int day = PERSIAN_TEST_CASE_1[i++]; + int jday = rd + 1721425; + cal.clear(); + cal.set(Calendar.YEAR, year); + cal.set(Calendar.MONTH, month-1); + cal.set(Calendar.DAY_OF_MONTH, day); + int actualJday = cal.get(Calendar.JULIAN_DAY); + int actualRD = actualJday - 1721425; + if (actualRD != rd) { + errln("Fail: Persian(" + year + "/" + month + "/" + day + ") => "+ + "expect rd " + rd + " but actual jd: " + actualJday + " = rd " + actualRD); + } + } + } + + // Test data copy from + // https://github.com/unicode-org/icu4x/blob/main/components/calendar/src/persian.rs#L534 + // From https://calendar.ut.ac.ir/Fa/News/Data/Doc/KabiseShamsi1206-1498-new.pdf + // Plain text version at https://github.com/roozbehp/persiancalendar/blob/main/kabise.txt + final int[] PERSIAN_TEST_CASE_2 = { + // pYear, pLeap, year, month, day + 1206, 0, 1827, 3, 22, + 1207, 0, 1828, 3, 21, + 1208, 0, 1829, 3, 21, + 1209, 0, 1830, 3, 21, + 1210, 1, 1831, 3, 21, + 1211, 0, 1832, 3, 21, + 1212, 0, 1833, 3, 21, + 1213, 0, 1834, 3, 21, + 1214, 1, 1835, 3, 21, + 1215, 0, 1836, 3, 21, + 1216, 0, 1837, 3, 21, + 1217, 0, 1838, 3, 21, + 1218, 1, 1839, 3, 21, + 1219, 0, 1840, 3, 21, + 1220, 0, 1841, 3, 21, + 1221, 0, 1842, 3, 21, + 1222, 1, 1843, 3, 21, + 1223, 0, 1844, 3, 21, + 1224, 0, 1845, 3, 21, + 1225, 0, 1846, 3, 21, + 1226, 1, 1847, 3, 21, + 1227, 0, 1848, 3, 21, + 1228, 0, 1849, 3, 21, + 1229, 0, 1850, 3, 21, + 1230, 1, 1851, 3, 21, + 1231, 0, 1852, 3, 21, + 1232, 0, 1853, 3, 21, + 1233, 0, 1854, 3, 21, + 1234, 1, 1855, 3, 21, + 1235, 0, 1856, 3, 21, + 1236, 0, 1857, 3, 21, + 1237, 0, 1858, 3, 21, + 1238, 1, 1859, 3, 21, + 1239, 0, 1860, 3, 21, + 1240, 0, 1861, 3, 21, + 1241, 0, 1862, 3, 21, + 1242, 0, 1863, 3, 21, + 1243, 1, 1864, 3, 20, + 1244, 0, 1865, 3, 21, + 1245, 0, 1866, 3, 21, + 1246, 0, 1867, 3, 21, + 1247, 1, 1868, 3, 20, + 1248, 0, 1869, 3, 21, + 1249, 0, 1870, 3, 21, + 1250, 0, 1871, 3, 21, + 1251, 1, 1872, 3, 20, + 1252, 0, 1873, 3, 21, + 1253, 0, 1874, 3, 21, + 1254, 0, 1875, 3, 21, + 1255, 1, 1876, 3, 20, + 1256, 0, 1877, 3, 21, + 1257, 0, 1878, 3, 21, + 1258, 0, 1879, 3, 21, + 1259, 1, 1880, 3, 20, + 1260, 0, 1881, 3, 21, + 1261, 0, 1882, 3, 21, + 1262, 0, 1883, 3, 21, + 1263, 1, 1884, 3, 20, + 1264, 0, 1885, 3, 21, + 1265, 0, 1886, 3, 21, + 1266, 0, 1887, 3, 21, + 1267, 1, 1888, 3, 20, + 1268, 0, 1889, 3, 21, + 1269, 0, 1890, 3, 21, + 1270, 0, 1891, 3, 21, + 1271, 1, 1892, 3, 20, + 1272, 0, 1893, 3, 21, + 1273, 0, 1894, 3, 21, + 1274, 0, 1895, 3, 21, + 1275, 0, 1896, 3, 20, + 1276, 1, 1897, 3, 20, + 1277, 0, 1898, 3, 21, + 1278, 0, 1899, 3, 21, + 1279, 0, 1900, 3, 21, + 1280, 1, 1901, 3, 21, + 1281, 0, 1902, 3, 22, + 1282, 0, 1903, 3, 22, + 1283, 0, 1904, 3, 21, + 1284, 1, 1905, 3, 21, + 1285, 0, 1906, 3, 22, + 1286, 0, 1907, 3, 22, + 1287, 0, 1908, 3, 21, + 1288, 1, 1909, 3, 21, + 1289, 0, 1910, 3, 22, + 1290, 0, 1911, 3, 22, + 1291, 0, 1912, 3, 21, + 1292, 1, 1913, 3, 21, + 1293, 0, 1914, 3, 22, + 1294, 0, 1915, 3, 22, + 1295, 0, 1916, 3, 21, + 1296, 1, 1917, 3, 21, + 1297, 0, 1918, 3, 22, + 1298, 0, 1919, 3, 22, + 1299, 0, 1920, 3, 21, + 1300, 1, 1921, 3, 21, + 1301, 0, 1922, 3, 22, + 1302, 0, 1923, 3, 22, + 1303, 0, 1924, 3, 21, + 1304, 1, 1925, 3, 21, + 1305, 0, 1926, 3, 22, + 1306, 0, 1927, 3, 22, + 1307, 0, 1928, 3, 21, + 1308, 0, 1929, 3, 21, + 1309, 1, 1930, 3, 21, + 1310, 0, 1931, 3, 22, + 1311, 0, 1932, 3, 21, + 1312, 0, 1933, 3, 21, + 1313, 1, 1934, 3, 21, + 1314, 0, 1935, 3, 22, + 1315, 0, 1936, 3, 21, + 1316, 0, 1937, 3, 21, + 1317, 1, 1938, 3, 21, + 1318, 0, 1939, 3, 22, + 1319, 0, 1940, 3, 21, + 1320, 0, 1941, 3, 21, + 1321, 1, 1942, 3, 21, + 1322, 0, 1943, 3, 22, + 1323, 0, 1944, 3, 21, + 1324, 0, 1945, 3, 21, + 1325, 1, 1946, 3, 21, + 1326, 0, 1947, 3, 22, + 1327, 0, 1948, 3, 21, + 1328, 0, 1949, 3, 21, + 1329, 1, 1950, 3, 21, + 1330, 0, 1951, 3, 22, + 1331, 0, 1952, 3, 21, + 1332, 0, 1953, 3, 21, + 1333, 1, 1954, 3, 21, + 1334, 0, 1955, 3, 22, + 1335, 0, 1956, 3, 21, + 1336, 0, 1957, 3, 21, + 1337, 1, 1958, 3, 21, + 1338, 0, 1959, 3, 22, + 1339, 0, 1960, 3, 21, + 1340, 0, 1961, 3, 21, + 1341, 0, 1962, 3, 21, + 1342, 1, 1963, 3, 21, + 1343, 0, 1964, 3, 21, + 1344, 0, 1965, 3, 21, + 1345, 0, 1966, 3, 21, + 1346, 1, 1967, 3, 21, + 1347, 0, 1968, 3, 21, + 1348, 0, 1969, 3, 21, + 1349, 0, 1970, 3, 21, + 1350, 1, 1971, 3, 21, + 1351, 0, 1972, 3, 21, + 1352, 0, 1973, 3, 21, + 1353, 0, 1974, 3, 21, + 1354, 1, 1975, 3, 21, + 1355, 0, 1976, 3, 21, + 1356, 0, 1977, 3, 21, + 1357, 0, 1978, 3, 21, + 1358, 1, 1979, 3, 21, + 1359, 0, 1980, 3, 21, + 1360, 0, 1981, 3, 21, + 1361, 0, 1982, 3, 21, + 1362, 1, 1983, 3, 21, + 1363, 0, 1984, 3, 21, + 1364, 0, 1985, 3, 21, + 1365, 0, 1986, 3, 21, + 1366, 1, 1987, 3, 21, + 1367, 0, 1988, 3, 21, + 1368, 0, 1989, 3, 21, + 1369, 0, 1990, 3, 21, + 1370, 1, 1991, 3, 21, + 1371, 0, 1992, 3, 21, + 1372, 0, 1993, 3, 21, + 1373, 0, 1994, 3, 21, + 1374, 0, 1995, 3, 21, + 1375, 1, 1996, 3, 20, + 1376, 0, 1997, 3, 21, + 1377, 0, 1998, 3, 21, + 1378, 0, 1999, 3, 21, + 1379, 1, 2000, 3, 20, + 1380, 0, 2001, 3, 21, + 1381, 0, 2002, 3, 21, + 1382, 0, 2003, 3, 21, + 1383, 1, 2004, 3, 20, + 1384, 0, 2005, 3, 21, + 1385, 0, 2006, 3, 21, + 1386, 0, 2007, 3, 21, + 1387, 1, 2008, 3, 20, + 1388, 0, 2009, 3, 21, + 1389, 0, 2010, 3, 21, + 1390, 0, 2011, 3, 21, + 1391, 1, 2012, 3, 20, + 1392, 0, 2013, 3, 21, + 1393, 0, 2014, 3, 21, + 1394, 0, 2015, 3, 21, + 1395, 1, 2016, 3, 20, + 1396, 0, 2017, 3, 21, + 1397, 0, 2018, 3, 21, + 1398, 0, 2019, 3, 21, + 1399, 1, 2020, 3, 20, + 1400, 0, 2021, 3, 21, + 1401, 0, 2022, 3, 21, + 1402, 0, 2023, 3, 21, + 1403, 1, 2024, 3, 20, + 1404, 0, 2025, 3, 21, + 1405, 0, 2026, 3, 21, + 1406, 0, 2027, 3, 21, + 1407, 0, 2028, 3, 20, + 1408, 1, 2029, 3, 20, + 1409, 0, 2030, 3, 21, + 1410, 0, 2031, 3, 21, + 1411, 0, 2032, 3, 20, + 1412, 1, 2033, 3, 20, + 1413, 0, 2034, 3, 21, + 1414, 0, 2035, 3, 21, + 1415, 0, 2036, 3, 20, + 1416, 1, 2037, 3, 20, + 1417, 0, 2038, 3, 21, + 1418, 0, 2039, 3, 21, + 1419, 0, 2040, 3, 20, + 1420, 1, 2041, 3, 20, + 1421, 0, 2042, 3, 21, + 1422, 0, 2043, 3, 21, + 1423, 0, 2044, 3, 20, + 1424, 1, 2045, 3, 20, + 1425, 0, 2046, 3, 21, + 1426, 0, 2047, 3, 21, + 1427, 0, 2048, 3, 20, + 1428, 1, 2049, 3, 20, + 1429, 0, 2050, 3, 21, + 1430, 0, 2051, 3, 21, + 1431, 0, 2052, 3, 20, + 1432, 1, 2053, 3, 20, + 1433, 0, 2054, 3, 21, + 1434, 0, 2055, 3, 21, + 1435, 0, 2056, 3, 20, + 1436, 1, 2057, 3, 20, + 1437, 0, 2058, 3, 21, + 1438, 0, 2059, 3, 21, + 1439, 0, 2060, 3, 20, + 1440, 0, 2061, 3, 20, + 1441, 1, 2062, 3, 20, + 1442, 0, 2063, 3, 21, + 1443, 0, 2064, 3, 20, + 1444, 0, 2065, 3, 20, + 1445, 1, 2066, 3, 20, + 1446, 0, 2067, 3, 21, + 1447, 0, 2068, 3, 20, + 1448, 0, 2069, 3, 20, + 1449, 1, 2070, 3, 20, + 1450, 0, 2071, 3, 21, + 1451, 0, 2072, 3, 20, + 1452, 0, 2073, 3, 20, + 1453, 1, 2074, 3, 20, + 1454, 0, 2075, 3, 21, + 1455, 0, 2076, 3, 20, + 1456, 0, 2077, 3, 20, + 1457, 1, 2078, 3, 20, + 1458, 0, 2079, 3, 21, + 1459, 0, 2080, 3, 20, + 1460, 0, 2081, 3, 20, + 1461, 1, 2082, 3, 20, + 1462, 0, 2083, 3, 21, + 1463, 0, 2084, 3, 20, + 1464, 0, 2085, 3, 20, + 1465, 1, 2086, 3, 20, + 1466, 0, 2087, 3, 21, + 1467, 0, 2088, 3, 20, + 1468, 0, 2089, 3, 20, + 1469, 1, 2090, 3, 20, + 1470, 0, 2091, 3, 21, + 1471, 0, 2092, 3, 20, + 1472, 0, 2093, 3, 20, + 1473, 0, 2094, 3, 20, + 1474, 1, 2095, 3, 20, + 1475, 0, 2096, 3, 20, + 1476, 0, 2097, 3, 20, + 1477, 0, 2098, 3, 20, + 1478, 1, 2099, 3, 20, + 1479, 0, 2100, 3, 21, + 1480, 0, 2101, 3, 21, + 1481, 0, 2102, 3, 21, + 1482, 1, 2103, 3, 21, + 1483, 0, 2104, 3, 21, + 1484, 0, 2105, 3, 21, + 1485, 0, 2106, 3, 21, + 1486, 1, 2107, 3, 21, + 1487, 0, 2108, 3, 21, + 1488, 0, 2109, 3, 21, + 1489, 0, 2110, 3, 21, + 1490, 1, 2111, 3, 21, + 1491, 0, 2112, 3, 21, + 1492, 0, 2113, 3, 21, + 1493, 0, 2114, 3, 21, + 1494, 1, 2115, 3, 21, + 1495, 0, 2116, 3, 21, + 1496, 0, 2117, 3, 21, + 1497, 0, 2118, 3, 21, + 1498, 1, 2119, 3, 21, + }; + + @Test + public void TestPersianJan1ToGregorian() { + Calendar gcal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran"), + new ULocale("en")); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran"), + new ULocale("fa_IR@calendar=persian")); + for (int i = 0; i < PERSIAN_TEST_CASE_2.length;) { + int pYear = PERSIAN_TEST_CASE_2[i++]; + boolean pLeap = PERSIAN_TEST_CASE_2[i++] != 0; + int year = PERSIAN_TEST_CASE_2[i++]; + int month = PERSIAN_TEST_CASE_2[i++]; + int day = PERSIAN_TEST_CASE_2[i++]; + cal.clear(); + cal.set(Calendar.YEAR, pYear); + cal.set(Calendar.MONTH, 0); + cal.set(Calendar.DAY_OF_MONTH, 1); + gcal.setTime(cal.getTime()); + int actualYear = gcal.get(Calendar.YEAR); + int actualMonth = gcal.get(Calendar.MONTH)+1; + int actualDay = gcal.get(Calendar.DAY_OF_MONTH); + if (actualYear != year || actualMonth != month || actualDay != day) { + errln("Fail: Persian(" + pYear + ", 1, 1) => " + + "expect Gregorian(" + year + "/" + month + "/" + day + ") " + + "actual Gregorian(" + actualYear + "/" + actualMonth + "/" + actualDay + ")"); + } + } + } + + @Test + public void TestGregorianToPersian() { + Calendar gcal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran"), + new ULocale("en")); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran"), + new ULocale("fa_IR@calendar=persian")); + for (int i = 0; i < PERSIAN_TEST_CASE_2.length;) { + int pYear = PERSIAN_TEST_CASE_2[i++]; + boolean pLeap = PERSIAN_TEST_CASE_2[i++] != 0; + int year = PERSIAN_TEST_CASE_2[i++]; + int month = PERSIAN_TEST_CASE_2[i++]; + int day = PERSIAN_TEST_CASE_2[i++]; + gcal.clear(); + gcal.set(Calendar.YEAR, year); + gcal.set(Calendar.MONTH, month-1); + gcal.set(Calendar.DAY_OF_MONTH, day); + cal.setTime(gcal.getTime()); + int persianYear = cal.get(Calendar.YEAR); + int persianMonth = cal.get(Calendar.MONTH)+1; + int persianDay = cal.get(Calendar.DAY_OF_MONTH); + if (persianYear != pYear || persianMonth != 1 || persianDay != 1) { + errln("Fail: Gregorian(" + year + "/" + month + "/" + day + ") "+ + " => expect Persian(" + pYear + "/1/1) actual " + + "Persian(" + persianYear + "/" + persianMonth + "/" + persianDay + ")"); + } + } + } } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/LanguageTestFmwk.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/LanguageTestFmwk.java index e7dbb058f61..13f7484114d 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/LanguageTestFmwk.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/LanguageTestFmwk.java @@ -63,7 +63,7 @@ public abstract class LanguageTestFmwk extends CoreTestFmwk implements TimeUnitC private PrintWriter pw; - private static final Map datacache = new HashMap(); // String->TestData + private static final Map datacache = new HashMap<>(); // String->TestData private static final long[] approxDurations = { 36525L*24*60*60*10, 3045*24*60*60*10L, 7*24*60*60*1000L, 24*60*60*1000L, @@ -79,7 +79,7 @@ public abstract class LanguageTestFmwk extends CoreTestFmwk implements TimeUnitC if (locale.equals("testFullPluralizedForms")) { Thread.dumpStack(); } - TestData data = (TestData) datacache.get(locale); + TestData data = datacache.get(locale); if (data == null) { try { InputStream is = LanguageTestFmwk.class @@ -604,14 +604,13 @@ class FileTestData extends LanguageTestFmwk.TestData { String[] stringArray; - void wrapup(List /* of String */list, Element element) { + void wrapup(List list, Element element) { if (list == null) return; switch (element.mode) { case EMode.mString: - stringArray = (String[]) list.toArray(new String[list - .size()]); + stringArray = list.toArray(new String[list.size()]); break; case EMode.mInt: @@ -668,7 +667,7 @@ class FileTestData extends LanguageTestFmwk.TestData { } Wrapup w = new Wrapup(); - List /* of String */list = null; + List list = null; Element element = null; String line = null; while (null != (line = br.readLine())) { @@ -678,7 +677,7 @@ class FileTestData extends LanguageTestFmwk.TestData { if (line.charAt(0) == '=') { w.wrapup(list, element); - list = new ArrayList(); + list = new ArrayList<>(); element = Element.forString(line.substring(1)); } else if (line.equals("null")) { list.add(null); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java index 17af5f8214e..ea94b7b6313 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java @@ -11,9 +11,6 @@ package com.ibm.icu.dev.test.duration; -import java.util.Collection; -import java.util.Iterator; - import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -28,9 +25,7 @@ public class ResourceBasedPeriodFormatterDataServiceTest extends CoreTestFmwk { public void testAvailable() { ResourceBasedPeriodFormatterDataService service = ResourceBasedPeriodFormatterDataService.getInstance(); - Collection locales = service.getAvailableLocales(); - for (Iterator i = locales.iterator(); i.hasNext();) { - String locale = (String)i.next(); + for (String locale : service.getAvailableLocales()) { PeriodFormatterData pfd = service.get(locale); assertFalse(locale + ": " + pfd.pluralization(), -1 == pfd.pluralization()); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java index e52dd2e53f0..25de60c10a8 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java @@ -13,7 +13,6 @@ import java.text.ParsePosition; import java.util.Collection; import java.util.Date; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -576,26 +575,6 @@ public class DateTimeGeneratorTest extends CoreTestFmwk { new String[] {"Ed", "26\u65E5\u5468\u4E09"}, new String[] {"jmmssSSS", "23:58:59.123"}, new String[] {"JJmm", "23:58"}, - - new ULocale("ja_JP_TRADITIONAL"), - // TODO: This is different in C++ and Java. - new String[] {"yM", "1999/1",}, - new String[] {"yMMM", "1999年1月"}, - new String[] {"yMd", "1999/1/13"}, - new String[] {"yMMMd", "1999年1月13日"}, - new String[] {"Md", "1/13"}, - new String[] {"MMMd", "1月13日"}, - new String[] {"MMMMd", "1月13日"}, - new String[] {"yQQQ", "1999/Q1"}, - new String[] {"hhmm", "午後11:58"}, - new String[] {"HHmm", "23:58"}, - new String[] {"jjmm", "23:58"}, - new String[] {"mmss", "58:59"}, - new String[] {"yyyyMMMM", "1999年1月"}, - new String[] {"MMMEd", "1月13日(水)"}, - new String[] {"Ed", "13日(水)"}, - new String[] {"jmmssSSS", "23:58:59.123"}, - new String[] {"JJmm", "23:58"} }; @Test @@ -797,7 +776,7 @@ public class DateTimeGeneratorTest extends CoreTestFmwk { * @return */ public String replaceZoneString(String pattern, String newZone) { - final List itemList = formatParser.set(pattern).getItems(); + final List itemList = formatParser.set(pattern).getItems(); boolean changed = false; for (int i = 0; i < itemList.size(); ++i) { Object item = itemList.get(i); @@ -815,8 +794,7 @@ public class DateTimeGeneratorTest extends CoreTestFmwk { } public boolean containsZone(String pattern) { - for (Iterator it = formatParser.set(pattern).getItems().iterator(); it.hasNext();) { - Object item = it.next(); + for (Object item : formatParser.set(pattern).getItems()) { if (item instanceof VariableField) { VariableField variableField = (VariableField) item; if (variableField.getType() == DateTimePatternGenerator.ZONE) { @@ -849,8 +827,7 @@ public class DateTimeGeneratorTest extends CoreTestFmwk { int count = 0; DateOrder result = new DateOrder(); - for (Iterator it = formatParser.set(pattern).getItems().iterator(); it.hasNext();) { - Object item = it.next(); + for (Object item : formatParser.set(pattern).getItems()) { if (!(item instanceof String)) { // the first character of the variable field determines the type, // according to CLDR. diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/ListFormatterTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/ListFormatterTest.java index feb47927100..debc63b0c4b 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/ListFormatterTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/ListFormatterTest.java @@ -418,7 +418,7 @@ public class ListFormatterTest extends CoreTestFmwk { String expected = (String) cas[2]; for (String locale : locales) { ULocale uloc = new ULocale(locale); - List inputs = Arrays.asList(cas).subList(3, cas.length); + List inputs = Arrays.asList(cas).subList(3, cas.length); ListFormatter fmt = ListFormatter.getInstance(uloc, type, width); String message = "TestContextual uloc=" + uloc + " type=" diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java index 71638854c14..e38df34f449 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/MessageRegressionTest.java @@ -677,19 +677,17 @@ public class MessageRegressionTest extends CoreTestFmwk { try { logln("Apply with pattern : " + pattern1); messageFormatter.applyPattern(pattern1); - HashMap paramsMap = new HashMap(); + HashMap paramsMap = new HashMap<>(); paramsMap.put("arg0", 7); String tempBuffer = messageFormatter.format(paramsMap); if (!tempBuffer.equals("Impossible {arg1} has occurred -- status code is 7 and message is {arg2}.")) errln("Tests arguments < substitution failed"); logln("Formatted with 7 : " + tempBuffer); ParsePosition status = new ParsePosition(0); - Map objs = messageFormatter.parseToMap(tempBuffer, status); + Map objs = messageFormatter.parseToMap(tempBuffer, status); if (objs.get("arg1") != null || objs.get("arg2") != null) errln("Parse failed with more than expected arguments"); - for (Iterator keyIter = objs.keySet().iterator(); - keyIter.hasNext();) { - String key = (String) keyIter.next(); + for (String key : objs.keySet()) { if (objs.get(key) != null && !objs.get(key).toString().equals(paramsMap.get(key).toString())) { errln("Parse failed on object " + objs.get(key) + " with argument name : " + key ); } @@ -721,7 +719,7 @@ public class MessageRegressionTest extends CoreTestFmwk { } MessageFormat fmt = new MessageFormat("There are {numberOfApples} apples growing on the {whatKindOfTree} tree."); String str = new String("There is one apple growing on the peach tree."); - Map objs = fmt.parseToMap(str, pos); + Map objs = fmt.parseToMap(str, pos); logln("unparsable string , should fail at " + pos.getErrorIndex()); if (pos.getErrorIndex() == -1) errln("Bug 4052223 failed : parsing string " + str); @@ -773,14 +771,14 @@ public class MessageRegressionTest extends CoreTestFmwk { String pattern = patterns[i]; mf.applyPattern(pattern); try { - Map objs = mf.parseToMap(null, new ParsePosition(0)); + Map objs = mf.parseToMap(null, new ParsePosition(0)); logln("pattern: \"" + pattern + "\""); log(" parsedObjects: "); if (objs != null) { log("{"); - for (Iterator keyIter = objs.keySet().iterator(); + for (Iterator keyIter = objs.keySet().iterator(); keyIter.hasNext();) { - String key = (String)keyIter.next(); + String key = keyIter.next(); if (objs.get(key) != null) { err("\"" + objs.get(key).toString() + "\""); } else { @@ -802,9 +800,9 @@ public class MessageRegressionTest extends CoreTestFmwk { } }{ // Taken from Test4114739(). MessageFormat mf = new MessageFormat("<{arg}>"); - Map objs1 = null; - Map objs2 = new HashMap(); - Map objs3 = new HashMap(); + Map objs1 = null; + Map objs2 = new HashMap<>(); + Map objs3 = new HashMap<>(); objs3.put("arg", null); try { logln("pattern: \"" + mf.toPattern() + "\""); @@ -821,14 +819,14 @@ public class MessageRegressionTest extends CoreTestFmwk { String argName = "something_stupid"; MessageFormat mf = new MessageFormat("{"+ argName + "}, {" + argName + "}, {" + argName + "}"); String forParsing = "x, y, z"; - Map objs = mf.parseToMap(forParsing, new ParsePosition(0)); + Map objs = mf.parseToMap(forParsing, new ParsePosition(0)); logln("pattern: \"" + mf.toPattern() + "\""); logln("text for parsing: \"" + forParsing + "\""); if (!objs.get(argName).toString().equals("z")) errln("argument0: \"" + objs.get(argName) + "\""); mf.setLocale(Locale.US); mf.applyPattern("{" + argName + ",number,#.##}, {" + argName + ",number,#.#}"); - Map oldobjs = new HashMap(); + Map oldobjs = new HashMap<>(); oldobjs.put(argName, 3.1415d); String result = mf.format( oldobjs ); logln("pattern: \"" + mf.toPattern() + "\""); @@ -836,7 +834,7 @@ public class MessageRegressionTest extends CoreTestFmwk { // result now equals "3.14, 3.1" if (!result.equals("3.14, 3.1")) errln("result = " + result); - Map newobjs = mf.parseToMap(result, new ParsePosition(0)); + Map newobjs = mf.parseToMap(result, new ParsePosition(0)); // newobjs now equals {Double.valueOf(3.1)} if (((Number)newobjs.get(argName)).doubleValue() != 3.1) // was (Double) [alan] errln( "newobjs.get(argName) = " + newobjs.get(argName)); @@ -850,14 +848,14 @@ public class MessageRegressionTest extends CoreTestFmwk { ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart); form1.setFormat(1, fileform); form2.setFormat(0, fileform); - Map testArgs = new HashMap(); + Map testArgs = new HashMap<>(); testArgs.put("diskName", "MyDisk"); testArgs.put("numberOfFiles", 12373L); logln(form1.format(testArgs)); logln(form2.format(testArgs)); }{ // Taken from test4293229(). MessageFormat format = new MessageFormat("'''{'myNamedArgument}'' '''{myNamedArgument}'''"); - Map args = new HashMap(); + Map args = new HashMap<>(); String expected = "'{myNamedArgument}' '{myNamedArgument}'"; String result = format.format(args); if (!result.equals(expected)) { diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/PluralFormatUnitTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/PluralFormatUnitTest.java index 89339fe959d..7b8d87fbd2a 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/PluralFormatUnitTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/PluralFormatUnitTest.java @@ -215,11 +215,11 @@ public class PluralFormatUnitTest extends CoreTestFmwk { @Test public void TestSamples() { - Map> same = new LinkedHashMap(); + Map> same = new LinkedHashMap<>(); for (ULocale locale : PluralRules.getAvailableULocales()) { ULocale otherLocale = PluralRules.getFunctionalEquivalent(locale, null); Set others = same.get(otherLocale); - if (others == null) same.put(otherLocale, others = new LinkedHashSet()); + if (others == null) same.put(otherLocale, others = new LinkedHashSet<>()); others.add(locale); continue; } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/RBNFParseTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/RBNFParseTest.java index 54df0d1fb8b..50684c8fff8 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/RBNFParseTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/format/RBNFParseTest.java @@ -165,6 +165,18 @@ public class RBNFParseTest extends CoreTestFmwk { parseList(rbnf_en, rbnf_fr, lists); } + @Test + public void TestParseRuleDescriptorOverflow23002() { + try { + RuleBasedNumberFormat rbnf = + new RuleBasedNumberFormat( + "0110110/300113001103000113001103000110i/3013033:", + new Locale("as")); + } catch (IllegalArgumentException e) { + return; + } + errln("expected exception but didn't get one!"); + } @Test public void TestBadParse() { RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(Locale.JAPAN, RuleBasedNumberFormat.SPELLOUT); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/DataDrivenUScriptTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/DataDrivenUScriptTest.java index 00df24b6bed..ce1e084b9ef 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/DataDrivenUScriptTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/DataDrivenUScriptTest.java @@ -48,7 +48,7 @@ public class DataDrivenUScriptTest extends CoreTestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { { new ULocale("en"), UScript.LATIN }, { new ULocale("en_US"), UScript.LATIN }, { new ULocale("sr"), UScript.CYRILLIC }, @@ -126,7 +126,7 @@ public class DataDrivenUScriptTest extends CoreTestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { { "ja", new int[] { UScript.KATAKANA, UScript.HIRAGANA, UScript.HAN }, Locale.JAPANESE }, { "ko_KR", new int[] { UScript.HANGUL, UScript.HAN }, Locale.KOREA }, @@ -175,7 +175,7 @@ public class DataDrivenUScriptTest extends CoreTestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { /* test locale */ { "en", UScript.LATIN }, @@ -269,7 +269,7 @@ public class DataDrivenUScriptTest extends CoreTestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { { UScript.CYRILLIC, "Cyrillic" }, { UScript.DESERET, "Deseret" }, @@ -302,7 +302,7 @@ public class DataDrivenUScriptTest extends CoreTestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { { UScript.HAN, "Hani" }, { UScript.HANGUL, "Hang" }, @@ -338,7 +338,7 @@ public class DataDrivenUScriptTest extends CoreTestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new int[][] { { 0x0000FF9D, UScript.KATAKANA }, { 0x0000FFBE, UScript.HANGUL }, diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java index 9990c3870f7..75df58a3bca 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java @@ -263,7 +263,7 @@ public final class UCharacterSurrogateTest extends CoreTestFmwk { } } - void fail(String s, int start, int limit, Class exc) { + void fail(String s, int start, int limit, Class exc) { try { UCharacter.codePointCount(s, start, limit); errln("unexpected success " + str(s, start, limit)); @@ -350,7 +350,7 @@ public final class UCharacterSurrogateTest extends CoreTestFmwk { } void fail(char[] text, int start, int count, int index, int offset, - Class exc) { + Class exc) { try { UCharacter.offsetByCodePoints(text, start, count, index, offset); @@ -365,7 +365,7 @@ public final class UCharacterSurrogateTest extends CoreTestFmwk { } } - void fail(String text, int index, int offset, Class exc) { + void fail(String text, int index, int offset, Class exc) { try { UCharacter.offsetByCodePoints(text, index, offset); errln("unexpected success " diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterTest.java index 1701b8f17a6..cd950653a61 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterTest.java @@ -2988,7 +2988,7 @@ public final class UCharacterTest extends CoreTestFmwk @Test public void TestBlockData() { - Class ubc = UCharacter.UnicodeBlock.class; + Class ubc = UCharacter.UnicodeBlock.class; for (int b = 1; b < UCharacter.UnicodeBlock.COUNT; b += 1) { UCharacter.UnicodeBlock blk = UCharacter.UnicodeBlock.getInstance(b); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterThreadTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterThreadTest.java index 5873fb36e5b..86a9a2dd836 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterThreadTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UCharacterThreadTest.java @@ -8,9 +8,8 @@ */ package com.ibm.icu.dev.test.lang; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; -import java.util.ListIterator; import org.junit.Test; import org.junit.runner.RunWith; @@ -42,7 +41,7 @@ public class UCharacterThreadTest extends CoreTestFmwk { // @Test public void TestUCharactersGetName() throws InterruptedException { - List threads = new LinkedList(); + List threads = new ArrayList<>(); for(int t=0; t<20; t++) { int codePoint = 47 + t; String correctName = UCharacter.getName(codePoint); @@ -50,9 +49,7 @@ public class UCharacterThreadTest extends CoreTestFmwk { thread.start(); threads.add(thread); } - ListIterator i = threads.listIterator(); - while (i.hasNext()) { - GetNameThread thread = (GetNameThread)i.next(); + for (GetNameThread thread : threads) { thread.join(); if (!thread.correctName.equals(thread.actualName)) { errln("FAIL, expected \"" + thread.correctName + "\", got \"" + thread.actualName + "\""); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UnicodeSetTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UnicodeSetTest.java index 5c77f3c64c8..2bd6a8c1861 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UnicodeSetTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/lang/UnicodeSetTest.java @@ -781,8 +781,8 @@ public class UnicodeSetTest extends CoreTestFmwk { // Ram also add a similar test to UtilityTest.java logln("Testing addAll(Collection) ... "); String[] array = {"a", "b", "c", "de"}; - List list = Arrays.asList(array); - Set aset = new HashSet(list); + List list = Arrays.asList(array); + Set aset = new HashSet<>(list); logln(" *** The source set's size is: " + aset.size()); set.clear(); @@ -794,16 +794,16 @@ public class UnicodeSetTest extends CoreTestFmwk { logln("OK: After addAll, the UnicodeSet size got " + set.size()); } - List list2 = new ArrayList(); + List list2 = new ArrayList<>(); set.addAllTo(list2); //verify the result log(" *** The elements are: "); String s = set.toPattern(true); logln(s); - Iterator myiter = list2.iterator(); + Iterator myiter = list2.iterator(); while(myiter.hasNext()) { - log(myiter.next().toString() + " "); + log(myiter.next() + " "); } logln(""); // a new line } @@ -859,8 +859,8 @@ public class UnicodeSetTest extends CoreTestFmwk { String[] choices = {"a", "b", "cd", "ef"}; int limit = 1 << choices.length; - SortedSet iset = new TreeSet(); - SortedSet jset = new TreeSet(); + SortedSet iset = new TreeSet<>(); + SortedSet jset = new TreeSet<>(); for (int i = 0; i < limit; ++i) { pick(i, choices, iset); @@ -882,8 +882,8 @@ public class UnicodeSetTest extends CoreTestFmwk { public void SetSpeed2(int size) { - SortedSet iset = new TreeSet(); - SortedSet jset = new TreeSet(); + SortedSet iset = new TreeSet<>(); + SortedSet jset = new TreeSet<>(); for (int i = 0; i < size*2; i += 2) { // only even values iset.add(i); @@ -907,12 +907,12 @@ public class UnicodeSetTest extends CoreTestFmwk { CheckSpeed(jset, iset, "when a, b are disjoint", iterations); } - void CheckSpeed(SortedSet iset, SortedSet jset, String message, int iterations) { + void CheckSpeed(SortedSet iset, SortedSet jset, String message, int iterations) { CheckSpeed2(iset, jset, message, iterations); CheckSpeed3(iset, jset, message, iterations); } - void CheckSpeed2(SortedSet iset, SortedSet jset, String message, int iterations) { + void CheckSpeed2(SortedSet iset, SortedSet jset, String message, int iterations) { boolean x; boolean y; @@ -939,7 +939,7 @@ public class UnicodeSetTest extends CoreTestFmwk { + ", Utility: " + utime + ", u:j: " + nf.format(utime/jtime)); } - void CheckSpeed3(SortedSet iset, SortedSet jset, String message, int iterations) { + void CheckSpeed3(SortedSet iset, SortedSet jset, String message, int iterations) { boolean x; boolean y; @@ -967,7 +967,7 @@ public class UnicodeSetTest extends CoreTestFmwk { + ", Utility: " + utime + ", u:j: " + nf.format(utime/jtime)); } - void pick(int bits, Object[] examples, SortedSet output) { + void pick(int bits, String[] examples, SortedSet output) { output.clear(); for (int k = 0; k < 32; ++k) { if (((1< A, int filter, Collection B) { + Collection ab = new TreeSet<>(A); ab.retainAll(B); if (ab.size() > 0 && (filter & SortedSetRelation.A_AND_B) == 0) return false; @@ -999,7 +999,7 @@ public class UnicodeSetTest extends CoreTestFmwk { return true; } - void checkSetRelation(SortedSet a, SortedSet b, String message) { + void checkSetRelation(SortedSet a, SortedSet b, String message) { for (int i = 0; i < 8; ++i) { boolean hasRelation = SortedSetRelation.hasRelation(a, i, b); @@ -1768,16 +1768,16 @@ public class UnicodeSetTest extends CoreTestFmwk { set1.addAllTo(list1); assertEquals("iteration test", oldList, list1); - list1 = set1.addAllTo(new ArrayList()); + list1 = set1.addAllTo(new ArrayList<>()); assertEquals("addAllTo", oldList, list1); - ArrayList list2 = set2.addAllTo(new ArrayList()); - ArrayList list3 = set3.addAllTo(new ArrayList()); + ArrayList list2 = set2.addAllTo(new ArrayList<>()); + ArrayList list3 = set3.addAllTo(new ArrayList<>()); // put them into different order, to check that order doesn't matter - TreeSet sorted1 = set1.addAllTo(new TreeSet()); - TreeSet sorted2 = set2.addAllTo(new TreeSet()); - TreeSet sorted3 = set3.addAllTo(new TreeSet()); + TreeSet sorted1 = set1.addAllTo(new TreeSet<>()); + TreeSet sorted2 = set2.addAllTo(new TreeSet<>()); + TreeSet sorted3 = set3.addAllTo(new TreeSet<>()); //containsAll(Collection collection) assertTrue("containsAll", set1.containsAll(list1)); @@ -1837,7 +1837,7 @@ public class UnicodeSetTest extends CoreTestFmwk { List goalLongest = Arrays.asList(set1, set3, set2); List goalLex = Arrays.asList(set1, set2, set3); - List sorted = new ArrayList(new TreeSet<>(unsorted)); + List sorted = new ArrayList<>(new TreeSet<>(unsorted)); assertNotEquals("compareTo-shorter-first", unsorted, sorted); assertEquals("compareTo-shorter-first", goalShortest, sorted); @@ -1848,7 +1848,7 @@ public class UnicodeSetTest extends CoreTestFmwk { return o1.compareTo(o2, ComparisonStyle.LONGER_FIRST); }}); sorted1.addAll(unsorted); - sorted = new ArrayList(sorted1); + sorted = new ArrayList<>(sorted1); assertNotEquals("compareTo-longer-first", unsorted, sorted); assertEquals("compareTo-longer-first", goalLongest, sorted); @@ -1859,7 +1859,7 @@ public class UnicodeSetTest extends CoreTestFmwk { return o1.compareTo(o2, ComparisonStyle.LEXICOGRAPHIC); }}); sorted1.addAll(unsorted); - sorted = new ArrayList(sorted1); + sorted = new ArrayList<>(sorted1); assertNotEquals("compareTo-lex", unsorted, sorted); assertEquals("compareTo-lex", goalLex, sorted); @@ -1931,8 +1931,8 @@ public class UnicodeSetTest extends CoreTestFmwk { UnicodeSet t = new UnicodeSet(3,5, 7,7); assertEquals("new constructor", w, t); // check to make sure right exceptions are thrown - Class expected = IllegalArgumentException.class; - Class actual; + Class expected = IllegalArgumentException.class; + Class actual; try { actual = null; @@ -2022,7 +2022,7 @@ public class UnicodeSetTest extends CoreTestFmwk { case 0: test.add(0); break; case 1: test.add(0,1); break; case 2: test.add("a"); break; - case 3: List a = new ArrayList(); a.add("a"); test.addAll(a); break; + case 3: List a = new ArrayList<>(); a.add("a"); test.addAll(a); break; case 4: test.addAll("ab"); break; case 5: test.addAll(new UnicodeSet("[ab]")); break; case 6: test.applyIntPropertyValue(0,0); break; @@ -2135,7 +2135,7 @@ public class UnicodeSetTest extends CoreTestFmwk { // } public class TokenSymbolTable implements SymbolTable { - HashMap contents = new HashMap(); + HashMap contents = new HashMap<>(); /** * (Non-SymbolTable API) Add the given variable and value to @@ -2163,8 +2163,8 @@ public class UnicodeSetTest extends CoreTestFmwk { @Override public char[] lookup(String s) { logln("TokenSymbolTable: lookup \"" + s + "\" => \"" + - new String((char[]) contents.get(s)) + "\""); - return (char[])contents.get(s); + new String(contents.get(s)) + "\""); + return contents.get(s); } /* (non-Javadoc) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/Args.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/Args.java index 6d37d97e5a8..97e971e8c34 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/Args.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/Args.java @@ -7,8 +7,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import com.ibm.icu.message2.MessageFormatter; - /** * Convenience class that provides the same functionality as * Map.of introduced in JDK 11, which can't be used yet for ICU4J. diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/TestUtils.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/TestUtils.java index 7bfcf65dc56..71b9708dd7b 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/TestUtils.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/message2/TestUtils.java @@ -200,20 +200,5 @@ public class TestUtils { URI getPath = cls.getClassLoader().getResource(packageName).toURI(); Path filePath = Paths.get(getPath); Path json = Paths.get(fileName); - // First, check the top level of the source directory, - // in case we're in a source tarball - Path icuTestdataInSourceDir = filePath.resolve("../../../../../../../../../../../testdata/message2/").normalize(); - Path icuTestdataDir = icuTestdataInSourceDir; - if (!Files.isDirectory(icuTestdataInSourceDir)) { - // If that doesn't exist, check one directory higher, in case we're - // in a checked-out repo - Path icuTestdataInRepo = Paths.get("../").resolve(icuTestdataInSourceDir).normalize(); - if (!Files.isDirectory(icuTestdataInRepo)) { - throw new java.io.FileNotFoundException("Test data directory does not exist: tried " - + icuTestdataInSourceDir + " and " - + icuTestdataInRepo); - } - icuTestdataDir = icuTestdataInSourceDir; - } - return icuTestdataDir.resolve(json); + return filePath.resolve(json); }} diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/normalizer/TestCanonicalIterator.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/normalizer/TestCanonicalIterator.java index 104825d2569..510d61532c9 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/normalizer/TestCanonicalIterator.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/normalizer/TestCanonicalIterator.java @@ -9,9 +9,9 @@ package com.ibm.icu.dev.test.normalizer; import java.util.Collection; -import java.util.Iterator; import java.util.Set; import java.util.SortedSet; +import java.util.StringJoiner; import java.util.TreeSet; import org.junit.Test; @@ -135,12 +135,12 @@ public class TestCanonicalIterator extends CoreTestFmwk { // check permute // NOTE: we use a TreeSet below to sort the output, which is not guaranteed to be sorted! - Set results = new TreeSet(); + Set results = new TreeSet<>(); CanonicalIterator.permute("ABC", false, results); expectEqual("Simple permutation ", "", collectionToString(results), "ABC, ACB, BAC, BCA, CAB, CBA"); // try samples - SortedSet set = new TreeSet(); + SortedSet set = new TreeSet<>(); for (int i = 0; i < testArray.length; ++i) { //logln("Results for: " + name.transliterate(testArray[i])); CanonicalIterator it = new CanonicalIterator(testArray[i][0]); @@ -263,12 +263,10 @@ public class TestCanonicalIterator extends CoreTestFmwk { } } - static String collectionToString(Collection col) { - StringBuffer result = new StringBuffer(); - Iterator it = col.iterator(); - while (it.hasNext()) { - if (result.length() != 0) result.append(", "); - result.append(it.next().toString()); + static String collectionToString(Collection col) { + StringJoiner result = new StringJoiner(", "); + for (String item : col) { + result.add(item); } return result.toString(); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITest.java index 0c60e946222..a7210ba1253 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITest.java @@ -499,8 +499,8 @@ public class RBBITest extends CoreTestFmwk { static class T13512Thread extends Thread { private String fText; - public List fBoundaries; - public List fExpectedBoundaries; + public List fBoundaries; + public List fExpectedBoundaries; T13512Thread(String text) { fText = text; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java index cabbfc50f43..8d3ead20fb6 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/rbbi/RBBITestMonkey.java @@ -55,14 +55,14 @@ public class RBBITestMonkey extends CoreTestFmwk { // abstract static class RBBIMonkeyKind { RBBIMonkeyKind() { - fSets = new ArrayList(); - fClassNames = new ArrayList(); - fAppliedRules = new ArrayList(); + fSets = new ArrayList<>(); + fClassNames = new ArrayList<>(); + fAppliedRules = new ArrayList<>(); } // Return a List of UnicodeSets, representing the character classes used // for this type of iterator. - abstract List charClasses(); + abstract List charClasses(); // Set the test text on which subsequent calls to next() will operate abstract void setText(StringBuffer text); @@ -145,9 +145,9 @@ public class RBBITestMonkey extends CoreTestFmwk { UnicodeSet fHangulSet; UnicodeSet fZWJSet; UnicodeSet fExtendedPictSet; - UnicodeSet fViramaSet; - UnicodeSet fLinkingConsonantSet; - UnicodeSet fExtCccZwjSet; + UnicodeSet fInCBLinkerSet; + UnicodeSet fInCBConsonantSet; + UnicodeSet fInCBExtendSet; UnicodeSet fAnySet; @@ -176,11 +176,9 @@ public class RBBITestMonkey extends CoreTestFmwk { fHangulSet.addAll(fLVTSet); fExtendedPictSet = new UnicodeSet("[:Extended_Pictographic:]"); - fViramaSet = new UnicodeSet("[\\p{Gujr}\\p{sc=Telu}\\p{sc=Mlym}\\p{sc=Orya}\\p{sc=Beng}\\p{sc=Deva}&" - + "\\p{Indic_Syllabic_Category=Virama}]"); - fLinkingConsonantSet = new UnicodeSet("[\\p{Gujr}\\p{sc=Telu}\\p{sc=Mlym}\\p{sc=Orya}\\p{sc=Beng}\\p{sc=Deva}&" - + "\\p{Indic_Syllabic_Category=Consonant}]"); - fExtCccZwjSet = new UnicodeSet("[[\\p{gcb=Extend}-\\p{ccc=0}] \\p{gcb=ZWJ}]"); + fInCBLinkerSet = new UnicodeSet("[\\p{InCB=Linker}]"); + fInCBConsonantSet = new UnicodeSet("[\\p{InCB=Consonant}]"); + fInCBExtendSet = new UnicodeSet("[\\p{InCB=Extend}]"); fAnySet = new UnicodeSet("[\\u0000-\\U0010ffff]"); @@ -196,9 +194,9 @@ public class RBBITestMonkey extends CoreTestFmwk { fSets.add(fAnySet); fClassNames.add("Any"); fSets.add(fZWJSet); fClassNames.add("ZWJ"); fSets.add(fExtendedPictSet); fClassNames.add("ExtendedPict"); - fSets.add(fViramaSet); fClassNames.add("Virama"); - fSets.add(fLinkingConsonantSet); fClassNames.add("LinkingConsonant"); - fSets.add(fExtCccZwjSet); fClassNames.add("ExtCccZwj"); + fSets.add(fInCBLinkerSet); fClassNames.add("InCB=Linker"); + fSets.add(fInCBConsonantSet); fClassNames.add("InCB=Consonant"); + fSets.add(fInCBExtendSet); fClassNames.add("InCB=Extend"); } @@ -209,7 +207,7 @@ public class RBBITestMonkey extends CoreTestFmwk { } @Override - List charClasses() { + List charClasses() { return fSets; } @@ -315,17 +313,18 @@ public class RBBITestMonkey extends CoreTestFmwk { } // Note: Viramas are also included in the ExtCccZwj class. - if (fLinkingConsonantSet.contains(c2)) { + if (fInCBConsonantSet.contains(c2)) { int pi = p1; boolean sawVirama = false; - while (pi > 0 && fExtCccZwjSet.contains(fText.codePointAt(pi))) { - if (fViramaSet.contains(fText.codePointAt(pi))) { + while (pi > 0 && (fInCBExtendSet.contains(fText.codePointAt(pi)) || + fInCBLinkerSet.contains(fText.codePointAt(pi)))) { + if (fInCBLinkerSet.contains(fText.codePointAt(pi))) { sawVirama = true; } pi = fText.offsetByCodePoints(pi, -1); } - if (sawVirama && fLinkingConsonantSet.contains(fText.codePointAt(pi))) { - setAppliedRule(p2, "GB 9.3 LinkingConsonant ExtCccZwj* Virama ExtCccZwj* × LinkingConsonant"); + if (sawVirama && fInCBConsonantSet.contains(fText.codePointAt(pi))) { + setAppliedRule(p2, "GB9c \\p{InCB=Consonant} [ \\p{InCB=Extend} \\p{InCB=Linker} ]* \\p{InCB=Linker} [ \\p{InCB=Extend} \\p{InCB=Linker} ]* × \\p{InCB=Consonant})"); continue; } } @@ -404,7 +403,7 @@ public class RBBITestMonkey extends CoreTestFmwk { fSingle_QuoteSet = new UnicodeSet("[\\p{Word_Break = Single_Quote}]"); fDouble_QuoteSet = new UnicodeSet("[\\p{Word_Break = Double_Quote}]"); fMidNumLetSet = new UnicodeSet("[\\p{Word_Break = MidNumLet}]"); - fMidLetterSet = new UnicodeSet("[\\p{Word_Break = MidLetter} - [\\: \\uFE55 \\uFF1A]]"); + fMidLetterSet = new UnicodeSet("[\\p{Word_Break = MidLetter}]"); fMidNumSet = new UnicodeSet("[\\p{Word_Break = MidNum}]"); fNumericSet = new UnicodeSet("[\\p{Word_Break = Numeric}]"); fFormatSet = new UnicodeSet("[\\p{Word_Break = Format}]"); @@ -477,7 +476,7 @@ public class RBBITestMonkey extends CoreTestFmwk { @Override - List charClasses() { + List charClasses() { return fSets; } @@ -1277,7 +1276,6 @@ public class RBBITestMonkey extends CoreTestFmwk { fLF.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fNL.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fSP.contains(fText.codePointAt(breakObliviousPrevPosX2)) || - fGL.contains(fText.codePointAt(breakObliviousPrevPosX2)) || fZW.contains(fText.codePointAt(breakObliviousPrevPosX2))) { setAppliedRule(pos, "LB 20a"); continue; @@ -1286,7 +1284,8 @@ public class RBBITestMonkey extends CoreTestFmwk { fCM.contains(fText.codePointAt(breakObliviousPrevPosX2))) { breakObliviousPrevPosX2 = moveIndex32(fText, breakObliviousPrevPosX2, -1); } - if (fCB.contains(fText.codePointAt(breakObliviousPrevPosX2))) { + if (fCB.contains(fText.codePointAt(breakObliviousPrevPosX2)) || + fGL.contains(fText.codePointAt(breakObliviousPrevPosX2))) { setAppliedRule(pos, "LB 20a"); continue; } @@ -1763,7 +1762,7 @@ public class RBBITestMonkey extends CoreTestFmwk { @Override - List charClasses() { + List charClasses() { return fSets; } } @@ -1846,7 +1845,7 @@ public class RBBITestMonkey extends CoreTestFmwk { @Override - List charClasses() { + List charClasses() { return fSets; } @@ -2204,7 +2203,7 @@ public class RBBITestMonkey extends CoreTestFmwk { int TESTSTRINGLEN = 500; StringBuffer testText = new StringBuffer(); int numCharClasses; - List chClasses; + List chClasses; @SuppressWarnings("unused") int expectedCount = 0; boolean[] expectedBreaks = new boolean[TESTSTRINGLEN*2 + 1]; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/shaping/DataDrivenArabicShapingRegTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/shaping/DataDrivenArabicShapingRegTest.java index 2e7beef0c0a..d7b1d87d407 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/shaping/DataDrivenArabicShapingRegTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/shaping/DataDrivenArabicShapingRegTest.java @@ -60,7 +60,7 @@ public class DataDrivenArabicShapingRegTest extends CoreTestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { String lamAlefSpecialVLTR = "\u0020\u0646\u0622\u0644\u0627\u0020\u0646\u0623\u064E\u0644\u0627\u0020" + "\u0646\u0627\u0670\u0644\u0627\u0020\u0646\u0622\u0653\u0644\u0627\u0020" + @@ -390,7 +390,7 @@ public class DataDrivenArabicShapingRegTest extends CoreTestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { {"\u0644\u0627", LETTERS_SHAPE | LENGTH_GROW_SHRINK, 1}, {"\u0644\u0627\u0031", @@ -432,16 +432,16 @@ public class DataDrivenArabicShapingRegTest extends CoreTestFmwk { public static class ErrorDataTest extends CoreTestFmwk { private String source; private int flags; - private Class error; + private Class error; - public ErrorDataTest(String source, int flags, Class error) { + public ErrorDataTest(String source, int flags, Class error) { this.source = source; this.flags = flags; this.error = error; } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { return Arrays.asList(new Object[][] { /* bad data */ {"\u0020\ufef7\u0644\u0020", LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_NEAR, diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/IDNAConformanceTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/IDNAConformanceTest.java index c263039daf0..2bb9632bcd5 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/IDNAConformanceTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/IDNAConformanceTest.java @@ -15,7 +15,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; -import java.util.Iterator; +import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -38,7 +38,7 @@ public class IDNAConformanceTest extends CoreTestFmwk { @Test public void TestConformance() { - TreeMap inputData = null; + TreeMap> inputData = null; try { inputData = ReadInput.getInputData(); @@ -50,11 +50,8 @@ public class IDNAConformanceTest extends CoreTestFmwk { return; } - Set keyMap = inputData.keySet(); - for (Iterator iter = keyMap.iterator(); iter.hasNext();) { - Long element = (Long) iter.next(); - HashMap tempHash = (HashMap) inputData.get(element); - + Set keyMap = inputData.keySet(); + for (Map tempHash : inputData.values()) { //get all attributes from input data String passfail = (String) tempHash.get("passfail"); String desc = (String) tempHash.get("desc"); @@ -244,16 +241,16 @@ public class IDNAConformanceTest extends CoreTestFmwk { */ public static class ReadInput { - public static TreeMap getInputData() throws IOException, + public static TreeMap> getInputData() throws IOException, UnsupportedEncodingException { - TreeMap result = new TreeMap(); + TreeMap> result = new TreeMap<>(); BufferedReader in = TestUtil.getDataReader("IDNATestInput.txt", "utf-8"); try { String tempStr = null; int records = 0; boolean firstLine = true; - HashMap hashItem = new HashMap(); + HashMap hashItem = new HashMap<>(); while ((tempStr = in.readLine()) != null) { //ignore the first line if it's "=====" @@ -292,9 +289,9 @@ public class IDNAConformanceTest extends CoreTestFmwk { //if met "=====", it means this item is finished if ("=====".equals(tempStr)) { //set them into result, using records number as key - result.put((long)records, hashItem); + result.put(records, hashItem); //create another hash item and continue - hashItem = new HashMap(); + hashItem = new HashMap<>(); records++; continue; } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/NamePrepTransform.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/NamePrepTransform.java index 5b662041f9d..a08f047b3cd 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/NamePrepTransform.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/stringprep/NamePrepTransform.java @@ -185,7 +185,7 @@ public class NamePrepTransform { boolean initialize(String id, String rule, int direction) { try { - Class cls = Class.forName("com.ibm.icu.text.Transliterator"); + Class cls = Class.forName("com.ibm.icu.text.Transliterator"); Method createMethod = cls.getMethod("createFromRules", String.class, String.class, Integer.TYPE); translitInstance = createMethod.invoke(null, id, rule, direction); translitMethod = cls.getMethod("transliterate", String.class); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/text/SpoofCheckerTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/text/SpoofCheckerTest.java index 9ef1eb11137..7b849976b56 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/text/SpoofCheckerTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/text/SpoofCheckerTest.java @@ -849,8 +849,8 @@ public class SpoofCheckerTest extends CoreTestFmwk { @Test public void testScriptSet() { try { - Class ScriptSet = Class.forName("com.ibm.icu.text.SpoofChecker$ScriptSet"); - Constructor ctor = ScriptSet.getDeclaredConstructor(); + Class ScriptSet = Class.forName("com.ibm.icu.text.SpoofChecker$ScriptSet"); + Constructor ctor = ScriptSet.getDeclaredConstructor(); ctor.setAccessible(true); BitSet ss = (BitSet) ctor.newInstance(); diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneAliasTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneAliasTest.java index f069e9ff0a9..9db505891e6 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneAliasTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneAliasTest.java @@ -48,8 +48,8 @@ public class TimeZoneAliasTest extends CoreTestFmwk { @Test public void TestAliases() { Zone.Seconds seconds = new Zone.Seconds(); - for (Iterator it = Zone.getZoneSet().iterator(); it.hasNext(); ) { - Zone zone = (Zone)it.next(); + for (Iterator it = Zone.getZoneSet().iterator(); it.hasNext(); ) { + Zone zone = it.next(); String id = zone.id; if (id.indexOf('/') < 0 && (id.endsWith("ST") || id.endsWith("DT"))) { if (zone.minRecentOffset != zone.maxRecentOffset) { @@ -59,14 +59,12 @@ public class TimeZoneAliasTest extends CoreTestFmwk { + " != " + Zone.formatHours(zone.maxRecentOffset)); } } - Set aliases = zone.getPurportedAliases(); - Set aliasesSet = new TreeSet(aliases); + Set aliases = zone.getPurportedAliases(); + Set aliasesSet = new TreeSet<>(aliases); aliasesSet.add(id); // for comparison - Iterator aliasIterator = aliases.iterator(); - while (aliasIterator.hasNext()) { - String otherId = (String)aliasIterator.next(); + for (String otherId : aliases) { Zone otherZone = Zone.make(otherId); - Set otherAliases = otherZone.getPurportedAliases(); + Set otherAliases = otherZone.getPurportedAliases(); otherAliases.add(otherId); // for comparison if (!aliasesSet.equals(otherAliases)) { errln( @@ -92,8 +90,7 @@ public class TimeZoneAliasTest extends CoreTestFmwk { public void TestDifferences() { Zone last = null; Zone.Seconds diffDate = new Zone.Seconds(); - for (Iterator it = Zone.getZoneSet().iterator(); it.hasNext();) { - Zone testZone = (Zone)it.next(); + for (Zone testZone : Zone.getZoneSet()) { if (last != null) { String common = testZone + "\tvs " + last + ":\t"; int diff = testZone.findOffsetOrdering(last, diffDate); @@ -115,8 +112,7 @@ public class TimeZoneAliasTest extends CoreTestFmwk { */ public static void TestGenerateZones() { int count = 1; - for (Iterator it = Zone.getUniqueZoneSet().iterator(); it.hasNext();) { - Zone zone = (Zone)it.next(); + for (Zone zone : Zone.getUniqueZoneSet()) { System.out.println(zone.toString(count++)); } } @@ -129,13 +125,13 @@ public class TimeZoneAliasTest extends CoreTestFmwk { CollectionJoiner(String separator) { this.separator = separator; } - String join(Collection c) { + String join(Collection c) { StringBuffer result = new StringBuffer(); boolean isFirst = true; - for (Iterator it = c.iterator(); it.hasNext(); ) { + for (String item : c) { if (!isFirst) result.append(separator); else isFirst = false; - result.append(it.next().toString()); + result.append(item); } return result.toString(); } @@ -152,7 +148,7 @@ public class TimeZoneAliasTest extends CoreTestFmwk { * avoid expensive comparisons. * @author Davis */ - static class Zone implements Comparable { + static class Zone implements Comparable { // class fields // static private final BagFormatter bf = new BagFormatter().setSeparator(", "); private static final CollectionJoiner bf = new CollectionJoiner(", "); @@ -169,10 +165,10 @@ public class TimeZoneAliasTest extends CoreTestFmwk { static private final long recentLimit = getDate((currentYear-1),6,1).getTime(); static private final long startDate = getDate(1905,0,1).getTime(); - static private final Map idToZone = new HashMap(); - static private final Set zoneSet = new TreeSet(); - static private final Set uniqueZoneSet = new TreeSet(); - static private final Map idToRealAliases = new HashMap(); + static private final Map idToZone = new HashMap<>(); + static private final Set zoneSet = new TreeSet<>(); + static private final Set uniqueZoneSet = new TreeSet<>(); + static private final Map> idToRealAliases = new HashMap<>(); // build everything once. static { @@ -183,8 +179,7 @@ public class TimeZoneAliasTest extends CoreTestFmwk { Zone last = null; Zone.Seconds diffDate = new Zone.Seconds(); String lastUnique = ""; - for (Iterator it = Zone.getZoneSet().iterator(); it.hasNext();) { - Zone testZone = (Zone)it.next(); + for (Zone testZone : Zone.getZoneSet()) { if (last == null) { uniqueZoneSet.add(testZone); lastUnique = testZone.id; @@ -194,9 +189,9 @@ public class TimeZoneAliasTest extends CoreTestFmwk { uniqueZoneSet.add(testZone); lastUnique = testZone.id; } else { - Set aliases = (Set)idToRealAliases.get(lastUnique); + Set aliases = idToRealAliases.get(lastUnique); if (aliases == null) { - aliases = new TreeSet(); + aliases = new TreeSet<>(); idToRealAliases.put(lastUnique, aliases); } aliases.add(testZone.id); @@ -206,16 +201,16 @@ public class TimeZoneAliasTest extends CoreTestFmwk { } } - static public Set getZoneSet() { + static public Set getZoneSet() { return zoneSet; } - public static Set getUniqueZoneSet() { + public static Set getUniqueZoneSet() { return uniqueZoneSet; } static public Zone make(String id) { - Zone result = (Zone)idToZone.get(id); + Zone result = idToZone.get(id); if (result != null) return result; result = new Zone(id); idToZone.put(id, result); @@ -344,7 +339,7 @@ public class TimeZoneAliasTest extends CoreTestFmwk { private Seconds diffDateReturn = new Seconds(); @Override - public int compareTo(Object o) { + public int compareTo(Zone o) { Zone other = (Zone)o; // first order by max and min offsets // min will usually correspond to standard time, max to daylight @@ -364,8 +359,8 @@ public class TimeZoneAliasTest extends CoreTestFmwk { return id.compareTo(other.id); } - public Set getPurportedAliases() { - return new TreeSet(purportedAliases); // clone for safety + public Set getPurportedAliases() { + return new TreeSet<>(purportedAliases); // clone for safety } public boolean isPurportedAlias(String zoneID) { @@ -377,13 +372,13 @@ public class TimeZoneAliasTest extends CoreTestFmwk { } public String getPurportedAliasesAsString() { - Set s = getPurportedAliases(); + Set s = getPurportedAliases(); if (s.size() == 0) return ""; return " " + bf.join(s); } public String getRealAliasesAsString() { - Set s = (Set)idToRealAliases.get(id); + Set s = idToRealAliases.get(id); if (s == null) return ""; return " *" + bf.join(s); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java index 7febdd27e3d..c7065e4ebea 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/timezone/TimeZoneTest.java @@ -1390,7 +1390,7 @@ public class TimeZoneTest extends CoreTestFmwk TimeZone tz = TimeZone.getTimeZone(tzid); int offset = tz.getOffset(new Date().getTime()); logln(tzid + ":\t" + offset); - List list = Arrays.asList(TimeZone.getAvailableIDs()); + List list = Arrays.asList(TimeZone.getAvailableIDs()); if(!list.contains(tzid)){ errln("Could create the time zone but it is not in getAvailableIDs"); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java index 94976a5c918..32b420996a6 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DebugUtilitiesData.java @@ -10,7 +10,7 @@ package com.ibm.icu.dev.test.util; public class DebugUtilitiesData extends Object { - public static final String ICU4C_VERSION="76.1"; + public static final String ICU4C_VERSION="77.0.1"; public static final int UDebugEnumType = 0; public static final int UCalendarDateFields = 1; public static final int UCalendarMonths = 2; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DisplayNameTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DisplayNameTest.java index 0330a7282de..a2298c3d6a6 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DisplayNameTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/DisplayNameTest.java @@ -42,9 +42,9 @@ public class DisplayNameTest extends CoreTestFmwk { public String get(ULocale locale, String code, Object context); } - Map[] codeToName = new Map[10]; + Map[] codeToName = new Map[10]; { - for (int k = 0; k < codeToName.length; ++k) codeToName[k] = new HashMap(); + for (int k = 0; k < codeToName.length; ++k) codeToName[k] = new HashMap<>(); } static final Object[] zoneFormats = {0, 1, 2, 3, 4, 5, 6, 7}; @@ -82,9 +82,9 @@ public class DisplayNameTest extends CoreTestFmwk { * @return */ private String[] getRealZoneIDs() { - Set temp = new TreeSet(Arrays.asList(TimeZone.getAvailableIDs())); + Set temp = new TreeSet<>(Arrays.asList(TimeZone.getAvailableIDs())); temp.removeAll(getAliasMap().keySet()); - return (String[])temp.toArray(new String[temp.size()]); + return temp.toArray(new String[temp.size()]); } @Ignore @@ -141,12 +141,12 @@ public class DisplayNameTest extends CoreTestFmwk { } - Map zoneData = new HashMap(); + Map> zoneData = new HashMap<>(); private String getZoneString(ULocale locale, String olsonID, int item) { - Map data = (Map)zoneData.get(locale); + Map data = zoneData.get(locale); if (data == null) { - data = new HashMap(); + data = new HashMap<>(); if (SHOW_ALL) System.out.println(); if (SHOW_ALL) System.out.println("zones for " + locale); ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale); @@ -156,7 +156,7 @@ public class DisplayNameTest extends CoreTestFmwk { //ICUResourceBundle stringSet = table.getWithFallback(String.valueOf(i)); String key = stringSet.getString(0); if (SHOW_ALL) System.out.println("key: " + key); - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); for (int j = 1; j < stringSet.getSize(); ++j) { String entry = stringSet.getString(j); if (SHOW_ALL) System.out.println(" entry: " + entry); @@ -337,8 +337,8 @@ public class DisplayNameTest extends CoreTestFmwk { ICUResourceBundle bundle = (ICUResourceBundle)UResourceBundle.getBundleInstance(locale); ICUResourceBundle table = bundle.getWithFallback(tableName); // copy into array - ArrayList stuff = new ArrayList(); - for (Enumeration keys = table.getKeys(); keys.hasMoreElements();) { + ArrayList stuff = new ArrayList<>(); + for (Enumeration keys = table.getKeys(); keys.hasMoreElements();) { stuff.add(keys.nextElement()); } String[] result = new String[stuff.size()]; @@ -359,19 +359,14 @@ public class DisplayNameTest extends CoreTestFmwk { return result; } - Map bogusZones = null; - - private Map getAliasMap() { - if (bogusZones == null) { - bogusZones = new TreeMap(); - for (int i = 0; i < zonesAliases.length; ++i) { - bogusZones.put(zonesAliases[i][0], zonesAliases[i][1]); - } + private Map getAliasMap() { + Map bogusZones = new TreeMap<>(); + for (int i = 0; i < zonesAliases.length; ++i) { + bogusZones.put(zonesAliases[i][0], zonesAliases[i][1]); } return bogusZones; } - private void check(String type, ULocale locale, String[] codes, Object[] contextList, DisplayNameGetter getter) { if (contextList == null) contextList = NO_CONTEXT; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTestSample.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTestSample.java index c81b7df4335..8e33b3b8b0e 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTestSample.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceTestSample.java @@ -10,9 +10,7 @@ package com.ibm.icu.dev.test.util; import java.text.Collator; import java.util.EventListener; -import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.SortedMap; @@ -60,13 +58,11 @@ public class ICUServiceTestSample { } private void display() { - Map names = HelloService.getDisplayNames(ULocale.US); + Map names = HelloService.getDisplayNames(ULocale.US); System.out.println("displaying " + names.size() + " names."); - Iterator iter = names.entrySet().iterator(); - while (iter.hasNext()) { - Entry entry = (Entry)iter.next(); - String displayName = (String)entry.getKey(); - HelloService service = HelloService.get((String)entry.getValue()); + for (Map.Entry entry : names.entrySet()) { + String displayName = entry.getKey(); + HelloService service = HelloService.get(entry.getValue()); System.out.println(displayName + " says " + service.hello()); try { Thread.sleep(50); @@ -184,11 +180,11 @@ public class ICUServiceTestSample { return (HelloService)registry().get(id); } - public static Set getVisibleIDs() { + public static Set getVisibleIDs() { return registry().getVisibleIDs(); } - public static Map getDisplayNames(ULocale locale) { + public static Map getDisplayNames(ULocale locale) { return getDisplayNames(registry(), locale); } @@ -210,7 +206,7 @@ public class ICUServiceTestSample { * uses the default collator for the locale as the comparator to * sort the display names, and null for the matchID. */ - public static SortedMap getDisplayNames(ICUService service, ULocale locale) { + public static SortedMap getDisplayNames(ICUService service, ULocale locale) { Collator col = Collator.getInstance(locale.toLocale()); return service.getDisplayNames(locale, col, null); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceThreadTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceThreadTest.java index 7e449e3581e..ae34d2e9d9f 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceThreadTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/ICUServiceThreadTest.java @@ -18,7 +18,6 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Map.Entry; import java.util.MissingResourceException; import java.util.Random; import java.util.Set; @@ -71,7 +70,7 @@ public class ICUServiceThreadTest extends CoreTestFmwk * uses the default collator for the locale as the comparator to * sort the display names, and null for the matchID. */ - public static SortedMap getDisplayNames(ICUService service, ULocale locale) { + public static SortedMap getDisplayNames(ICUService service, ULocale locale) { Collator col; try { col = Collator.getInstance(locale.toLocale()); @@ -206,7 +205,7 @@ public class ICUServiceThreadTest extends CoreTestFmwk static class UnregisterFactoryThread extends TestThread { private Random r; - List factories; + List factories; UnregisterFactoryThread(String name, ICUService service, long delay) { super("UNREG " + name, service, delay); @@ -257,11 +256,11 @@ public class ICUServiceThreadTest extends CoreTestFmwk @Override protected void iterate() { - Set ids = service.getVisibleIDs(); - Iterator iter = ids.iterator(); + Set ids = service.getVisibleIDs(); + Iterator iter = ids.iterator(); int n = 10; while (--n >= 0 && iter.hasNext()) { - String id = (String)iter.next(); + String id = iter.next(); Object result = service.get(id); TestFmwk.logln("iter: " + n + " id: " + id + " result: " + result); } @@ -279,11 +278,11 @@ public class ICUServiceThreadTest extends CoreTestFmwk @Override protected void iterate() { - Map names = getDisplayNames(service,locale); - Iterator iter = names.entrySet().iterator(); + Map names = getDisplayNames(service,locale); + Iterator> iter = names.entrySet().iterator(); int n = 10; while (--n >= 0 && iter.hasNext()) { - Entry e = (Entry)iter.next(); + Map.Entry e = iter.next(); String dname = (String)e.getKey(); String id = (String)e.getValue(); Object result = service.get(id); @@ -342,23 +341,22 @@ public class ICUServiceThreadTest extends CoreTestFmwk } // return a collection of unique factories, might be fewer than requested - Collection getFactoryCollection(int requested) { - Set locales = new HashSet(); + Collection getFactoryCollection(int requested) { + Set locales = new HashSet<>(); for (int i = 0; i < requested; ++i) { locales.add(getCLV()); } - List factories = new ArrayList(locales.size()); - Iterator iter = locales.iterator(); - while (iter.hasNext()) { - factories.add(new TestFactory((String)iter.next())); + List factories = new ArrayList<>(locales.size()); + Iterator iter = locales.iterator(); + for (String locale : locales) { + factories.add(new TestFactory(locale)); } return factories; } - void registerFactories(ICUService service, Collection c) { - Iterator iter = c.iterator(); - while (iter.hasNext()) { - service.registerFactory((Factory)iter.next()); + void registerFactories(ICUService service, Collection c) { + for (Factory factory : c) { + service.registerFactory(factory); } } @@ -429,13 +427,13 @@ public class ICUServiceThreadTest extends CoreTestFmwk ICUService service = new ICULocaleService(); if (PRINTSTATS) service.stats(); // Enable the stats collection - Collection fc = getFactoryCollection(50); + Collection fc = getFactoryCollection(50); registerFactories(service, fc); - Factory[] factories = (Factory[])fc.toArray(new Factory[fc.size()]); - Comparator comp = new Comparator() { + Factory[] factories = fc.toArray(new Factory[fc.size()]); + Comparator comp = new Comparator() { @Override - public int compare(Object lhs, Object rhs) { + public int compare(Factory lhs, Factory rhs) { return lhs.toString().compareTo(rhs.toString()); } }; diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/RegionTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/RegionTest.java index 579b9d9fc58..f1058a67c83 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/RegionTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/RegionTest.java @@ -13,6 +13,7 @@ package com.ibm.icu.dev.test.util; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; @@ -611,7 +612,7 @@ public class RegionTest extends CoreTestFmwk { try { Region grouping = Region.getInstance(groupingCode); Set actualChildren = grouping.getContainedRegions(); - List actualChildIDs = new java.util.ArrayList(); + List actualChildIDs = new ArrayList<>(); for (Region childRegion : actualChildren) { actualChildIDs.add(childRegion.toString()); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TestLocaleValidity.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TestLocaleValidity.java index 2142a1537ec..5d8ae0f0e66 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TestLocaleValidity.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TestLocaleValidity.java @@ -12,7 +12,6 @@ import java.util.Collections; import java.util.EnumSet; import java.util.LinkedHashSet; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import org.junit.Test; @@ -187,7 +186,7 @@ public class TestLocaleValidity extends CoreTestFmwk { final LinkedHashSet foundKeys = new LinkedHashSet(); check(tests, foundKeys, Datasubtype.regular, Datasubtype.unknown); - LinkedHashSet missing = new LinkedHashSet(KeyTypeData.getBcp47Keys()); + LinkedHashSet missing = new LinkedHashSet<>(KeyTypeData.getBcp47Keys()); missing.removeAll(foundKeys); if (!assertEquals("Missing keys", Collections.EMPTY_SET, missing)) { // print out template for missing cases for adding @@ -313,9 +312,9 @@ public class TestLocaleValidity extends CoreTestFmwk { private static void showAll() { Map> data = ValidIdentifiers.getData(); - for (Entry> e1 : data.entrySet()) { + for (Map.Entry> e1 : data.entrySet()) { System.out.println(e1.getKey()); - for (Entry e2 : e1.getValue().entrySet()) { + for (Map.Entry e2 : e1.getValue().entrySet()) { System.out.println("\t" + e2.getKey()); System.out.println("\t\t" + e2.getValue()); } diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TextTrieMapTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TextTrieMapTest.java index 422edb65706..a360957e54f 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TextTrieMapTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/TextTrieMapTest.java @@ -87,8 +87,8 @@ public class TextTrieMapTest extends CoreTestFmwk { @Test public void TestCaseSensitive() { - Iterator itr = null; - TextTrieMap map = new TextTrieMap(false); + Iterator itr = null; + TextTrieMap map = new TextTrieMap<>(false); for (int i = 0; i < TESTDATA.length; i++) { map.put((String)TESTDATA[i][0], TESTDATA[i][1]); } @@ -147,8 +147,8 @@ public class TextTrieMapTest extends CoreTestFmwk { @Test public void TestCaseInsensitive() { - Iterator itr = null; - TextTrieMap map = new TextTrieMap(true); + Iterator itr = null; + TextTrieMap map = new TextTrieMap<>(true); for (int i = 0; i < TESTDATA.length; i++) { map.put((String)TESTDATA[i][0], TESTDATA[i][1]); } @@ -214,7 +214,7 @@ public class TextTrieMapTest extends CoreTestFmwk { return o1.equals(o2); } - private void checkResult(String memo, Iterator itr, Object expected) { + private void checkResult(String memo, Iterator itr, Object expected) { if (itr == null) { if (expected != null) { String expectedStr = (expected instanceof Object[]) diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/UtilityTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/UtilityTest.java index cb27835b127..dd3432fde65 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/UtilityTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/util/UtilityTest.java @@ -195,8 +195,8 @@ public class UtilityTest extends CoreTestFmwk { @Test public void TestUnicodeSet(){ String[] array = new String[]{"a", "b", "c", "{de}"}; - List list = Arrays.asList(array); - Set aset = new HashSet(list); + List list = Arrays.asList(array); + Set aset = new HashSet<>(list); logln(" *** The source set's size is: " + aset.size()); //The size reads 4 UnicodeSet set = new UnicodeSet(); diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/cldr/localeIdentifiers/likelySubtags.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/cldr/localeIdentifiers/likelySubtags.txt index d7f06199e44..aca47b1a577 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/cldr/localeIdentifiers/likelySubtags.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/cldr/localeIdentifiers/likelySubtags.txt @@ -1441,7 +1441,7 @@ und-Latn-MQ ; fr-Latn-MQ ; fr-MQ ; und-Latn-MR ; fr-Latn-MR ; fr-MR ; und-Latn-MS ; en-Latn-MS ; en-MS ; und-Latn-MT ; mt-Latn-MT ; mt ; -und-Latn-MU ; en-Latn-MU ; en-MU ; +und-Latn-MU ; mfe-Latn-MU ; mfe ; und-Latn-MV ; en-Latn-MV ; en-MV ; und-Latn-MW ; en-Latn-MW ; en-MW ; und-Latn-MX ; es-Latn-MX ; es-MX ; @@ -1484,7 +1484,7 @@ und-Latn-SH ; en-Latn-SH ; en-SH ; und-Latn-SI ; sl-Latn-SI ; sl ; und-Latn-SJ ; nb-Latn-SJ ; nb-SJ ; und-Latn-SK ; sk-Latn-SK ; sk ; -und-Latn-SL ; en-Latn-SL ; en-SL ; +und-Latn-SL ; kri-Latn-SL ; kri ; und-Latn-SM ; it-Latn-SM ; it-SM ; und-Latn-SN ; fr-Latn-SN ; fr-SN ; und-Latn-SO ; so-Latn-SO ; so ; @@ -1498,7 +1498,7 @@ und-Latn-SZ ; en-Latn-SZ ; en-SZ ; und-Latn-TC ; en-Latn-TC ; en-TC ; und-Latn-TD ; fr-Latn-TD ; fr-TD ; und-Latn-TG ; fr-Latn-TG ; fr-TG ; -und-Latn-TK ; en-Latn-TK ; en-TK ; +und-Latn-TK ; tkl-Latn-TK ; tkl ; und-Latn-TL ; pt-Latn-TL ; pt-TL ; und-Latn-TM ; tk-Latn-TM ; tk ; und-Latn-TN ; fr-Latn-TN ; fr-TN ; @@ -1524,7 +1524,7 @@ und-Latn-WS ; sm-Latn-WS ; sm ; und-Latn-XK ; sq-Latn-XK ; sq-XK ; und-Latn-YT ; fr-Latn-YT ; fr-YT ; und-Latn-ZA ; en-Latn-ZA ; en-ZA ; -und-Latn-ZM ; en-Latn-ZM ; en-ZM ; +und-Latn-ZM ; bem-Latn-ZM ; bem ; und-Latn-ZW ; sn-Latn-ZW ; sn ; und-MA ; ar-Arab-MA ; ar-MA ; und-MC ; fr-Latn-MC ; fr-MC ; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/cldr/units/unitsTest.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/cldr/units/unitsTest.txt index 8999a44f8d9..c2d8dbb9672 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/cldr/units/unitsTest.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/cldr/units/unitsTest.txt @@ -151,6 +151,7 @@ mass ; ton ; kilogram ; 907.18474 * x ; 907184.7 mass ; tonne ; kilogram ; 1,000 * x ; 1000000.0 mass ; earth-mass ; kilogram ; 5,972,200,000,000,000,000,000,000 * x ; 5.9722E27 mass ; solar-mass ; kilogram ; 1,988,470,000,000,000,000,000,000,000,000 * x ; 1.98847E33 +night-duration ; night ; night ; 1 * x ; 1,000.00 portion ; permillion ; portion ; 0.000001 * x ; 0.001 portion ; permyriad ; portion ; 0.0001 * x ; 0.1 portion ; permille ; portion ; 0.001 * x ; 1.0 @@ -187,6 +188,7 @@ speed ; kilometer-per-hour ; meter-per-second ; 2.5/9 * x ; 277.7778 speed ; mile-per-hour ; meter-per-second ; 0.44704 * x ; 447.04 speed ; knot ; meter-per-second ; 4.63/9 * x ; 514.4444 speed ; meter-per-second ; meter-per-second ; 1 * x ; 1,000.00 +speed ; light-speed ; meter-per-second ; 299,792,458 * x ; 2.997925E11 substance-amount ; item ; item ; 1 * x ; 1,000.00 substance-amount ; mole ; item ; 602,214,076,000,000,000,000,000 * x ; 6.022141E26 temperature ; rankine ; kelvin ; 5/9 * x ; 555.5556 diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/testdata/structLocale.res b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/testdata/structLocale.res index aebb0a3975a..7a044487ba3 100644 Binary files a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/testdata/structLocale.res and b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/data/testdata/structLocale.res differ diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/README.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/README.txt new file mode 100644 index 00000000000..b803ebc0425 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/README.txt @@ -0,0 +1,43 @@ +© 2024 and later: Unicode, Inc. and others. +License & terms of use: http://www.unicode.org/copyright.html + +The format of the JSON files in this directory and subdirectories +follow the test schema defined in the Conformance repository: + +https://github.com/unicode-org/conformance/blob/main/schema/message_fmt2/testgen_schema.json + +(as of https://github.com/unicode-org/conformance/pull/255 or later). + +# JSON notes + +In the "params" field, a date parameter can be expressed as: +{ "date": n } +where n is a number representing a Unix timestamp. + +In the "params" field, a decimal string parameter can be expressed as: +{ "decimal": s } +where s is a string. + +Optional fields, "ignoreJava" and "ignoreCpp" can be used +for tests currently expected to fail in the respective language. +The field may have any value; if it's +present, the test is ignored. (The value can be a comment explaining +why it's expected to fail.) + +Tests in the `spec/` subdirectory are taken from https://github.com/unicode-org/message-format-wg/blob/main/test . +If the contents change upstream, then the corresponding tests in CLDR +need to be updated (also see https://unicode-org.atlassian.net/browse/ICU-22812 ). + +## ICU4J only + +The `cleanSrc` fields is used to represent normalized input (ICU4C has its +own function for normalizing input). + +## ICU4C only + +Additional "char" and "line" fields may be present with integer values, +used for tests expected to trigger a syntax error. +If present, "char" reflects the expected character offset and "line" +reflects the expected line number in the parse error. +The files with "diagnostics" in the name have these fields filled in. + diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/alias-selector-annotations.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/alias-selector-annotations.json new file mode 100644 index 00000000000..c064d40d4c8 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/alias-selector-annotations.json @@ -0,0 +1,18 @@ +{ + "scenario": "Selector annotations", + "description": "Tests for indirectly annotated selectors", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": ".local $one = {|The one| :string}\n .match {$one}\n 1 {{Value is one}}\n * {{Value is not one}}", + "exp": "Value is not one" + }, + { + "src": ".local $one = {|The one| :string}\n .local $two = {$one}\n .match {$two}\n 1 {{Value is one}}\n * {{Value is not one}}", + "exp": "Value is not one" + } + ] +} + diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/duplicate-declarations.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/duplicate-declarations.json new file mode 100644 index 00000000000..cd3acc1576d --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/duplicate-declarations.json @@ -0,0 +1,43 @@ +{ + "scenario": "Duplicate declaration errors", + "description": "Tests that should trigger a duplicate declaration error", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + "tests": [ + { + "src": ".local $foo = {$foo} .local $foo = {42} {{bar {$foo}}}", + "params": [{ "name": "foo", "value": "foo" }], + "exp": "bar 42" + }, + { + "src": ".local $foo = {42} .local $foo = {42} {{bar {$foo}}}", + "params": [{ "name": "foo", "value": "foo" }], + "exp": "bar 42" + }, + { + "src": ".local $foo = {:unknown} .local $foo = {42} {{bar {$foo}}}", + "params": [{ "name": "foo", "value": "foo" }], + "exp": "bar 42" + }, + { + "src": ".local $x = {42} .local $y = {$x} .local $x = {13} {{{$x} {$y}}}", + "exp": "13 42" + }, + { + "src": ".local $foo = {$foo} {{bar {$foo}}}", + "params": [{ "name": "foo", "value": "foo" }], + "exp": "bar foo" + }, + { + "src": ".local $foo = {$bar} .local $bar = {$baz} {{bar {$foo}}}", + "params": [{ "name": "baz", "value": "foo" }], + "exp": "bar {$bar}" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-parser-tests.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-parser-tests.json new file mode 100644 index 00000000000..0eb54b26651 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-parser-tests.json @@ -0,0 +1,57 @@ +{ + "scenario": "Valid tests", + "description": "Additional valid tests", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { "src": "" }, + { "src": "Hello" }, + { "src": "Hello world!" }, + { "src": "Hello \t \n \r \\{ world!" }, + { "src": "Hello world {:datetime}" }, + { "src": "Hello world {foo}" }, + { "src": "Hello {0} world" }, + { "src": "Hello {123} world" }, + { "src": "Hello {-123} world" }, + { "src": "Hello {3.1416} world" }, + { "src": "Hello {-3.1416} world" }, + { "src": "Hello {123E+2} world" }, + { "src": "Hello {123E-2} world" }, + { "src": "Hello {123.456E+2} world" }, + { "src": "Hello {123.456E-2} world" }, + { "src": "Hello {-123.456E+2} world" }, + { "src": "Hello {-123.456E-2} world" }, + { "src": "Hello {-123E+2} world" }, + { "src": "Hello {-123E-2} world" }, + { "src": "Hello world {$exp}" }, + { "src": "Hello world {$exp :datetime}" }, + { "src": "Hello world {|2024-02-27| :datetime}" }, + { "src": "Hello world {$exp :datetime style=long} and more" }, + { "src": "Hello world {$exp :function number=1234} and more" }, + { "src": "Hello world {$exp :function unquoted=left } and more" }, + { "src": "Hello world {$exp :function quoted=|Something| } and more" }, + { "src": "Hello world {$exp :function quoted=|Something with spaces| } and more" }, + { "src": "Hello world {$exp :function quoted=|Something with \\| spaces and \\| escapes| } and more" }, + { "src": "Hello world {$exp :function number=1234 unquoted=left quoted=|Something|}" }, + { "src": "Hello world {$exp :function number=1234 unquoted=left quoted=|Something longer|}" }, + { "src": "Hello world {$exp :function number=1234 unquoted=left quoted=|Something \\| longer|}" }, + { "src": "Hello world {$exp}" }, + { "src": "Hello world {$exp @attr}" }, + { "src": "Hello world {$exp @valid @attr=a @attrb=123 @atrn=|foo bar|}" }, + { "src": "Hello world {$exp :date @valid @attr=aaaa @attrb=123 @atrn=|foo bar|}" }, + { "src": "Hello world {$exp :date year=numeric month=long day=numeric int=12 @valid @attr=a @attrb=123 @atrn=|foo bar|}" }, + { "src": "{{.starting with dot is OK here}}" }, + { "src": "{{Some string pattern \\}, with {$foo} and {$exp :date style=long}!}}" }, + { "src": ".input {$pi :number} {{}}" }, + { "src": ".input {$exp :date} {{}}" }, + { "src": ".local $foo = {$exp} {{}}" }, + { "src": ".local $foo = {$exp :date} {{}}" }, + { "src": ".local $foo = {$exp :date year=numeric month=long day=numeric} {{}}" }, + { "src": ".local $bar = {$foo :date month=medium} {{}}" }, + { "src": ".input {$a :date} .local $exp = {$a :date style=full} {{Your card expires on {$exp}!}}" }, + { "src": ".input {$a :date} .local $b = {$a :date year=numeric month=long day=numeric} .local $c = {$b :date month=medium} {{}}" }, + { "src": ".input {$x :number} {{_}}" }, + { "src": ".local $foo = {|1|} {{_}}" } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-functions.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-functions.json new file mode 100644 index 00000000000..a97446addf0 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-functions.json @@ -0,0 +1,221 @@ +{ + "scenario": "Function tests", + "description": "Tests for ICU-specific formatting behavior.", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": "Expires on {$exp}", + "exp": "Expires on 8/3/24, 9:43 PM", + "comment": "Modified from ICU4J copy to add params (likewise with the other date/time tests); 1722746637000 is 2024-08-03 21:43:57 PDT", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime}", + "exp": "Expires on 8/3/24, 9:43 PM", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime icu:skeleton=yMMMMdjmsSSEE}", + "exp": "Expires on Sat, August 3, 2024 at 9:43:57.00 PM", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }], + "ignoreCpp": "ICU-22754 Skeleton option not implemented yet" + }, + { + "src": "Expires on {$exp :datetime dateStyle=full}", + "exp": "Expires on Saturday, August 3, 2024", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime dateStyle=long}", + "exp": "Expires on August 3, 2024", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime dateStyle=medium}", + "exp": "Expires on Aug 3, 2024", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime timeStyle=long}", + "exp": "Expires on 9:43:57 PM PDT", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime timeStyle=medium}", + "exp": "Expires on 9:43:57 PM", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime timeStyle=short}", + "exp": "Expires on 9:43 PM", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime dateStyle=full timeStyle=medium}", + "exp": "Expires on Saturday, August 3, 2024 at 9:43:57 PM", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime year=numeric month=long}", + "exp": "Expires on August 2024", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {$exp :datetime year=numeric month=medium day=numeric weekday=long hour=numeric minute=numeric}", + "exp": "Expires on 3 Saturday 2024, 9:43 PM", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "comment": "Make sure we ignore date / time fields if needed", + "src": "Expires on {$exp :date year=numeric month=medium day=numeric weekday=long hour=numeric minute=numeric}", + "exp": "Expires on 3 Saturday 2024", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }], + "ignoreCpp": "ICU-22754 ICU4C doesn't accept field options for `:date` or `:time` -- see spec" + }, + { + "comment": "Make sure we ignore date / time fields if needed", + "src": "Expires at {$exp :time year=numeric month=medium day=numeric weekday=long hour=numeric minute=numeric}", + "exp": "Expires at 9:43 PM", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }], + "ignoreCpp": "ICU-22754 ICU4C doesn't accept field options for `:date` or `:time` -- see spec" + }, + { + "comment": "Make sure we ignore date / time fields if needed", + "src": "Expires at {$exp :time style=long dateStyle=full timeStyle=medium}", + "exp": "Expires at 9:43:57 PM PDT", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "comment": "Make sure we ignore date / time fields if needed", + "src": "Expires on {$exp :date style=long dateStyle=full timeStyle=medium}", + "exp": "Expires on August 3, 2024", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Expires on {|2025-02-27| :datetime dateStyle=full}", + "exp": "Expires on Thursday, February 27, 2025" + }, + { + "src": "Expires at {|2024-07-02T19:23:45| :datetime timeStyle=full}", + "exp": "Expires at 7:23:45 PM Pacific Daylight Time" + }, + { + "src": "Expires at {|2024-07-02T19:23:45.123| :datetime timeStyle=full}", + "exp": "Expires at 7:23:45 PM Pacific Daylight Time" + }, + { + "src": "Expires on {|2025-02-27T19:23:45| :datetime dateStyle=full}", + "exp": "Expires on Thursday, February 27, 2025" + }, + { + "src": "Expires at {|2024-07-02T19:23:45Z| :datetime timeStyle=long}", + "exp": "Expires at 7:23:45 PM GMT", + "ignoreCpp": "ICU-22754 Time zones not working yet (bug)" + }, + { + "src": "Expires at {|2024-07-02T19:23:45+03:30| :datetime timeStyle=full}", + "exp": "Expires at 7:23:45 PM GMT+03:30", + "ignoreCpp": "ICU-22754 Time zones not working yet (bug)" + }, + { + "comment": "Horibly long, but I really wanted to test multiple declarations with overrides, and you can't join strings in JSON", + "src": [ + ".input {$exp :datetime timeStyle=short}\n", + ".input {$user :string}\n", + ".local $longExp = {$exp :datetime dateStyle=long}\n", + ".local $zooExp = {$exp :datetime dateStyle=short timeStyle=$tsOver}\n", + "{{Hello John, you want '{$exp}', '{$longExp}', or '{$zooExp}' or even '{$exp :datetime dateStyle=full}'?}}" + ], + "exp": "Hello John, you want '9:43 PM', 'August 3, 2024 at 9:43 PM', or '8/3/24, 9:43:57 PM Pacific Daylight Time' or even 'Saturday, August 3, 2024 at 9:43 PM'?", + "params": [{"name": "exp", "value": { "date": 1722746637000 }}, + {"name": "user", "value": "John"}, + {"name": "tsOver", "value": "full" }], + "ignoreCpp": "ICU-22754 ICU4C doesn't implement this kind of function composition yet. See https://github.com/unicode-org/message-format-wg/issues/515" + }, + { + "src": [ + ".input {$exp :datetime year=numeric month=numeric day=|2-digit|}\n", + ".local $longExp = {$exp :datetime month=long weekday=long}\n", + "{{Expires on '{$exp}' ('{$longExp}').}}" + ], + "exp": "Expires on '8/03/2024' ('Saturday, August 03, 2024').", + "params": [{ "name": "exp", "value": { "date": 1722746637000 } }] + }, + { + "src": "Format {$val} number", + "params": [{ "name": "val", "value": 31 }], + "exp": "Format 31 number" + }, + { + "src": "Format {123456789.9876} number", + "locale": "en-IN", + "exp": "Format 123456789.9876 number", + "comment": "Number literals are not formatted as numbers by default" + }, + { + "src": "Format {|3.1416|} number", + "locale": "ar-AR-u-nu-latn", + "exp": "Format 3.1416 number" + }, + { + "src": "Format {|3.1416|} number", + "locale": "ar-AR-u-nu-arab", + "exp": "Format 3.1416 number", + "comment": "Number literals are not formatted as numbers by default" + }, + { + "src": "Format {3.1415926 :number}", + "exp": "Format 3.141593" + }, + { + "src": "Format {3.1415926 :number maximumFractionDigits=4}", + "exp": "Format 3.1416" + }, + { + "src": "Format {3 :number minimumFractionDigits=2}", + "exp": "Format 3.00" + }, + { + "src": "Format {3.2 :number minimumFractionDigits=2}", + "exp": "Format 3.20" + }, + { + "src": "Format {123456789.97531 :number maximumSignificantDigits=4}", + "exp": "Format 123,500,000" + }, + { + "src": "Format {3.1415926 :number}", + "exp": "Format 3.141593" + }, + { + "src": "Numbering system {123456 :number numberingSystem=deva}", + "exp": "Numbering system १२३,४५६" + }, + { + "src": "Percent {0.1416 :number style=percent}", + "exp": "Percent 14.16%" + }, + { + "src": "Scientific {123456789.97531 :number notation=scientific}", + "exp": "Scientific 1.234568E8" + }, + { + "src": "Engineering {123456789.97531 :number notation=engineering}", + "exp": "Engineering 123.45679E6" + }, + { + "src": "Compact {123456789.97531 :number notation=compact}", + "exp": "Compact 123M" + }, + { + "src": "Compact {123456789.97531 :number notation=compact compactDisplay=long}", + "exp": "Compact 123 million" + }, + { + "src": "Compact {123456789.97531 :number notation=compact compactDisplay=short}", + "exp": "Compact 123M" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-previous-release.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-previous-release.json new file mode 100644 index 00000000000..0a1e27dff6e --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-previous-release.json @@ -0,0 +1,139 @@ +{ + "scenario": "Tests from original ICU4J release", + "description": "Tests taken from the September 2022 MF2 ICU4J release", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": "hello {|4.2| :number}", + "exp": "hello 4.2" + }, + { + "locale": "ar-EG", + "src": "hello {|4.2| :number}", + "exp": "hello \u0664\u066B\u0662" + }, + { + "comment": "This is not an error! foo is not used before the local declaration, so the local declaration of $foo shadows the input variable.", + "src": ".local $foo = {bar} {{bar {$foo}}}", + "exp": "bar bar", + "params": [{ "name": "foo", "value": "foo" }] + }, + { + "src": ".local $foo = {$bar :number} {{bar {$foo}}}", + "params": [{ "name": "bar", "value": 4.2 }], + "exp": "bar 4.2" + }, + { + "src": ".local $bar = {$baz} .local $foo = {$bar} {{bar {$foo}}}", + "params": [{ "name": "baz", "value": "foo" }], + "exp": "bar foo" + }, + { + "src": ".match {$foo :number} 1 {{one}} * {{other}}", + "params": [{ "name": "foo", "value": "1" }], + "exp": "one", + "ignoreJava": "See ICU-22809" + }, + { + "src": ".match {$foo :string} 1 {{one}} * {{other}}", + "params": [{ "name": "foo", "value": "1" }], + "exp": "one" + }, + { + "src": ".match {$foo :number} 1 {{one}} * {{other}}", + "params": [{ "name": "foo", "value": 1 }], + "exp": "one" + }, + { + "ignoreJava": "Can't pass null in a map", + "ignoreCpp": "Same as Java", + "src": ".match {$foo} 1 {{one}} * {{other}}", + "params": [{ "name": "foo", "value": null }], + "exp": "other" + }, + { + "src": ".match {$foo :number} 1 {{one}} * {{other}}", + "exp": "other", + "expErrors": [{ "type": "unresolved-variable" }] + }, + { + "src": ".local $foo = {$bar} .match {$foo :number} one {{one}} * {{other}}", + "params": [{ "name": "bar", "value": 1 }], + "exp": "one" + }, + { + "src": ".local $foo = {$bar} .match {$foo :number} one {{one}} * {{other}}", + "params": [{ "name": "bar", "value": 2 }], + "exp": "other" + }, + { + "src": ".local $bar = {$none} .match {$foo :number} one {{one}} * {{{$bar}}}", + "params": [{ "name": "foo", "value": 1 }, {"name": "none", "value": "" }], + "exp": "one" + }, + { + "src": ".local $bar = {$none :number} .match {$foo :string} one {{one}} * {{{$bar}}}", + "params": [{ "name": "foo", "value": 2 }], + "exp": "{$none}", + "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{{#tag}}", + "exp": "#tag" + }, + { + "src": "{#tag}content{/tag}", + "exp": "content" + }, + { + "src": "{#tag foo=foo bar=$bar}", + "params": [{ "name": "bar", "value": "b a r" }], + "exp": "" + }, + { + "src": "bad {#markup/} test", + "exp": "bad test" + }, + { + "src": "no braces {$foo}", + "params": [{ "name": "foo", "value": 2 }], + "exp": "no braces 2" + }, + { + "src": "empty { }", + "exp": "empty ", + "expErrors": [{ "type": "syntax-error" }], + "ignoreCpp": "Fallback is unclear. See https://github.com/unicode-org/message-format-wg/issues/703" + }, + { + "src": "bad {:}", + "exp": "bad {:}", + "expErrors": [{ "type": "syntax-error" }, { "type": "unknown-function" }] + }, + { + "src": "{bad {$placeholder option}}", + "exp": "bad {$placeholder}", + "expErrors": [{ "type": "syntax-error"}, { "type": "unresolved-variable" }], + "ignoreCpp": "Fallback is unclear. See https://github.com/unicode-org/message-format-wg/issues/703" + }, + { + "src": ".match {|foo| :string} *{{foo}}", + "exp": "foo" + }, + { + "src": ".match {$foo :string} * * {{foo}}", + "exp": "foo", + "expErrors": [{ "type": "variant-key-mismatch" }, { "type": "unresolved-variable" }], + "ignoreCpp": "Fallback is unclear. See https://github.com/unicode-org/message-format-wg/issues/735" + }, + { + "src": ".match {$foo :string} {$bar :string} * {{foo}}", + "exp": "foo", + "expErrors": [{ "type": "variant-key-mismatch" }, { "type": "unresolved-variable" }], + "ignoreCpp": "Fallback is unclear. See https://github.com/unicode-org/message-format-wg/issues/735" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-selectors.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-selectors.json new file mode 100644 index 00000000000..102bdfd88f5 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/icu-test-selectors.json @@ -0,0 +1,372 @@ +{ + "scenario": "Match tests", + "description": "Tests for various match constructs", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "comment": "Testing simple plural", + "src": [ + ".match {$count :number}\n", + "one {{{$count} file}}\n", + " * {{{$count} files}}" + ], + "params": [{"name": "count", "value": 0}], + "exp": "0 files" + }, + { + "comment": "Testing simple plural", + "src": [ + ".match {$count :number}\n", + "one {{{$count} file}}\n", + " * {{{$count} files}}" + ], + "params": [{"name": "count", "value": 1}], + "exp": "1 file" + }, + { + "comment": "Testing simple plural", + "src": [ + ".match {$count :number}\n", + "one {{{$count} file}}\n", + " * {{{$count} files}}" + ], + "params": [{"name": "count", "value": 3}], + "exp": "3 files" + }, + { + "comment": "Testing simple plural", + "locale": "fr", + "src": [ + ".match {$count :number}\n", + "one {{{$count} file}}\n", + " * {{{$count} files}}" + ], + "params": [{"name": "count", "value": 0}], + "exp": "0 file" + }, + { + "comment": "Testing simple plural", + "locale": "fr", + "src": [ + ".match {$count :number}\n", + "one {{{$count} file}}\n", + " * {{{$count} files}}" + ], + "params": [{"name": "count", "value": 1}], + "exp": "1 file" + }, + { + "comment": "Testing simple plural", + "locale": "fr", + "src": [ + ".match {$count :number}\n", + "one {{{$count} file}}\n", + " * {{{$count} files}}" + ], + "params": [{"name": "count", "value": 3}], + "exp": "3 files" + }, + { + "comment": "Testing simple plural, but swap variant order", + "src": [ + ".match {$count :number}\n", + " * {{You deleted {$count} files}}\n", + "one {{You deleted {$count} file}}" + ], + "params": [{"name": "count", "value": 1}], + "exp": "You deleted 1 file" + }, + { + "comment": "Testing simple plural, but swap variant order", + "src": [ + ".match {$count :number}\n", + " * {{You deleted {$count} files}}\n", + "one {{You deleted {$count} file}}" + ], + "params": [{"name": "count", "value": 3}], + "exp": "You deleted 3 files" + }, + { + "comment": "Ordinal, with mixed order and exact matches", + "src": [ + ".match {$place :number select=ordinal}\n", + "* {{You finished in the {$place}th place}}\n", + "two {{You finished in the {$place}nd place}}\n", + "one {{You finished in the {$place}st place}}\n", + "1 {{You got the gold medal}}\n", + "2 {{You got the silver medal}}\n", + "3 {{You got the bronze medal}}\n", + "few {{You finished in the {$place}rd place}}" + ], + "params": [{"name": "place", "value": 1}], + "exp": "You got the gold medal" + }, + { + "comment": "Ordinal, with mixed order and exact matches", + "src": [ + ".match {$place :number select=ordinal}\n", + "* {{You finished in the {$place}th place}}\n", + "two {{You finished in the {$place}nd place}}\n", + "one {{You finished in the {$place}st place}}\n", + "1 {{You got the gold medal}}\n", + "2 {{You got the silver medal}}\n", + "3 {{You got the bronze medal}}\n", + "few {{You finished in the {$place}rd place}}" + ], + "params": [{"name": "place", "value": 2}], + "exp": "You got the silver medal" + }, + { + "comment": "Ordinal, with mixed order and exact matches", + "src": [ + ".match {$place :number select=ordinal}\n", + "* {{You finished in the {$place}th place}}\n", + "two {{You finished in the {$place}nd place}}\n", + "one {{You finished in the {$place}st place}}\n", + "1 {{You got the gold medal}}\n", + "2 {{You got the silver medal}}\n", + "3 {{You got the bronze medal}}\n", + "few {{You finished in the {$place}rd place}}" + ], + "params": [{"name": "place", "value": 3}], + "exp": "You got the bronze medal" + }, + { + "comment": "Ordinal, with mixed order and exact matches", + "src": [ + ".match {$place :number select=ordinal}\n", + "* {{You finished in the {$place}th place}}\n", + "two {{You finished in the {$place}nd place}}\n", + "one {{You finished in the {$place}st place}}\n", + "1 {{You got the gold medal}}\n", + "2 {{You got the silver medal}}\n", + "3 {{You got the bronze medal}}\n", + "few {{You finished in the {$place}rd place}}" + ], + "params": [{"name": "place", "value": 7}], + "exp": "You finished in the 7th place" + }, + { + "comment": "Ordinal, with mixed order and exact matches", + "src": [ + ".match {$place :number select=ordinal}\n", + "* {{You finished in the {$place}th place}}\n", + "two {{You finished in the {$place}nd place}}\n", + "one {{You finished in the {$place}st place}}\n", + "1 {{You got the gold medal}}\n", + "2 {{You got the silver medal}}\n", + "3 {{You got the bronze medal}}\n", + "few {{You finished in the {$place}rd place}}" + ], + "params": [{"name": "place", "value": 21}], + "exp": "You finished in the 21st place" + }, + { + "comment": "Ordinal, with mixed order and exact matches", + "src": [ + ".match {$place :number select=ordinal}\n", + "* {{You finished in the {$place}th place}}\n", + "two {{You finished in the {$place}nd place}}\n", + "one {{You finished in the {$place}st place}}\n", + "1 {{You got the gold medal}}\n", + "2 {{You got the silver medal}}\n", + "3 {{You got the bronze medal}}\n", + "few {{You finished in the {$place}rd place}}" + ], + "params": [{"name": "place", "value": 22}], + "exp": "You finished in the 22nd place" + }, + { + "comment": "Ordinal, with mixed order and exact matches", + "src": [ + ".match {$place :number select=ordinal}\n", + "* {{You finished in the {$place}th place}}\n", + "two {{You finished in the {$place}nd place}}\n", + "one {{You finished in the {$place}st place}}\n", + "1 {{You got the gold medal}}\n", + "2 {{You got the silver medal}}\n", + "3 {{You got the bronze medal}}\n", + "few {{You finished in the {$place}rd place}}" + ], + "params": [{"name": "place", "value": 23}], + "exp": "You finished in the 23rd place" + }, + { + "comment": "Ordinal, with mixed order and exact matches", + "src": [ + ".match {$place :number select=ordinal}\n", + "* {{You finished in the {$place}th place}}\n", + "two {{You finished in the {$place}nd place}}\n", + "one {{You finished in the {$place}st place}}\n", + "1 {{You got the gold medal}}\n", + "2 {{You got the silver medal}}\n", + "3 {{You got the bronze medal}}\n", + "few {{You finished in the {$place}rd place}}" + ], + "params": [{"name": "place", "value": 28}], + "exp": "You finished in the 28th place" + }, + { + "comment": "Plural combinations, mixed order", + "src": [ + ".match {$fileCount :number} {$folderCount :number}\n", + " * * {{You found {$fileCount} files in {$folderCount} folders}}\n", + " one one {{You found {$fileCount} file in {$folderCount} folder}}\n", + " one * {{You found {$fileCount} file in {$folderCount} folders}}\n", + " * one {{You found {$fileCount} files in {$folderCount} folder}}" + ], + "params": [{"name": "fileCount", "value": 1}, + {"name": "folderCount", "value": 1}], + "exp": "You found 1 file in 1 folder" + }, + { + "comment": "Plural combinations, mixed order", + "src": [ + ".match {$fileCount :number} {$folderCount :number}\n", + " * * {{You found {$fileCount} files in {$folderCount} folders}}\n", + " one one {{You found {$fileCount} file in {$folderCount} folder}}\n", + " one * {{You found {$fileCount} file in {$folderCount} folders}}\n", + " * one {{You found {$fileCount} files in {$folderCount} folder}}" + ], + "params": [{"name": "fileCount", "value": 1}, + {"name": "folderCount", "value": 5}], + "exp": "You found 1 file in 5 folders" + }, + { + "comment": "Plural combinations, mixed order", + "src": [ + ".match {$fileCount :number} {$folderCount :number}\n", + " * * {{You found {$fileCount} files in {$folderCount} folders}}\n", + " one one {{You found {$fileCount} file in {$folderCount} folder}}\n", + " one * {{You found {$fileCount} file in {$folderCount} folders}}\n", + " * one {{You found {$fileCount} files in {$folderCount} folder}}" + ], + "params": [{"name": "fileCount", "value": 7}, + {"name": "folderCount", "value": 1}], + "exp": "You found 7 files in 1 folder" + }, + { + "comment": "Plural combinations, mixed order", + "src": [ + ".match {$fileCount :number} {$folderCount :number}\n", + " * * {{You found {$fileCount} files in {$folderCount} folders}}\n", + " one one {{You found {$fileCount} file in {$folderCount} folder}}\n", + " one * {{You found {$fileCount} file in {$folderCount} folders}}\n", + " * one {{You found {$fileCount} files in {$folderCount} folder}}" + ], + "params": [{"name": "fileCount", "value": 7}, + {"name": "folderCount", "value": 3}], + "exp": "You found 7 files in 3 folders" + }, + { + "comment": "Test that the selection honors the formatting option (`1.00 dollars`)", + "src": [ + ".local $c = {$price :number minimumFractionDigits=$minF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 1 }, + { "name": "minF", "value": 0 }], + "exp": "1 dollar" + }, + { + "comment": "Test that the selection honors the formatting option (`1.00 dollars`)", + "src": [ + ".local $c = {$price :number minimumFractionDigits=$minF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 1}, + { "name": "minF", "value": 2 }], + "exp": "1.00 dollars" + }, + { + "comment": "Test that the selection honors the formatting option (`1.00 dollars`)", + "src": [ + ".local $c = {$price :number maximumFractionDigits=$maxF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 1.25}, + { "name": "maxF", "value": 0 }], + "exp": "1 dollar" + }, + { + "comment": "Test that the selection honors the formatting option (`1.00 dollars`)", + "src": [ + ".local $c = {$price :number maximumFractionDigits=$maxF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 1.25}, + { "name": "maxF", "value": 2 }], + "exp": "1.25 dollars" + }, + { + "comment": "Test that the selection honors the `:integer` over options", + "src": [ + ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 1}, + { "name": "maxF", "value": 0 }], + "exp": "1 dollar" + }, + { + "comment": "Test that the selection honors the `:integer` over options", + "src": [ + ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 1}, + { "name": "maxF", "value": 2 }], + "exp": "1 dollar" + }, + { + "comment": "Test that the selection honors the `:integer` over options", + "src": [ + ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 1.25}, + { "name": "maxF", "value": 0 }], + "exp": "1 dollar" + }, + { + "comment": "Test that the selection honors the `:integer` over options", + "src": [ + ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 1.25 }, + { "name": "maxF", "value": 2 }], + "exp": "1 dollar" + }, + { + "comment": "Test that the selection honors the `:integer` over options", + "src": [ + ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", + ".match {$c}\n", + " one {{{$c} dollar}}\n", + " * {{{$c} dollars}}" + ], + "params": [{ "name": "price", "value": 4.12345 }, + { "name": "maxF", "value": 4 }], + "exp": "4 dollars" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/invalid-number-literals-diagnostics.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/invalid-number-literals-diagnostics.json new file mode 100644 index 00000000000..d35c16b2338 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/invalid-number-literals-diagnostics.json @@ -0,0 +1,25 @@ +{ + "scenario": "Number literal syntax errors", + "description": "Syntax errors with number literals; for ICU4C, the character offset in the parse error is checked", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { "src": "{00}", "char": 2}, + { "src": "{042}", "char": 2}, + { "src": "{1.}", "char": 3}, + { "src": "{1e}", "char": 3}, + { "src": "{1E}", "char": 3}, + { "src": "{1.e}", "char": 3}, + { "src": "{1.2e}", "char": 5}, + { "src": "{1.e3}", "char": 3}, + { "src": "{1e+}", "char": 4}, + { "src": "{1e-}", "char": 4}, + { "src": "{1.0e2.0}", "char": 6} + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/invalid-options.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/invalid-options.json new file mode 100644 index 00000000000..698583cd557 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/invalid-options.json @@ -0,0 +1,47 @@ +{ + "scenario": "Bad options for built-in functions", + "description": "Tests for the bad-option error; only run in ICU4C for now", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "bad-option" + } + ] + }, + "tests": [ + { "comment": "Neither impl validates options right now; see https://github.com/unicode-org/message-format-wg/issues/738", + "src": ".local $foo = {1 :number minimumIntegerDigits=-1} {{bar {$foo}}}", + "ignoreCpp": "ICU4C doesn't validate options", + "ignoreJava": "ICU4J doesn't validate options" + }, + { "src": ".local $foo = {1 :number minimumIntegerDigits=foo} {{bar {$foo}}}", + "ignoreCpp": "ICU4C doesn't validate options", + "ignoreJava": "ICU4J doesn't validate options" + }, + { "src": ".local $foo = {1 :number minimumFractionDigits=foo} {{bar {$foo}}}", + "ignoreCpp": "ICU4C doesn't validate options", + "ignoreJava": "ICU4J doesn't validate options" + }, + { "src": ".local $foo = {1 :number maximumFractionDigits=foo} {{bar {$foo}}}", + "ignoreCpp": "ICU4C doesn't validate options", + "ignoreJava": "ICU4J doesn't validate options" + }, + { "src": ".local $foo = {1 :number minimumSignificantDigits=foo} {{bar {$foo}}}", + "ignoreCpp": "ICU4C doesn't validate options", + "ignoreJava": "ICU4J doesn't validate options" + }, + { "src": ".local $foo = {1 :number maximumSignificantDigits=foo} {{bar {$foo}}}", + "ignoreCpp": "ICU4C doesn't validate options", + "ignoreJava": "ICU4J doesn't validate options" + }, + { "src": ".local $foo = {1 :integer minimumIntegerDigits=foo} {{bar {$foo}}}", + "ignoreCpp": "ICU4C doesn't validate options", + "ignoreJava": "ICU4J doesn't validate options" + }, + { "src": ".local $foo = {1 :integer maximumSignificantDigits=foo} {{bar {$foo}}}", + "ignoreCpp": "ICU4C doesn't validate options", + "ignoreJava": "ICU4J doesn't validate options" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/markup.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/markup.json new file mode 100644 index 00000000000..29b4408e2c4 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/markup.json @@ -0,0 +1,15 @@ +{ + "scenario": "Markup", + "description": "Tests for valid markup strings", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { "src": "{#tag/}", "exp": "" }, + { "src": "{/tag}", "exp": "" }, + { "src": "{#tag}content{/tag}", "exp": "content" }, + { "src": "{#tag foo=|foo| bar=$bar}", + "params": [{ "name": "bar", "value": "b a r" }], + "exp": "" } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/matches-whitespace.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/matches-whitespace.json new file mode 100644 index 00000000000..a0af4c4d143 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/matches-whitespace.json @@ -0,0 +1,34 @@ +{ + "scenario": "Matches with whitespace", + "description": "Tests for valid match constructs with whitespace in various places", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { "src": ".match {one :string} {bar :string} one * {{one}} * * {{other}}", + "exp": "one" }, + { "src": ".match {foo :string} {bar :string}one * {{one}} * * {{other}}", + "exp": "other" + }, + { "src": ".match {foo :string}{bar :string} one * {{one}} * * {{other}}", + "exp": "other" + }, + { "src": ".match {one :string}{bar :string}one * {{one}} * * {{other}}", + "exp": "one" + }, + { "src": ".match{foo :string} {bar :string} one * {{one}} * * {{other}}", + "exp": "other" + }, + { "src": ".match {foo :string} {bar :string} one * {{one}}* * {{other}}", + "exp": "other" }, + { "src": ".match {foo :string} {bar :string}one * {{one}}* * {{other}}", + "exp": "other" + }, + { "src": ".match {foo :string} {bar :string} one *{{one}} * * {{foo}}", + "exp": "foo" + }, + { "src": ".match {foo :string} {bar :string} one * {{one}} * * {{foo}}", + "exp": "foo" } + ] +} + diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/more-data-model-errors.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/more-data-model-errors.json new file mode 100644 index 00000000000..32744083af1 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/more-data-model-errors.json @@ -0,0 +1,177 @@ +{ + "scenario": "Additional data model errors", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": ".match {$foo :number} {$bar :number} one{{one}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + + { + "src": ".match {$foo :number} {$bar :number} one {{one}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + + { + "src": ".match {$foo :number} {$bar :number} one {{one}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + + { + "src": ".match {$foo :number} * * {{foo}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + + { + "src": ".match {$one :number}\n 1 2 {{Too many}}\n * {{Otherwise}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + + { + "src": ".match {$one :number} {$two :number}\n 1 2 {{Two keys}}\n * {{Missing a key}}\n * * {{Otherwise}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + + { + "src": ".match {$foo :x} {$bar :x} * {{foo}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + + { + "src": ".match {$one :number}\n 1 {{Value is one}}\n 2 {{Value is two}}", + "expErrors": [ + { + "type": "missing-fallback-variant" + } + ] + }, + + { + "src": ".match {$one :number} {$two :number}\n 1 * {{First is one}}\n * 1 {{Second is one}}", + "expErrors": [ + { + "type": "missing-fallback-variant" + } + ] + }, + + { + "src": ".match {$one}\n 1 {{Value is one}}\n * {{Value is not one}}", + "expErrors": [ + { + "type": "missing-selector-annotation" + } + ] + }, + + { + "src": ".local $one = {|The one|}\n .match {$one}\n 1 {{Value is one}}\n * {{Value is not one}}", + "expErrors": [ + { + "type": "missing-selector-annotation" + } + ] + }, + { + "src": ".input {$foo} .match {$foo} one {{one}} * {{other}}", + "expErrors": [ + { + "type": "missing-selector-annotation" + } + ] + }, + + { + "src": ".local $foo = {$bar} .match {$foo} one {{one}} * {{other}}", + "expErrors": [ + { + "type": "missing-selector-annotation" + } + ] + }, + + { + "src": ".local $x = {|1|} .input {$x :number} {{{$x}}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + + { + "src": ".input {$x :number} .input {$x :string} {{{$x}}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + + { + "src": "{:foo a=1 b=2 a=1}", + "expErrors": [ + { + "type": "duplicate-option-name" + } + ] + }, + + { + "src": "{:foo a=1 a=1}", + "expErrors": [ + { + "type": "duplicate-option-name" + } + ] + }, + + { + "src": "{:foo a=1 a=2}", + "expErrors": [ + { + "type": "duplicate-option-name" + } + ] + }, + + { + "src": "{|x| :foo a=1 a=2}", + "expErrors": [ + { + "type": "duplicate-option-name" + } + ] + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/more-functions.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/more-functions.json new file mode 100644 index 00000000000..b34803635ce --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/more-functions.json @@ -0,0 +1,117 @@ +{ + "scenario": "Function tests 2", + "description": "More tests for ICU-specific formatting behavior.", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": "Format {123456789.9876 :number} number", + "locale": "en-IN", + "exp": "Format 12,34,56,789.9876 number", + "comment": "From ICU4J tests, with explicit formatter added" + }, + { + "src": "Format {|3.1416| :number} number", + "locale": "ar-AR-u-nu-latn", + "exp": "Format 3.1416 number", + "comment": "From ICU4J tests, with explicit formatter added" + }, + { + "src": "Format {|3.1416| :number} number", + "locale": "ar-AR-u-nu-arab", + "exp": "Format ٣٫١٤١٦ number", + "comment": "From ICU4J tests, with explicit formatter added" + }, + { + "src": [".local $dateStr = {$date :datetime}\n", + "{{Testing date formatting: {$dateStr :datetime}.}}"], + "exp": "Testing date formatting: 23.11.2022, 19:42.", + "locale": "ro", + "params": [{ "name": "date", "value": { "date": 1669261357000 }}] + }, + { + "src": "Testing date formatting: {$date :date style=long}.", + "exp": "Testing date formatting: November 23, 2022.", + "params": [{ "name": "date", "value": { "date": 1669261357000 } }] + }, + { + "src": "Testing date formatting: {$date :date style=medium}.", + "exp": "Testing date formatting: Nov 23, 2022.", + "params": [{ "name": "date", "value": { "date": 1669261357000 } }] + }, + { + "src": "Testing date formatting: {$date :date style=short}.", + "exp": "Testing date formatting: 11/23/22.", + "params": [{ "name": "date", "value": { "date": 1669261357000 } }] + }, + { + "src": "Testing date formatting: {$date :time style=long}.", + "exp": "Testing date formatting: 7:42:37\u202FPM PST.", + "params": [{ "name": "date", "value": { "date": 1669261357000 } }] + }, + { + "src": "Testing date formatting: {$date :time style=medium}.", + "exp": "Testing date formatting: 7:42:37\u202FPM.", + "params": [{ "name": "date", "value": { "date": 1669261357000 } }] + }, + { + "src": "Testing date formatting: {$date :time style=short}.", + "exp": "Testing date formatting: 7:42\u202FPM.", + "params": [{ "name": "date", "value": { "date": 1669261357000 } }] + }, + { + "src": [".local $num = {|42| :number}\n", + "{{Testing date formatting: {$num :datetime}}}"], + "exp": "Testing date formatting: {|42|}", + "expErrors": [{"type": "bad-operand"}] + }, + { + "src": "From literal: {|123456789,531| :number}!", + "exp": "From literal: {|123456789,531|}!", + "locale": "en-IN", + "params": [{ "name": "val", "value": 1234567890.97531 }], + "expErrors": [{"type": "bad-operand"}], + "comment": "Should fail because number literals are not treated as localized numbers", + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "From literal: {|123456789.531| :number}!", + "exp": "From literal: \u1041\u1042\u1043,\u1044\u1045\u1046,\u1047\u1048\u1049.\u1045\u1043\u1041!", + "locale": "my", + "params": [{ "name": "val", "value": 1234567890.97531 }] + }, + { + "src": "Default double: {$val}!", + "exp": "Default double: 1,23,45,67,890.97531!", + "locale": "en-IN", + "params": [{ "name": "val", "value": 1234567890.97531 }], + "comment": "The next few tests check that numeric variables are formatted without specifying :number" + }, + { + "src": "Default double: {$val}!", + "exp": "Default double: 1.234.567.890,97531!", + "locale": "ro", + "params": [{ "name": "val", "value": 1234567890.97531 }] + }, + { + "src": "Default float: {$val}!", + "exp": "Default float: 3,141593!", + "locale": "ro", + "params": [{"name": "val", "value": 3.1415926535}] + }, + { + "src": "Default int64: {$val}!", + "exp": "Default int64: 1.234.567.890.123.456.789!", + "locale": "ro", + "params": [{ "name": "val", "value": {"decimal": "1234567890123456789"} }], + "comment": "Rounded due to JSON not supporting full 64-bit ints" + }, + { + "src": "Default number: {$val}!", + "exp": "Default number: 1.234.567.890.123.456.789,987654!", + "locale": "ro", + "params": [{ "name": "val", "value": {"decimal": "1234567890123456789.987654321"} }] + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/normalization.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/normalization.json new file mode 100644 index 00000000000..283e3dac8a8 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/normalization.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Syntax", + "description": "Test cases that do not depend on any registry definitions.", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "description": "NFC: text is not normalized", + "src": "\u1E0A\u0323", + "exp": "\u1E0A\u0323" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is", + "src": ".local $\u0044\u0323\u0307 = {foo} {{{$\u1E0c\u0307}}}", + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is normalized, use isn't", + "src": ".local $\u1E0c\u0307 = {foo} {{{$\u0044\u0323\u0307}}}", + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is normalized, use isn't", + "src": ".input {$\u1E0c\u0307} {{{$\u0044\u0323\u0307}}}", + "params": [{"name": "\u1E0c\u0307", "value": "foo"}], + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is", + "src": ".input {$\u0044\u0323\u0307} {{{$\u1E0c\u0307}}}", + "params": [{"name": "\u0044\u0323\u0307", "value": "foo"}], + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is; reordering", + "src": ".local $\u0044\u0307\u0323 = {foo} {{{$\u1E0c\u0307}}}", + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is; special case mapping", + "src": ".local $\u0041\u030A\u0301 = {foo} {{{$\u01FA}}}", + "exp": "foo" + }, + { + "description": "NFC: keys are normalized", + "src": ".local $x = {\u1E0C\u0307 :string} .match {$x} \u1E0A\u0323 {{Right}} * {{Wrong}}", + "exp": "Right" + }, + { + "description": "NFC: keys are normalized (unquoted)", + "src": ".local $x = {\u1E0A\u0323 :string} .match {$x} \u1E0A\u0323 {{Not normalized}} \u1E0C\u0307 {{Normalized}} * {{Wrong}}", + "expErrors": [{"type": "duplicate-variant"}] + }, + { + "description": "NFC: keys are normalized (quoted)", + "src": ".local $x = {\u1E0A\u0323 :string} .match {$x} |\u1E0A\u0323| {{Not normalized}} |\u1E0C\u0307| {{Normalized}} * {{Wrong}}", + "expErrors": [{"type": "duplicate-variant"}] + }, + { + "description": "NFC: keys are normalized (mixed)", + "src": ".local $x = {\u1E0A\u0323 :string} .match {$x} \u1E0A\u0323 {{Not normalized}} |\u1E0C\u0307| {{Normalized}} * {{Wrong}}", + "expErrors": [{"type": "duplicate-variant"}] + } +] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/resolution-errors.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/resolution-errors.json new file mode 100644 index 00000000000..8f1ac2fb936 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/resolution-errors.json @@ -0,0 +1,14 @@ +{ + "scenario": "Resolution errors", + "description": "Tests for unknown variables and functions", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { "src": "{$oops}", "exp": "{$oops}", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "ICU4J doesn't signal unresolved variable errors?"}, + { "src": ".input {$x :number} {{{$x}}}", "exp": "{$x}", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"}, + { "src": ".local $foo = {$bar} .match {$foo :number} one {{one}} * {{other}}", "exp": "other", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"}, + { "src": ".local $bar = {$none :number} .match {$foo :string} one {{one}} * {{{$bar}}}", "exp": "{$none}", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"}, + { "src": "The value is {horse :func}.", "exp": "The value is {|horse|}.", "expErrors": [{ "type": "unknown-function" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"} + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/runtime-errors.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/runtime-errors.json new file mode 100644 index 00000000000..b1bb0cd491a --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/runtime-errors.json @@ -0,0 +1,27 @@ +{ + "scenario": "Runtime errors", + "description": "Tests for bad-selector and bad-operand errors", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": ".match {|horse| :date}\n 1 {{The value is one.}}\n * {{Formatter used as selector.}}", + "exp": "Formatter used as selector.", + "expErrors": [{"type": "bad-selector"}], + "ignoreJava": "ICU4J doesn't signal runtime errors?" + }, + { + "src": ".match {|horse| :number}\n 1 {{The value is one.}}\n * {{horse is not a number.}}", + "exp": "horse is not a number.", + "expErrors": [{"type": "bad-selector"}], + "ignoreJava": "ICU4J doesn't signal runtime errors?" + }, + { + "src": ".local $sel = {|horse| :number}\n .match {$sel}\n 1 {{The value is one.}}\n * {{horse is not a number.}}", + "exp": "horse is not a number.", + "expErrors": [{"type": "bad-selector"}], + "ignoreJava": "ICU4J doesn't signal runtime errors?" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/data-model-errors.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/data-model-errors.json new file mode 100644 index 00000000000..86a674c4396 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/data-model-errors.json @@ -0,0 +1,185 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Data model errors", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": ".match {$foo :x} * * {{foo}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + { + "src": ".match {$foo :x} {$bar :x} * {{foo}}", + "expErrors": [ + { + "type": "variant-key-mismatch" + } + ] + }, + { + "src": ".match {:foo} 1 {{_}}", + "expErrors": [ + { + "type": "missing-fallback-variant" + } + ] + }, + { + "src": ".match {:foo} other {{_}}", + "expErrors": [ + { + "type": "missing-fallback-variant" + } + ] + }, + { + "src": ".match {:foo} {:bar} * 1 {{_}} 1 * {{_}}", + "expErrors": [ + { + "type": "missing-fallback-variant" + } + ] + }, + { + "src": ".match {$foo} one {{one}} * {{other}}", + "expErrors": [ + { + "type": "missing-selector-annotation" + } + ] + }, + { + "src": ".input {$foo} .match {$foo} one {{one}} * {{other}}", + "expErrors": [ + { + "type": "missing-selector-annotation" + } + ] + }, + { + "src": ".local $foo = {$bar} .match {$foo} one {{one}} * {{other}}", + "expErrors": [ + { + "type": "missing-selector-annotation" + } + ] + }, + { + "src": ".input {$foo} .input {$foo} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".input {$foo} .local $foo = {42} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".local $foo = {42} .input {$foo} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".local $foo = {:unknown} .local $foo = {42} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".local $foo = {$bar} .local $bar = {42} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".local $foo = {$foo} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".local $foo = {$bar} .local $bar = {$baz} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".local $foo = {$bar :func} .local $bar = {$baz} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".local $foo = {42 :func opt=$foo} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": ".local $foo = {42 :func opt=$bar} .local $bar = {42} {{_}}", + "expErrors": [ + { + "type": "duplicate-declaration" + } + ] + }, + { + "src": "bad {:placeholder option=x option=x}", + "expErrors": [ + { + "type": "duplicate-option-name" + } + ] + }, + { + "src": "bad {:placeholder ns:option=x ns:option=y}", + "expErrors": [ + { + "type": "duplicate-option-name" + } + ] + }, + { + "src": ".match {$var :string} * {{The first default}} * {{The second default}}", + "expErrors": [ + { + "type": "duplicate-variant" + } + ] + }, + { + "src": ".match {$x :string} {$y :string} * foo {{The first foo variant}} bar * {{The bar variant}} * |foo| {{The second foo variant}} * * {{The default variant}}", + "expErrors": [ + { + "type": "duplicate-variant" + } + ] + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/date.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/date.json new file mode 100644 index 00000000000..dd14e6785fb --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/date.json @@ -0,0 +1,46 @@ +{ + "scenario": "Date function", + "description": "The built-in formatter for dates.", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [] + }, + "tests": [ + { + "src": "{:date}", + "exp": "{:date}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{horse :date}", + "exp": "{|horse|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{|2006-01-02| :date}" + }, + { + "src": "{|2006-01-02T15:04:06| :date}" + }, + { + "src": "{|2006-01-02| :date style=long}" + }, + { + "src": ".local $d = {|2006-01-02| :date style=long} {{{$d :date}}}" + }, + { + "src": ".local $t = {|2006-01-02T15:04:06| :time} {{{$t :date}}}", + "ignoreJava": "ICU4J doesn't support this kind of composition" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/datetime.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/datetime.json new file mode 100644 index 00000000000..bdfea3096cd --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/datetime.json @@ -0,0 +1,68 @@ +{ + "scenario": "Datetime function", + "description": "The built-in formatter for datetimes.", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [] + }, + "tests": [ + { + "src": "{:datetime}", + "exp": "{:datetime}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{$x :datetime}", + "exp": "{$x}", + "params": [ + { + "name": "x", + "value": true + } + ], + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{horse :datetime}", + "exp": "{|horse|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{|2006-01-02T15:04:06| :datetime}" + }, + { + "src": "{|2006-01-02T15:04:06| :datetime year=numeric month=|2-digit|}" + }, + { + "src": "{|2006-01-02T15:04:06| :datetime dateStyle=long}" + }, + { + "src": "{|2006-01-02T15:04:06| :datetime timeStyle=medium}" + }, + { + "src": "{$dt :datetime}", + "params": [ + { + "type": "datetime", + "name": "dt", + "value": "2006-01-02T15:04:06" + } + ] + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/integer.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/integer.json new file mode 100644 index 00000000000..c8e75077a22 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/integer.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Integer function", + "description": "The built-in formatter for integers.", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": "hello {4.2 :integer}", + "exp": "hello 4" + }, + { + "src": "hello {-4.20 :integer}", + "exp": "hello -4" + }, + { + "src": "hello {0.42e+1 :integer}", + "exp": "hello 4" + }, + { + "src": ".match {$foo :integer} one {{one}} * {{other}}", + "params": [ + { + "name": "foo", + "value": 1.2 + } + ], + "exp": "one" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/number.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/number.json new file mode 100644 index 00000000000..1b81c705622 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/number.json @@ -0,0 +1,407 @@ +{ + "scenario": "Number function", + "description": "The built-in formatter for numbers.", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": "hello {4.2 :number}", + "exp": "hello 4.2" + }, + { + "src": "hello {-4.20 :number}", + "exp": "hello -4.2" + }, + { + "src": "hello {0.42e+1 :number}", + "exp": "hello 4.2" + }, + { + "src": "hello {foo :number}", + "exp": "hello {|foo|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "invalid number literal {|.1| :number}", + "exp": "invalid number literal {|.1|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "invalid number literal {|1.| :number}", + "exp": "invalid number literal {|1.|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "invalid number literal {|01| :number}", + "exp": "invalid number literal {|01|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "invalid number literal {|+1| :number}", + "exp": "invalid number literal {|+1|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "invalid number literal {|0x1| :number}", + "exp": "invalid number literal {|0x1|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "hello {:number}", + "exp": "hello {:number}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "hello {4.2 :number minimumFractionDigits=2}", + "exp": "hello 4.20" + }, + { + "src": "hello {|4.2| :number minimumFractionDigits=|2|}", + "exp": "hello 4.20" + }, + { + "src": "hello {4.2 :number minimumFractionDigits=$foo}", + "params": [ + { + "name": "foo", + "value": 2 + } + ], + "exp": "hello 4.20" + }, + { + "src": "hello {|4.2| :number minimumFractionDigits=$foo}", + "params": [ + { + "name": "foo", + "value": "2" + } + ], + "exp": "hello 4.20" + }, + { + "src": ".local $foo = {$bar :number} {{bar {$foo}}}", + "params": [ + { + "name": "bar", + "value": 4.2 + } + ], + "exp": "bar 4.2" + }, + { + "src": ".local $foo = {$bar :number minimumFractionDigits=2} {{bar {$foo}}}", + "params": [ + { + "name": "bar", + "value": 4.2 + } + ], + "exp": "bar 4.20" + }, + { + "src": ".local $foo = {$bar :number minimumFractionDigits=foo} {{bar {$foo}}}", + "params": [ + { + "name": "bar", + "value": 4.2 + } + ], + "exp": "bar {$bar}", + "expErrors": [ + { + "type": "bad-option" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": ".local $foo = {$bar :number} {{bar {$foo}}}", + "params": [ + { + "name": "bar", + "value": "foo" + } + ], + "exp": "bar {$bar}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": ".input {$foo :number} {{bar {$foo}}}", + "params": [ + { + "name": "foo", + "value": 4.2 + } + ], + "exp": "bar 4.2" + }, + { + "src": ".input {$foo :number minimumFractionDigits=2} {{bar {$foo}}}", + "params": [ + { + "name": "foo", + "value": 4.2 + } + ], + "exp": "bar 4.20" + }, + { + "src": ".input {$foo :number minimumFractionDigits=foo} {{bar {$foo}}}", + "params": [ + { + "name": "foo", + "value": 4.2 + } + ], + "exp": "bar {$foo}", + "expErrors": [ + { + "type": "bad-option" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": ".input {$foo :number} {{bar {$foo}}}", + "params": [ + { + "name": "foo", + "value": "foo" + } + ], + "exp": "bar {$foo}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": ".match {$foo :number} one {{one}} * {{other}}", + "params": [ + { + "name": "foo", + "value": 1 + } + ], + "exp": "one" + }, + { + "src": ".match {$foo :number} 1 {{=1}} one {{one}} * {{other}}", + "params": [ + { + "name": "foo", + "value": 1 + } + ], + "exp": "=1" + }, + { + "src": ".match {$foo :number} one {{one}} 1 {{=1}} * {{other}}", + "params": [ + { + "name": "foo", + "value": 1 + } + ], + "exp": "=1" + }, + { + "src": ".match {$foo :number} {$bar :number} one one {{one one}} one * {{one other}} * * {{other}}", + "params": [ + { + "name": "foo", + "value": 1 + }, + { + "name": "bar", + "value": 1 + } + ], + "exp": "one one" + }, + { + "src": ".match {$foo :number} {$bar :number} one one {{one one}} one * {{one other}} * * {{other}}", + "params": [ + { + "name": "foo", + "value": 1 + }, + { + "name": "bar", + "value": 2 + } + ], + "exp": "one other" + }, + { + "src": ".match {$foo :number} {$bar :number} one one {{one one}} one * {{one other}} * * {{other}}", + "params": [ + { + "name": "foo", + "value": 2 + }, + { + "name": "bar", + "value": 2 + } + ], + "exp": "other" + }, + { + "src": ".input {$foo :number} .match {$foo} one {{one}} * {{other}}", + "params": [ + { + "name": "foo", + "value": 1 + } + ], + "exp": "one" + }, + { + "src": ".local $foo = {$bar :number} .match {$foo} one {{one}} * {{other}}", + "params": [ + { + "name": "bar", + "value": 1 + } + ], + "exp": "one" + }, + { + "src": ".input {$foo :number} .local $bar = {$foo} .match {$bar} one {{one}} * {{other}}", + "params": [ + { + "name": "foo", + "value": 1 + } + ], + "exp": "one" + }, + { + "src": ".input {$bar :number} .match {$bar} one {{one}} * {{other}}", + "params": [ + { + "name": "bar", + "value": 2 + } + ], + "exp": "other" + }, + { + "src": ".input {$bar} .match {$bar :number} one {{one}} * {{other}}", + "params": [ + { + "name": "bar", + "value": 1 + } + ], + "exp": "one" + }, + { + "src": ".input {$bar} .match {$bar :number} one {{one}} * {{other}}", + "params": [ + { + "name": "bar", + "value": 2 + } + ], + "exp": "other" + }, + { + "src": ".input {$none} .match {$foo :number} one {{one}} * {{{$none}}}", + "params": [ + { + "name": "foo", + "value": 1 + } + ], + "exp": "one" + }, + { + "src": ".local $bar = {$none} .match {$foo :number} one {{one}} * {{{$bar}}}", + "params": [ + { + "name": "foo", + "value": 1 + } + ], + "exp": "one" + }, + { + "src": ".local $bar = {$none} .match {$foo :number} one {{one}} * {{{$bar}}}", + "params": [ + { + "name": "foo", + "value": 2 + } + ], + "exp": "{$none}", + "expErrors": [ + { + "type": "unresolved-variable" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{42 :number @foo @bar=13}", + "exp": "42", + "expParts": [ + { + "type": "number", + "source": "|42|", + "parts": [ + { + "type": "integer", + "value": "42" + } + ] + } + ] + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/string.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/string.json new file mode 100644 index 00000000000..5858079b99a --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/string.json @@ -0,0 +1,51 @@ +{ + "scenario": "String function", + "description": "The built-in formatter for strings.", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "src": ".match {$foo :string} |1| {{one}} * {{other}}", + "params": [ + { + "name": "foo", + "value": "1" + } + ], + "exp": "one" + }, + { + "src": ".match {$foo :string} 1 {{one}} * {{other}}", + "params": [ + { + "name": "foo", + "value": 1 + } + ], + "exp": "one", + "ignoreJava": ":string doesn't stringify numbers?" + }, + { + "src": ".match {$foo :string} 1 {{one}} * {{other}}", + "params": [ + { + "name": "foo", + "value": null + } + ], + "exp": "other", + "ignoreCpp": "Can't handle null value for input variable" + }, + { + "src": ".match {$foo :string} 1 {{one}} * {{other}}", + "exp": "other", + "expErrors": [ + { + "type": "unresolved-variable" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/time.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/time.json new file mode 100644 index 00000000000..845934a5e16 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/functions/time.json @@ -0,0 +1,43 @@ +{ + "scenario": "Time function", + "description": "The built-in formatter for times.", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [] + }, + "tests": [ + { + "src": "{:time}", + "exp": "{:time}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{horse :time}", + "exp": "{|horse|}", + "expErrors": [ + { + "type": "bad-operand" + } + ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "src": "{|2006-01-02T15:04:06| :time}" + }, + { + "src": "{|2006-01-02T15:04:06| :time style=medium}" + }, + { + "src": ".local $t = {|2006-01-02T15:04:06| :time style=medium} {{{$t :time}}}" + }, + { + "src": ".local $d = {|2006-01-02T15:04:06| :date} {{{$d :time}}}", + "ignoreJava": "ICU4J doesn't support this kind of composition" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/syntax-errors.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/syntax-errors.json new file mode 100644 index 00000000000..34d9aa48457 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/syntax-errors.json @@ -0,0 +1,180 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Syntax errors", + "description": "Strings that produce syntax errors when parsed.", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { + "src": "." + }, + { + "src": "{" + }, + { + "src": "}" + }, + { + "src": "{}" + }, + { + "src": "{{" + }, + { + "src": "{{}" + }, + { + "src": "{{}}}" + }, + { + "src": "{|foo| #markup}" + }, + { + "src": "{{missing end brace}" + }, + { + "src": "{{missing end braces" + }, + { + "src": "{{missing end {$braces" + }, + { + "src": "{{extra}} content" + }, + { + "src": "empty { } placeholder" + }, + { + "src": "missing space {42:func}" + }, + { + "src": "missing space {|foo|:func}" + }, + { + "src": "missing space {|foo|@bar}" + }, + { + "src": "missing space {:func@bar}" + }, + { + "src": "missing space {:func @bar@baz}" + }, + { + "src": "missing space {:func @bar=42@baz}" + }, + { + "src": "missing space {+reserved@bar}" + }, + { + "src": "missing space {&private@bar}" + }, + { + "src": "bad {:} placeholder" + }, + { + "src": "bad {\\u0000placeholder}" + }, + { + "src": "no-equal {|42| :number minimumFractionDigits 2}" + }, + { + "src": "bad {:placeholder option=}" + }, + { + "src": "bad {:placeholder option value}" + }, + { + "src": "bad {:placeholder option:value}" + }, + { + "src": "bad {:placeholder option}" + }, + { + "src": "bad {:placeholder:}" + }, + { + "src": "bad {::placeholder}" + }, + { + "src": "bad {:placeholder::foo}" + }, + { + "src": "bad {:placeholder option:=x}" + }, + { + "src": "bad {:placeholder :option=x}" + }, + { + "src": "bad {:placeholder option::x=y}" + }, + { + "src": "bad {$placeholder option}" + }, + { + "src": "bad {:placeholder @attribute=}" + }, + { + "src": "bad {:placeholder @attribute=@foo}" + }, + { + "src": "{ @misplaced = attribute }" + }, + { + "src": "no {placeholder end" + }, + { + "src": "no {$placeholder end" + }, + { + "src": "no {:placeholder end" + }, + { + "src": "no {|placeholder| end" + }, + { + "src": "no {|literal} end" + }, + { + "src": "no {|literal or placeholder end" + }, + { + "src": ".local bar = {|foo|} {{_}}" + }, + { + "src": ".local #bar = {|foo|} {{_}}" + }, + { + "src": ".local $bar {|foo|} {{_}}" + }, + { + "src": ".local $bar = |foo| {{_}}" + }, + { + "src": ".match {#foo} * {{foo}}" + }, + { + "src": ".match {} * {{foo}}" + }, + { + "src": ".match {|foo| :x} {|bar| :x} ** {{foo}}" + }, + { + "src": ".match * {{foo}}" + }, + { + "src": ".match {|x| :x} * foo" + }, + { + "src": ".match {|x| :x} * {{foo}} extra" + }, + { + "src": ".match |x| * {{foo}}" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/syntax.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/syntax.json new file mode 100644 index 00000000000..558fc64062b --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/spec/syntax.json @@ -0,0 +1,699 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Syntax", + "description": "Test cases that do not depend on any registry definitions.", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "description": "message -> simple-message -> ", + "src": "", + "exp": "" + }, + { + "description": "message -> simple-message -> simple-start pattern -> simple-start-char", + "src": "a", + "exp": "a" + }, + { + "description": "message -> simple-message -> simple-start pattern -> simple-start-char pattern -> ...", + "src": "hello", + "exp": "hello" + }, + { + "description": "message -> simple-message -> simple-start pattern -> escaped-char", + "src": "\\\\", + "exp": "\\" + }, + { + "description": "message -> simple-message -> simple-start pattern -> simple-start-char pattern -> ... -> simple-start-char *text-char placeholder", + "src": "hello {world}", + "exp": "hello world" + }, + { + "description": "message -> simple-message -> simple-start pattern -> simple-start-char pattern -> ... -> simple-start-char *text-char placeholder", + "src": "hello {|world|}", + "exp": "hello world" + }, + { + "description": "message -> simple-message -> s simple-start pattern -> s simple-start-char pattern -> ...", + "src": "\n hello\t", + "exp": "\n hello\t" + }, + { + "src": "hello {$place}", + "params": [ + { + "name": "place", + "value": "world" + } + ], + "exp": "hello world" + }, + { + "src": "hello {$place-.}", + "params": [ + { + "name": "place-.", + "value": "world" + } + ], + "exp": "hello world" + }, + { + "src": "hello {$place}", + "expErrors": [ + { + "type": "unresolved-variable" + } + ], + "exp": "hello {$place}", + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> expression -> literal-expression -> \"{\" literal \"}\"", + "src": "{a}", + "exp": "a" + }, + { + "description": "... -> literal-expression -> \"{\" literal s annotation \"}\" -> \"{\" literal s function \"}\" -> \"{\" literal s \":\" identifier \"}\" -> \"{\" literal s \":\" name \"}\"", + "src": "{a :f}", + "exp": "{|a|}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... -> \"{\" literal s \":\" namespace \":\" name \"}\"", + "src": "{a :u:f}", + "exp": "{|a|}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> expression -> variable-expression -> \"{\" variable \"}\"", + "src": "{$x}", + "exp": "{$x}", + "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... -> variable-expression -> \"{\" variable s annotation \"}\" -> \"{\" variable s function \"}\" -> \"{\" variable s \":\" identifier \"}\" -> \"{\" variable s \":\" name \"}\"", + "src": "{$x :f}", + "exp": "{$x}", + "expErrors": [{ "type": "unresolved-variable" }, { "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... -> \"{\" variable s \":\" namespace \":\" name \"}\"", + "src": "{$x :u:f}", + "exp": "{$x}", + "expErrors": [{ "type": "unresolved-variable" }, { "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... -> annotation-expression -> function -> \"{\" \":\" namespace \":\" name \"}\"", + "src": "{:u:f}", + "exp": "{:u:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... -> annotation-expression -> function -> \"{\" \":\" name \"}\"", + "src": "{:f}", + "exp": "{:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "message -> complex-message -> complex-body -> quoted-pattern -> \"{{\" pattern \"}}\" -> \"{{\"\"}}\"", + "src": "{{}}", + "exp": "" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier \"}\"", + "src": "{#tag}", + "exp": "", + "expParts": [ + { + "type": "markup", + "kind": "open", + "name": "tag" + } + ] + }, + { + "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration complex-body -> input-declaration complex-body -> input variable-expression complex-body", + "src": ".input{$x}{{}}", + "exp": "" + }, + { + "description": "message -> complex-message -> s *(declaration [s]) complex-body s -> s declaration complex-body s -> s input-declaration complex-body s -> s input variable-expression complex-body s", + "src": "\t.input{$x}{{}}\n", + "exp": "" + }, + { + "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration declaration complex-body -> input-declaration input-declaration complex-body -> input variable-expression input variable-expression complex-body", + "src": ".input{$x}.input{$y}{{}}", + "exp": "" + }, + { + "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration s declaration complex-body -> input-declaration s input-declaration complex-body -> input variable-expression s input variable-expression complex-body", + "src": ".input{$x} .input{$y}{{}}", + "exp": "" + }, + { + "description": "message -> complex-message -> s *(declaration [s]) complex-body s -> s complex-body s", + "src": " {{}} ", + "exp": "" + }, + { + "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration declaration complex-body -> local-declaration input-declaration complex-body -> local s variable [s] \"=\" [s] expression input variable-expression complex-body", + "src": ".local $x ={a}.input{$y}{{}}", + "exp": "" + }, + { + "description": "message -> complex-message -> complex-body -> matcher -> match-statement variant -> match selector key quoted-pattern -> \".match\" expression literal quoted-pattern", + "src": ".match{a :f}a{{}}*{{}}", + "exp": "", + "expErrors": [ { "type": "unknown-function" } ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... input-declaration -> input s variable-expression ...", + "src": ".input {$x}{{}}", + "exp": "" + }, + { + "description": "... local-declaration -> local s variable s \"=\" expression ...", + "src": ".local $x ={a}{{}}", + "exp": "" + }, + { + "description": "... local-declaration -> local s variable \"=\" s expression ...", + "src": ".local $x= {a}{{}}", + "exp": "" + }, + { + "description": "... local-declaration -> local s variable s \"=\" expression ...", + "src": ".local $x = {a}{{}}", + "exp": "" + }, + { + "description": "... matcher -> match-statement [s] variant -> match 1*([s] selector) variant -> match selector selector variant -> match selector selector variant key s key quoted-pattern", + "src": ".match{a :f}{b :f}a b{{}}* *{{}}", + "exp": "", + "expErrors": [ { "type": "unknown-function" } ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... matcher -> match-statement [s] variant -> match 1*([s] selector) variant -> match selector variant variant ...", + "src": ".match{a :f}a{{}}b{{}}*{{}}", + "exp": "", + "expErrors": [ { "type": "unknown-function" } ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... variant -> key s quoted-pattern -> ...", + "src": ".match{a :f}a {{}}*{{}}", + "exp": "", + "expErrors": [ { "type": "unknown-function" } ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... variant -> key s key s quoted-pattern -> ...", + "src": ".match{a :f}{b :f}a b {{}}* *{{}}", + "exp": "", + "expErrors": [ { "type": "unknown-function" } ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... key -> \"*\" ...", + "src": ".match{a :f}*{{}}", + "exp": "", + "expErrors": [ { "type": "unknown-function" } ], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "simple-message -> simple-start pattern -> placeholder -> expression -> literal-expression -> \"{\" s literal \"}\"", + "src": "{ a}", + "exp": "a" + }, + { + "description": "... literal-expression -> \"{\" literal s attribute \"}\" -> \"{\" literal s \"@\" identifier \"}\"", + "src": "{a @c}", + "exp": "a" + }, + { + "description": "... -> literal-expression -> \"{\" literal s \"}\"", + "src": "{a }", + "exp": "a" + }, + { + "description": "simple-message -> simple-start pattern -> placeholder -> expression -> variable-expression -> \"{\" s variable \"}\"", + "src": "{ $x}", + "exp": "{$x}", + "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... variable-expression -> \"{\" variable s attribute \"}\" -> \"{\" variable s \"@\" identifier \"}\"", + "src": "{$x @c}", + "exp": "{$x}", + "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... -> variable-expression -> \"{\" variable s \"}\"", + "src": "{$x }", + "exp": "{$x}", + "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "simple-message -> simple-start pattern -> placeholder -> expression -> annotation-expression -> \"{\" s annotation \"}\"", + "src": "{ :f}", + "exp": "{:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... annotation-expression -> \"{\" annotation s attribute \"}\" -> \"{\" annotation s \"@\" identifier \"}\"", + "src": "{:f @c}", + "exp": "{:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... -> annotation-expression -> \"{\" annotation s \"}\"", + "src": "{:f }", + "exp": "{:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" s \"#\" identifier \"}\"", + "src": "{ #a}", + "exp": "" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier option \"}\" -> \"{\" \"#\" identifier identifier \"=\" literal \"}\"", + "src": "{#tag foo=bar}", + "exp": "", + "expParts": [ + { + "type": "markup", + "kind": "open", + "name": "tag", + "options": { + "foo": "bar" + } + } + ] + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier attribute \"}\" -> \"{\" \"#\" identifier identifier \"=\" literal \"}\"", + "src": "{#a @c}", + "exp": "" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier s \"}\" -> \"{\" \"#\" identifier identifier \"=\" literal \"}\"", + "src": "{#a }", + "exp": "" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier \"/\" \"}\" -> \"{\" \"#\" identifier identifier \"=\" literal \"}\"", + "src": "{#a/}", + "exp": "" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"/\" identifier \"}\"", + "src": "{/a}", + "exp": "" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" s \"/\" identifier \"}\"", + "src": "{ /a}", + "exp": "" + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"/\" identifier option \"}\"", + "src": "{/tag foo=bar}", + "exp": "", + "expParts": [ + { + "type": "markup", + "kind": "close", + "name": "tag", + "options": { + "foo": "bar" + } + } + ] + }, + { + "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"/\" identifier s \"}\"", + "src": "{/a }", + "exp": "" + }, + { + "description": "... annotation-expression -> function -> \":\" identifier option", + "src": "{:f k=v}", + "exp": "{:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... option -> identifier s \"=\" literal", + "src": "{:f k =v}", + "exp": "{:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... option -> identifier \"=\" s literal", + "src": "{:f k= v}", + "exp": "{:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... option -> identifier s \"=\" s literal", + "src": "{:f k = v}", + "exp": "{:f}", + "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + }, + { + "description": "... attribute -> \"@\" identifier \"=\" literal ...", + "src": "{a @c=d}", + "exp": "a" + }, + { + "description": "... attribute -> \"@\" identifier s \"=\" literal ...", + "src": "{a @c =d}", + "exp": "a" + }, + { + "description": "... attribute -> \"@\" identifier \"=\" s literal ...", + "src": "{a @c= d}", + "exp": "a" + }, + { + "description": "... attribute -> \"@\" identifier s \"=\" s literal ...", + "src": "{a @c = d}", + "exp": "a" + }, + { + "description": "... attribute -> \"@\" identifier s \"=\" s variable ...", + "src": "{42 @foo=$bar}", + "exp": "42", + "expParts": [ + { + "type": "string", + "source": "|42|", + "value": "42" + } + ] + }, + { + "description": "... literal -> quoted-literal -> \"|\" \"|\" ...", + "src": "{||}", + "exp": "" + }, + { + "description": "... quoted-literal -> \"|\" quoted-char \"|\"", + "src": "{|a|}", + "exp": "a" + }, + { + "description": "... quoted-literal -> \"|\" escaped-char \"|\"", + "src": "{|\\\\|}", + "exp": "\\" + }, + { + "description": "... quoted-literal -> \"|\" quoted-char escaped-char \"|\"", + "src": "{|a\\\\|}", + "exp": "a\\" + }, + { + "description": "... unquoted-literal -> number-literal -> %x30", + "src": "{0}", + "exp": "0" + }, + { + "description": "... unquoted-literal -> number-literal -> \"-\" %x30", + "src": "{-0}", + "exp": "-0" + }, + { + "description": "... unquoted-literal -> number-literal -> (%x31-39 *DIGIT) -> %x31", + "src": "{1}", + "exp": "1" + }, + { + "description": "... unquoted-literal -> number-literal -> (%x31-39 *DIGIT) -> %x31 DIGIT -> 11", + "src": "{11}", + "exp": "11" + }, + { + "description": "... unquoted-literal -> number-literal -> %x30 \".\" 1*DIGIT -> 0 \".\" 1", + "src": "{0.1}", + "exp": "0.1" + }, + { + "description": "... unquoted-literal -> number-literal -> %x30 \".\" 1*DIGIT -> %x30 \".\" DIGIT DIGIT -> 0 \".\" 1 2", + "src": "{0.12}", + "exp": "0.12" + }, + { + "description": "... unquoted-literal -> number-literal -> %x30 %i\"e\" 1*DIGIT -> %x30 \"e\" DIGIT", + "src": "{0e1}", + "exp": "0e1" + }, + { + "description": "... unquoted-literal -> number-literal -> %x30 %i\"e\" 1*DIGIT -> %x30 \"E\" DIGIT", + "src": "{0E1}", + "exp": "0E1" + }, + { + "description": "... unquoted-literal -> number-literal -> %x30 %i\"e\" \"-\" 1*DIGIT ...", + "src": "{0E-1}", + "exp": "0E-1" + }, + { + "description": "... unquoted-literal -> number-literal -> %x30 %i\"e\" \"+\" 1*DIGIT ...", + "src": "{0E-1}", + "exp": "0E-1" + }, + { + "src": "hello { world\t\n}", + "exp": "hello world" + }, + { + "src": "hello {\u3000world\r}", + "exp": "hello world" + }, + { + "src": "{$one} and {$two}", + "params": [ + { + "name": "one", + "value": 1.3 + }, + { + "name": "two", + "value": 4.2 + } + ], + "exp": "1.3 and 4.2" + }, + { + "src": "{$one} et {$two}", + "locale": "fr", + "params": [ + { + "name": "one", + "value": 1.3 + }, + { + "name": "two", + "value": 4.2 + } + ], + "exp": "1,3 et 4,2" + }, + { + "src": ".local $foo = {bar} {{bar {$foo}}}", + "exp": "bar bar" + }, + { + "src": ".local $foo = {|bar|} {{bar {$foo}}}", + "exp": "bar bar" + }, + { + "src": ".local $foo = {|bar|} {{bar {$foo}}}", + "params": [ + { + "name": "foo", + "value": "foo" + } + ], + "exp": "bar bar" + }, + { + "src": ".local $foo = {$bar} {{bar {$foo}}}", + "params": [ + { + "name": "bar", + "value": "foo" + } + ], + "exp": "bar foo" + }, + { + "src": ".local $foo = {$baz} .local $bar = {$foo} {{bar {$bar}}}", + "params": [ + { + "name": "baz", + "value": "foo" + } + ], + "exp": "bar foo" + }, + { + "src": ".input {$foo} {{bar {$foo}}}", + "params": [ + { + "name": "foo", + "value": "foo" + } + ], + "exp": "bar foo" + }, + { + "src": ".input {$foo} .local $bar = {$foo} {{bar {$bar}}}", + "params": [ + { + "name": "foo", + "value": "foo" + } + ], + "exp": "bar foo" + }, + { + "src": ".local $foo = {$baz} .local $bar = {$foo} {{bar {$bar}}}", + "params": [ + { + "name": "baz", + "value": "foo" + } + ], + "exp": "bar foo" + }, + { + "src": ".local $x = {42} .local $y = {$x} {{{$x} {$y}}}", + "exp": "42 42" + }, + { + "src": "{#tag}content", + "exp": "content", + "expParts": [ + { + "type": "markup", + "kind": "open", + "name": "tag" + }, + { + "type": "literal", + "value": "content" + } + ] + }, + { + "src": "{#ns:tag}content{/ns:tag}", + "exp": "content", + "expParts": [ + { + "type": "markup", + "kind": "open", + "name": "ns:tag" + }, + { + "type": "literal", + "value": "content" + }, + { + "type": "markup", + "kind": "close", + "name": "ns:tag" + } + ] + }, + { + "src": "{/tag}content", + "exp": "content", + "expParts": [ + { + "type": "markup", + "kind": "close", + "name": "tag" + }, + { + "type": "literal", + "value": "content" + } + ] + }, + { + "src": "{#tag foo=bar/}", + "exp": "", + "expParts": [ + { + "type": "markup", + "kind": "standalone", + "name": "tag", + "options": { + "foo": "bar" + } + } + ] + }, + { + "src": "{#tag a:foo=|foo| b:bar=$bar}", + "params": [ + { + "name": "bar", + "value": "b a r" + } + ], + "exp": "", + "expParts": [ + { + "type": "markup", + "kind": "open", + "name": "tag", + "options": { + "a:foo": "foo", + "b:bar": "b a r" + } + } + ] + }, + { + "src": "{42 @foo @bar=13}", + "exp": "42", + "expParts": [ + { + "type": "string", + "source": "|42|", + "value": "42" + } + ] + }, + { + "src": "{{trailing whitespace}} \n", + "exp": "trailing whitespace" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-diagnostics-multiline.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-diagnostics-multiline.json new file mode 100644 index 00000000000..facfadebab4 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-diagnostics-multiline.json @@ -0,0 +1,50 @@ +{ + "scenario": "Syntax errors with character and line offsets", + "description": "Syntax errors; for ICU4C, the character and line offsets in the parse error are checked", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { + "src": "{{hello wo\nrld", + "char": 3, + "line": 1, + "comment": "Check that the missing closing '}' is reported on the correct line" + }, + { + "src": "{{hello wo\nr\nl\ndddd", + "char": 4, + "line": 3, + "comment": "Check that the missing closing '}' is reported on the correct line" + }, + { + "src": "{{hello wo\nr\nl\n", + "char": 0, + "line": 3, + "comment": "Offset for end-of-input should be 0 here because the line begins after the '\n', but there is no character after the '\n'" + }, + { + "src": "hello {|wo\nrld", + "char": 3, + "line": 1, + "comment": "Quoted literals may include newlines; check that the missing closing '|' is reported on the correct line" + }, + { + "src": "hello {|wo\nr\nl\ndddd", + "char": 4, + "line": 3, + "comment": "Quoted literals may include newlines; check that the missing closing '|' is reported on the correct line" + }, + { + "src": "hello {|wo\nr\nl\n", + "char": 0, + "line": 3, + "comment": "Offset for end-of-input should be 0 here because the line begins after the '\n', but there is no character after the '\n'" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-diagnostics.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-diagnostics.json new file mode 100644 index 00000000000..79a29a027f9 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-diagnostics.json @@ -0,0 +1,347 @@ +{ + "scenario": "Syntax errors with character offsets", + "description": "Syntax errors; for ICU4C, the character offset in the parse error is checked", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { "src": "}{|xyz|", "char": 0 }, + { "src": "}", "char": 0 }, + { + "src": "{{{%\\y{}}", + "char": 5, + "comment": "Backslash followed by non-backslash followed by a '{' -- this should be an error immediately after the first backslash" + }, + { + "src": "{%abc|\\z}}", + "char": 7, + "comment": "Reserved chars followed by a '|' that doesn't begin a valid literal -- this should be an error at the first invalid char in the literal" + }, + { + "src": "{%\\y{p}}", + "char": 3, + "comment": "Same pattern, but with a valid reserved-char following the erroneous reserved-escape -- the offset should be the same as with the previous one" + }, + { + "src": "{{{%ab|\\z|cd}}", + "char": 8, + "comment": "Erroneous literal inside a reserved string -- the error should be at the first erroneous literal char" + }, + { + "src": "hello {|4.2| %num\\ber}}", + "char": 18, + "comment": "Single backslash not allowed" + }, + { + "src": "hello {|4.2| %num{be\\|r}}", + "char": 17, + "comment": "Unescaped '{' not allowed" + }, + { + "src": "hello {|4.2| %num}be\\|r}}", + "char": 23, + "comment": "Unescaped '}' -- will be interpreted as the end of the reserved string, and the error will be reported at the index of the next '}'" }, + { + "src": "hello {|4.2| %num\\{be|r}}", + "char": 25, + "comment": "Unescaped '|' -- will be interpreted as the beginning of a literal. Error at end of input" + }, + { + "src": ".match{|y|}|y|{{{|||}}}", + "char": 19, + "comment": "No spaces are required here. The error should be in the pattern, not before" + }, + { + "src": ".match {|y|}|foo|bar {{{a}}}", + "char": 17, + "comment": "Missing spaces between keys" + }, + { + "src": ".match {|y|} |quux| |foo|bar {{{a}}}", + "char": 25, + "comment": "Missing spaces between keys" + }, + { + "src": ".match {|y|} |quux| |foo||bar| {{{a}}}", + "char": 26, + "comment": "Missing spaces between keys" + }, + { + "src": ".match {|y|} |\\q| * %{! {z}", + "char": 16, + "comment": "Error parsing the first key -- the error should be there, not in the also-erroneous third key" + }, + { + "src": ".match {|y|} * %{! {z} |\\q|", + "char": 16, + "comment": "Error parsing the second key -- the error should be there, not in the also-erroneous third key" + }, + { + "src": ".match {|y|} * |\\q| {\\z}", + "char": 18, + "comment": "Error parsing the last key -- the error should be there, not in the erroneous pattern" + }, + { + "src": ".match {|y|} {\\|} {@} * * * {{a}}", + "char": 14, + "comment": "Non-expression as scrutinee in pattern -- error should be at the first non-expression, not the later non-expression" + }, + { + "src": ".match {|y|} $foo * {{a}} when * :bar {{b}}", + "char": 14, + "comment": "Non-key in variant -- error should be there, not in the next erroneous variant" + }, + { + "src": "{{ foo {|bar|} \\q baz ", + "char": 16, + "comment": "Error should be within the first erroneous `text` or expression" + }, + { + "src": "{{{: }}}", + "char": 4, + "comment": "':' has to be followed by a function name -- the error should be at the first whitespace character" + }, + { + "src": ".local $x = }|foo|}", + "char": 12, + "comment": "Expression not starting with a '{'" + }, + { + "src": ".local $bar {|foo|} {{$bar}}", + "char": 12, + "comment": "Missing '=' in `.local` declaration" + }, + { + "src": ".local bar = {|foo|} {{$bar}}", + "char": 7, + "comment": "LHS of declaration doesn't start with a '$'" + }, + { + "src": ".local $bar = |foo| {{$bar}}", + "char": 14, + "comment": "`.local` RHS isn't an expression" + }, + { + "src": "{{extra}}content", + "char": 9, + "comment": "Trailing characters that are not whitespace" + }, + { + "src": ".match {|x|} * {{foo}}extra", + "char": 28, + "comment": "Trailing characters that are not whitespace" + }, + { + "src": "empty { }", + "char": 8, + "comment": "Empty expression" + }, + { + "src": ".match {} * {{foo}}", + "char": 8, + "comment": "Empty expression" + }, + { + "src": "bad {:}", + "char": 6, + "comment": "':' not preceding a function name" + }, + { + "src": "{{no-equal {|42| :number m }}}", + "char": 27, + "comment": "Missing '=' after option name" + }, + { + "src": "{{no-equal {|42| :number minimumFractionDigits 2}}}", + "char": 47, + "comment": "Missing '=' after option name" + }, + { + "src": "bad {:placeholder option value}", + "char": 25, + "comment": "Missing '=' after option name" + }, + { + "src": "hello {|4.2| :number min=2=3}", + "char": 26, + "comment": "Extra '=' after option name" + }, + { + "src": "hello {|4.2| :number min=2max=3}", + "char": 26, + "comment": "Missing space between options" + }, + { + "src": "hello {|4.2| :number min=|a|max=3}", + "char": 28, + "comment": "Missing whitespace between valid options" + }, + { + "src": "hello {|4.2| :number min=|\\a|}", + "char": 27, + "comment": "Ill-formed RHS of option -- the error should be within the RHS, not after parsing options" + }, + { + "src": "no-equal {|42| :number {}", + "char": 25, + "comment": "Junk after annotation" + }, + { + "src": "bad {:placeholder option=}", + "char": 25, + "comment": "Missing RHS of option" + }, + { + "src": "bad {:placeholder option}", + "char": 24, + "comment": "Missing RHS of option" + }, + { + "src": "bad {$placeholder option}", + "char": 18, + "comment": "Annotation is not a function or reserved text" + }, + { + "src": "no {$placeholder end", + "char": 17, + "comment": "Annotation is not a function or reserved text" + }, + { + "src": ".match * {{foo}}", + "char": 8, + "comment": "Missing expression in selectors" + }, + { + "src": ".match |x| * {{foo}}", + "char": 7, + "comment": "Non-expression in selectors" + }, + { + "src": ".match {|x|} * foo", + "char": 19, + "comment": "Missing RHS in variant" + }, + { + "src": "{$:abc}", + "char": 2, + "comment": "Variable names can't start with a : or -" + }, + { + "src": "{$-abc}", + "char": 2, + "comment": "Variable names can't start with a : or -" + }, + { + "src": "{$bar+foo}", + "char": 5, + "comment": "Missing space before annotation. Note that {{$bar:foo}} and {{$bar-foo}} are valid, because variable names can contain a ':' or a '-'" + }, + { + "src": "{|3.14|:foo}", + "char": 7, + "comment": "Missing space before annotation." + }, + { + "src": "{|3.14|-foo}", + "char": 7, + "comment": "Missing space before annotation." + }, + { + "src": "{|3.14|+foo}", + "char": 7, + "comment": "Missing space before annotation." + }, + { + "src": ".local $foo = {$bar} .match {$foo} :one {one} * {other}", + "char": 36, + "comment": "Unquoted literals can't begin with a ':'" + }, + { + "src": ".local $foo = {$bar :fun option=:a} {{bar {$foo}}}", + "char": 32, + "comment": "Unquoted literals can't begin with a ':'" + }, + { "src": "{|foo| {#markup}}", "char": 7, "comment": "Markup in wrong place" }, + { "src": "{|foo| #markup}", "char": 7, "comment": "Markup in wrong place" }, + { "src": "{|foo| {#markup/}}", "char": 7, "comment": "Markup in wrong place" }, + { "src": "{|foo| {/markup}}", "char": 7, "comment": "Markup in wrong place" }, + { "src": ".input $x = {|1|} {{{$x}}}", "char": 7, "comment": ".input with non-variable-expression" }, + { "src": ".input $x = {:number} {{{$x}}}", "char": 7, "comment": ".input with non-variable-expression" }, + { "src": ".input {|1| :number} {{{$x}}}", "char": 7, "comment": ".input with non-variable-expression" }, + { "src": ".input {:number} {{{$x}}}", "char": 7, "comment": ".input with non-variable-expression" }, + { "src": ".input {|1|} {{{$x}}}", "char": 7, "comment": ".input with non-variable-expression" }, + { "src": ".", "char": 1}, + { "src": "{", "char": 1}, + { "src": "}", "char": 0}, + { "src": "{}", "char": 1}, + { "src": "{{", "char": 2}, + { "src": "{{}", "char": 3}, + { "src": "{{}}}", "char": 4}, + { "src": "{|foo| #markup}", "char": 7}, + { "src": "{{missing end brace}", "char": 20}, + { "src": "{{missing end braces", "char": 20}, + { "src": "{{missing end {$braces", "char": 22}, + { "src": "{{extra}} content", "char": 10}, + { "src": "empty { } placeholder", "char": 8}, + { "src": "missing space {42:func}", "char": 17}, + { "src": "missing space {|foo|:func}", "char": 20}, + { "src": "missing space {|foo|@bar}", "char": 20}, + { "src": "missing space {:func@bar}", "char": 20}, + { "src": "{:func @bar@baz}", "char": 11}, + { "src": "{:func @bar=42@baz}", "char": 14}, + { "src": "{+reserved@bar}", "char": 10}, + { "src": "{&private@bar}", "char": 9}, + { "src": "bad {:} placeholder", "char": 6}, + { "src": "bad {\\u0000placeholder}", "char": 5}, + { "src": "no-equal {|42| :number minimumFractionDigits 2}", "char": 45}, + { "src": "bad {:placeholder option=}", "char": 25}, + { "src": "bad {:placeholder option value}", "char": 25}, + { "src": "bad {:placeholder option:value}", "char": 30}, + { "src": "bad {:placeholder option}", "char": 24}, + { "src": "bad {:placeholder:}", "char": 18}, + { "src": "bad {::placeholder}", "char": 6}, + { "src": "bad {:placeholder::foo}", "char": 18}, + { "src": "bad {:placeholder option:=x}", "char": 25}, + { "src": "bad {:placeholder :option=x}", "char": 18}, + { "src": "bad {:placeholder option::x=y}", "char": 25}, + { "src": "bad {$placeholder option}", "char": 18}, + { "src": "bad {:placeholder @attribute=}", "char": 29}, + { "src": "bad {:placeholder @attribute=@foo}", "char": 29}, + { "src": "no {placeholder end", "char": 16}, + { "src": "no {$placeholder end", "char": 17}, + { "src": "no {:placeholder end", "char": 20}, + { "src": "no {|placeholder| end", "char": 18}, + { "src": "no {|literal} end", "char": 17}, + { "src": "no {|literal or placeholder end", "char": 31}, + { "src": ".local bar = {|foo|} {{_}}", "char": 7}, + { "src": ".local #bar = {|foo|} {{_}}", "char": 7}, + { "src": ".local $bar {|foo|} {{_}}", "char": 12}, + { "src": ".local $bar = |foo| {{_}}", "char": 14}, + { "src": ".match {#foo} * {{foo}}", "char": 8}, + { "src": ".match {} * {{foo}}", "char": 8}, + { "src": ".match {|foo| :x} {|bar| :x} ** {{foo}}", "char": 30}, + { "src": ".match * {{foo}}", "char": 7}, + { "src": ".match {|x| :x} * foo", "char": 21}, + { "src": ".match {|x| :x} * {{foo}} extra", "char": 31}, + { "src": ".match |x| * {{foo}}", "char": 7}, + { "src": ".match {|foo| :string} o:ne {{one}} * {{other}}", "char": 24, "comment" : "tests for ':' in unquoted literals (not allowed)" }, + { "src": ".match {|foo| :string} one: {{one}} * {{other}}", "char": 26, "comment" : "tests for ':' in unquoted literals (not allowed)" }, + { "src": ".local $foo = {|42| :number option=a:b} {{bar {$foo}}}", "char": 36, "comment" : "tests for ':' in unquoted literals (not allowed)" }, + { "src": ".local $foo = {|42| :number option=a:b:c} {{bar {$foo}}}", "char": 36, "comment" : "tests for ':' in unquoted literals (not allowed)" }, + { "src": "{$bar:foo}", "char": 5, "comment" : "tests for ':' in unquoted literals (not allowed)"}, + { + "src": ".match {1} {{_}}", + "char": 12, + "comment": "Disambiguating a wrong .match from an unsupported statement" + }, + { + "src": "{{{/p o4.􍅲 = 1}}}", + "char": 9 + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-end-of-input.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-end-of-input.json new file mode 100644 index 00000000000..d97dcb24ac8 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-end-of-input.json @@ -0,0 +1,29 @@ +{ + "scenario": "Syntax errors for unexpected end-of-input", + "description": "Syntax errors; for ICU4C, the character offset is expected to be the last character", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { "src": ".local ", "char": 9 }, + { "src": ".lo", "char": 3 }, + { "src": ".local $foo", "char": 11 }, + { "src": ".local $foo = ", "char": 17 }, + { "src": "{:fszzz", "char": 7 }, + { "src": "{:fszzz ", "char": 10 }, + { "src": ".match {$foo} |xyz", "char": 19 }, + { "src": "{:f aaa", "char": 7 }, + { "src": "{{missing end brace", "char": 19 }, + { "src": "{{missing end brace}", "char": 20 }, + { "src": "{{missing end {$brace", "char": 21 }, + { "src": "{{missing end {$brace}", "char": 22 }, + { "src": "{{missing end {$brace}}", "char": 23 }, + { "src": "{{%xyz", "char": 6 } + ] +} + diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-reserved.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-reserved.json new file mode 100644 index 00000000000..e82421485d2 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/syntax-errors-reserved.json @@ -0,0 +1,22 @@ +{ + "scenario": "Reserved and private annotations", + "description": "Tests for old unsupported expression (reserved/private) syntax -- these are now syntax errors", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { "src" : "\\\\{ ? 󗟋 𫓜|@} |}" }, + { "src" : "\\\\{ ? 󗟋 𫓜|@} | \\} @𠟅򑚎𥪙𽧫=|| @򒘒򳷦㥞򉊷=$򸚶񽱆񅗽񤕞 @𰺱:񎫛񢶛򶈎񄮒}" }, + { "src" : "{ $iFN ^ @USh =$u @l}" }, + { "src" : ".local $dS ={ $p4 ^ |.| \\\\ @g:FV = $kd}{{@}}" }, + { "src" : ".D. \\\\ ||{1}{{}} " }, + { "src" : ".cIT ||{|@| % \\} } { *󔜫񥘃󸇀 }{{}}" }, + { "src" : ".򱋿󠆿 . |@| {$󛒁񓝖 & \\{ . @𯼼򋼡= $򵀀񓞈}{{\\\\}}" } + ] +} + diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/tricky-declarations.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/tricky-declarations.json new file mode 100644 index 00000000000..3fded666e63 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/tricky-declarations.json @@ -0,0 +1,19 @@ +{ + "scenario": "Declarations tests", + "description": "Tests for interesting combinations of .local and .input", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { "src": ".input {$var :number minimumFractionDigits=$var2} .input {$var2 :number minimumFractionDigits=5} {{{$var} {$var2}}}", + "exp": "1.000 3.00000", + "params": [{ "name": "var", "value": 1}, {"name": "var2", "value": 3 }], + "expErrors": [{ "type": "duplicate-declaration" }] + }, + { "src": ".local $var = {$var2} .local $var2 = {1} {{{$var} {$var2}}}", + "exp": "5 1", + "params": [{ "name": "var2", "value": 5 }], + "expErrors": [{ "type": "duplicate-declaration" }] + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/unsupported-expressions.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/unsupported-expressions.json new file mode 100644 index 00000000000..7e9a64943bd --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/unsupported-expressions.json @@ -0,0 +1,77 @@ +{ + "scenario": "Reserved and private annotations", + "description": "Tests for unsupported expressions (reserved/private) (now syntax errors)", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { "src": "hello {|4.2| %number}" }, + { "src": "hello {|4.2| %n|um|ber}" }, + { "src": "{+42}" }, + { "src": "hello {|4.2| &num|be|r}" }, + { "src": "hello {|4.2| ^num|be|r}" }, + { "src": "hello {|4.2| +num|be|r}" }, + { "src": "hello {|4.2| ?num|be||r|s}" }, + { "src": "hello {|foo| !number}" }, + { "src": "hello {|foo| *number}" }, + { "src": "hello {?number}" }, + { "src": "{xyzz }" }, + { "src": "hello {$foo ~xyzz }" }, + { "src": "hello {$x xyzz }" }, + { "src": "{ !xyzz }" }, + { "src": "{~xyzz }" }, + { "src": "{ num x \\\\ abcde |aaa||3.14||42| r }" }, + { "src": "hello {$foo >num x \\\\ abcde |aaa||3.14| |42| r }" }, + { "src" : ".input{ $n ~ }{{{$n}}}" }, + { "src": "foo {+reserved}"}, + { "src": "foo {&private}" }, + { "src": "foo {?reserved @a @b=$c}" }, + { "src": "{!.}" }, + { "src": "{! .}" }, + { "src": "{%}" }, + { "src": "{*}" }, + { "src": "{+}" }, + { "src": "{<}" }, + { "src": "{>}" }, + { "src": "{?}" }, + { "src": "{~}" }, + { "src": "{^.}" }, + { "src": "{^ .}" }, + { "src": "{&}" }, + { "src": "{!.\\{}" }, + { "src": "{!. \\{}" }, + { "src": "{!|a|}" }, + { "src": "{^}" }, + { "src": "{!}" }, + { "src": ".match {$foo !select} |1| {{one}} * {{other}}" }, + { "src": ".match {$foo ^select} |1| {{one}} * {{other}}" }, + { "src": ".match {|horse| ^private}\n 1 {{The value is one.}} * {{The value is not one.}}" }, + { "src": ".match {$foo ^select} |1| {{one}} * {{other}}" } + ] +} + diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/unsupported-statements.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/unsupported-statements.json new file mode 100644 index 00000000000..46cf75ac1e9 --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/unsupported-statements.json @@ -0,0 +1,27 @@ +{ + "scenario": "Reserved statements", + "description": "Tests for unsupported statements (now syntax errors)", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { "src" : ".i {1} {{}}" }, + { "src" : ".l $y = {|bar|} {{}}" }, + { "src" : ".l $x.y = {|bar|} {{}}" }, + { "src": ".matc {-1} {{hello}}" }, + { "src": ".m {-1} {{hello}}" }, + { "src": ".n{a}{{}}" }, + { "src": ".foo {42} {{bar}}" }, + { "src": ".foo{42}{{bar}}" }, + { "src": ".foo |}lit{| {42}{{bar}}" }, + { "src": ".n .{a}{{}}" }, + { "src": ".n. {a}{{}}" }, + { "src": ".n.{a}{b}{{}}" } + ] +} + diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/valid-tests.json b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/valid-tests.json new file mode 100644 index 00000000000..4b1ce8d67fb --- /dev/null +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/message2/valid-tests.json @@ -0,0 +1,156 @@ +{ + "scenario": "Valid tests", + "description": "Additional valid tests", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { "src": "hello {|4.2| :number minimumFractionDigits=2}", "exp": "hello 4.20"}, + { "src": "hello {|4.2| :number minimumFractionDigits = 2}", "exp": "hello 4.20" }, + { "src": "hello {|4.2| :number minimumFractionDigits= 2}", "exp": "hello 4.20" }, + { "src": "hello {|4.2| :number minimumFractionDigits =2}", "exp": "hello 4.20"}, + { "src": "hello {|4.2| :number minimumFractionDigits=2 }", "exp": "hello 4.20"}, + { "src": "hello {|4.2| :number minimumFractionDigits=2 bar=3}", "exp": "hello 4.20"}, + { "src": "hello {|4.2| :number minimumFractionDigits=2 bar=3 }", "exp": "hello 4.20"}, + { "src": "hello {|4.2| :number minimumFractionDigits=|2|}", "exp": "hello 4.20"}, + { "src": "content -tag", "exp": "content -tag"}, + { "src": "", "exp": ""}, + { "src": "{|hel\\\\lo|}", "exp": "hel\\lo"}, + { "src": "{|hel\\|lo|}", "exp": "hel|lo"}, + { "src": "{|hel\\|\\\\lo|}", "exp": "hel|\\lo"}, + { "src": "hel\\{lo", "exp": "hel{lo"}, + { "src": "hel\\}lo", "exp": "hel}lo"}, + { "src": "hel\\\\lo", "exp": "hel\\lo"}, + { "src": "hel\\{\\\\lo", "exp": "hel{\\lo"}, + { "src": "hel\\{\\}lo", "exp": "hel{}lo"}, + { "src": "hello {|wo\nrld|}", "exp": "hello wo\nrld"}, + { "src": "hello wo\nrld", "exp": "hello wo\nrld"}, + { "src": "{#tag/} content", "exp": " content"}, + { "src": "{#tag} content", "exp": " content"}, + { "src": "{#tag/} {|content|}", "exp": " content"}, + { "src": "{#tag} {|content|}", "exp": " content"}, + { "src": "{|content|} {#tag/}", "exp": "content "}, + { "src": "{|content|} {#tag}", "exp": "content "}, + { "src": "{/tag} {|content|}", "exp": " content"}, + { "src": "{|content|} {/tag}", "exp": "content "}, + { "src": "{#tag} {|content|} {/tag}", "exp": " content "}, + { "src": "{/tag} {|content|} {#tag}", "exp": " content "}, + { "src": "{#tag/} {|content|} {#tag}", "exp": " content "}, + { "src": "{#tag/} {|content|} {/tag}", "exp": " content "}, + { "src": "{#tag foo=bar/} {|content|}", "exp": " content"}, + { "src": "{#tag foo=bar} {|content|}", "exp": " content"}, + { "src": "{/tag foo=bar} {|content|}", "exp": " content"}, + { "src": "{#tag foo=bar} {|content|} {/tag foo=bar}", "exp": " content "}, + { "src": "{/tag foo=bar} {|content|} {#tag foo=bar}", "exp": " content "}, + { "src": "{#tag foo=bar /} {|content|} {#tag foo=bar}", "exp": " content "}, + { "src": "{#tag foo=bar/} {|content|} {/tag foo=bar}", "exp": " content "}, + { "src": "The value is {horse @horse}.", "exp": "The value is horse."}, + { "src": "hello {|4.2| @number}", "exp": "hello 4.2"}, + { "src": "The value is {horse @horse=cool}.", "exp": "The value is horse."}, + { "src": "hello {|4.2| @number=5}", "exp": "hello 4.2"}, + { "src": "{-1}", "exp": "-1"}, + { "src": "{0}", "exp": "0"}, + { "src": "{0.0123}", "exp": "0.0123"}, + { "src": "{1.234e5}", "exp": "1.234e5", + "ignoreJava": "See ICU-22810"}, + { "src": "{1.234E5}", "exp": "1.234E5", + "ignoreJava": "See ICU-22810"}, + { "src": "{1.234E+5}", "exp": "1.234E+5", + "ignoreJava": "See ICU-22810"}, + { "src": "{1.234e-5}", "exp": "1.234e-5", + "ignoreJava": "See ICU-22810"}, + { "src": "{42e5}", "exp": "42e5", + "ignoreJava": "See ICU-22810"}, + { "src": "{42e0}", "exp": "42e0", + "ignoreJava": "See ICU-22810"}, + { "src": "{42e000}", "exp": "42e000", + "ignoreJava": "See ICU-22810"}, + { "src": "{42e369}", "exp": "42e369", + "ignoreJava": "See ICU-22810"}, + { "src": "hello {|3| :number }", "exp": "hello 3" }, + { "src": "{:foo}", "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{:foo }", "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{:foo }", "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{:foo k=v}", "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{:foo k=v }", "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{:foo k1=v1 k2=v2}", "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{:foo k1=v1 k2=v2 }", "expErrors": [{ "type": "unknown-function" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{|3.14| }", "exp": "3.14" }, + { "src": "{|3.14| }", "exp": "3.14" }, + { "src": "{|3.14| :number}", "exp": "3.14" }, + { "src": "{|3.14| :number }", "exp": "3.14" }, + { "src": "{$bar }", "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{$bar }", "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{$bar :foo}", "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{$bar :foo }", "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": "{$bar-foo}", "expErrors": [{ "type": "unresolved-variable" }], + "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" }, + { "src": ".local $foo = {|hello|} .local $foo = {$foo} {{{$foo}}}", + "expErrors": [{ "type": "duplicate-declaration" }] }, + { "src": "good {placeholder}", "exp": "good placeholder" }, + { + "src": "a\\\\qbc", + "exp": "a\\qbc", + "comment": "pattern -> escaped-char -> backslash backslash" + }, + { + "comment": "message -> simple-message -> simple-start pattern -> escaped-char", + "src": "\\\\", + "exp": "\\" + }, + { + "comment": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" s \"#\" identifier \"}\"", + "src": "{ #a}", + "exp": "" + }, + { + "comment": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" s \"/\" identifier \"}\"", + "src": "{ /a}", + "exp": "" + }, + { + "comment": "message -> complex-message -> *(declaration [s]) complex-body -> declaration complex-body -> input-declaration complex-body -> input variable-expression complex-body", + "src": ".input{$x}{{}}", + "exp": "" + }, + { + "comment": "Test that escaped characters are re-escaped properly when serializing literals", + "src": "{|\\}|}", + "exp": "}" + }, + { + "comment": "Test that escaped characters are re-escaped properly when serializing patterns", + "src": "\\|", + "exp": "|" + }, + { + "comment": "Test that parser and serializer treat optionally-escaped characters consistently", + "src" : "{{{1}|}}", + "exp": "1|" + }, + { + "comment": "Trailing whitespace after match is valid", + "src": ".match {1 :string} * {{}} ", + "exp": "" + }, + { + "src" : "𴢸", + "exp" : "𴢸" + }, + { + "src" : "{{􍅲}}", + "exp" : "􍅲" + } + ] +} diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/grapheme.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/grapheme.txt index d5776f33c20..0a811057a57 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/grapheme.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/grapheme.txt @@ -18,7 +18,7 @@ CR = [\p{Grapheme_Cluster_Break = CR}]; LF = [\p{Grapheme_Cluster_Break = LF}]; Control = [[\p{Grapheme_Cluster_Break = Control}]]; -Extend = [[\p{Grapheme_Cluster_Break = Extend}]]; +Extend_ = [[\p{Grapheme_Cluster_Break = Extend}]]; ZWJ = [\p{Grapheme_Cluster_Break = ZWJ}]; Regional_Indicator = [\p{Grapheme_Cluster_Break = Regional_Indicator}]; Prepend = [\p{Grapheme_Cluster_Break = Prepend}]; @@ -38,11 +38,9 @@ LVT = [\p{Grapheme_Cluster_Break = LVT}]; Extended_Pict = [:ExtPict:]; # Indic Sequences -Virama_ = [[\p{Gujr}\p{sc=Telu}\p{sc=Mlym}\p{sc=Orya}\p{sc=Beng}\p{sc=Deva}] & [\p{Indic_Syllabic_Category=Virama}]]; - -LinkingConsonant = [[\p{Gujr}\p{sc=Telu}\p{sc=Mlym}\p{sc=Orya}\p{sc=Beng}\p{sc=Deva}] & [\p{Indic_Syllabic_Category=Consonant}]]; - -ExtCccZwj = [[Extend-[\p{ccc=0}]] ZWJ]; +InCBLinker = [\p{InCB=Linker}]; +InCBConsonant = [\p{InCB=Consonant}]; +InCBExtend = [\p{InCB=Extend}]; GB3: CR LF; GB4: (Control | CR | LF) ÷; @@ -52,9 +50,9 @@ GB6: L (L | V | LV | LVT); GB7: (LV | V) (V | T); GB8: (LVT | T) T; -GB11: Extended_Pict Extend* ZWJ Extended_Pict; -GB9c: LinkingConsonant ExtCccZwj* Virama_ ExtCccZwj* LinkingConsonant; -GB9: . (Extend | ZWJ); +GB11: Extended_Pict Extend_* ZWJ Extended_Pict; +GB9c: InCBConsonant ( InCBExtend | InCBLinker )* InCBLinker ( InCBExtend | InCBLinker )* InCBConsonant; +GB9: . (Extend_ | ZWJ); GB9a: . SpacingMark; GB9b: Prepend .; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt index 9f85b791713..e2154abf630 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line.txt @@ -176,7 +176,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt index 7aad76ecf10..bb0a6880ea2 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_cj.txt @@ -180,7 +180,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt index 72e7563c927..f9152060bf2 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose.txt @@ -181,7 +181,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt index 99d01874d1f..b04236532bb 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_loose_cj.txt @@ -200,7 +200,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA BAX HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt index 21129853979..c7c518d5b68 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal.txt @@ -182,7 +182,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt index 2061f917084..cfa9c7968e1 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/line_normal_cj.txt @@ -186,7 +186,7 @@ LB11.2: SP WJ; LB11.3: WJ CM* [^CM]; # Needs to apply before LB12, because the new monkeys are not greedy. -LB20a.2: GL (HY | HH) CM* AL; +LB20a.2: GL CM* (HY | HH) CM* AL; LB12: GL CM* [^CM]; LB12a: [^SP BA HY] CM* GL; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/word.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/word.txt index 002d1af5780..5ace30266c8 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/word.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/word.txt @@ -29,7 +29,7 @@ ALetter = [\p{Word_Break = ALetter}]; Single_Quote = [\p{Word_Break = Single_Quote}]; Double_Quote = [\p{Word_Break = Double_Quote}]; MidNumLet = [\p{Word_Break = MidNumLet}]; -MidLetter = [\p{Word_Break = MidLetter} - [\: \uFE55 \uFF1A]]; +MidLetter = [\p{Word_Break = MidLetter}]; MidNum = [\p{Word_Break = MidNum}]; Numeric = [\p{Word_Break = Numeric}]; ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/word_POSIX.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/word_POSIX.txt index fc4eedeb8bd..7fdc1a1ee07 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/word_POSIX.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/break_rules/word_POSIX.txt @@ -28,7 +28,7 @@ ALetter = [\p{Word_Break = ALetter}]; Single_Quote = [\p{Word_Break = Single_Quote}]; Double_Quote = [\p{Word_Break = Double_Quote}]; MidNumLet = [\p{Word_Break = MidNumLet} - [.]]; -MidLetter = [\p{Word_Break = MidLetter} - [\: \uFE55 \uFF1A]]; +MidLetter = [\p{Word_Break = MidLetter} - [\:]]; MidNum = [\p{Word_Break = MidNum} [.]]; Numeric = [\p{Word_Break = Numeric}]; ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; diff --git a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt index 7d77588ef97..781ce068be7 100644 --- a/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt +++ b/icu4j/main/core/src/test/resources/com/ibm/icu/dev/test/rbbi/rbbitst.txt @@ -169,18 +169,9 @@ # #•\u0e40\u0e01•\u0e44\u0301\u0e23\u0302\u0303•\u0e40•\u0e40\u0e02•\u0e02• • -# -# ICU-13637 and CLDR-10994 - Indic Grapheme Cluster Boundary changes to support aksaras -# New rule: LinkingConsonant ExtCccZwj* Virama ExtCccZwj* × LinkingConsonant -# Sample Chars: LinkingConsonant: \u0915 -# Virama: \u094d [also Extend] -# ExtCccZWJ: \u0308 -# Extend but not ExtCCCZWJ \u093A - -•\u0915\u094d\u0915• -•\u0915\u0308\u0308\u094d\u0308\u0308\u0915• -•\u0915\u0308\u0308\u094d\u0308\u0308•\u0041• -•\u0915\u0308\u0308\u094d\u093A\u093A•\u0915• +# From L2/14-131, §3.2; made into a single EGC by UTC-179-C31. +# This test would have caught ICU-22956. +•સૻ્સૻ• # # From cldr/common/testData/segmentation/graphemeCluster/TestSegmenter-Bengali.txt @@ -1583,7 +1574,7 @@ Bangkok)• -•Can't<200> •have<200> •breaks<200> •in<200> •xx<200>:•yy<200> •or<200> •struct.field<200> \ +•Can't<200> •have<200> •breaks<200> •in<200> •xx:yy<200> •or<200> •struct.field<200> \ •for<200> •CS<200>-•types<200>.• •\uFF92\uFF76\uFF9E<400> • •xx<200>@•yy<200>.• @@ -2223,3 +2214,7 @@ Bangkok)• •« Complex »« chaining » • •« .618 »• # Interaction with the ICU tailoring to break before such numbers. +# A hyphen following non-breaking space that carries an intervening combining +# mark is treated as word-initial; by LB20a it has no break opportunity after +# it. A bug in ICU 76 incorrectly handled that case (ICU-22986). +• ̄-k• \ No newline at end of file diff --git a/icu4j/main/currdata/pom.xml b/icu4j/main/currdata/pom.xml index 53a41960b9a..ed3352fa2b1 100644 --- a/icu4j/main/currdata/pom.xml +++ b/icu4j/main/currdata/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/framework/pom.xml b/icu4j/main/framework/pom.xml index 832c518e4bf..32a8df86610 100644 --- a/icu4j/main/framework/pom.xml +++ b/icu4j/main/framework/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/framework/src/test/java/com/ibm/icu/dev/test/UnicodeKnownIssues.java b/icu4j/main/framework/src/test/java/com/ibm/icu/dev/test/UnicodeKnownIssues.java index 0c4c2c30782..ff9fd382d12 100644 --- a/icu4j/main/framework/src/test/java/com/ibm/icu/dev/test/UnicodeKnownIssues.java +++ b/icu4j/main/framework/src/test/java/com/ibm/icu/dev/test/UnicodeKnownIssues.java @@ -6,7 +6,6 @@ package com.ibm.icu.dev.test; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -120,7 +119,7 @@ public class UnicodeKnownIssues { return false; } logFn.accept("\n " + knownIssues.size() + " Known Issues:"); - for (Entry> entry : knownIssues.entrySet()) { + for (Map.Entry> entry : knownIssues.entrySet()) { String ticketLink = entry.getKey(); if (UNICODE_JIRA_PATTERN.matcher(ticketLink) != null) { logFn.accept(ticketLink + " <" + UNICODE_JIRA_BROWSE + ticketLink + ">"); diff --git a/icu4j/main/icu4j/pom.xml b/icu4j/main/icu4j/pom.xml index 182026251df..bd87662e62f 100644 --- a/icu4j/main/icu4j/pom.xml +++ b/icu4j/main/icu4j/pom.xml @@ -9,11 +9,12 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml icu4j + ICU4J International Components for Unicode for Java (ICU4J) is a mature, widely used Java library providing Unicode and Globalization support ${proj.url} diff --git a/icu4j/main/langdata/pom.xml b/icu4j/main/langdata/pom.xml index ade5a882f70..6310217c076 100644 --- a/icu4j/main/langdata/pom.xml +++ b/icu4j/main/langdata/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/localespi/pom.xml b/icu4j/main/localespi/pom.xml index 1526e98516c..d819f3c3ab0 100644 --- a/icu4j/main/localespi/pom.xml +++ b/icu4j/main/localespi/pom.xml @@ -8,11 +8,12 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml icu4j-localespi + ICU4J Locale Service Provider icu4j-localespi is a supplemental library for icu4j, implementing Java Locale SPI. ${proj.url} diff --git a/icu4j/main/regiondata/pom.xml b/icu4j/main/regiondata/pom.xml index 858200ed598..0a71c8986f8 100644 --- a/icu4j/main/regiondata/pom.xml +++ b/icu4j/main/regiondata/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/translit/pom.xml b/icu4j/main/translit/pom.xml index 7219f4bf383..98f8a639f44 100644 --- a/icu4j/main/translit/pom.xml +++ b/icu4j/main/translit/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/main/translit/src/main/resources/com/ibm/icu/impl/data/icudata/translit/root.res b/icu4j/main/translit/src/main/resources/com/ibm/icu/impl/data/icudata/translit/root.res index 966ed456aa9..f23ac3dd2a3 100644 Binary files a/icu4j/main/translit/src/main/resources/com/ibm/icu/impl/data/icudata/translit/root.res and b/icu4j/main/translit/src/main/resources/com/ibm/icu/impl/data/icudata/translit/root.res differ diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/IncrementalProgressTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/IncrementalProgressTest.java index 285de0b490a..e683239fb03 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/IncrementalProgressTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/IncrementalProgressTest.java @@ -66,12 +66,12 @@ public class IncrementalProgressTest extends TestFmwk { @Test public void TestIncrementalProgress() { - Enumeration targets = Transliterator.getAvailableTargets(this.lang); + Enumeration targets = Transliterator.getAvailableTargets(this.lang); while(targets.hasMoreElements()) { - String target = (String) targets.nextElement(); - Enumeration variants = Transliterator.getAvailableVariants(this.lang, target); + String target = targets.nextElement(); + Enumeration variants = Transliterator.getAvailableVariants(this.lang, target); while(variants.hasMoreElements()) { - String variant = (String) variants.nextElement(); + String variant = variants.nextElement(); String id = this.lang + "-" + target + "/" + variant; logln("id: " + id); diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java index ea0afe876af..2adcd6e5045 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java @@ -184,9 +184,9 @@ public class RegexUtilitiesTest extends TestFmwk { String result; if (test.endsWith(".txt")) { java.io.InputStream is = RegexUtilitiesTest.class.getResourceAsStream(test); - List lines; + List lines; try { - lines = UnicodeRegex.appendLines(new ArrayList(), is, "UTF-8"); + lines = UnicodeRegex.appendLines(new ArrayList<>(), is, "UTF-8"); } finally { is.close(); } diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorDisorderedMarksTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorDisorderedMarksTest.java index 47be5b3a8d1..651131a666f 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorDisorderedMarksTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorDisorderedMarksTest.java @@ -5,7 +5,6 @@ package com.ibm.icu.dev.test.translit; import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -102,7 +101,7 @@ public class TransliteratorDisorderedMarksTest extends TestFmwk { } - for (Entry x : leadToSources.entrySet()) { + for (Map.Entry x : leadToSources.entrySet()) { Integer lead = x.getKey(); UnicodeSet sources = x.getValue(); UnicodeSet trailSet = leadToTrail.get(lead); diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorInstantiateAllTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorInstantiateAllTest.java index 855182964c0..42c08334a81 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorInstantiateAllTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorInstantiateAllTest.java @@ -29,11 +29,11 @@ public class TransliteratorInstantiateAllTest extends TestFmwk { } @Parameterized.Parameters - public static Collection testData() { + public static Collection testData() { ArrayList allTranslitIDs = new ArrayList(); - for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { - String id = (String) e.nextElement(); + for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { + String id = e.nextElement(); allTranslitIDs.add(id); } diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorTest.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorTest.java index 42a364a7219..2971f940701 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorTest.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/TransliteratorTest.java @@ -139,8 +139,8 @@ public class TransliteratorTest extends TestFmwk { checkRegistry("foo3", "::[a-z]; ::NFC; [:letter:] a > b;"); // check compound checkRegistry("foo2", "::NFC; [:letter:] a > b;"); // check compound checkRegistry("foo1", "[:letter:] a > b;"); - for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { - String id = (String) e.nextElement(); + for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { + String id = e.nextElement(); checkRegistry(id); } // Need to remove these test-specific transliterators in order not to interfere with other tests. @@ -1538,25 +1538,25 @@ public class TransliteratorTest extends TestFmwk { @Test public void TestSTV() { - Enumeration es = Transliterator.getAvailableSources(); + Enumeration es = Transliterator.getAvailableSources(); for (int i=0; es.hasMoreElements(); ++i) { - String source = (String) es.nextElement(); + String source = es.nextElement(); logln("" + i + ": " + source); if (source.length() == 0) { errln("FAIL: empty source"); continue; } - Enumeration et = Transliterator.getAvailableTargets(source); + Enumeration et = Transliterator.getAvailableTargets(source); for (int j=0; et.hasMoreElements(); ++j) { - String target = (String) et.nextElement(); + String target = et.nextElement(); logln(" " + j + ": " + target); if (target.length() == 0) { errln("FAIL: empty target"); continue; } - Enumeration ev = Transliterator.getAvailableVariants(source, target); + Enumeration ev = Transliterator.getAvailableVariants(source, target); for (int k=0; ev.hasMoreElements(); ++k) { - String variant = (String) ev.nextElement(); + String variant = ev.nextElement(); if (variant.length() == 0) { logln(" " + k + ": "); } else { @@ -1599,25 +1599,25 @@ public class TransliteratorTest extends TestFmwk { } // Make sure getAvailable API reflects removal - for (Enumeration e = Transliterator.getAvailableIDs(); + for (Enumeration e = Transliterator.getAvailableIDs(); e.hasMoreElements(); ) { - String id = (String) e.nextElement(); + String id = e.nextElement(); for (int i=0; i<3; ++i) { if (id.equals(FULL_IDS[i])) { errln("FAIL: unregister(" + id + ") failed"); } } } - for (Enumeration e = Transliterator.getAvailableTargets("Any"); + for (Enumeration e = Transliterator.getAvailableTargets("Any"); e.hasMoreElements(); ) { - String t = (String) e.nextElement(); + String t = e.nextElement(); if (t.equals(IDS[0])) { errln("FAIL: unregister(Any-" + t + ") failed"); } } - for (Enumeration e = Transliterator.getAvailableSources(); + for (Enumeration e = Transliterator.getAvailableSources(); e.hasMoreElements(); ) { - String s = (String) e.nextElement(); + String s = e.nextElement(); for (int i=0; i<3; ++i) { if (SOURCES[i] == null) continue; if (s.equals(SOURCES[i])) { @@ -2545,8 +2545,8 @@ public class TransliteratorTest extends TestFmwk { @Test public void TestScriptAllCodepoints(){ int code; - HashSet scriptIdsChecked = new HashSet(); - HashSet scriptAbbrsChecked = new HashSet(); + HashSet scriptIdsChecked = new HashSet<>(); + HashSet scriptAbbrsChecked = new HashSet<>(); for( int i =0; i <= 0x10ffff; i++){ code = UScript.getScript(i); if(code==UScript.INVALID_CODE){ @@ -2683,7 +2683,7 @@ public class TransliteratorTest extends TestFmwk { static class DummyFactory implements Transliterator.Factory { static DummyFactory singleton = new DummyFactory(); - static HashMap m = new HashMap(); + static HashMap m = new HashMap<>(); // Since Transliterators are immutable, we don't have to clone on set & get static void add(String ID, Transliterator t) { @@ -2693,7 +2693,7 @@ public class TransliteratorTest extends TestFmwk { } @Override public Transliterator getInstance(String ID) { - return (Transliterator) m.get(ID); + return m.get(ID); } } @@ -2896,7 +2896,7 @@ public class TransliteratorTest extends TestFmwk { static class TestUserFunctionFactory implements Transliterator.Factory { static TestUserFunctionFactory singleton = new TestUserFunctionFactory(); - static HashMap m = new HashMap(); + static HashMap m = new HashMap<>(); static void add(String ID, Transliterator t) { m.put(new CaseInsensitiveString(ID), t); @@ -2905,13 +2905,13 @@ public class TransliteratorTest extends TestFmwk { @Override public Transliterator getInstance(String ID) { - return (Transliterator) m.get(new CaseInsensitiveString(ID)); + return m.get(new CaseInsensitiveString(ID)); } static void unregister() { - Iterator ids = m.keySet().iterator(); + Iterator ids = m.keySet().iterator(); while (ids.hasNext()) { - CaseInsensitiveString id = (CaseInsensitiveString) ids.next(); + CaseInsensitiveString id = ids.next(); Transliterator.unregister(id.getString()); ids.remove(); // removes pair from m } diff --git a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/WriteCharts.java b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/WriteCharts.java index 2cb05f3440b..5504af39b04 100644 --- a/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/WriteCharts.java +++ b/icu4j/main/translit/src/test/java/com/ibm/icu/dev/test/translit/WriteCharts.java @@ -58,11 +58,11 @@ public class WriteCharts { } public static String[] getAllScripts() { - Set set = new TreeSet(); + Set set = new TreeSet<>(); int scripts[]; - Enumeration sources = Transliterator.getAvailableSources(); + Enumeration sources = Transliterator.getAvailableSources(); while(sources.hasMoreElements()) { - String source = (String) sources.nextElement(); + String source = sources.nextElement(); scripts = UScript.getCode(source); if (scripts == null) { System.out.println("[Skipping " + source + "]"); @@ -70,9 +70,9 @@ public class WriteCharts { } int sourceScript = scripts[0]; System.out.println("Source: " + source + ";\tScripts: " + showScripts(scripts)); - Enumeration targets = Transliterator.getAvailableTargets(source); + Enumeration targets = Transliterator.getAvailableTargets(source); while(targets.hasMoreElements()) { - String target = (String) targets.nextElement(); + String target = targets.nextElement(); scripts = UScript.getCode(target); if (scripts == null || priority(scripts[0]) < priority(sourceScript)) { @@ -81,9 +81,9 @@ public class WriteCharts { continue; } System.out.println("\tTarget: " + target + ";\tScripts: " + showScripts(scripts)); - Enumeration variants = Transliterator.getAvailableVariants(source, target); + Enumeration variants = Transliterator.getAvailableVariants(source, target); while(variants.hasMoreElements()) { - String variant = (String) variants.nextElement(); + String variant = variants.nextElement(); String id = source + "-" + target; if (variant.length() != 0) { id += "/" + variant; @@ -167,7 +167,7 @@ public class WriteCharts { UnicodeSet leftOverSet = new UnicodeSet(targetSet); UnicodeSet privateUse = new UnicodeSet("[:private use:]"); - Map map = new TreeMap(); + Map map = new TreeMap<>(); UnicodeSet targetSetPlusAnyways = new UnicodeSet(targetSet); targetSetPlusAnyways.addAll(okAnyway); @@ -315,7 +315,7 @@ public class WriteCharts { out.println("

Round Trip

"); out.println(tableHeader); - Iterator it = map.keySet().iterator(); + Iterator it = map.keySet().iterator(); char lastGroup = 0; int count = 0; int column = 0; diff --git a/icu4j/perf-tests/pom.xml b/icu4j/perf-tests/pom.xml index 31ab0491de9..3ac628e8564 100644 --- a/icu4j/perf-tests/pom.xml +++ b/icu4j/perf-tests/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT perf-tests diff --git a/icu4j/pom.xml b/icu4j/pom.xml index e79083871ea..faeb96a96fc 100644 --- a/icu4j/pom.xml +++ b/icu4j/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT pom ${proj-title} (${project.artifactId}) @@ -72,7 +72,7 @@ https://github.com/unicode-org/icu - 76 + 77 @@ -235,6 +235,9 @@ maven-deploy-plugin 3.1.3 + + true + maven-site-plugin diff --git a/icu4j/releases_tools/shared.sh b/icu4j/releases_tools/shared.sh index 1b9b39272b2..3eec622421f 100755 --- a/icu4j/releases_tools/shared.sh +++ b/icu4j/releases_tools/shared.sh @@ -5,10 +5,10 @@ export MAVEN_ARGS='--no-transfer-progress' # Version update! -export artifact_version='76.1-SNAPSHOT' -export github_rel_version='76rc' -export api_report_version='76' -export api_report_prev_version='75' +export artifact_version='77.0.1-SNAPSHOT' +export github_rel_version='77_0_1' +export api_report_version='77' +export api_report_prev_version='76' export out_dir=target function checkThatJdk8IsDefault() { diff --git a/icu4j/samples/pom.xml b/icu4j/samples/pom.xml index 910be88c6ac..61b28f65109 100644 --- a/icu4j/samples/pom.xml +++ b/icu4j/samples/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT samples diff --git a/icu4j/tools/build/pom.xml b/icu4j/tools/build/pom.xml index 6113e7e452f..7f027bd4b51 100644 --- a/icu4j/tools/build/pom.xml +++ b/icu4j/tools/build/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/tools/build/src/main/java/com/ibm/icu/dev/tool/coverage/JacocoReportCheck.java b/icu4j/tools/build/src/main/java/com/ibm/icu/dev/tool/coverage/JacocoReportCheck.java index 1c9eb9d70e2..20f546314b7 100644 --- a/icu4j/tools/build/src/main/java/com/ibm/icu/dev/tool/coverage/JacocoReportCheck.java +++ b/icu4j/tools/build/src/main/java/com/ibm/icu/dev/tool/coverage/JacocoReportCheck.java @@ -23,6 +23,7 @@ import java.util.TreeSet; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.XMLConstants; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -142,7 +143,16 @@ public class JacocoReportCheck { private static Map parseReport(File reportXmlFile) { try { Map entries = new TreeMap(); - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + // Securely configure DocumentBuilderFactory + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + docFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + docFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + docFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); + docFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + docFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + docFactory.setNamespaceAware(true); + + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); docBuilder.setEntityResolver(new EntityResolver() { // Ignores JaCoCo report DTD public InputSource resolveEntity(String publicId, String systemId) { diff --git a/icu4j/tools/misc/pom.xml b/icu4j/tools/misc/pom.xml index 61cd0a9a841..796b87eb17d 100644 --- a/icu4j/tools/misc/pom.xml +++ b/icu4j/tools/misc/pom.xml @@ -8,7 +8,7 @@ com.ibm.icu icu4j-root - 76.1-SNAPSHOT + 77.0.1-SNAPSHOT ../../pom.xml diff --git a/icu4j/tools/misc/src/main/java/com/ibm/icu/dev/tool/localeconverter/XLIFF2ICUConverter.java b/icu4j/tools/misc/src/main/java/com/ibm/icu/dev/tool/localeconverter/XLIFF2ICUConverter.java index aece3d7d6e4..94a0a730dad 100644 --- a/icu4j/tools/misc/src/main/java/com/ibm/icu/dev/tool/localeconverter/XLIFF2ICUConverter.java +++ b/icu4j/tools/misc/src/main/java/com/ibm/icu/dev/tool/localeconverter/XLIFF2ICUConverter.java @@ -20,6 +20,7 @@ import java.util.Date; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; @@ -407,7 +408,22 @@ public final class XLIFF2ICUConverter { String urls = filenameToURL(xmlfileName); DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); - dfactory.setNamespaceAware(true); + + try { + // Set secure processing features to avoid XXE attacks + dfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + dfactory.setNamespaceAware(true); + + // Disable access to external DTDs and entities to mitigate XXE attacks + dfactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + dfactory.setFeature("http://xml.org/sax/features/external-general-entities", false); + dfactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + dfactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + } catch (ParserConfigurationException e) { + System.err.println("ERROR: Parser configuration error: " + e.getMessage()); + System.exit(-1); + } + Document doc = null; if (xliff10) { diff --git a/testdata/message2/alias-selector-annotations.json b/testdata/message2/alias-selector-annotations.json index c064d40d4c8..d5307c5b119 100644 --- a/testdata/message2/alias-selector-annotations.json +++ b/testdata/message2/alias-selector-annotations.json @@ -6,11 +6,11 @@ }, "tests": [ { - "src": ".local $one = {|The one| :string}\n .match {$one}\n 1 {{Value is one}}\n * {{Value is not one}}", + "src": ".local $one = {|The one| :string}\n .match $one\n 1 {{Value is one}}\n * {{Value is not one}}", "exp": "Value is not one" }, { - "src": ".local $one = {|The one| :string}\n .local $two = {$one}\n .match {$two}\n 1 {{Value is one}}\n * {{Value is not one}}", + "src": ".local $one = {|The one| :string}\n .local $two = {$one}\n .match $two\n 1 {{Value is one}}\n * {{Value is not one}}", "exp": "Value is not one" } ] diff --git a/testdata/message2/bidi.json b/testdata/message2/bidi.json new file mode 100644 index 00000000000..0654befba25 --- /dev/null +++ b/testdata/message2/bidi.json @@ -0,0 +1,160 @@ +{ + "scenario": "Bidi support", + "description": "Tests for correct parsing of messages with bidirectional marks and isolates", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "comment": "simple-message = o [simple-start pattern]", + "src": " \u061C Hello world!", + "exp": " \u061C Hello world!" + }, + { + "comment": "complex-message = o *(declaration o) complex-body o", + "src": "\u200E .local $x = {1} {{ {$x}}}", + "exp": " 1" + }, + { + "comment": "complex-message = o *(declaration o) complex-body o", + "src": ".local $x = {1} \u200F {{ {$x}}}", + "exp": " 1" + }, + { + "comment": "complex-message = o *(declaration o) complex-body o", + "src": ".local $x = {1} {{ {$x}}} \u2066", + "exp": " 1" + }, + { + "comment": "input-declaration = input o variable-expression", + "src": ".input \u2067 {$x :number} {{hello}}", + "params": [{"name": "x", "value": "1"}], + "exp": "hello" + }, + { + "comment": "local s variable o \"=\" o expression", + "src": ".local $x \u2068 = \u2069 {1} {{hello}}", + "exp": "hello" + }, + { + "comment": "local s variable o \"=\" o expression", + "src": ".local \u2067 $x = {1} {{hello}}", + "exp": "hello" + }, + { + "comment": "local s variable o \"=\" o expression", + "src": ".local\u2067 $x = {1} {{hello}}", + "exp": "hello" + }, + { + "comment": "o \"{{\" pattern \"}}\"", + "src": "\u2067 {{hello}}", + "exp": "hello" + }, + { + "comment": "match-statement s variant *(o variant)", + "src": [".local $x = {1 :number}\n", + ".match $x\n", + "1 {{one}}\n", + "\u061C * {{other}}"], + "exp": "one" + }, + { + "comment": "match-statement s variant *(o variant)", + "src": [".local $x = {1 :number}", + ".match $x \u061c", + "1 {{one}}", + "* {{other}}"], + "exp": "one" + }, + { + "comment": "match-statement s variant *(o variant)", + "src": [".local $x = {1 :number}", + ".match $x \u061c", + "1 {{one}}", + "* {{other}}"], + "exp": "one" + }, + { + "comment": "variant = key *(s key) quoted-pattern", + "src": [".local $x = {1 :number} .local $y = {$x :number}", + ".match $x $y\n", + "1 \u200E 1 {{one}}", + "* * {{other}}"], + "exp": "one" + }, + { + "comment": "variant = key *(s key) quoted-pattern", + "src": [".local $x = {1 :number} .local $y = {$x :number}", + ".match $x $y\n", + "1\u200E 1 {{one}}", + "* * {{other}}"], + "exp": "one" + }, + { + "comment": "literal-expression = \"{\" o literal [s function] *(s attribute) o \"}\"", + "src": "{\u200E hello \u200F}", + "exp": "hello" + }, + { + "comment": "variable-expression = \"{\" o variable [s function] *(s attribute) o \"}\"", + "src": ".local $x = {1} {{ {\u200E $x \u200F} }}", + "exp": " 1 " + }, + { + "comment": "function-expression = \"{\" o function *(s attribute) o \"}\"", + "src": "{1 \u200E :number \u200F}", + "exp": "1" + }, + { + "comment": "markup = \"{\" o \"#\" identifier *(s option) *(s attribute) o [\"/\"] \"}\"", + "src": "{\u200F #b \u200E }", + "exp": "" + }, + { + "comment": "markup = \"{\" o \"/\" identifier *(s option) *(s attribute) o \"}\"", + "src": "{\u200F /b \u200E }", + "exp": "" + }, + { + "comment": "option = identifier o \"=\" o (literal / variable)", + "src": "{1 :number minimumFractionDigits\u200F=\u200E1 }", + "exp": "1.0" + }, + { + "comment": "attribute = \"@\" identifier [o \"=\" o (literal / variable)]", + "src": "{1 :number @locale\u200F=\u200Een }", + "exp": "1" + }, + { + "comment": " name... excludes U+FFFD and U+061C -- this pases as name -> [bidi] name-start *name-char", + "src": ".local $\u061Cfoo = {1} {{ {$\u061Cfoo} }}", + "exp": " 1 " + }, + { + "comment": " name matches https://www.w3.org/TR/REC-xml-names/#NT-NCName but excludes U+FFFD and U+061C", + "src": ".local $foo\u061Cbar = {2} {{ }}", + "expErrors": [{"type": "syntax-error"}] + }, + { + "comment": "name = [bidi] name-start *name-char [bidi]", + "src": ".local $\u200Efoo\u200F = {3} {{{$\u200Efoo\u200F}}}", + "exp": "3" + }, + { + "comment": "name = [bidi] name-start *name-char [bidi]", + "src": ".local $foo = {4} {{{$\u200Efoo\u200F}}}", + "exp": "4" + }, + { + "comment": "name = [bidi] name-start *name-char [bidi]", + "src": ".local $\u200Efoo\u200F = {5} {{{$foo}}}", + "exp": "5" + }, + { + "comment": "name = [bidi] name-start *name-char [bidi]", + "src": ".local $foo\u200Ebar = {6} {{{$foo\u200Ebar}}}", + "expErrors": [{"type": "syntax-error"}] + } + ] +} diff --git a/testdata/message2/icu-test-previous-release.json b/testdata/message2/icu-test-previous-release.json index 0a1e27dff6e..74fc41fdfce 100644 --- a/testdata/message2/icu-test-previous-release.json +++ b/testdata/message2/icu-test-previous-release.json @@ -31,50 +31,50 @@ "exp": "bar foo" }, { - "src": ".match {$foo :number} 1 {{one}} * {{other}}", + "src": ".input {$foo :number} .match $foo 1 {{one}} * {{other}}", "params": [{ "name": "foo", "value": "1" }], "exp": "one", "ignoreJava": "See ICU-22809" }, { - "src": ".match {$foo :string} 1 {{one}} * {{other}}", + "src": ".input {$foo :string} .match $foo 1 {{one}} * {{other}}", "params": [{ "name": "foo", "value": "1" }], "exp": "one" }, { - "src": ".match {$foo :number} 1 {{one}} * {{other}}", + "src": ".input {$foo :number} .match $foo 1 {{one}} * {{other}}", "params": [{ "name": "foo", "value": 1 }], "exp": "one" }, { "ignoreJava": "Can't pass null in a map", "ignoreCpp": "Same as Java", - "src": ".match {$foo} 1 {{one}} * {{other}}", + "src": ".match $foo 1 {{one}} * {{other}}", "params": [{ "name": "foo", "value": null }], "exp": "other" }, { - "src": ".match {$foo :number} 1 {{one}} * {{other}}", + "src": ".input {$foo :number} .match $foo 1 {{one}} * {{other}}", "exp": "other", "expErrors": [{ "type": "unresolved-variable" }] }, { - "src": ".local $foo = {$bar} .match {$foo :number} one {{one}} * {{other}}", + "src": ".local $foo = {$bar :number} .match $foo one {{one}} * {{other}}", "params": [{ "name": "bar", "value": 1 }], "exp": "one" }, { - "src": ".local $foo = {$bar} .match {$foo :number} one {{one}} * {{other}}", + "src": ".local $foo = {$bar :number} .match $foo one {{one}} * {{other}}", "params": [{ "name": "bar", "value": 2 }], "exp": "other" }, { - "src": ".local $bar = {$none} .match {$foo :number} one {{one}} * {{{$bar}}}", + "src": ".local $bar = {$none} .input {$foo :number} .match $foo one {{one}} * {{{$bar}}}", "params": [{ "name": "foo", "value": 1 }, {"name": "none", "value": "" }], "exp": "one" }, { - "src": ".local $bar = {$none :number} .match {$foo :string} one {{one}} * {{{$bar}}}", + "src": ".local $bar = {$none :number} .input {$foo :string} .match $foo one {{one}} * {{{$bar}}}", "params": [{ "name": "foo", "value": 2 }], "exp": "{$none}", "expErrors": [{ "type": "unresolved-variable" }], @@ -120,17 +120,17 @@ "ignoreCpp": "Fallback is unclear. See https://github.com/unicode-org/message-format-wg/issues/703" }, { - "src": ".match {|foo| :string} *{{foo}}", + "src": ".local $f = {|foo| :string} .match $f *{{foo}}", "exp": "foo" }, { - "src": ".match {$foo :string} * * {{foo}}", + "src": ".input {$foo :string} .match $foo * * {{foo}}", "exp": "foo", "expErrors": [{ "type": "variant-key-mismatch" }, { "type": "unresolved-variable" }], "ignoreCpp": "Fallback is unclear. See https://github.com/unicode-org/message-format-wg/issues/735" }, { - "src": ".match {$foo :string} {$bar :string} * {{foo}}", + "src": ".input {$foo :string} .input {$bar :string} .match $foo $bar * {{foo}}", "exp": "foo", "expErrors": [{ "type": "variant-key-mismatch" }, { "type": "unresolved-variable" }], "ignoreCpp": "Fallback is unclear. See https://github.com/unicode-org/message-format-wg/issues/735" diff --git a/testdata/message2/icu-test-selectors.json b/testdata/message2/icu-test-selectors.json index 102bdfd88f5..7998f1359fb 100644 --- a/testdata/message2/icu-test-selectors.json +++ b/testdata/message2/icu-test-selectors.json @@ -8,7 +8,8 @@ { "comment": "Testing simple plural", "src": [ - ".match {$count :number}\n", + ".input {$count :number}\n", + ".match $count\n", "one {{{$count} file}}\n", " * {{{$count} files}}" ], @@ -18,7 +19,8 @@ { "comment": "Testing simple plural", "src": [ - ".match {$count :number}\n", + ".input {$count :number}\n", + ".match $count\n", "one {{{$count} file}}\n", " * {{{$count} files}}" ], @@ -28,7 +30,8 @@ { "comment": "Testing simple plural", "src": [ - ".match {$count :number}\n", + ".input {$count :number}\n", + ".match $count\n", "one {{{$count} file}}\n", " * {{{$count} files}}" ], @@ -39,7 +42,8 @@ "comment": "Testing simple plural", "locale": "fr", "src": [ - ".match {$count :number}\n", + ".input {$count :number}\n", + ".match $count\n", "one {{{$count} file}}\n", " * {{{$count} files}}" ], @@ -50,7 +54,8 @@ "comment": "Testing simple plural", "locale": "fr", "src": [ - ".match {$count :number}\n", + ".input {$count :number}\n", + ".match $count\n", "one {{{$count} file}}\n", " * {{{$count} files}}" ], @@ -61,7 +66,8 @@ "comment": "Testing simple plural", "locale": "fr", "src": [ - ".match {$count :number}\n", + ".input {$count :number}\n", + ".match $count\n", "one {{{$count} file}}\n", " * {{{$count} files}}" ], @@ -71,7 +77,8 @@ { "comment": "Testing simple plural, but swap variant order", "src": [ - ".match {$count :number}\n", + ".input {$count :number}\n", + ".match $count\n", " * {{You deleted {$count} files}}\n", "one {{You deleted {$count} file}}" ], @@ -81,7 +88,8 @@ { "comment": "Testing simple plural, but swap variant order", "src": [ - ".match {$count :number}\n", + ".input {$count :number}\n", + ".match $count\n", " * {{You deleted {$count} files}}\n", "one {{You deleted {$count} file}}" ], @@ -91,7 +99,8 @@ { "comment": "Ordinal, with mixed order and exact matches", "src": [ - ".match {$place :number select=ordinal}\n", + ".input {$place :number select=ordinal}\n", + ".match $place\n", "* {{You finished in the {$place}th place}}\n", "two {{You finished in the {$place}nd place}}\n", "one {{You finished in the {$place}st place}}\n", @@ -106,7 +115,8 @@ { "comment": "Ordinal, with mixed order and exact matches", "src": [ - ".match {$place :number select=ordinal}\n", + ".input {$place :number select=ordinal}\n", + ".match $place\n", "* {{You finished in the {$place}th place}}\n", "two {{You finished in the {$place}nd place}}\n", "one {{You finished in the {$place}st place}}\n", @@ -121,7 +131,8 @@ { "comment": "Ordinal, with mixed order and exact matches", "src": [ - ".match {$place :number select=ordinal}\n", + ".input {$place :number select=ordinal}\n", + ".match $place\n", "* {{You finished in the {$place}th place}}\n", "two {{You finished in the {$place}nd place}}\n", "one {{You finished in the {$place}st place}}\n", @@ -136,7 +147,8 @@ { "comment": "Ordinal, with mixed order and exact matches", "src": [ - ".match {$place :number select=ordinal}\n", + ".input {$place :number select=ordinal}\n", + ".match $place\n", "* {{You finished in the {$place}th place}}\n", "two {{You finished in the {$place}nd place}}\n", "one {{You finished in the {$place}st place}}\n", @@ -151,7 +163,8 @@ { "comment": "Ordinal, with mixed order and exact matches", "src": [ - ".match {$place :number select=ordinal}\n", + ".input {$place :number select=ordinal}\n", + ".match $place\n", "* {{You finished in the {$place}th place}}\n", "two {{You finished in the {$place}nd place}}\n", "one {{You finished in the {$place}st place}}\n", @@ -166,7 +179,8 @@ { "comment": "Ordinal, with mixed order and exact matches", "src": [ - ".match {$place :number select=ordinal}\n", + ".input {$place :number select=ordinal}\n", + ".match $place\n", "* {{You finished in the {$place}th place}}\n", "two {{You finished in the {$place}nd place}}\n", "one {{You finished in the {$place}st place}}\n", @@ -181,7 +195,8 @@ { "comment": "Ordinal, with mixed order and exact matches", "src": [ - ".match {$place :number select=ordinal}\n", + ".input {$place :number select=ordinal}\n", + ".match $place\n", "* {{You finished in the {$place}th place}}\n", "two {{You finished in the {$place}nd place}}\n", "one {{You finished in the {$place}st place}}\n", @@ -196,7 +211,8 @@ { "comment": "Ordinal, with mixed order and exact matches", "src": [ - ".match {$place :number select=ordinal}\n", + ".input {$place :number select=ordinal}\n", + ".match $place\n", "* {{You finished in the {$place}th place}}\n", "two {{You finished in the {$place}nd place}}\n", "one {{You finished in the {$place}st place}}\n", @@ -211,7 +227,8 @@ { "comment": "Plural combinations, mixed order", "src": [ - ".match {$fileCount :number} {$folderCount :number}\n", + ".input {$fileCount :number} .input {$folderCount :number}\n", + ".match $fileCount $folderCount\n", " * * {{You found {$fileCount} files in {$folderCount} folders}}\n", " one one {{You found {$fileCount} file in {$folderCount} folder}}\n", " one * {{You found {$fileCount} file in {$folderCount} folders}}\n", @@ -224,7 +241,8 @@ { "comment": "Plural combinations, mixed order", "src": [ - ".match {$fileCount :number} {$folderCount :number}\n", + ".input {$fileCount :number} .input {$folderCount :number}\n", + ".match $fileCount $folderCount\n", " * * {{You found {$fileCount} files in {$folderCount} folders}}\n", " one one {{You found {$fileCount} file in {$folderCount} folder}}\n", " one * {{You found {$fileCount} file in {$folderCount} folders}}\n", @@ -237,7 +255,8 @@ { "comment": "Plural combinations, mixed order", "src": [ - ".match {$fileCount :number} {$folderCount :number}\n", + ".input {$fileCount :number} .input {$folderCount :number}\n", + ".match $fileCount $folderCount\n", " * * {{You found {$fileCount} files in {$folderCount} folders}}\n", " one one {{You found {$fileCount} file in {$folderCount} folder}}\n", " one * {{You found {$fileCount} file in {$folderCount} folders}}\n", @@ -250,7 +269,8 @@ { "comment": "Plural combinations, mixed order", "src": [ - ".match {$fileCount :number} {$folderCount :number}\n", + ".input {$fileCount :number} .input {$folderCount :number}\n", + ".match $fileCount $folderCount\n", " * * {{You found {$fileCount} files in {$folderCount} folders}}\n", " one one {{You found {$fileCount} file in {$folderCount} folder}}\n", " one * {{You found {$fileCount} file in {$folderCount} folders}}\n", @@ -264,7 +284,7 @@ "comment": "Test that the selection honors the formatting option (`1.00 dollars`)", "src": [ ".local $c = {$price :number minimumFractionDigits=$minF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], @@ -276,7 +296,7 @@ "comment": "Test that the selection honors the formatting option (`1.00 dollars`)", "src": [ ".local $c = {$price :number minimumFractionDigits=$minF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], @@ -288,7 +308,7 @@ "comment": "Test that the selection honors the formatting option (`1.00 dollars`)", "src": [ ".local $c = {$price :number maximumFractionDigits=$maxF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], @@ -300,7 +320,7 @@ "comment": "Test that the selection honors the formatting option (`1.00 dollars`)", "src": [ ".local $c = {$price :number maximumFractionDigits=$maxF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], @@ -312,7 +332,7 @@ "comment": "Test that the selection honors the `:integer` over options", "src": [ ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], @@ -324,7 +344,7 @@ "comment": "Test that the selection honors the `:integer` over options", "src": [ ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], @@ -336,7 +356,7 @@ "comment": "Test that the selection honors the `:integer` over options", "src": [ ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], @@ -348,7 +368,7 @@ "comment": "Test that the selection honors the `:integer` over options", "src": [ ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], @@ -360,7 +380,7 @@ "comment": "Test that the selection honors the `:integer` over options", "src": [ ".local $c = {$price :integer maximumFractionDigits=$maxF}\n", - ".match {$c}\n", + ".match $c\n", " one {{{$c} dollar}}\n", " * {{{$c} dollars}}" ], diff --git a/testdata/message2/matches-whitespace.json b/testdata/message2/matches-whitespace.json index a0af4c4d143..fd4b2b2ced1 100644 --- a/testdata/message2/matches-whitespace.json +++ b/testdata/message2/matches-whitespace.json @@ -5,29 +5,14 @@ "locale": "en-US" }, "tests": [ - { "src": ".match {one :string} {bar :string} one * {{one}} * * {{other}}", - "exp": "one" }, - { "src": ".match {foo :string} {bar :string}one * {{one}} * * {{other}}", - "exp": "other" - }, - { "src": ".match {foo :string}{bar :string} one * {{one}} * * {{other}}", - "exp": "other" - }, - { "src": ".match {one :string}{bar :string}one * {{one}} * * {{other}}", - "exp": "one" - }, - { "src": ".match{foo :string} {bar :string} one * {{one}} * * {{other}}", - "exp": "other" - }, - { "src": ".match {foo :string} {bar :string} one * {{one}}* * {{other}}", + { "src": ".local $one = {1 :string} .local $bar = {bar :string} .match $one $bar one * {{one}} * * {{other}}", "exp": "other" }, - { "src": ".match {foo :string} {bar :string}one * {{one}}* * {{other}}", - "exp": "other" - }, - { "src": ".match {foo :string} {bar :string} one *{{one}} * * {{foo}}", + { "src": ".local $foo = {foo :string} .local $bar = {bar :string} .match $foo $bar one * {{one}}* * {{other}}", + "exp": "other" }, + { "src": ".local $foo = {foo :string} .local $bar = {bar :string} .match $foo $bar one *{{one}} * * {{foo}}", "exp": "foo" }, - { "src": ".match {foo :string} {bar :string} one * {{one}} * * {{foo}}", + { "src": ".local $foo = {foo :string} .local $bar = {bar :string} .match $foo $bar one * {{one}} * * {{foo}}", "exp": "foo" } ] } diff --git a/testdata/message2/more-data-model-errors.json b/testdata/message2/more-data-model-errors.json index 32744083af1..36b528bc271 100644 --- a/testdata/message2/more-data-model-errors.json +++ b/testdata/message2/more-data-model-errors.json @@ -5,7 +5,7 @@ }, "tests": [ { - "src": ".match {$foo :number} {$bar :number} one{{one}}", + "src": ".input {$foo :number} .input {$bar :number} .match $foo $bar one{{one}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -14,7 +14,7 @@ }, { - "src": ".match {$foo :number} {$bar :number} one {{one}}", + "src": ".input {$foo :number} .input {$bar :number} .match $foo $bar one {{one}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -23,7 +23,7 @@ }, { - "src": ".match {$foo :number} {$bar :number} one {{one}}", + "src": ".input {$foo :number} .input {$bar :number} .match $foo $bar one {{one}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -32,7 +32,7 @@ }, { - "src": ".match {$foo :number} * * {{foo}}", + "src": ".input {$foo :number} .match $foo * * {{foo}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -41,7 +41,7 @@ }, { - "src": ".match {$one :number}\n 1 2 {{Too many}}\n * {{Otherwise}}", + "src": ".input {$one :number} .match $one\n 1 2 {{Too many}}\n * {{Otherwise}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -50,7 +50,7 @@ }, { - "src": ".match {$one :number} {$two :number}\n 1 2 {{Two keys}}\n * {{Missing a key}}\n * * {{Otherwise}}", + "src": ".input {$one :number} .input {$two :number} .match $one $two \n 1 2 {{Two keys}}\n * {{Missing a key}}\n * * {{Otherwise}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -59,7 +59,7 @@ }, { - "src": ".match {$foo :x} {$bar :x} * {{foo}}", + "src": ".input {$foo :x} .input {$bar :X} .match $foo $bar * {{foo}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -68,7 +68,7 @@ }, { - "src": ".match {$one :number}\n 1 {{Value is one}}\n 2 {{Value is two}}", + "src": ".input {$one :number} .match $one\n 1 {{Value is one}}\n 2 {{Value is two}}", "expErrors": [ { "type": "missing-fallback-variant" @@ -77,7 +77,7 @@ }, { - "src": ".match {$one :number} {$two :number}\n 1 * {{First is one}}\n * 1 {{Second is one}}", + "src": ".input {$one :number} .input {$two :number} .match $one $two\n 1 * {{First is one}}\n * 1 {{Second is one}}", "expErrors": [ { "type": "missing-fallback-variant" @@ -86,7 +86,7 @@ }, { - "src": ".match {$one}\n 1 {{Value is one}}\n * {{Value is not one}}", + "src": ".match $one\n 1 {{Value is one}}\n * {{Value is not one}}", "expErrors": [ { "type": "missing-selector-annotation" @@ -95,7 +95,7 @@ }, { - "src": ".local $one = {|The one|}\n .match {$one}\n 1 {{Value is one}}\n * {{Value is not one}}", + "src": ".local $one = {|The one|}\n .match $one\n 1 {{Value is one}}\n * {{Value is not one}}", "expErrors": [ { "type": "missing-selector-annotation" @@ -103,7 +103,7 @@ ] }, { - "src": ".input {$foo} .match {$foo} one {{one}} * {{other}}", + "src": ".input {$foo} .match $foo one {{one}} * {{other}}", "expErrors": [ { "type": "missing-selector-annotation" @@ -112,7 +112,7 @@ }, { - "src": ".local $foo = {$bar} .match {$foo} one {{one}} * {{other}}", + "src": ".local $foo = {$bar} .match $foo one {{one}} * {{other}}", "expErrors": [ { "type": "missing-selector-annotation" diff --git a/testdata/message2/more-syntax-errors.json b/testdata/message2/more-syntax-errors.json new file mode 100644 index 00000000000..6e1b86e8efb --- /dev/null +++ b/testdata/message2/more-syntax-errors.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Syntax errors", + "description": "Strings that produce syntax errors when parsed.", + "defaultTestProperties": { + "locale": "en-US", + "expErrors": [ + { + "type": "syntax-error" + } + ] + }, + "tests": [ + { + "src": "{\u0000/\u0000g }\u0000\u0000\u0000\u0000\u000c" + }, + { + "src": ".\u0000$\u0000.\u0000\u00ca$\u0000\u0000\u00f9\u00f9{\u0000{\u0000{\u0000/\u0000\u00ff$\u00ff\u00ff\u00ff\u00ff" + } + ] +} diff --git a/testdata/message2/normalization.json b/testdata/message2/normalization.json new file mode 100644 index 00000000000..da3bdca87eb --- /dev/null +++ b/testdata/message2/normalization.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Syntax", + "description": "Test cases that do not depend on any registry definitions.", + "defaultTestProperties": { + "locale": "en-US" + }, + "tests": [ + { + "description": "NFC: text is not normalized", + "src": "\u1E0A\u0323", + "exp": "\u1E0A\u0323" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is", + "src": ".local $\u0044\u0323\u0307 = {foo} {{{$\u1E0c\u0307}}}", + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is normalized, use isn't", + "src": ".local $\u1E0c\u0307 = {foo} {{{$\u0044\u0323\u0307}}}", + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is normalized, use isn't", + "src": ".input {$\u1E0c\u0307} {{{$\u0044\u0323\u0307}}}", + "params": [{"name": "\u1E0c\u0307", "value": "foo"}], + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is", + "src": ".input {$\u0044\u0323\u0307} {{{$\u1E0c\u0307}}}", + "params": [{"name": "\u0044\u0323\u0307", "value": "foo"}], + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is; reordering", + "src": ".local $\u0044\u0307\u0323 = {foo} {{{$\u1E0c\u0307}}}", + "exp": "foo" + }, + { + "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is; special case mapping", + "src": ".local $\u0041\u030A\u0301 = {foo} {{{$\u01FA}}}", + "exp": "foo" + }, + { + "description": "NFC: keys are normalized", + "src": ".local $x = {\u1E0C\u0307 :string} .match $x \u1E0A\u0323 {{Right}} * {{Wrong}}", + "exp": "Right" + }, + { + "description": "NFC: keys are normalized (unquoted)", + "src": ".local $x = {\u1E0A\u0323 :string} .match $x \u1E0A\u0323 {{Not normalized}} \u1E0C\u0307 {{Normalized}} * {{Wrong}}", + "expErrors": [{"type": "duplicate-variant"}] + }, + { + "description": "NFC: keys are normalized (quoted)", + "src": ".local $x = {\u1E0A\u0323 :string} .match $x |\u1E0A\u0323| {{Not normalized}} |\u1E0C\u0307| {{Normalized}} * {{Wrong}}", + "expErrors": [{"type": "duplicate-variant"}] + }, + { + "description": "NFC: keys are normalized (mixed)", + "src": ".local $x = {\u1E0A\u0323 :string} .match $x \u1E0A\u0323 {{Not normalized}} |\u1E0C\u0307| {{Normalized}} * {{Wrong}}", + "expErrors": [{"type": "duplicate-variant"}] + } +] +} diff --git a/testdata/message2/resolution-errors.json b/testdata/message2/resolution-errors.json index 8f1ac2fb936..736e1cb64f0 100644 --- a/testdata/message2/resolution-errors.json +++ b/testdata/message2/resolution-errors.json @@ -7,8 +7,8 @@ "tests": [ { "src": "{$oops}", "exp": "{$oops}", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "ICU4J doesn't signal unresolved variable errors?"}, { "src": ".input {$x :number} {{{$x}}}", "exp": "{$x}", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"}, - { "src": ".local $foo = {$bar} .match {$foo :number} one {{one}} * {{other}}", "exp": "other", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"}, - { "src": ".local $bar = {$none :number} .match {$foo :string} one {{one}} * {{{$bar}}}", "exp": "{$none}", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"}, + { "src": ".local $foo = {$bar} .local $f = {$foo :number} .match $f one {{one}} * {{other}}", "exp": "other", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"}, + { "src": ".local $bar = {$none :number} .local $f = {$foo :string} .match $f one {{one}} * {{{$bar}}}", "exp": "{$none}", "expErrors": [{ "type": "unresolved-variable" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"}, { "src": "The value is {horse :func}.", "exp": "The value is {|horse|}.", "expErrors": [{ "type": "unknown-function" }], "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782"} ] } diff --git a/testdata/message2/runtime-errors.json b/testdata/message2/runtime-errors.json index b1bb0cd491a..ffeb081fab0 100644 --- a/testdata/message2/runtime-errors.json +++ b/testdata/message2/runtime-errors.json @@ -6,19 +6,19 @@ }, "tests": [ { - "src": ".match {|horse| :date}\n 1 {{The value is one.}}\n * {{Formatter used as selector.}}", + "src": ".local $h = {|horse| :date} .match $h\n 1 {{The value is one.}}\n * {{Formatter used as selector.}}", "exp": "Formatter used as selector.", "expErrors": [{"type": "bad-selector"}], "ignoreJava": "ICU4J doesn't signal runtime errors?" }, { - "src": ".match {|horse| :number}\n 1 {{The value is one.}}\n * {{horse is not a number.}}", + "src": ".local $h = {|horse| :number} .match $h\n 1 {{The value is one.}}\n * {{horse is not a number.}}", "exp": "horse is not a number.", "expErrors": [{"type": "bad-selector"}], "ignoreJava": "ICU4J doesn't signal runtime errors?" }, { - "src": ".local $sel = {|horse| :number}\n .match {$sel}\n 1 {{The value is one.}}\n * {{horse is not a number.}}", + "src": ".local $sel = {|horse| :number}\n .match $sel\n 1 {{The value is one.}}\n * {{horse is not a number.}}", "exp": "horse is not a number.", "expErrors": [{"type": "bad-selector"}], "ignoreJava": "ICU4J doesn't signal runtime errors?" diff --git a/testdata/message2/spec/data-model-errors.json b/testdata/message2/spec/data-model-errors.json index 86a674c4396..f1f54cabe7c 100644 --- a/testdata/message2/spec/data-model-errors.json +++ b/testdata/message2/spec/data-model-errors.json @@ -6,7 +6,7 @@ }, "tests": [ { - "src": ".match {$foo :x} * * {{foo}}", + "src": ".input {$foo :x} .match $foo * * {{foo}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -14,7 +14,7 @@ ] }, { - "src": ".match {$foo :x} {$bar :x} * {{foo}}", + "src": ".input {$foo :x} .input {$bar :x} .match $foo $bar * {{foo}}", "expErrors": [ { "type": "variant-key-mismatch" @@ -22,7 +22,7 @@ ] }, { - "src": ".match {:foo} 1 {{_}}", + "src": ".input {$foo :x} .match $foo 1 {{_}}", "expErrors": [ { "type": "missing-fallback-variant" @@ -30,7 +30,7 @@ ] }, { - "src": ".match {:foo} other {{_}}", + "src": ".input {$foo :x} .match $foo other {{_}}", "expErrors": [ { "type": "missing-fallback-variant" @@ -38,7 +38,7 @@ ] }, { - "src": ".match {:foo} {:bar} * 1 {{_}} 1 * {{_}}", + "src": ".input {$foo :x} .input {$bar :x} .match $foo $bar * 1 {{_}} 1 * {{_}}", "expErrors": [ { "type": "missing-fallback-variant" @@ -46,7 +46,7 @@ ] }, { - "src": ".match {$foo} one {{one}} * {{other}}", + "src": ".input {$foo} .match $foo one {{one}} * {{other}}", "expErrors": [ { "type": "missing-selector-annotation" @@ -54,7 +54,7 @@ ] }, { - "src": ".input {$foo} .match {$foo} one {{one}} * {{other}}", + "src": ".local $foo = {$bar} .match $foo one {{one}} * {{other}}", "expErrors": [ { "type": "missing-selector-annotation" @@ -62,7 +62,7 @@ ] }, { - "src": ".local $foo = {$bar} .match {$foo} one {{one}} * {{other}}", + "src": ".input {$bar} .local $foo = {$bar} .match $foo one {{one}} * {{other}}", "expErrors": [ { "type": "missing-selector-annotation" @@ -166,7 +166,7 @@ ] }, { - "src": ".match {$var :string} * {{The first default}} * {{The second default}}", + "src": ".input {$var :string} .match $var * {{The first default}} * {{The second default}}", "expErrors": [ { "type": "duplicate-variant" @@ -174,12 +174,16 @@ ] }, { - "src": ".match {$x :string} {$y :string} * foo {{The first foo variant}} bar * {{The bar variant}} * |foo| {{The second foo variant}} * * {{The default variant}}", + "src": ".input {$x :string} .input {$y :string} .match $x $y * foo {{The first foo variant}} bar * {{The bar variant}} * |foo| {{The second foo variant}} * * {{The default variant}}", "expErrors": [ { "type": "duplicate-variant" } ] + }, + { + "src": ".local $star = {star :string} .match $star |*| {{Literal star}} * {{The default}}", + "exp": "The default" } ] } diff --git a/testdata/message2/spec/functions/date.json b/testdata/message2/spec/functions/date.json index dd14e6785fb..494ca8d2345 100644 --- a/testdata/message2/spec/functions/date.json +++ b/testdata/message2/spec/functions/date.json @@ -1,9 +1,10 @@ { + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", "scenario": "Date function", "description": "The built-in formatter for dates.", "defaultTestProperties": { "locale": "en-US", - "expErrors": [] + "expErrors": false }, "tests": [ { @@ -13,8 +14,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "{horse :date}", @@ -23,8 +23,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "{|2006-01-02| :date}" @@ -39,8 +38,7 @@ "src": ".local $d = {|2006-01-02| :date style=long} {{{$d :date}}}" }, { - "src": ".local $t = {|2006-01-02T15:04:06| :time} {{{$t :date}}}", - "ignoreJava": "ICU4J doesn't support this kind of composition" + "src": ".local $t = {|2006-01-02T15:04:06| :time} {{{$t :date}}}" } ] } diff --git a/testdata/message2/spec/functions/datetime.json b/testdata/message2/spec/functions/datetime.json index bdfea3096cd..758a8bbaa00 100644 --- a/testdata/message2/spec/functions/datetime.json +++ b/testdata/message2/spec/functions/datetime.json @@ -1,9 +1,10 @@ { + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", "scenario": "Datetime function", "description": "The built-in formatter for datetimes.", "defaultTestProperties": { "locale": "en-US", - "expErrors": [] + "expErrors": false }, "tests": [ { @@ -13,8 +14,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "{$x :datetime}", @@ -29,8 +29,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "{horse :datetime}", @@ -39,8 +38,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "{|2006-01-02T15:04:06| :datetime}" diff --git a/testdata/message2/spec/functions/integer.json b/testdata/message2/spec/functions/integer.json index c8e75077a22..4ea96941e17 100644 --- a/testdata/message2/spec/functions/integer.json +++ b/testdata/message2/spec/functions/integer.json @@ -19,7 +19,7 @@ "exp": "hello 4" }, { - "src": ".match {$foo :integer} one {{one}} * {{other}}", + "src": ".input {$foo :integer} .match $foo 1 {{one}} * {{other}}", "params": [ { "name": "foo", diff --git a/testdata/message2/spec/functions/number.json b/testdata/message2/spec/functions/number.json index 1b81c705622..2b00d83e495 100644 --- a/testdata/message2/spec/functions/number.json +++ b/testdata/message2/spec/functions/number.json @@ -1,4 +1,5 @@ { + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", "scenario": "Number function", "description": "The built-in formatter for numbers.", "defaultTestProperties": { @@ -24,8 +25,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "invalid number literal {|.1| :number}", @@ -34,8 +34,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "invalid number literal {|1.| :number}", @@ -44,8 +43,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "invalid number literal {|01| :number}", @@ -54,8 +52,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "invalid number literal {|+1| :number}", @@ -64,8 +61,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "invalid number literal {|0x1| :number}", @@ -74,8 +70,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "hello {:number}", @@ -84,8 +79,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "hello {4.2 :number minimumFractionDigits=2}", @@ -148,8 +142,7 @@ { "type": "bad-option" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": ".local $foo = {$bar :number} {{bar {$foo}}}", @@ -164,8 +157,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": ".input {$foo :number} {{bar {$foo}}}", @@ -200,8 +192,7 @@ { "type": "bad-option" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": ".input {$foo :number} {{bar {$foo}}}", @@ -216,176 +207,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" - }, - { - "src": ".match {$foo :number} one {{one}} * {{other}}", - "params": [ - { - "name": "foo", - "value": 1 - } - ], - "exp": "one" - }, - { - "src": ".match {$foo :number} 1 {{=1}} one {{one}} * {{other}}", - "params": [ - { - "name": "foo", - "value": 1 - } - ], - "exp": "=1" - }, - { - "src": ".match {$foo :number} one {{one}} 1 {{=1}} * {{other}}", - "params": [ - { - "name": "foo", - "value": 1 - } - ], - "exp": "=1" - }, - { - "src": ".match {$foo :number} {$bar :number} one one {{one one}} one * {{one other}} * * {{other}}", - "params": [ - { - "name": "foo", - "value": 1 - }, - { - "name": "bar", - "value": 1 - } - ], - "exp": "one one" - }, - { - "src": ".match {$foo :number} {$bar :number} one one {{one one}} one * {{one other}} * * {{other}}", - "params": [ - { - "name": "foo", - "value": 1 - }, - { - "name": "bar", - "value": 2 - } - ], - "exp": "one other" - }, - { - "src": ".match {$foo :number} {$bar :number} one one {{one one}} one * {{one other}} * * {{other}}", - "params": [ - { - "name": "foo", - "value": 2 - }, - { - "name": "bar", - "value": 2 - } - ], - "exp": "other" - }, - { - "src": ".input {$foo :number} .match {$foo} one {{one}} * {{other}}", - "params": [ - { - "name": "foo", - "value": 1 - } - ], - "exp": "one" - }, - { - "src": ".local $foo = {$bar :number} .match {$foo} one {{one}} * {{other}}", - "params": [ - { - "name": "bar", - "value": 1 - } - ], - "exp": "one" - }, - { - "src": ".input {$foo :number} .local $bar = {$foo} .match {$bar} one {{one}} * {{other}}", - "params": [ - { - "name": "foo", - "value": 1 - } - ], - "exp": "one" - }, - { - "src": ".input {$bar :number} .match {$bar} one {{one}} * {{other}}", - "params": [ - { - "name": "bar", - "value": 2 - } - ], - "exp": "other" - }, - { - "src": ".input {$bar} .match {$bar :number} one {{one}} * {{other}}", - "params": [ - { - "name": "bar", - "value": 1 - } - ], - "exp": "one" - }, - { - "src": ".input {$bar} .match {$bar :number} one {{one}} * {{other}}", - "params": [ - { - "name": "bar", - "value": 2 - } - ], - "exp": "other" - }, - { - "src": ".input {$none} .match {$foo :number} one {{one}} * {{{$none}}}", - "params": [ - { - "name": "foo", - "value": 1 - } - ], - "exp": "one" - }, - { - "src": ".local $bar = {$none} .match {$foo :number} one {{one}} * {{{$bar}}}", - "params": [ - { - "name": "foo", - "value": 1 - } - ], - "exp": "one" - }, - { - "src": ".local $bar = {$none} .match {$foo :number} one {{one}} * {{{$bar}}}", - "params": [ - { - "name": "foo", - "value": 2 - } - ], - "exp": "{$none}", - "expErrors": [ - { - "type": "unresolved-variable" - } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "{42 :number @foo @bar=13}", diff --git a/testdata/message2/spec/functions/string.json b/testdata/message2/spec/functions/string.json index 5858079b99a..1deb2ec66ce 100644 --- a/testdata/message2/spec/functions/string.json +++ b/testdata/message2/spec/functions/string.json @@ -1,4 +1,5 @@ { + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", "scenario": "String function", "description": "The built-in formatter for strings.", "defaultTestProperties": { @@ -6,7 +7,7 @@ }, "tests": [ { - "src": ".match {$foo :string} |1| {{one}} * {{other}}", + "src": ".input {$foo :string} .match $foo |1| {{one}} * {{other}}", "params": [ { "name": "foo", @@ -16,18 +17,17 @@ "exp": "one" }, { - "src": ".match {$foo :string} 1 {{one}} * {{other}}", + "src": ".input {$foo :string} .match $foo 1 {{one}} * {{other}}", "params": [ { "name": "foo", "value": 1 } ], - "exp": "one", - "ignoreJava": ":string doesn't stringify numbers?" + "exp": "one" }, { - "src": ".match {$foo :string} 1 {{one}} * {{other}}", + "src": ".input {$foo :string} .match $foo 1 {{one}} * {{other}}", "params": [ { "name": "foo", @@ -35,17 +35,16 @@ } ], "exp": "other", - "ignoreCpp": "Can't handle null value for input variable" + "ignoreCpp": "Explicit null doesn't work" }, { - "src": ".match {$foo :string} 1 {{one}} * {{other}}", + "src": ".input {$foo :string} .match $foo 1 {{one}} * {{other}}", "exp": "other", "expErrors": [ { "type": "unresolved-variable" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] } ] } diff --git a/testdata/message2/spec/functions/time.json b/testdata/message2/spec/functions/time.json index 845934a5e16..416d18a3efe 100644 --- a/testdata/message2/spec/functions/time.json +++ b/testdata/message2/spec/functions/time.json @@ -1,9 +1,10 @@ { + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", "scenario": "Time function", "description": "The built-in formatter for times.", "defaultTestProperties": { "locale": "en-US", - "expErrors": [] + "expErrors": false }, "tests": [ { @@ -13,8 +14,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "{horse :time}", @@ -23,8 +23,7 @@ { "type": "bad-operand" } - ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + ] }, { "src": "{|2006-01-02T15:04:06| :time}" @@ -36,8 +35,7 @@ "src": ".local $t = {|2006-01-02T15:04:06| :time style=medium} {{{$t :time}}}" }, { - "src": ".local $d = {|2006-01-02T15:04:06| :date} {{{$d :time}}}", - "ignoreJava": "ICU4J doesn't support this kind of composition" + "src": ".local $d = {|2006-01-02T15:04:06| :date} {{{$d :time}}}" } ] } diff --git a/testdata/message2/spec/pattern-selection.json b/testdata/message2/spec/pattern-selection.json new file mode 100644 index 00000000000..29dc146c190 --- /dev/null +++ b/testdata/message2/spec/pattern-selection.json @@ -0,0 +1,120 @@ +{ + "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json", + "scenario": "Pattern selection", + "description": "Tests for pattern selection", + "defaultTestProperties": { + "locale": "und" + }, + "tests": [ + { + "src": ".local $x = {1 :test:select} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "exp": "1" + }, + { + "src": ".local $x = {0 :test:select} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "exp": "other" + }, + { + "src": ".input {$x :test:select} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "params": [{ "name": "x", "value": 1 }], + "exp": "1" + }, + { + "src": ".input {$x :test:select} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "params": [{ "name": "x", "value": 2 }], + "exp": "other" + }, + { + "src": ".input {$x :test:select} .local $y = {$x} .match $y 1.0 {{1.0}} 1 {{1}} * {{other}}", + "params": [{ "name": "x", "value": 1 }], + "exp": "1" + }, + { + "src": ".input {$x :test:select} .local $y = {$x} .match $y 1.0 {{1.0}} 1 {{1}} * {{other}}", + "params": [{ "name": "x", "value": 2 }], + "exp": "other" + }, + { + "src": ".local $x = {1 :test:select decimalPlaces=1} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "exp": "1.0" + }, + { + "src": ".local $x = {1 :test:select decimalPlaces=1} .match $x 1 {{1}} 1.0 {{1.0}} * {{other}}", + "exp": "1.0" + }, + { + "src": ".local $x = {1 :test:select decimalPlaces=9} .match $x 1.0 {{1.0}} 1 {{1}} * {{bad-option-value}}", + "exp": "bad-option-value", + "expErrors": [{ "type": "bad-option" }, { "type": "bad-selector" }] + }, + { + "src": ".input {$x :test:select} .local $y = {$x :test:select decimalPlaces=1} .match $y 1.0 {{1.0}} 1 {{1}} * {{other}}", + "params": [{ "name": "x", "value": 1 }], + "exp": "1.0" + }, + { + "src": ".input {$x :test:select decimalPlaces=1} .local $y = {$x :test:select} .match $y 1.0 {{1.0}} 1 {{1}} * {{other}}", + "params": [{ "name": "x", "value": 1 }], + "exp": "1.0" + }, + { + "src": ".input {$x :test:select decimalPlaces=9} .local $y = {$x :test:select decimalPlaces=1} .match $y 1.0 {{1.0}} 1 {{1}} * {{bad-option-value}}", + "params": [{ "name": "x", "value": 1 }], + "exp": "bad-option-value", + "expErrors": [ + { "type": "bad-option" }, + { "type": "bad-operand" }, + { "type": "bad-selector" } + ] + }, + { + "src": ".local $x = {1 :test:select fails=select} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "exp": "other", + "expErrors": [{ "type": "bad-selector" }] + }, + { + "src": ".local $x = {1 :test:select fails=format} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "exp": "1" + }, + { + "src": ".local $x = {1 :test:format} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "exp": "other", + "expErrors": [{ "type": "bad-selector" }] + }, + { + "src": ".input {$x :test:select} .match $x 1.0 {{1.0}} 1 {{1}} * {{other}}", + "exp": "other", + "expErrors": [ + { "type": "unresolved-variable" }, + { "type": "bad-operand" }, + { "type": "bad-selector" } + ] + }, + { + "src": ".local $x = {1 :test:select} .local $y = {1 :test:select} .match $x $y 1 1 {{1,1}} 1 * {{1,*}} * 1 {{*,1}} * * {{*,*}}", + "exp": "1,1" + }, + { + "src": ".local $x = {1 :test:select} .local $y = {0 :test:select} .match $x $y 1 1 {{1,1}} 1 * {{1,*}} * 1 {{*,1}} * * {{*,*}}", + "exp": "1,*" + }, + { + "src": ".local $x = {0 :test:select} .local $y = {1 :test:select} .match $x $y 1 1 {{1,1}} 1 * {{1,*}} * 1 {{*,1}} * * {{*,*}}", + "exp": "*,1" + }, + { + "src": ".local $x = {0 :test:select} .local $y = {0 :test:select} .match $x $y 1 1 {{1,1}} 1 * {{1,*}} * 1 {{*,1}} * * {{*,*}}", + "exp": "*,*" + }, + { + "src": ".local $x = {1 :test:select fails=select} .local $y = {1 :test:select} .match $x $y 1 1 {{1,1}} 1 * {{1,*}} * 1 {{*,1}} * * {{*,*}}", + "exp": "*,1", + "expErrors": [{ "type": "bad-selector" }] + }, + { + "src": ".local $x = {1 :test:select} .local $y = {1 :test:format} .match $x $y 1 1 {{1,1}} 1 * {{1,*}} * 1 {{*,1}} * * {{*,*}}", + "exp": "1,*", + "expErrors": [{ "type": "bad-selector" }] + } + ] +} diff --git a/testdata/message2/spec/syntax-errors.json b/testdata/message2/spec/syntax-errors.json index 34d9aa48457..00d0420f46f 100644 --- a/testdata/message2/spec/syntax-errors.json +++ b/testdata/message2/spec/syntax-errors.json @@ -122,6 +122,9 @@ { "src": "bad {:placeholder @attribute=@foo}" }, + { + "src": "bad {:placeholder @attribute=$foo}" + }, { "src": "{ @misplaced = attribute }" }, @@ -155,26 +158,90 @@ { "src": ".local $bar = |foo| {{_}}" }, - { - "src": ".match {#foo} * {{foo}}" - }, - { - "src": ".match {} * {{foo}}" - }, - { - "src": ".match {|foo| :x} {|bar| :x} ** {{foo}}" - }, - { - "src": ".match * {{foo}}" - }, - { - "src": ".match {|x| :x} * foo" - }, - { - "src": ".match {|x| :x} * {{foo}} extra" - }, - { - "src": ".match |x| * {{foo}}" - } + { "src": ".match {{foo}}" }, + { "src": ".match * {{foo}}" }, + { "src": ".match x * {{foo}}" }, + { "src": ".match |x| * {{foo}}" }, + { "src": ".match :x * {{foo}}" }, + { "src": ".match {$foo} * {{foo}}" }, + { "src": ".match {#foo} * {{foo}}" }, + { "src": ".input {$x :x} .match {$x} * {{foo}}" }, + { "src": ".input {$x :x} .match$x * {{foo}}" }, + { "src": ".input {$x :x} .match $x* {{foo}}" }, + { "src": ".input {$x :x} .match $x|x| {{foo}} * {{foo}}" }, + { "src": ".input {$x :x} .local $y = {y :y} .match $x$y * * {{foo}}" }, + { "src": ".input {$x :x} .local $y = {y :y} .match $x $y ** {{foo}}" }, + { "src": ".input {$x :x} .match $x" }, + { "src": ".input {$x :x} .match $x *" }, + { "src": ".input {$x :x} .match $x * foo" }, + { "src": ".input {$x :x} .match $x * {{foo}} extra" }, + { "src": ".n{a}{{}}" }, + { "src": "{^}" }, + { "src": "{!}" }, + { "src": ".n .{a}{{}}" }, + { "src": ".n. {a}{{}}" }, + { "src": ".n.{a}{b}{{}}" }, + { "src": "{!.}" }, + { "src": "{! .}" }, + { "src": "{%}" }, + { "src": "{*}" }, + { "src": "{+}" }, + { "src": "{<}" }, + { "src": "{>}" }, + { "src": "{?}" }, + { "src": "{~}" }, + { "src": "{^.}" }, + { "src": "{^ .}" }, + { "src": "{&}" }, + { "src": "{!.\\{}" }, + { "src": "{!. \\{}" }, + { "src": "{!|a|}" }, + { "src": "foo {+reserved}" }, + { "src": "foo {&private}" }, + { "src": "foo {?reserved @a @b=c}" }, + { "src": ".foo {42} {{bar}}" }, + { "src": ".foo{42}{{bar}}" }, + { "src": ".foo |}lit{| {42}{{bar}}" }, + { "src": ".i {1} {{}}" }, + { "src": ".l $y = {|bar|} {{}}" }, + { "src": ".l $x.y = {|bar|} {{}}" }, + { "src": "hello {|4.2| %number}" }, + { "src": "hello {|4.2| %n|um|ber}" }, + { "src": "{+42}" }, + { "src": "hello {|4.2| &num|be|r}" }, + { "src": "hello {|4.2| ^num|be|r}" }, + { "src": "hello {|4.2| +num|be|r}" }, + { "src": "hello {|4.2| ?num|be||r|s}" }, + { "src": "hello {|foo| !number}" }, + { "src": "hello {|foo| *number}" }, + { "src": "hello {?number}" }, + { "src": "{xyzz }" }, + { "src": "hello {$foo ~xyzz }" }, + { "src": "hello {$x xyzz }" }, + { "src": "{ !xyzz }" }, + { "src": "{~xyzz }" }, + { "src": "{ num x \\\\ abcde |aaa||3.14||42| r }" }, + { "src": "hello {$foo >num x \\\\ abcde |aaa||3.14| |42| r }" }, + { "src" : ".input{ $n ~ }{{{$n}}}" } ] } diff --git a/testdata/message2/spec/syntax.json b/testdata/message2/spec/syntax.json index 558fc64062b..27b74b2f302 100644 --- a/testdata/message2/spec/syntax.json +++ b/testdata/message2/spec/syntax.json @@ -26,6 +26,11 @@ "src": "\\\\", "exp": "\\" }, + { + "description": "message -> simple-message -> simple-start pattern -> 1*escaped-char", + "src": "\\\\\\{\\|\\}", + "exp": "\\{|}" + }, { "description": "message -> simple-message -> simple-start pattern -> simple-start-char pattern -> ... -> simple-start-char *text-char placeholder", "src": "hello {world}", @@ -68,8 +73,7 @@ "type": "unresolved-variable" } ], - "exp": "hello {$place}", - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "exp": "hello {$place}" }, { "description": "message -> simple-message -> simple-start pattern -> placeholder -> expression -> literal-expression -> \"{\" literal \"}\"", @@ -80,50 +84,43 @@ "description": "... -> literal-expression -> \"{\" literal s annotation \"}\" -> \"{\" literal s function \"}\" -> \"{\" literal s \":\" identifier \"}\" -> \"{\" literal s \":\" name \"}\"", "src": "{a :f}", "exp": "{|a|}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "... -> \"{\" literal s \":\" namespace \":\" name \"}\"", "src": "{a :u:f}", "exp": "{|a|}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "message -> simple-message -> simple-start pattern -> placeholder -> expression -> variable-expression -> \"{\" variable \"}\"", "src": "{$x}", "exp": "{$x}", - "expErrors": [{ "type": "unresolved-variable" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unresolved-variable" }] }, { "description": "... -> variable-expression -> \"{\" variable s annotation \"}\" -> \"{\" variable s function \"}\" -> \"{\" variable s \":\" identifier \"}\" -> \"{\" variable s \":\" name \"}\"", "src": "{$x :f}", "exp": "{$x}", - "expErrors": [{ "type": "unresolved-variable" }, { "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unresolved-variable" }, { "type": "unknown-function" }] }, { "description": "... -> \"{\" variable s \":\" namespace \":\" name \"}\"", "src": "{$x :u:f}", "exp": "{$x}", - "expErrors": [{ "type": "unresolved-variable" }, { "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unresolved-variable" }, { "type": "unknown-function" }] }, { "description": "... -> annotation-expression -> function -> \"{\" \":\" namespace \":\" name \"}\"", "src": "{:u:f}", "exp": "{:u:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "... -> annotation-expression -> function -> \"{\" \":\" name \"}\"", "src": "{:f}", "exp": "{:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "message -> complex-message -> complex-body -> quoted-pattern -> \"{{\" pattern \"}}\" -> \"{{\"\"}}\"", @@ -173,11 +170,10 @@ "exp": "" }, { - "description": "message -> complex-message -> complex-body -> matcher -> match-statement variant -> match selector key quoted-pattern -> \".match\" expression literal quoted-pattern", - "src": ".match{a :f}a{{}}*{{}}", + "description": "message -> complex-message -> complex-body -> ... -> matcher -> match-statement variant -> match selector key quoted-pattern -> \".match\" variable literal quoted-pattern", + "src": ".local $a={a :f}.match $a a{{}}*{{}}", "exp": "", - "expErrors": [ { "type": "unknown-function" } ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }, { "type": "bad-selector" }] }, { "description": "... input-declaration -> input s variable-expression ...", @@ -199,40 +195,57 @@ "src": ".local $x = {a}{{}}", "exp": "" }, + { + "description": "input-declaration-like content in complex-message", + "src": "{{.input {$x}}}", + "params": [{ "name": "x", "value": "X" }], + "exp": ".input X" + }, + { + "description": "local-declaration-like content in complex-message with leading whitespace", + "src": "{{ .local $x = {$y}}}", + "params": [{ "name": "y", "value": "Y" }], + "exp": " .local $x = Y" + }, { "description": "... matcher -> match-statement [s] variant -> match 1*([s] selector) variant -> match selector selector variant -> match selector selector variant key s key quoted-pattern", - "src": ".match{a :f}{b :f}a b{{}}* *{{}}", + "src": ".local $a={a :f}.local $b={b :f}.match $a $b a b{{}}* *{{}}", "exp": "", - "expErrors": [ { "type": "unknown-function" } ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [ + { "type": "unknown-function" }, + { "type": "bad-selector" }, + { "type": "unknown-function" }, + { "type": "bad-selector" } + ] }, { "description": "... matcher -> match-statement [s] variant -> match 1*([s] selector) variant -> match selector variant variant ...", - "src": ".match{a :f}a{{}}b{{}}*{{}}", + "src": ".local $a={a :f}.match $a a{{}}b{{}}*{{}}", "exp": "", - "expErrors": [ { "type": "unknown-function" } ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }, { "type": "bad-selector" }] }, { "description": "... variant -> key s quoted-pattern -> ...", - "src": ".match{a :f}a {{}}*{{}}", + "src": ".local $a={a :f}.match $a a {{}}*{{}}", "exp": "", - "expErrors": [ { "type": "unknown-function" } ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }, { "type": "bad-selector" }] }, { "description": "... variant -> key s key s quoted-pattern -> ...", - "src": ".match{a :f}{b :f}a b {{}}* *{{}}", + "src": ".local $a={a :f}.local $b={b :f}.match $a $b a b {{}}* *{{}}", "exp": "", - "expErrors": [ { "type": "unknown-function" } ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [ + { "type": "unknown-function" }, + { "type": "bad-selector" }, + { "type": "unknown-function" }, + { "type": "bad-selector" } + ] }, { "description": "... key -> \"*\" ...", - "src": ".match{a :f}*{{}}", + "src": ".local $a={a :f}.match $a *{{}}", "exp": "", - "expErrors": [ { "type": "unknown-function" } ], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }, { "type": "bad-selector" }] }, { "description": "simple-message -> simple-start pattern -> placeholder -> expression -> literal-expression -> \"{\" s literal \"}\"", @@ -253,43 +266,37 @@ "description": "simple-message -> simple-start pattern -> placeholder -> expression -> variable-expression -> \"{\" s variable \"}\"", "src": "{ $x}", "exp": "{$x}", - "expErrors": [{ "type": "unresolved-variable" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unresolved-variable" }] }, { "description": "... variable-expression -> \"{\" variable s attribute \"}\" -> \"{\" variable s \"@\" identifier \"}\"", "src": "{$x @c}", "exp": "{$x}", - "expErrors": [{ "type": "unresolved-variable" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unresolved-variable" }] }, { "description": "... -> variable-expression -> \"{\" variable s \"}\"", "src": "{$x }", "exp": "{$x}", - "expErrors": [{ "type": "unresolved-variable" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unresolved-variable" }] }, { "description": "simple-message -> simple-start pattern -> placeholder -> expression -> annotation-expression -> \"{\" s annotation \"}\"", "src": "{ :f}", "exp": "{:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "... annotation-expression -> \"{\" annotation s attribute \"}\" -> \"{\" annotation s \"@\" identifier \"}\"", "src": "{:f @c}", "exp": "{:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "... -> annotation-expression -> \"{\" annotation s \"}\"", "src": "{:f }", "exp": "{:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" s \"#\" identifier \"}\"", @@ -360,29 +367,25 @@ "description": "... annotation-expression -> function -> \":\" identifier option", "src": "{:f k=v}", "exp": "{:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "... option -> identifier s \"=\" literal", "src": "{:f k =v}", "exp": "{:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "... option -> identifier \"=\" s literal", "src": "{:f k= v}", "exp": "{:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "... option -> identifier s \"=\" s literal", "src": "{:f k = v}", "exp": "{:f}", - "expErrors": [{ "type": "unknown-function" }], - "ignoreJava": "See https://github.com/unicode-org/message-format-wg/issues/782" + "expErrors": [{ "type": "unknown-function" }] }, { "description": "... attribute -> \"@\" identifier \"=\" literal ...", @@ -405,8 +408,8 @@ "exp": "a" }, { - "description": "... attribute -> \"@\" identifier s \"=\" s variable ...", - "src": "{42 @foo=$bar}", + "description": "... attribute -> \"@\" identifier s \"=\" s quoted-literal ...", + "src": "{42 @foo=|bar|}", "exp": "42", "expParts": [ { @@ -432,9 +435,9 @@ "exp": "\\" }, { - "description": "... quoted-literal -> \"|\" quoted-char escaped-char \"|\"", - "src": "{|a\\\\|}", - "exp": "a\\" + "description": "... quoted-literal -> \"|\" quoted-char 1*escaped-char \"|\"", + "src": "{|a\\\\\\{\\|\\}|}", + "exp": "a\\{|}" }, { "description": "... unquoted-literal -> number-literal -> %x30", diff --git a/testdata/message2/valid-tests.json b/testdata/message2/valid-tests.json index 4b1ce8d67fb..0f062116b73 100644 --- a/testdata/message2/valid-tests.json +++ b/testdata/message2/valid-tests.json @@ -141,7 +141,7 @@ }, { "comment": "Trailing whitespace after match is valid", - "src": ".match {1 :string} * {{}} ", + "src": ".local $x = {1 :string} .match $x * {{}} ", "exp": "" }, { diff --git a/tools/cldr/.gitignore b/tools/cldr/.gitignore index ac11dec3002..5a3fa6f6edc 100644 --- a/tools/cldr/.gitignore +++ b/tools/cldr/.gitignore @@ -1,9 +1,4 @@ -# Exclude the Maven local repository but keep the lib directory and the top-level readme, scripts and build config. -/lib/** -!/lib/README.txt -!/lib/install-cldr-jars.sh -!/lib/pom.xml - -# Ignore the default Maven target directory. -/cldr-to-icu/target - +# Eclipse IDE generated files +.classpath +.project +.settings/ diff --git a/tools/cldr/build.xml b/tools/cldr/build.xml index 53f815d91e3..b1e1287e4ba 100644 --- a/tools/cldr/build.xml +++ b/tools/cldr/build.xml @@ -3,7 +3,7 @@ - - - - - - - - - - - - - - - diff --git a/tools/cldr/cldr-to-icu/.classpath b/tools/cldr/cldr-to-icu/.classpath deleted file mode 100644 index 6d7587a819e..00000000000 --- a/tools/cldr/cldr-to-icu/.classpath +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/cldr/cldr-to-icu/.project b/tools/cldr/cldr-to-icu/.project deleted file mode 100644 index d3bf0a17a78..00000000000 --- a/tools/cldr/cldr-to-icu/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - cldr-to-icu - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/tools/cldr/cldr-to-icu/.settings/org.eclipse.jdt.core.prefs b/tools/cldr/cldr-to-icu/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 714351aec19..00000000000 --- a/tools/cldr/cldr-to-icu/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/tools/cldr/cldr-to-icu/.settings/org.eclipse.jdt.ui.prefs b/tools/cldr/cldr-to-icu/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index c6293a5e418..00000000000 --- a/tools/cldr/cldr-to-icu/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.ui.ignorelowercasenames=true -org.eclipse.jdt.ui.importorder=java;javax;org;com; -org.eclipse.jdt.ui.ondemandthreshold=9999 -org.eclipse.jdt.ui.staticondemandthreshold=9999 diff --git a/tools/cldr/cldr-to-icu/.settings/org.eclipse.m2e.core.prefs b/tools/cldr/cldr-to-icu/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1cb2..00000000000 --- a/tools/cldr/cldr-to-icu/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/tools/cldr/cldr-to-icu/README.md b/tools/cldr/cldr-to-icu/README.md index 15d1f4d2f75..295a23135ed 100644 --- a/tools/cldr/cldr-to-icu/README.md +++ b/tools/cldr/cldr-to-icu/README.md @@ -6,32 +6,56 @@ License & terms of use: http://www.unicode.org/copyright.html # Basic instructions for running the LdmlConverter via Maven > Note: While this document provides useful background information about the - LdmlConverter, the actual complete process for integrating CLDR data to ICU + `LdmlConverter`, the actual complete process for integrating CLDR data to ICU is described in the document `../../../docs/processes/cldr-icu.md` which is best viewed as [CLDR-ICU integration](https://unicode-org.github.io/icu/processes/cldr-icu.html) +## TLDR + +* Define the `ICU_DIR`, `CLDR_DIR`, and `CLDR_DATA_DIR` environment variables, or (see below) +* Check / update versions +* Build ICU4J: + ```sh + cd "$ICU_DIR" + mvn clean install -f icu4j -DskipTests -DskipITs + ``` +* Build the `cldr-code` library from the `cldr` repo: + ```sh + cd "$CLDR_DIR" + mvn clean install -pl :cldr-all,:cldr-code -DskipTests -DskipITs + ``` +* Build the conversion tool: + ```sh + cd "$ICU_DIR/tools/cldr/cldr-to-icu/" + mvn clean package -DskipTests -DskipITs + ``` +* Run the conversion tool: + ```sh + java -jar target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar + ``` + ## Requirements * A CLDR release for supplying CLDR data and the CLDR API. +* JDK 11+ * The Maven build tool -* The Ant build tool (using JDK 11+) ## Important directories | Directory | Description | |-----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `TOOLS_ROOT` | Path to root of ICU tools directory, below which are (e.g.) the `cldr/` and `unicodetools/` directories. | +| `ICU_DIR` | Path to root of ICU directory, below which are (e.g.) the `icu4c/`, `icu4j/` and `tools/` directories. | | `CLDR_DIR` | This is the path to the to root of standard CLDR sources, below which are the `common/` and `tools/` directories. | | `CLDR_DATA_DIR` | The top-level directory for the CLDR production data (typically the "production" directory in the staging repository). Usually generated locally or obtained from: https://github.com/unicode-org/cldr-staging/tree/main/production | In Posix systems, it's best to set these as exported shell variables, and any following instructions assume they have been set accordingly: -``` -$ export TOOLS_ROOT=/path/to/icu/tools -$ export CLDR_DIR=/path/to/cldr -$ export CLDR_DATA_DIR=/path/to/cldr-staging/production +```sh +export TOOLS_ROOT=/path/to/icu/tools +export CLDR_DIR=/path/to/cldr +export CLDR_DATA_DIR=/path/to/cldr-staging/production ``` Note that you should not attempt to use data from the CLDR project directory @@ -40,65 +64,132 @@ relies on a pre-processing step, and the CLDR data must come from the separate "staging" repository (i.e. https://github.com/unicode-org/cldr-staging) or be pre-processed locally into a different directory. +:point_right: **Note**: the 3 folders can also be overridden: + +* with Java properties (e.g. `-DCLDR_DIR=/foo/bar`) +* from the command line when invoking the tool (the `icuDir`, `cldrDir`, and `cldrDataDir` options) ## Initial Setup -This project relies on the Maven build tool for managing dependencies and uses -Ant for configuration purposes, so both will need to be installed. On a Debian +This project relies on the Maven build tool for managing dependencies, so it will need to be installed. On a Debian based system, this should be as simple as: -``` -$ sudo apt-get install maven ant +```sh +sudo apt-get install maven ``` -You must also install an additional CLDR JAR file the local Maven repository at -`$TOOLS_ROOT/cldr/lib` (see the `README.txt` in that directory for more -information). +## Check / update versions +### Real versions + +**ICU version (`real_icu_ver`):** +```sh +mvn help:evaluate -Dexpression=project.version -q -DforceStdout -f $ICU_DIR/icu4j ``` -$ cd "$TOOLS_ROOT/cldr/lib" -$ ./install-cldr-jars.sh "$CLDR_DIR" + +**CLDR Library version (`real_cldr_ver`):** +```sh +mvn help:evaluate -Dexpression=project.version -q -DforceStdout -f $CLDR_DIR/tools +``` + +### Dependency versions + +**ICU version used by the cldr conversion tool:** \ +⚠️ **Warning:** Must be the same as `real_icu_ver` +```sh +mvn help:evaluate -Dexpression=icu4j.version -q -DforceStdout -f $ICU_DIR/tools/cldr/cldr-to-icu +``` + +**CLDR library version used by the cldr conversion tool:** \ +⚠️ **Warning:** Must be the same as `real_cldr_ver` +```sh +mvn help:evaluate -Dexpression=cldr-code.version -q -DforceStdout -f $ICU_DIR/tools/cldr/cldr-to-icu +``` + +**ICU version used by the cldr library:** \ +⚠️ **Warning:** Must be the same as `real_icu_ver` +```sh +mvn help:evaluate -Dexpression=icu4j.version -q -DforceStdout -f $CLDR_DIR/tools +``` + +### TLDR (Quick update versions without checking) + +```sh +# Get real versions +real_icu_ver=`mvn help:evaluate -Dexpression=project.version -q -DforceStdout -f $ICU_DIR/icu4j` +echo $real_icu_ver +real_cldr_ver=`mvn help:evaluate -Dexpression=project.version -q -DforceStdout -f $CLDR_DIR/tools` +echo $real_cldr_ver +# Set dependency versions +mvn versions:set-property -DgenerateBackupPoms=false -Dproperty=icu4j.version -DnewVersion=$real_icu_ver -f $ICU_DIR/tools/cldr/cldr-to-icu +mvn versions:set-property -DgenerateBackupPoms=false -Dproperty=cldr-code.version -DnewVersion=$real_cldr_ver -f $ICU_DIR/tools/cldr/cldr-to-icu +mvn versions:set-property -DgenerateBackupPoms=false -Dproperty=icu4j.version -DnewVersion=$real_icu_ver -f $CLDR_DIR/tools +``` + +## Build everything + +You must also build and install an additional CLDR library in the the local Maven repository. + +Since that depends on ICU4J, you need to build and install that first. + +Lastly, build the conversion tool + +```sh +# Build ICU4J +cd "$ICU_DIR" +mvn clean install -f icu4j -DskipTests -DskipITs +# Build the CLDR library +cd "$CLDR_DIR" +mvn clean install -pl :cldr-all,:cldr-code -DskipTests -DskipITs +# Build the conversion tool +cd "$ICU_DIR/tools/cldr/cldr-to-icu/" +mvn clean package -DskipTests -DskipITs ``` ## Generating all ICU data and source code +Run the conversion tool: +```sh +cd "$ICU_DIR/tools/cldr/cldr-to-icu/" +java -jar target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar ``` -$ cd "$TOOLS_ROOT/cldr/cldr-to-icu" -$ ant -f build-icu-data.xml -``` + +You can run it with `--help` for all the options supported. ## Other Examples * Outputting a subset of the supplemental data into a specified directory: - ``` - $ ant -f build-icu-data.xml -DoutDir=/tmp/cldr -DoutputTypes=plurals,dayPeriods -DdontGenCode=true + ```sh + java -jar target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar --outDir=/tmp/cldr --outputTypes=plurals,dayPeriods --dontGenCode=true ``` Note: Output types can be listed with mixedCase, lower_underscore or UPPER_UNDERSCORE. Pass `-DoutputTypes=help` to see the full list. * Outputting only a subset of locale IDs (and all the supplemental data): - ``` - $ ant -f build-icu-data.xml -DoutDir=/tmp/cldr -DlocaleIdFilter='(zh|yue).*' -DdontGenCode=true + ```sh + java -jar target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar --outDir=/tmp/cldr --outputTypes=plurals,dayPeriods --dontGenCode=true + + java -jar target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar --outDir=/tmp/cldr --localeIdFilter='(zh|yue).*' --dontGenCode=true ``` * Overriding the default CLDR version string (which normally matches the CLDR library code): - ``` - $ ant -f build-icu-data.xml -DcldrVersion="36.1" + ```sh + java -jar target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar --cldrVersion="36.1" ``` ### Using `alt="ascii"` CLDR alternate values from the CLDR XML CLDR provides alternate values in addition to the default values for locale data. -For example, some locales have time formats using U+202F NARROW NO-BREAK SPACE (NNBSP) between the hours/minutes/seconds and the day periods. +For example, some locales have time formats using U+202F NARROW NO-BREAK SPACE (`NNBSP`) between the hours/minutes/seconds and the day periods. In order to provide the equivalent time formats that use the ASCII space U+0020 SPACE, the alternate values have the extra attribute `alt="ascii"`. Follw these steps to generate ICU data using the ASCII versions of locale data: -1. First, edit the `build-icu-data.xml` file where it mentions `ALTERNATE VALUES` +1. First, edit the `config.xml` file where it mentions `ALTERNATE VALUES` with the correctly annotated source path, target path, and locales list as follows: @@ -150,10 +241,10 @@ as follows: + source="//ldml/dates/calendars/calendar[@type='generic']/dateTimeFormats/availableFormats/dateFormatItem[@id='hms'][@alt='ascii']"/> ``` -1. Then run the generator: +1. Then run the generator: - ``` - $ ant -f build-icu-data.xml + ```sh + java -jar target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar ``` ## Config syntax details @@ -167,15 +258,13 @@ the following excerpt of the DTD schema indicates that there is a default value ``` -See `build-icu-data.xml` for documentation of all options and additional customization. +See `config.xml` for documentation of all options and additional customization. +## Running unit tests (CURRENTLY FAILING) -## Running unit tests - +```sh +mvn test -DCLDR_DIR="$CLDR_DATA_DIR" ``` -$ mvn test -DCLDR_DIR="$CLDR_DATA_DIR" -``` - ## Importing and running from an IDE @@ -183,3 +272,5 @@ This project should be easy to import into an IDE which supports Maven developme as IntelliJ or Eclipse. It uses a local Maven repository directory for the unpublished CLDR libraries (which are included in the project), but otherwise gets all dependencies via Maven's public repositories. + +But before importing and running it you still need to build the ICU4J and the CLDR library (see above). diff --git a/tools/cldr/cldr-to-icu/README.txt b/tools/cldr/cldr-to-icu/README.txt deleted file mode 100644 index d675c1d078b..00000000000 --- a/tools/cldr/cldr-to-icu/README.txt +++ /dev/null @@ -1,11 +0,0 @@ -********************************************************************* -*** © 2019 and later: Unicode, Inc. and others. *** -*** License & terms of use: http://www.unicode.org/copyright.html *** -********************************************************************* - -The instructions for the LdmlConverter tool (a.k.a. CLDR-to-ICU converter) have -moved to README.md in this directory. - -Please read README.md, or better yet, view the rendered form of its Markdown -contents online at Github -(ex: https://github.com/unicode-org/icu/tree/main/tools/cldr/cldr-to-icu) diff --git a/tools/cldr/cldr-to-icu/build-icu-data.xml b/tools/cldr/cldr-to-icu/build-icu-data.xml deleted file mode 100644 index 69bf7f577cb..00000000000 --- a/tools/cldr/cldr-to-icu/build-icu-data.xml +++ /dev/null @@ -1,472 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // A - af, agq, ak, am, ar, ars, as, asa, ast, az, az_AZ, az_Cyrl - - // B - bas, be, bem, bez, bg, bgc, bho, blo, bm, bn, bo, br, brx, bs, bs_BA, bs_Cyrl - - // C - ca, ccp, ce, ceb, cgg, chr, ckb, cs, csw, cv, cy - - // D - da, dav, de, dje, doi, dsb, dua, dyo, dz - - // E - ebu, ee, el, en, en_NH, en_RH, eo, es, et, eu, ewo - - // F - fa, ff, ff_Adlm, ff_CM, ff_GN, ff_MR, ff_SN, fi, fil, fo, fr, fur, fy - - // G - ga, gaa, gd, gl, gsw, gu, guz, gv - - // H - ha, haw, he, hi, hi_Latn, hr, hsb, hu, hy - - // I - ia, id, ie, ig, ii, in, in_ID, is, it, iw, iw_IL - - // J - ja, jgo, jmc, jv - - // K - ka, kab, kam, kde, kea, kgp, khq, ki, kk, kkj, kl, kln, km, kn, ko, kok, kok_Latn, ks - ks_Deva, ks_IN, ksb, ksf, ksh, ku, kw, kxv, kxv_Deva, kxv_IN, kxv_Orya, kxv_Telu, ky - - // L - lag, lb, lg, lij, lkt, lmo, ln, lo, lrc, lt, lu, luo, luy, lv - - // M - mai, mas, mer, mfe, mg, mgh, mgo, mi, mk, ml, mn, mni, mni_IN, mo, mr, ms - mt, mua, my, mzn - - // N - naq, nb, nd, nds, ne, nl, nmg, nn, nnh, no, no_NO, no_NO_NY, nqo, nso, nus, nyn - - // O - oc, om, or, os - - // P - pa, pa_Arab, pa_IN, pa_PK, pcm, pl, prg, ps, pt - - // Q - qu - - // R - raj, rm, rn, ro, rof, ru, rw, rwk - - // S - sa, sah, saq, sat, sat_IN, sbp, sc, sd, sd_Deva, sd_IN, sd_PK, se, seh, ses, sg, sh, sh_BA, sh_CS, sh_YU - shi, shi_Latn, shi_MA, si, sk, sl, smn, sn, so, sq, sr, sr_BA, sr_CS, sr_Cyrl_CS, sr_Cyrl_YU, sr_Latn - sr_Latn_CS, sr_Latn_YU, sr_ME, sr_RS, sr_XK, sr_YU, st, su, su_ID, sv, sw, syr, szl - - // T - ta, te, teo, tg, th, ti, tk, tl, tl_PH, tn, to, tok, tr, tt, twq, tzm - - // U - ug, uk, ur, uz, uz_AF, uz_Arab, uz_Cyrl, uz_UZ - - // V - vai, vai_LR, vai_Latn, vec, vi, vmw, vun - - // W - wae, wo - - // X - xh, xnr, xog - - // Y - yav, yi, yo, yrl, yue, yue_CN, yue_HK, yue_Hans - - // Z - za, zgh, zh, zh_CN, zh_HK, zh_Hant, zh_MO, zh_SG, zh_TW, zu - - - - - - - - - - - - - - - - - - - root, - - // A-B - af, am, ars, ar, as, az, be, bg, bn, bo, br, bs_Cyrl, bs, - - // C-F - ca, ceb, chr, cs, cy, da, de_AT, de, dsb, dz, ee, el, en, - en_US_POSIX, en_US, eo, es, et, fa_AF, fa, ff_Adlm, ff, fil, fi, fo, fr_CA, fr, fy, - - // G-J - ga, gl, gu, ha, haw, he, hi, hr, hsb, hu, hy, - id_ID, id, ig, in, in_ID, is, it, iw_IL, iw, ja, - - // K-P - ka, kk, kl, km, kn, kok, ko, ku, ky, lb, lij, lkt, ln, lo, lt, lv, - mk, ml, mn, mo, mr, ms, mt, my, nb, nb_NO, ne, nl, nn, no, no_NO, nso, - om, or, pa_IN, pa, pa_Guru, pl, ps, pt, - - // R-T - ro, ru, sa, se, sh_BA, sh_CS, sh, sh_YU, si, sk, sl, smn, sq, - sr_BA, sr_Cyrl_ME, sr_Latn, sr_ME, sr_RS, sr, st, sv, sw, - ta, te, th, tk, tn, to, tr, - - // U-Z - ug, uk, ur, uz, vi, wae, wo, xh, yi, yo, yue_CN, yue_Hans_CN, yue_Hans - yue_Hant, yue, zh_CN, zh_Hans, zh_Hant, zh_HK, zh_MO, zh_SG, zh_TW, zh, zu - - - - - - - - - - root, - - // A-E - af, ak, am, ars, ar, az, be, bg, bs, ca, ccp, chr, cs, cy, - da, de_CH, de, ee, el, en_001, en_IN, en, eo, es_419, es_DO, - es_GT, es_HN, es_MX, es_NI, es_PA, es_PR, es_SV, es, es_US, et, - - // F-P - fa_AF, fa, ff, fil, fi, fo, fr_BE, fr_CH, fr, ga, he, hi, hr, - hu, hy, id, in, is, it, iw, ja, ka, kk, kl, km, ko, ky, lb, - lo, lrc, lt, lv, mk, ms, mt, my, nb, ne, nl, nn, no, pl, pt_PT, pt, - - // Q-Z - qu, ro, ru, se, sh, sk, sl, sq, sr_Latn, sr, su, sv, sw, ta, th, tr, - uk, vec, vi, yue_Hans, yue, zh_Hant_HK, zh_Hant, zh_HK, zh_MO, zh_TW, zh - - - - - - root, - de, el, en, en_US_POSIX, en_US, es, fi, fr, it, ja, ko, pt, ru, sv, zh_Hant, zh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/cldr/cldr-to-icu/config.xml b/tools/cldr/cldr-to-icu/config.xml new file mode 100644 index 00000000000..e5be7e6b03d --- /dev/null +++ b/tools/cldr/cldr-to-icu/config.xml @@ -0,0 +1,295 @@ + + + + + + + + // A + af, agq, ak, am, ar, ars, as, asa, ast, az, az_AZ, az_Cyrl + + // B + bas, be, bem, bez, bg, bgc, bho, blo, bm, bn, bo, br, brx, bs, bs_BA, bs_Cyrl + + // C + ca, ccp, ce, ceb, cgg, chr, ckb, cs, csw, cv, cy + + // D + da, dav, de, dje, doi, dsb, dua, dyo, dz + + // E + ebu, ee, el, en, en_NH, en_RH, eo, es, et, eu, ewo + + // F + fa, ff, ff_Adlm, ff_CM, ff_GN, ff_MR, ff_SN, fi, fil, fo, fr, fur, fy + + // G + ga, gaa, gd, gl, gsw, gu, guz, gv + + // H + ha, haw, he, hi, hi_Latn, hr, hsb, hu, hy + + // I + ia, id, ie, ig, ii, in, in_ID, is, it, iw, iw_IL + + // J + ja, jgo, jmc, jv + + // K + ka, kab, kam, kde, kea, kgp, khq, ki, kk, kkj, kl, kln, km, kn, ko, kok, kok_Latn, ks + ks_Deva, ks_IN, ksb, ksf, ksh, ku, kw, kxv, kxv_Deva, kxv_IN, kxv_Orya, kxv_Telu, ky + + // L + lag, lb, lg, lij, lkt, lmo, ln, lo, lrc, lt, lu, luo, luy, lv + + // M + mai, mas, mer, mfe, mg, mgh, mgo, mi, mk, ml, mn, mni, mni_IN, mo, mr, ms + mt, mua, my, mzn + + // N + naq, nb, nd, nds, ne, nl, nmg, nn, nnh, no, no_NO, no_NO_NY, nqo, nso, nus, nyn + + // O + oc, om, or, os + + // P + pa, pa_Arab, pa_IN, pa_PK, pcm, pl, prg, ps, pt + + // Q + qu + + // R + raj, rm, rn, ro, rof, ru, rw, rwk + + // S + sa, sah, saq, sat, sat_IN, sbp, sc, sd, sd_Deva, sd_IN, sd_PK, se, seh, ses, sg, sh, sh_BA, sh_CS, sh_YU + shi, shi_Latn, shi_MA, si, sk, sl, smn, sn, so, sq, sr, sr_BA, sr_CS, sr_Cyrl_CS, sr_Cyrl_YU, sr_Latn + sr_Latn_CS, sr_Latn_YU, sr_ME, sr_RS, sr_XK, sr_YU, st, su, su_ID, sv, sw, syr, szl + + // T + ta, te, teo, tg, th, ti, tk, tl, tl_PH, tn, to, tok, tr, tt, twq, tzm + + // U + ug, uk, ur, uz, uz_AF, uz_Arab, uz_Cyrl, uz_UZ + + // V + vai, vai_LR, vai_Latn, vec, vi, vmw, vun + + // W + wae, wo + + // X + xh, xnr, xog + + // Y + yav, yi, yo, yrl, yue, yue_CN, yue_HK, yue_Hans + + // Z + za, zgh, zh, zh_CN, zh_HK, zh_Hant, zh_MO, zh_SG, zh_TW, zu + + + + + + + + + + + + + + + + + + root, + + // A-B + af, am, ars, ar, as, az, be, bg, bn, bo, br, bs_Cyrl, bs, + + // C-F + ca, ceb, chr, cs, cy, da, de_AT, de, dsb, dz, ee, el, en, + en_US_POSIX, en_US, eo, es, et, fa_AF, fa, ff_Adlm, ff, fil, fi, fo, fr_CA, fr, fy, + + // G-J + ga, gl, gu, ha, haw, he, hi, hr, hsb, hu, hy, + id_ID, id, ig, in, in_ID, is, it, iw_IL, iw, ja, + + // K-P + ka, kk, kl, km, kn, kok, ko, ku, ky, lb, lij, lkt, ln, lo, lt, lv, + mk, ml, mn, mo, mr, ms, mt, my, nb, nb_NO, ne, nl, nn, no, no_NO, nso, + om, or, pa_IN, pa, pa_Guru, pl, ps, pt, + + // R-T + ro, ru, sa, se, sh_BA, sh_CS, sh, sh_YU, si, sk, sl, smn, sq, + sr_BA, sr_Cyrl_ME, sr_Latn, sr_ME, sr_RS, sr, st, sv, sw, + ta, te, th, tk, tn, to, tr, + + // U-Z + ug, uk, ur, uz, vi, wae, wo, xh, yi, yo, yue_CN, yue_Hans_CN, yue_Hans + yue_Hant, yue, zh_CN, zh_Hans, zh_Hant, zh_HK, zh_MO, zh_SG, zh_TW, zh, zu + + + + + + + + + + root, + + // A-E + af, ak, am, ars, ar, az, be, bg, bs, ca, ccp, chr, cs, cy, + da, de_CH, de, ee, el, en_001, en_IN, en, eo, es_419, es_DO, + es_GT, es_HN, es_MX, es_NI, es_PA, es_PR, es_SV, es, es_US, et, + + // F-P + fa_AF, fa, ff, fil, fi, fo, fr_BE, fr_CH, fr, ga, he, hi, hr, + hu, hy, id, in, is, it, iw, ja, ka, kk, kl, km, ko, ky, lb, + lo, lrc, lt, lv, mk, ms, mt, my, nb, ne, nl, nn, no, pl, pt_PT, pt, + + // Q-Z + qu, ro, ru, se, sh, sk, sl, sq, sr_Latn, sr, su, sv, sw, ta, th, tr, + uk, vec, vi, yue_Hans, yue, zh_Hant_HK, zh_Hant, zh_HK, zh_MO, zh_TW, zh + + + + + + root, + de, el, en, en_US_POSIX, en_US, es, fi, fr, it, ja, ko, pt, ru, sv, zh_Hant, zh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/cldr/cldr-to-icu/pom.xml b/tools/cldr/cldr-to-icu/pom.xml index 0d8f6634dcb..677e632ed19 100644 --- a/tools/cldr/cldr-to-icu/pom.xml +++ b/tools/cldr/cldr-to-icu/pom.xml @@ -9,71 +9,60 @@ 4.0.0 - - org.unicode.icu - cldr-lib - 1.0 - ../lib - + org.unicode.icu + cldr-to-icu + 1.0-SNAPSHOT UTF-8 + + 11 + 11 + + 77.0.1-SNAPSHOT + 47.0-SNAPSHOT + 32.1.1-jre + 1.4.4 + 1.9.0 - cldr-to-icu - 1.0-SNAPSHOT org.apache.maven.plugins maven-compiler-plugin - 3.5.1 + 3.13.0 - 8 - 8 - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - org.unicode.icu.tool.cldrtoicu.LdmlConverter - - - - ICU_DIR - ${project.basedir}/../../.. - - + ${maven.compiler.source} + ${maven.compiler.target} org.apache.maven.plugins maven-assembly-plugin - 3.1.1 + 3.7.1 compile single - - - - - org.unicode.icu.tool.cldrtoicu.LdmlConverter - - - - - jar-with-dependencies - - + + + + + org.unicode.icu.tool.cldrtoicu.Cldr2Icu + + + + + jar-with-dependencies + + @@ -83,11 +72,16 @@ com.ibm.icu icu4j - 76.1-SNAPSHOT - + ${icu4j.version} + + + + org.unicode.cldr + cldr-code + ${cldr-code.version} - org.apache.ant - ant - 1.10.11 + commons-cli + commons-cli + ${commons-cli.version} com.google.truth truth - 1.0 - test - - - com.google.truth.extensions - truth-java8-extension - 1.0 + ${truth.version} test - - - githubcldr - GitHub unicode-org/icu Apache Maven Packages - https://maven.pkg.github.com/unicode-org/icu - - diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/Cldr2Icu.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/Cldr2Icu.java new file mode 100644 index 00000000000..b63b062d0e6 --- /dev/null +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/Cldr2Icu.java @@ -0,0 +1,72 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +package org.unicode.icu.tool.cldrtoicu; + +import org.unicode.icu.tool.cldrtoicu.ant.CleanOutputDirectoryTask; +import org.unicode.icu.tool.cldrtoicu.ant.ConvertIcuDataTask; +import org.unicode.icu.tool.cldrtoicu.ant.GenerateCodeTask; + +public class Cldr2Icu { + private final Cldr2IcuCliOptions options = new Cldr2IcuCliOptions(); + + private void convert() { + ConvertIcuDataTask convert = ConvertIcuDataTask.fromXml(options.xmlConfig); + + convert.setCldrDir(options.cldrDataDir); + convert.setOutputDir(options.outDir); + convert.setSpecialsDir(options.specialsDir); + convert.setOutputTypes(options.outputTypes); + convert.setIcuVersion(options.icuVersion); + convert.setIcuDataVersion(options.icuDataVersion); + convert.setCldrVersion(options.cldrVersion); + convert.setMinimalDraftStatus(options.minDraftStatus); + convert.setLocaleIdFilter(options.localeIdFilter); + convert.setIncludePseudoLocales(options.includePseudoLocales); + convert.setEmitReport(options.emitReport); + convert.setParallel(options.parallel); + + convert.init(); + convert.execute(); + } + + private void generateCode(String action) { + GenerateCodeTask generateCode = new GenerateCodeTask(); + + generateCode.setCldrDir(options.cldrDataDir); + generateCode.setCOutDir(options.genCCodeDir); + generateCode.setJavaOutDir(options.genJavaCodeDir); + generateCode.setAction(action); + + generateCode.init(); + generateCode.execute(); + } + + private void outputDirectories() { + CleanOutputDirectoryTask clean = CleanOutputDirectoryTask.fromXml(options.xmlConfig); + + clean.setRoot(options.outDir); + clean.setForceDelete(options.forceDelete); + + clean.init(); + clean.execute(); + } + + private void clean() { + outputDirectories(); + generateCode("clean"); + } + + private void generate() { + convert(); + if (!options.dontGenCode) { + generateCode(null); + } + } + + public static void main(String[] args) { + Cldr2Icu self = new Cldr2Icu(); + self.options.processArgs(args); + self.clean(); + self.generate(); + } +} diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/Cldr2IcuCliOptions.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/Cldr2IcuCliOptions.java new file mode 100644 index 00000000000..14a4ded5987 --- /dev/null +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/Cldr2IcuCliOptions.java @@ -0,0 +1,411 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +package org.unicode.icu.tool.cldrtoicu; + +import java.io.File; +import java.util.Arrays; +import java.util.StringJoiner; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.unicode.icu.tool.cldrtoicu.LdmlConverter.OutputType; + +import com.ibm.icu.util.VersionInfo; + +class Cldr2IcuCliOptions { + private static final String HELP = "help"; + private static final String HELP_DESC = "this text"; + + private static final String ICU_DIR = "icuDir"; + private static final String ICU_DIR_DESC = "Path top level ICU directory" + + " (containing `.git`, `icu4c`, `icu4j`, `tools` directories)"; + private static final String ICU_DIR_DEFAULT = "${environ.ICU_DIR}"; + String icuDir; + + private static final String CLDR_DIR = "cldrDir"; + private static final String CLDR_DIR_DESC = "This is the path to the to root of standard CLDR sources," + + " (containing `common` and `tools` directories)."; + private static final String CLDR_DIR_DEFAULT = "${environ.CLDR_DIR}"; + String cldrDir; + + private static final String CLDR_DATA_DIR = "cldrDataDir"; + private static final String CLDR_DATA_DIR_DESC = "The top-level directory for the CLDR production data" + + " (typically the `production` directory in the staging repository)." + + " Usually generated locally or obtained from https://github.com/unicode-org/cldr-staging/tree/main/production"; + private static final String CLDR_DATA_DIR_DEFAULT = "${environ.CLDR_DATA_DIR}"; + String cldrDataDir; + + private static final String OUT_DIR = "outDir"; + final private static String OUT_DIR_DESC = "The output directory into which to write the converted ICU data. By default" + + " this will overwrite (without deletion) the ICU data files in this ICU release," + + " so it is recommended that for testing, it be set to another value."; + final private static String OUT_DIR_DEFAULT = "${icuDir}/icu4c/source/data"; + String outDir; + + private static final String GEN_C_CODE_DIR = "genCCodeDir"; + private static final String GEN_C_CODE_DIR_DESC = "The output directory into which to write generated C/C++ code." + + " By default this will overwrite (without deletion) the generated C/C++ files in this ICU release," + + " so it is recommended that for testing, it be set to another value."; + private static final String GEN_C_CODE_DIR_DEFAULT = "${icuDir}/icu4c/source"; + String genCCodeDir; + + private static final String GEN_JAVA_CODE_DIR = "genJavaCodeDir"; + private static final String GEN_JAVA_CODE_DIR_DESC = "The output directory into which to write generated Java code." + + " By default this will overwrite (without deletion) the generated Java files in this ICU release," + + " so it is recommended that for testing, it be set to another value."; + private static final String GEN_JAVA_CODE_DIR_DEFAULT = "${icuDir}/icu4j/main/core"; + String genJavaCodeDir; + + private static final String DONT_GEN_CODE = "dontGenCode"; + private static final String DONT_GEN_CODE_DESC = "Set this to true to prevent the generation of" + + " ICU source files"; + private static final String DONT_GEN_CODE_DEFAULT = "false"; + boolean dontGenCode; + + private static final String SPECIALS_DIR = "specialsDir"; + private static final String SPECIALS_DIR_DESC = "The directory in which the additional ICU XML data is stored."; + private static final String SPECIALS_DIR_DEFAULT = "${icuDir}/icu4c/source/data/xml"; + String specialsDir; + + private static final String ICU_VERSION = "icuVersion"; + private static final String ICU_VERSION_DESC = "Default value for ICU version (`icuver.txt`)." + + " Update this for each release."; + private static final String ICU_VERSION_DEFAULT = VersionInfo.ICU_VERSION.toString(); + String icuVersion; + + private static final String ICU_DATA_VERSION = "icuDataVersion"; + private static final String ICU_DATA_VERSION_DESC = "Default value for ICU data version (`icuver.txt`)." + + " Update this for each release."; + private static final String ICU_DATA_VERSION_DEFAULT = VersionInfo.ICU_DATA_VERSION.toString(); + String icuDataVersion; + + private static final String CLDR_VERSION = "cldrVersion"; + private static final String CLDR_VERSION_DESC = "An override for the CLDR version string (`icuver.txt` and others)." + + " This will be extracted from the CLDR library used for building the data if not set here."; + private static final String CLDR_VERSION_DEFAULT = ""; + String cldrVersion; + + private static final String MIN_DRAFT_STATUS = "minDraftStatus"; + private static final String MIN_DRAFT_STATUS_DESC = "The minimum draft status for CLDR data to be used in the conversion." + + " See CldrDraftStatus for more details."; + private static final String MIN_DRAFT_STATUS_DEFAULT = "CONTRIBUTED"; + String minDraftStatus; + + private static final String LOCALE_ID_FILTER = "localeIdFilter"; + private static final String LOCALE_ID_FILTER_DESC = "A regular expression to match the locale IDs to be generated" + + " (useful for debugging specific regions). This is applied after locale ID specifications" + + " have been expanded into full locale IDs, so the value `en` will NOT match `en_GB` or `en_001` etc."; + private static final String LOCALE_ID_FILTER_DEFAULT = ""; + String localeIdFilter; + + private static final String INCLUDE_PSEUDO_LOCALES = "includePseudoLocales"; + private static final String INCLUDE_PSEUDO_LOCALES_DESC = "Whether to synthetically generate \"pseudo locale\" data" + + " (`en_XA` and `ar_XB`)."; + private static final String INCLUDE_PSEUDO_LOCALES_DEFAULT = "false"; + boolean includePseudoLocales; + + private static final String EMIT_REPORT = "emitReport"; + private static final String EMIT_REPORT_DESC = "Whether to emit a debug report containing some possibly" + + " useful information after the conversion has finished."; + private static final String EMIT_REPORT_DEFAULT = "false"; + boolean emitReport; + + private static final String OUTPUT_TYPES = "outputTypes"; + private static final String OUTPUT_TYPES_DESC = "List of output \"types\" to be generated (e.g. `rbnf,plurals,locales`);" + + " an empty list means \"build everything\".\n" + + "Note that the grouping of types is based on the legacy converter behaviour and" + + " is not always directly associated with an output directory (e.g. \"locales\") produces locale data" + + " for `curr/`, `lang/`, `main/`, `region/`, `unit/`, `zone/` but NOT `coll/`, `brkitr/` or `rbnf/`).\n" + // It would be nice to initialize this from OutputType, but to do that we need to read an XML file, + // so we need to know what the cldrDir folder is. But we only know that AFTER we parse the command line. + + "Use outputTypesList to get a list of currently know values."; + private static final String OUTPUT_TYPES_DEFAULT = ""; + String outputTypes; + + private static final String OUTPUT_TYPES_LIST = "outputTypesList"; + private static final String OUTPUT_TYPES_LIST_DESC = "Show the complete list of knonw output types and exit."; + private static final String OUTPUT_TYPES_LIST_DEFAULT = "false"; + + private static final String FORCE_DELETE = "forceDelete"; + private static final String FORCE_DELETE_DESC = "Override to force the 'clean' task to delete files it cannot" + + " determine to be auto-generated by this tool. This is useful if the file header changes since" + + " the heading is what's used to recognize auto-generated files."; + private static final String FORCE_DELETE_DEFAULT = "false"; + boolean forceDelete; + + private static final String XML_CONFIG = "xmlConfig"; + private static final String XML_CONFIG_DESC = "Override to force the 'clean' task to delete files it cannot" + + " determine to be auto-generated by this tool. This is useful if the file header changes since" + + " the heading is what's used to recognize auto-generated files."; + private static final String XML_CONFIG_DEFAULT = "${icuDir}/tools/cldr/cldr-to-icu/config.xml"; + String xmlConfig; + + private static final String PARALLEL = "parallel"; + private static final String PARALLEL_DESC = "Run the generation in parallel (multithreaded), to make it faster."; + private static final String PARALLEL_DEFAULT = "false"; + boolean parallel; + + // These must be kept in sync with getOptions(). + private static final Options options = new Options() + .addOption(Option.builder() + .longOpt(HELP) + .desc(HELP_DESC) + .build()) + .addOption(Option.builder() + .longOpt(ICU_DIR) + .hasArg() + .argName("path") + .desc(descWithDefault(ICU_DIR_DESC, ICU_DIR_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(CLDR_DIR) + .hasArg() + .argName("path") + .desc(descWithDefault(CLDR_DIR_DESC, CLDR_DIR_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(CLDR_DATA_DIR) + .hasArg() + .argName("path") + .desc(descWithDefault(CLDR_DATA_DIR_DESC, CLDR_DATA_DIR_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(OUT_DIR) + .hasArg() + .argName("path") + .desc(descWithDefault(OUT_DIR_DESC, OUT_DIR_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(GEN_C_CODE_DIR) + .hasArg() + .argName("path") + .desc(descWithDefault(GEN_C_CODE_DIR_DESC, GEN_C_CODE_DIR_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(GEN_JAVA_CODE_DIR) + .hasArg() + .argName("path") + .desc(descWithDefault(GEN_JAVA_CODE_DIR_DESC, GEN_JAVA_CODE_DIR_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(DONT_GEN_CODE) + .desc(descWithDefault(DONT_GEN_CODE_DESC, DONT_GEN_CODE_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(SPECIALS_DIR) + .hasArg() + .argName("path") + .desc(descWithDefault(SPECIALS_DIR_DESC, SPECIALS_DIR_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(OUTPUT_TYPES) + .hasArg() + .argName("out_types") + .desc(descWithDefault(OUTPUT_TYPES_DESC, OUTPUT_TYPES_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(OUTPUT_TYPES_LIST) + .desc(descWithDefault(OUTPUT_TYPES_LIST_DESC, OUTPUT_TYPES_LIST_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(ICU_VERSION) + .hasArg() + .argName("version") + .desc(descWithDefault(ICU_VERSION_DESC, ICU_VERSION_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(ICU_DATA_VERSION) + .hasArg() + .argName("version") + .desc(descWithDefault(ICU_DATA_VERSION_DESC, ICU_DATA_VERSION_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(CLDR_VERSION) + .hasArg() + .argName("version") + .desc(descWithDefault(CLDR_VERSION_DESC, CLDR_VERSION_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(MIN_DRAFT_STATUS) + .hasArg() + .argName("draft_status") + .desc(descWithDefault(MIN_DRAFT_STATUS_DESC, MIN_DRAFT_STATUS_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(LOCALE_ID_FILTER) + .hasArg() + .argName("locale_list") + .desc(descWithDefault(LOCALE_ID_FILTER_DESC, LOCALE_ID_FILTER_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(INCLUDE_PSEUDO_LOCALES) + .desc(descWithDefault(INCLUDE_PSEUDO_LOCALES_DESC, INCLUDE_PSEUDO_LOCALES_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(EMIT_REPORT) + .desc(descWithDefault(EMIT_REPORT_DESC, EMIT_REPORT_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(FORCE_DELETE) + .desc(descWithDefault(FORCE_DELETE_DESC, FORCE_DELETE_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(XML_CONFIG) + .hasArg() + .argName("path") + .desc(descWithDefault(XML_CONFIG_DESC, XML_CONFIG_DEFAULT)) + .build()) + .addOption(Option.builder() + .longOpt(PARALLEL) + .desc(descWithDefault(PARALLEL_DESC, PARALLEL_DEFAULT)) + .build()) + ; + + void processArgs(String[] args) { + CommandLine cli = null; + try{ + CommandLineParser parser = new DefaultParser(); + cli = parser.parse(options, args); + } catch (Exception e){ + cli = CommandLine.builder().build(); + showUsageAndExit(); + } + if (cli.hasOption(HELP)) { + showUsageAndExit(); + } + + icuDir = cli.getOptionValue(ICU_DIR, icuDir); + cldrDir = cli.getOptionValue(CLDR_DIR, cldrDir); + cldrDataDir = cli.getOptionValue(CLDR_DATA_DIR, cldrDataDir); + + outDir = cli.getOptionValue(OUT_DIR, expandFolders(OUT_DIR_DEFAULT)); + genCCodeDir = cli.getOptionValue(GEN_C_CODE_DIR, expandFolders(GEN_C_CODE_DIR_DEFAULT)); + genJavaCodeDir = cli.getOptionValue(GEN_JAVA_CODE_DIR, expandFolders(GEN_JAVA_CODE_DIR_DEFAULT)); + dontGenCode = cli.hasOption(DONT_GEN_CODE); + specialsDir = cli.getOptionValue(SPECIALS_DIR, expandFolders(SPECIALS_DIR_DEFAULT)); + outputTypes = cli.getOptionValue(OUTPUT_TYPES, ""); // empty means all + icuVersion = cli.getOptionValue(ICU_VERSION, ICU_VERSION_DEFAULT); + icuDataVersion = cli.getOptionValue(ICU_DATA_VERSION, ICU_DATA_VERSION_DEFAULT); + cldrVersion = cli.getOptionValue(CLDR_VERSION, CLDR_VERSION_DEFAULT); + minDraftStatus = cli.getOptionValue(MIN_DRAFT_STATUS, MIN_DRAFT_STATUS_DEFAULT); + localeIdFilter = cli.getOptionValue(LOCALE_ID_FILTER, LOCALE_ID_FILTER_DEFAULT); + includePseudoLocales = cli.hasOption(INCLUDE_PSEUDO_LOCALES); + emitReport = cli.hasOption(EMIT_REPORT); + forceDelete = cli.hasOption(FORCE_DELETE); + xmlConfig = cli.getOptionValue(XML_CONFIG, expandFolders(XML_CONFIG_DEFAULT)); + parallel = cli.hasOption(PARALLEL); + + if (cli.hasOption(OUTPUT_TYPES_LIST)) { + OutputType[] outTypesToSort = OutputType.values(); + Arrays.sort(outTypesToSort, (o1, o2) -> o1.name().compareTo(o2.name())); + StringJoiner strOutType = new StringJoiner(", "); + for (OutputType ot : outTypesToSort) { + strOutType.add(ot.name()); + } + System.out.println("Known output types: " + strOutType); + System.exit(2); + } + } + + private static String descWithDefault(String description, String defaultValue) { + if (defaultValue != null) { + return description + "\nDefaults to: \"" + defaultValue + "\""; + } else { + return description; + } + } + + private void showUsageAndExit() { + String thisClassName = Cldr2Icu.class.getCanonicalName(); + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( + /*width*/ 120, + /*cmdLineSyntax*/ thisClassName + " [OPTIONS]\n", + /*header*/ "\n" + + "This program is used to convert CLDR xml files to ICU ResourceBundle txt files.\n" + + "Options:", + options, + /*footer*/ "\nExample: " + thisClassName + " --outDir /tmp/debug --localeIdFilter=fr"); + System.exit(-1); + } + + Cldr2IcuCliOptions() { + // This will initialize icuDir, cldrDir, and cldrDataDir from environment variables + validateEnvironment(); + } + + String expandFolders(String str) { + return str + .replace("${icuDir}", icuDir) + .replace("${cldrDir}", cldrDir) + .replace("${cldrDataDir}", cldrDataDir); + } + + // For certain things we want to check both the environment, and Java properties + // (passed with -Dkey=value) + // The property takes precedence. + private static String getEnvironOrProperty(String key) { + String result = System.getProperty(key); + if (result == null) { + result = System.getenv(key); + } + return result; + } + + // Check that the environment variables point to the proper `icu` / `cldr` / `cldr-staging` folders + private void validateEnvironment() { + icuDir = getEnvironOrProperty("ICU_DIR"); + cldrDir = getEnvironOrProperty("CLDR_DIR"); + cldrDataDir = getEnvironOrProperty("CLDR_DATA_DIR"); + + String icuMessage = "Set the ICU_DIR environment variable to the top level ICU directory (containing `.git`, `icu4c`, `icu4j`, `tools` directories)"; + String cldrMessage = "Set the CLDR_DIR environment variable to the top level CLDR directory (containing `common` and `tools` directories)"; + String cldrDataMessage = "Set the CLDR_DATA_DIR environment variable to the top level CLDR production data directory (typically the `production` directory in the staging repository)\n" + + "Usually generated locally or obtained from: https://github.com/unicode-org/cldr-staging/tree/main/production"; + if (icuDir == null) { + System.err.println(icuMessage); + System.exit(1); + } + if (cldrDir == null) { + System.err.println(cldrMessage); + System.exit(1); + } + if (cldrDataDir == null) { + System.err.println(cldrDataMessage); + System.exit(1); + } + + if (!new File(icuDir).isDirectory() + || ! new File(icuDir, "icu4c").isDirectory() + || ! new File(icuDir, "icu4j").isDirectory() + || ! new File(icuDir, "tools/cldr/cldr-to-icu").isDirectory() + || ! new File(icuDir, "tools/cldr/cldr-to-icu/pom.xml").isFile()) { + System.err.println("The `" + icuDir + "` directory does not look like a valid icu root."); + System.err.println(icuMessage); + System.exit(1); + } + if (!new File(cldrDir).isDirectory() + || ! new File(cldrDir, "tools/cldr-code").isDirectory() + || ! new File(cldrDir, "tools/cldr-code/pom.xml").isFile()) { + System.err.println("The `" + cldrDir + "` directory does not look like a valid cldr root."); + System.err.println(cldrMessage); + System.exit(1); + } + if (!new File(cldrDataDir).isDirectory() + || ! new File(cldrDataDir, "common/supplemental").isDirectory() + || ! new File(cldrDataDir, "common/main").isDirectory() + || ! new File(cldrDataDir, "common/main/en.xml").isFile()) { + System.err.println("The `" + cldrDataDir + "` directory does not look like a valid cldr-staging/ root."); + System.err.println(cldrDataMessage); + System.exit(1); + } + + // The cldr-code library checks for CLDR_DIR in the Java properties. + // So if we got cldrDir from or from environment or command line we update the property. + System.setProperty("CLDR_DIR", cldrDir); + } +} diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuConverterConfig.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuConverterConfig.java index a99ba7063a3..8b57e10918c 100644 --- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuConverterConfig.java +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuConverterConfig.java @@ -4,7 +4,6 @@ package org.unicode.icu.tool.cldrtoicu; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; -import static java.util.stream.Collectors.joining; import java.nio.file.Files; import java.nio.file.Path; @@ -22,7 +21,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.ImmutableTable; import com.google.common.collect.SetMultimap; -import com.google.common.collect.Sets; import com.google.common.collect.Table; import com.google.common.collect.TreeBasedTable; import com.google.common.collect.TreeMultimap; @@ -49,6 +47,7 @@ public final class IcuConverterConfig implements LdmlConverterConfig { private Optional cldrVersion = Optional.empty(); private CldrDraftStatus minimumDraftStatus = CldrDraftStatus.CONTRIBUTED; private boolean emitReport = false; + private boolean parallel = false; private final SetMultimap localeIdsMap = TreeMultimap.create(); private final Table forcedAliases = TreeBasedTable.create(); private final Table forcedParents = TreeBasedTable.create(); @@ -113,6 +112,11 @@ public final class IcuConverterConfig implements LdmlConverterConfig { return this; } + public Builder setParallel(boolean parallel) { + this.parallel = parallel; + return this; + } + public Builder addLocaleIds(IcuLocaleDir dir, Iterable localeIds) { localeIdsMap.putAll(dir, localeIds); return this; @@ -140,6 +144,7 @@ public final class IcuConverterConfig implements LdmlConverterConfig { private final IcuVersionInfo versionInfo; private final CldrDraftStatus minimumDraftStatus; private final boolean emitReport; + private final boolean parallel; private final ImmutableSet allLocaleIds; private final ImmutableSetMultimap localeIdsMap; private final ImmutableTable forcedAliases; @@ -163,6 +168,7 @@ public final class IcuConverterConfig implements LdmlConverterConfig { builder.cldrVersion.orElse(CldrDataSupplier.getCldrVersionString())); this.minimumDraftStatus = checkNotNull(builder.minimumDraftStatus); this.emitReport = builder.emitReport; + this.parallel = builder.parallel; // getAllLocaleIds() returns the union of all the specified IDs in the map. this.allLocaleIds = ImmutableSet.copyOf(builder.localeIdsMap.values()); this.localeIdsMap = ImmutableSetMultimap.copyOf(builder.localeIdsMap); @@ -204,6 +210,11 @@ public final class IcuConverterConfig implements LdmlConverterConfig { return emitReport; } + @Override + public boolean parallel() { + return parallel; + } + @Override public ImmutableMap getForcedAliases(IcuLocaleDir dir) { return forcedAliases.row(dir); diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuDataDumper.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuDataDumper.java index 5df53606ba3..90d1b317f49 100644 --- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuDataDumper.java +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/IcuDataDumper.java @@ -179,7 +179,6 @@ final class IcuDataDumper { LineMatch match = LineType.match(line, inBlockComment); checkState(match.getType().isValidTransitionFrom(lastType), "invalid state transition: %s --//-> %s", lastType, match.getType()); - boolean isEndOfWrappedValue = false; switch (match.getType()) { case COMMENT: if (name != null) { diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverter.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverter.java index 6373f9a4bba..f013284b81f 100644 --- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverter.java +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverter.java @@ -288,22 +288,26 @@ public final class LdmlConverter { Path baseDir = config.getOutputDir(); System.out.println("processing standard ldml files"); - for (String id : config.getAllLocaleIds()) { + Stream localeStream = config.getAllLocaleIds().stream(); + if (config.parallel()) { + localeStream = localeStream.parallel(); + } + localeStream.forEach(id -> { // Skip "target" IDs that are aliases (they are handled later). if (!availableIds.contains(id)) { - continue; + return; } // TODO: Remove the following skip when ICU-20997 is fixed if (id.contains("VALENCIA") || id.contains("TARASK")) { System.out.println("(skipping " + id + " until ICU-20997 is fixed)"); - continue; + return; } // Now that former CLDR see locales are in common, there are some language // variants that are not at a high enough coverage level to pick up. // TODO need a better way of handling this. if (id.contains("POLYTON")) { System.out.println("(skipping " + id + ", insufficient coverage level)"); - continue; + return; } IcuData icuData = new IcuData(id, true); @@ -365,7 +369,7 @@ public final class LdmlConverter { writtenLocaleIds.put(dir, id); } } - } + }); System.out.println("processing alias ldml files"); for (IcuLocaleDir dir : splitDirs) { diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverterConfig.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverterConfig.java index 95ee67368cb..f3ef6190748 100644 --- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverterConfig.java +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/LdmlConverterConfig.java @@ -6,7 +6,6 @@ import java.nio.file.Path; import java.util.Map; import java.util.Set; -import com.google.common.base.Preconditions; import org.unicode.cldr.api.CldrDraftStatus; import org.unicode.icu.tool.cldrtoicu.LdmlConverter.OutputType; @@ -149,4 +148,9 @@ public interface LdmlConverterConfig { * Whether to emit a summary report for debug purposes after conversion is complete. */ boolean emitReport(); + + /** + * Whether to generate data in parallel (using multithreading). + */ + boolean parallel(); } diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/CleanOutputDirectoryTask.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/CleanOutputDirectoryTask.java index 01e781387d2..76061b1b348 100644 --- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/CleanOutputDirectoryTask.java +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/CleanOutputDirectoryTask.java @@ -11,6 +11,7 @@ import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.partitioningBy; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -28,9 +29,14 @@ import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Task; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.unicode.icu.tool.cldrtoicu.LdmlConverterConfig.IcuLocaleDir; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import com.google.common.base.CharMatcher; import com.google.common.collect.ImmutableList; @@ -38,7 +44,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.io.CharStreams; -// Note: Auto-magical Ant methods are listed as "unused" by IDEs, unless the warning is suppressed. public final class CleanOutputDirectoryTask extends Task { private static final ImmutableSet ALLOWED_DIRECTORIES = Stream @@ -58,8 +63,7 @@ public final class CleanOutputDirectoryTask extends Task { // header without it (since that's the old behaviour). // Once there's been an ICU release with this line included in the headers of all data // files, we can remove the fallback and just test for this line and nothing else. - private static final String WAS_GENERATED_LABEL = - "Generated using tools/cldr/cldr-to-icu/build-icu-data.xml"; + private static final String WAS_GENERATED_LABEL = "Generated using tools/cldr/cldr-to-icu/"; // The number of header lines to check before giving up if we don't find the generated // label. @@ -84,9 +88,8 @@ public final class CleanOutputDirectoryTask extends Task { public static final class Retain extends Task { private Path path = null; - // Don't use "Path" for the argument type because that always makes an absolute path (e.g. - // relative to the working directory for the Ant task). We want relative paths. - @SuppressWarnings("unused") + // Don't use "Path" for the argument type because that always makes an absolute path + // (e.g. relative to the working directory). We want relative paths. public void setPath(String path) { Path p = Paths.get(path).normalize(); checkBuild(!p.isAbsolute() && !p.startsWith(".."), "invalid path: %s", path); @@ -103,14 +106,12 @@ public final class CleanOutputDirectoryTask extends Task { private String name; private final Set retained = new HashSet<>(); - @SuppressWarnings("unused") public void setName(String name) { checkBuild(ALLOWED_DIRECTORIES.contains(name), "unknown directory name '%s'; allowed values: %s", name, ALLOWED_DIRECTORIES); this.name = name; } - @SuppressWarnings("unused") public void addConfiguredRetain(Retain retain) { retained.add(retain.path); } @@ -121,18 +122,15 @@ public final class CleanOutputDirectoryTask extends Task { } } - @SuppressWarnings("unused") public void setRoot(String root) { // Use String here since on some systems Ant doesn't support automatically converting Path instances. this.root = Paths.get(root); } - @SuppressWarnings("unused") public void setForceDelete(boolean forceDelete) { this.forceDelete = forceDelete; } - @SuppressWarnings("unused") public void addConfiguredDir(Dir dir) { outputDirs.add(dir); } @@ -255,7 +253,7 @@ public final class CleanOutputDirectoryTask extends Task { fileReader.reset(); } boolean isLenientHeaderMatchSoFar = true; - for (int n = 0; n < MAX_HEADER_CHECK_LINES ; n++) { + for (int n = 0; n < MAX_HEADER_CHECK_LINES; n++) { String line = fileReader.readLine(); // True if we have processed the header, not including the trailing generated label. boolean headerIsProcessed = n >= headerLines.size() - 1; @@ -340,4 +338,77 @@ public final class CleanOutputDirectoryTask extends Task { throw new RuntimeException("cannot read resource: " + name, e); } } + + private static Retain getRetain(Element elem) { + if (!"retain".equals(elem.getTagName())) { + return null; + } + String path = elem.getAttribute("path"); + Retain retain = new Retain(); + retain.setPath(path); + return retain; + } + + private static Dir getDirectory(Element element) { + if (!"dir".equals(element.getTagName())) { + return null; + } + String name = element.getAttribute("name"); + Dir dir = new Dir(); + dir.setName(name); + Node node = element.getFirstChild(); + while (node != null) { + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element childElement = (Element) node; + switch (childElement.getTagName()) { + case "retain": + Retain retain = getRetain(childElement); + dir.addConfiguredRetain(retain); + break; + default: + } + } + node = node.getNextSibling(); + } + return dir; + } + + public static CleanOutputDirectoryTask fromXml(String fileName) { + try { + DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document doc = builder.parse(new File(fileName)); + Element root = doc.getDocumentElement(); + if (!"config".equals(root.getTagName())) { + System.err.println("The root of the config file should be "); + return null; + } + + NodeList outputDirectories = root.getElementsByTagName("outputDirectories"); + if (outputDirectories.getLength() != 1) { + System.err.println("Exactly one element allowed and required"); + return null; + } + CleanOutputDirectoryTask cleaner = new CleanOutputDirectoryTask(); + Node node = outputDirectories.item(0).getFirstChild(); + while (node != null) { + if (node instanceof Element) { + Element childElement = (Element) node; + String nodeName = childElement.getTagName(); + switch (nodeName) { + case "dir": + Dir dir = getDirectory(childElement); + cleaner.addConfiguredDir(dir); + break; + default: + break; + } + } + node = node.getNextSibling(); + } + return cleaner; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } } diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java index 48eeea9edfa..0c5c37a8632 100644 --- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java @@ -15,6 +15,7 @@ import static com.google.common.collect.Tables.immutableCell; import static java.util.stream.Collectors.joining; import static org.unicode.cldr.api.CldrPath.parseDistinguishingPath; +import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -25,8 +26,9 @@ import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Task; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.unicode.cldr.api.CldrDataSupplier; import org.unicode.cldr.api.CldrDraftStatus; import org.unicode.cldr.api.CldrPath; @@ -38,6 +40,10 @@ import org.unicode.icu.tool.cldrtoicu.LdmlConverter.OutputType; import org.unicode.icu.tool.cldrtoicu.LdmlConverterConfig.IcuLocaleDir; import org.unicode.icu.tool.cldrtoicu.PseudoLocales; import org.unicode.icu.tool.cldrtoicu.SupplementalData; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import com.google.common.base.Ascii; import com.google.common.base.CaseFormat; @@ -53,10 +59,9 @@ import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; import com.google.common.collect.Table.Cell; -// Note: Auto-magical Ant methods are listed as "unused" by IDEs, unless the warning is suppressed. public final class ConvertIcuDataTask extends Task { private static final Splitter LIST_SPLITTER = - Splitter.on(CharMatcher.anyOf(",\n")).trimResults(whitespace()).omitEmptyStrings(); + Splitter.on(CharMatcher.anyOf(",\n")).trimResults(whitespace()).omitEmptyStrings(); private static final CharMatcher DIGIT_OR_UNDERSCORE = inRange('0', '9').or(is('_')); private static final CharMatcher UPPER_UNDERSCORE = inRange('A', 'Z').or(DIGIT_OR_UNDERSCORE); @@ -77,39 +82,32 @@ public final class ConvertIcuDataTask extends Task { private boolean includePseudoLocales = false; private Predicate idFilter = id -> true; - @SuppressWarnings("unused") public void setOutputDir(String path) { // Use String here since on some systems Ant doesn't support automatically converting Path instances. config.setOutputDir(Paths.get(path)); } - @SuppressWarnings("unused") public void setCldrDir(String path) { // Use String here since on some systems Ant doesn't support automatically converting Path instances. this.cldrPath = checkNotNull(Paths.get(path)); } - @SuppressWarnings("unused") public void setIcuVersion(String icuVersion) { config.setIcuVersion(icuVersion); } - @SuppressWarnings("unused") public void setIcuDataVersion(String icuDataVersion) { config.setIcuDataVersion(icuDataVersion); } - @SuppressWarnings("unused") public void setCldrVersion(String cldrVersion) { config.setCldrVersion(cldrVersion); } - @SuppressWarnings("unused") public void setMinimalDraftStatus(String status) { minimumDraftStatus = resolve(CldrDraftStatus.class, status); } - @SuppressWarnings("unused") public void setOutputTypes(String types) { ImmutableList typeList = LIST_SPLITTER @@ -121,31 +119,30 @@ public final class ConvertIcuDataTask extends Task { } } - @SuppressWarnings("unused") public void setSpecialsDir(String path) { // Use String here since on some systems Ant doesn't support automatically converting Path instances. config.setSpecialsDir(Paths.get(path)); } - @SuppressWarnings("unused") public void setIncludePseudoLocales(boolean includePseudoLocales) { this.includePseudoLocales = includePseudoLocales; } - @SuppressWarnings("unused") public void setLocaleIdFilter(String idFilterRegex) { this.idFilter = Pattern.compile(idFilterRegex).asPredicate(); } - @SuppressWarnings("unused") public void setEmitReport(boolean emit) { config.setEmitReport(emit); } + public void setParallel(boolean parallel) { + config.setParallel(parallel); + } + public static final class LocaleIds extends Task { private ImmutableSet ids; - @SuppressWarnings("unused") public void addText(String localeIds) { this.ids = parseLocaleIds(localeIds); } @@ -162,22 +159,18 @@ public final class ConvertIcuDataTask extends Task { private final List forcedAliases = new ArrayList<>(); private LocaleIds localeIds = null; - @SuppressWarnings("unused") public void setDir(String directory) { this.dir = resolve(IcuLocaleDir.class, directory); } - @SuppressWarnings("unused") public void setInheritLanguageSubtag(String localeIds) { this.inheritLanguageSubtag = parseLocaleIds(localeIds); } - @SuppressWarnings("unused") public void addConfiguredForcedAlias(ForcedAlias alias) { forcedAliases.add(alias); } - @SuppressWarnings("unused") public void addConfiguredLocaleIds(LocaleIds localeIds) { checkBuild(this.localeIds == null, "Cannot add more that one element for : %s", dir); @@ -195,12 +188,10 @@ public final class ConvertIcuDataTask extends Task { private String source = ""; private String target = ""; - @SuppressWarnings("unused") public void setSource(String source) { this.source = whitespace().trimFrom(source); } - @SuppressWarnings("unused") public void setTarget(String target) { this.target = whitespace().trimFrom(target); } @@ -217,17 +208,14 @@ public final class ConvertIcuDataTask extends Task { private String target = ""; private ImmutableSet localeIds = ImmutableSet.of(); - @SuppressWarnings("unused") public void setTarget(String target) { this.target = target.replace('\'', '"'); } - @SuppressWarnings("unused") public void setSource(String source) { this.source = source.replace('\'', '"'); } - @SuppressWarnings("unused") public void setLocales(String localeIds) { this.localeIds = parseLocaleIds(localeIds); } @@ -239,13 +227,11 @@ public final class ConvertIcuDataTask extends Task { } } - @SuppressWarnings("unused") public void addConfiguredLocaleIds(LocaleIds localeIds) { checkBuild(this.localeIds == null, "Cannot add more that one element"); this.localeIds = localeIds; } - @SuppressWarnings("unused") public void addConfiguredDirectory(Directory filter) { checkState(!perDirectoryIds.containsKey(filter.dir), "directory %s specified twice", filter.dir); @@ -289,14 +275,12 @@ public final class ConvertIcuDataTask extends Task { } // Aliases on the outside are applied to all directories. - @SuppressWarnings("unused") public void addConfiguredForcedAlias(ForcedAlias alias) { for (IcuLocaleDir dir : IcuLocaleDir.values()) { config.addForcedAlias(dir, alias.source, alias.target); } } - @SuppressWarnings("unused") public void addConfiguredAltPath(AltPath altPath) { // Don't convert to CldrPath here (it triggers a bunch of CLDR data loading for the DTDs). // Wait until the "execute()" method since in future we expect to use the configured CLDR @@ -304,7 +288,6 @@ public final class ConvertIcuDataTask extends Task { altPaths.add(altPath); } - @SuppressWarnings("unused") public void execute() throws BuildException { // Spin up CLDRConfig outside of other inner loops, to // avoid static init problems seen in CLDR-14636 @@ -408,4 +391,128 @@ public final class ConvertIcuDataTask extends Task { "invalid enumeration name " + name + "; expected one of; " + validNames); } } + + private static AltPath getAltPath(Element elem) { + if (!"altPath".equals(elem.getTagName())) { + return null; + } + String source = elem.getAttribute("source"); + String target = elem.getAttribute("target"); + String locales = elem.getAttribute("locales"); + AltPath ap = new AltPath(); + ap.setSource(source); + ap.setTarget(target); + ap.setLocales(locales); + ap.init(); + return ap; + } + + private static ForcedAlias getForcedAlias(Element elem) { + if (!"forcedAlias".equals(elem.getTagName())) { + return null; + } + String source = elem.getAttribute("source"); + String target = elem.getAttribute("target"); + ForcedAlias fa = new ForcedAlias(); + fa.setSource(source); + fa.setTarget(target); + fa.init(); + return fa; + } + + private static LocaleIds getLocaleIds(Element elem) { + if (!"localeIds".equals(elem.getTagName())) { + return null; + } + LocaleIds localeIds = new LocaleIds(); + String strLocaleIds = elem.getTextContent(); + localeIds.addText(strLocaleIds); + localeIds.init(); + return localeIds; + } + + private static Directory getDirectory(Element element) { + if (!"directory".equals(element.getTagName())) { + return null; + } + String dir = element.getAttribute("dir"); + String inheritLanguageSubtag = element.getAttribute("inheritLanguageSubtag"); + Directory directory = new Directory(); + directory.setDir(dir); + directory.setInheritLanguageSubtag(inheritLanguageSubtag); + Node node = element.getFirstChild(); + while (node != null) { + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element childElement = (Element) node; + switch (childElement.getTagName()) { + case "localeIds": + LocaleIds localeIds = getLocaleIds(childElement); + directory.addConfiguredLocaleIds(localeIds); + break; + case "forcedAlias": + ForcedAlias fa = getForcedAlias(childElement); + directory.addConfiguredForcedAlias(fa); + break; + default: + } + } + node = node.getNextSibling(); + } + if (directory.localeIds == null) { + directory.addConfiguredLocaleIds(new LocaleIds()); + } + directory.init(); + return directory; + } + + public static ConvertIcuDataTask fromXml(String fileName) { + try { + DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document doc = builder.parse(new File(fileName)); + Element root = doc.getDocumentElement(); + if (!"config".equals(root.getTagName())) { + System.err.println("The root of the config file should be "); + return null; + } + + NodeList convertNodes = root.getElementsByTagName("convert"); + if (convertNodes.getLength() != 1) { + System.err.println("Exactly one element allowed and required"); + return null; + } + ConvertIcuDataTask converter = new ConvertIcuDataTask(); + Node node = convertNodes.item(0).getFirstChild(); + while (node != null) { + if (node instanceof Element) { + Element childElement = (Element) node; + String nodeName = childElement.getTagName(); + switch (nodeName) { + case "localeIds": + LocaleIds localeIds = getLocaleIds(childElement); + converter.addConfiguredLocaleIds(localeIds); + break; + case "directory": + Directory directory = getDirectory(childElement); + converter.addConfiguredDirectory(directory); + break; + case "forcedAlias": + ForcedAlias fa = getForcedAlias(childElement); + converter.addConfiguredForcedAlias(fa); + break; + case "altPath": + AltPath altPath = getAltPath(childElement); + converter.addConfiguredAltPath(altPath); + break; + default: + break; + } + } + node = node.getNextSibling(); + } + return converter; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } } diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/GenerateCodeTask.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/GenerateCodeTask.java index 9ab24778af9..004137f5f44 100644 --- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/GenerateCodeTask.java +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/GenerateCodeTask.java @@ -12,12 +12,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Task; import org.unicode.icu.tool.cldrtoicu.CodeGenerator; import org.unicode.icu.tool.cldrtoicu.generator.ResourceFallbackCodeGenerator; -// Note: Auto-magical Ant methods are listed as "unused" by IDEs, unless the warning is suppressed. public final class GenerateCodeTask extends Task { private Path cldrPath; private Path cOutDir; @@ -40,31 +37,26 @@ public final class GenerateCodeTask extends Task { new GeneratedFileDef("common/localefallback_data.h", "src/main/java/com/ibm/icu/impl/LocaleFallbackData.java", new ResourceFallbackCodeGenerator()), }; - @SuppressWarnings("unused") public void setCldrDir(String path) { // Use String here since on some systems Ant doesn't support automatically converting Path instances. this.cldrPath = checkNotNull(Paths.get(path)); } - @SuppressWarnings("unused") public void setCOutDir(String path) { // Use String here since on some systems Ant doesn't support automatically converting Path instances. this.cOutDir = Paths.get(path); } - @SuppressWarnings("unused") public void setJavaOutDir(String path) { // Use String here since on some systems Ant doesn't support automatically converting Path instances. this.javaOutDir = Paths.get(path); } - @SuppressWarnings("unused") public void setAction(String action) { // Use String here since on some systems Ant doesn't support automatically converting Path instances. this.action = action; } - @SuppressWarnings("unused") public void execute() throws BuildException { for (GeneratedFileDef task : generatedFileDefs) { Path cOutPath = cOutDir.resolve(task.cRelativePath); @@ -91,5 +83,4 @@ public final class GenerateCodeTask extends Task { } } } - } diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/Task.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/Task.java new file mode 100644 index 00000000000..049a939b2c8 --- /dev/null +++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/Task.java @@ -0,0 +1,25 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +package org.unicode.icu.tool.cldrtoicu.ant; + +public class Task { + public static class BuildException extends RuntimeException { + private static final long serialVersionUID = 2430911677116799373L; + + public BuildException(String message, Throwable cause) { + super(message, cause); + } + + public BuildException(String message) { + super(message); + } + } + + void log(String format) { + System.out.println(format); + } + + public void execute() throws BuildException {} + + public void init() throws BuildException {} +} diff --git a/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_header.txt b/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_header.txt index 09025850a4f..efef06f32d2 100644 --- a/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_header.txt +++ b/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_header.txt @@ -1,3 +1,3 @@ © 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html -Generated using tools/cldr/cldr-to-icu/build-icu-data.xml +Generated using tools/cldr/cldr-to-icu/ diff --git a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/SupplementalDataTest.java b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/SupplementalDataTest.java index 6d53170769e..f90a5d54ac8 100644 --- a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/SupplementalDataTest.java +++ b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/SupplementalDataTest.java @@ -4,7 +4,6 @@ package org.unicode.icu.tool.cldrtoicu; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; -import static com.google.common.truth.Truth8.assertThat; import static org.unicode.cldr.api.CldrValue.parseValue; import java.nio.file.Path; @@ -22,7 +21,6 @@ import org.unicode.cldr.api.CldrValue; import org.unicode.cldr.tool.LikelySubtags; import org.unicode.cldr.util.LanguageTagCanonicalizer; import org.unicode.cldr.util.LocaleIDParser; -import org.unicode.cldr.util.SupplementalDataInfo; import org.unicode.icu.tool.cldrtoicu.testing.FakeDataSupplier; import com.google.common.base.Joiner; @@ -39,7 +37,11 @@ public class SupplementalDataTest { @BeforeClass public static void loadRegressionData() { - Path cldrRoot = Paths.get(System.getProperty("CLDR_DIR")); + String cldrDir = System.getProperty("CLDR_DIR"); + if (cldrDir == null) { + cldrDir = System.getenv("CLDR_DIR"); + } + Path cldrRoot = Paths.get(cldrDir); regressionData = SupplementalData.create(CldrDataSupplier.forCldrFilesIn(cldrRoot)); likelySubtags = new LikelySubtags(); } diff --git a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/ant/CleanOutputDirectoryTaskTest.java b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/ant/CleanOutputDirectoryTaskTest.java index 08962fcb4c0..881da25d007 100644 --- a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/ant/CleanOutputDirectoryTaskTest.java +++ b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/ant/CleanOutputDirectoryTaskTest.java @@ -18,7 +18,7 @@ import java.util.Arrays; public class CleanOutputDirectoryTaskTest { // Not using the original field since we want this test to fail if this changes unexpectedly. private static final String WAS_GENERATED_LABEL = - "Generated using tools/cldr/cldr-to-icu/build-icu-data.xml"; + "Generated using tools/cldr/cldr-to-icu/"; // Commented version of the label for test data. private static final String WAS_GENERATED_LINE = "// " + WAS_GENERATED_LABEL; diff --git a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/localedistance/LocaleDistanceMapperTest.java b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/localedistance/LocaleDistanceMapperTest.java index 4e1fafe334f..1b94b6e7866 100644 --- a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/localedistance/LocaleDistanceMapperTest.java +++ b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/localedistance/LocaleDistanceMapperTest.java @@ -135,14 +135,15 @@ public class LocaleDistanceMapperTest { // LSR values come in (language, script, region) tuples. They are the mapped-to // values for the likely subtag mappings, ordered by the DTD order in which the // mapping keys were encountered. - assertThat(icuData).hasValuesFor("likely/lsrs", - "", "", "", - "skip", "script", "", - "zh", "Hans", "CN", - "zh", "Hant", "TW", - "en", "Latn", "US", - "zh", "Hant", "HK", - "zh", "Hant", "MO"); + assertThat(icuData).hasValuesFor("likely/lsrnum:intvector", + "0", // "", "", "" + "1", // "skip", "script", "" + "1232236233", // "zh", "Hans", "CN" + "1254131029", // "zh", "Hant", "TW" + "429941505", // "en", "Latn", "US" + "1247517541", // "zh", "Hant", "HK" + "1249741720" // "zh", "Hant", "MO" + ); // It's a bit easier to see how match keys are grouped against the partitions. ImmutableSetMultimap likelyTrie = @@ -174,11 +175,12 @@ public class LocaleDistanceMapperTest { // Pairs of expanded paradigm locales (using LSR tuples) in declaration order. // This is just the list from the CLDR data with no processing. - assertThat(icuData).hasValuesFor("match/paradigms", - "en", "Latn", "US", - "en", "Latn", "GB", - "es", "Latn", "ES", - "es", "Latn", "419"); + assertThat(icuData).hasValuesFor("match/paradigmnum:intvector", + "429941505", // "en", "Latn", "US" + "420631446", // "en", "Latn", "GB" + "429626712", // "es", "Latn", "ES" + "419470284" // "es", "Latn", "419" + ); // See PartitionInfoTest for a description of the ordering of these strings. assertThat(icuData).hasValuesFor("match/partitions", diff --git a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/mapper/Bcp47MapperTest.java b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/mapper/Bcp47MapperTest.java index d5adde881cd..d65ce49df48 100644 --- a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/mapper/Bcp47MapperTest.java +++ b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/mapper/Bcp47MapperTest.java @@ -28,7 +28,9 @@ public class Bcp47MapperTest { RbPath.of("typeAlias", "timezone:alias"), RbValue.of("/ICUDATA/timezoneTypes/typeAlias/timezone"), RbPath.of("typeMap", "timezone:alias"), - RbValue.of("/ICUDATA/timezoneTypes/typeMap/timezone")); + RbValue.of("/ICUDATA/timezoneTypes/typeMap/timezone"), + RbPath.of("ianaMap", "timezone:alias"), + RbValue.of("/ICUDATA/timezoneTypes/ianaMap/timezone")); @Test public void testSimple() { diff --git a/tools/cldr/lib/README.txt b/tools/cldr/lib/README.txt deleted file mode 100644 index bfca72d31fe..00000000000 --- a/tools/cldr/lib/README.txt +++ /dev/null @@ -1,101 +0,0 @@ -********************************************************************* -*** © 2019 and later: Unicode, Inc. and others. *** -*** License & terms of use: http://www.unicode.org/copyright.html *** -********************************************************************* - -What is this directory and why is it empty? -------------------------------------------- - -This is the root of a local Maven repository which needs to be populated before -code which uses the CLDR data API can be executed. - -To do this, you need to have a local copy of the CLDR project configured on your -computer and be able able to build the API jar file and copy an existing utility -jar file. In the examples below it is assumed that $CLDR_ROOT references this -CLDR release. - -Setup ------ - -This project relies on the Maven build tool for managing dependencies and uses -Ant for configuration purposes, so both will need to be installed. On a Debian -based system, this should be as simple as: - -$ sudo apt-get install maven ant - - -Installing the CLDR API jar ---------------------------- - -From this directory: - -$ ./install-cldr-jars.sh "$CLDR_DIR" - - -Manually installing the CLDR API jar ------------------------------------- - -Only follow these remaining steps if the installation script isn't suitable or -doesn't work on your system. - -To regenerate the CLDR API jar you need to build the "jar" target manually -using the Maven pom.xml file in the "tools" directory of the CLDR project: - -$ cd "$CLDR_ROOT/tools" -$ mvn package -DskipTests=true - -This should result in the cldr-code.jar file being built into the cldr-code/target -sub-directory, which can then be installed as a Maven dependency as described above. - - -Updating local Maven repository -------------------------------- - -To update the local Maven repository (e.g. to install the CLDR jar) then from -this directory (lib/) you should run: - -$ mvn install:install-file \ - -Dproject.parent.relativePath="" \ - -DgroupId=org.unicode.cldr \ - -DartifactId=cldr-api \ - -Dversion=0.1-SNAPSHOT \ - -Dpackaging=jar \ - -DgeneratePom=true \ - -DlocalRepositoryPath=. \ - -Dfile="$CLDR_ROOT/tools/cldr-code/target/cldr-code.jar" - -And if you have updated one of these libraries then from this directory run: - -$ mvn dependency:purge-local-repository \ - -Dproject.parent.relativePath="" \ - -DmanualIncludes=org.unicode.cldr:cldr-api:jar - -After doing this, you should see something like the following list of files in -this directory: - -README.txt <-- this file -org/unicode/cldr/cldr-api/maven-metadata-local.xml -org/unicode/cldr/cldr-api/0.1-SNAPSHOT/maven-metadata-local.xml -org/unicode/cldr/cldr-api/0.1-SNAPSHOT/cldr-api-0.1-SNAPSHOT.pom -org/unicode/cldr/cldr-api/0.1-SNAPSHOT/cldr-api-0.1-SNAPSHOT.jar - -Finally, if you choose to update the version number of the snapshot, then also -update all the the pom.xml files which reference it (but this is unlikely to be -necessary). - -Troubleshooting ---------------- - -While the Maven system should keep the CLDR JAR up to date, there is a chance -that you may have an out of date JAR installed elsewhere. If you have any -issues with the JAR not being the expected version (e.g. after making changes) -then run the above "purge" step again, from this directory. - -This should re-resolve the current JAR snapshot from the repository in this -directory. Having purged the Maven cache, next time you build a project, you -should see something like: - -[exec] Downloading from : /org/unicode/cldr/cldr-api/0.1-SNAPSHOT/maven-metadata.xml -[exec] [INFO] Building jar: /tools/cldr/cldr-to-icu/target/cldr-to-icu-1.0-SNAPSHOT-jar-with-dependencies.jar - -This shows that it has had to re-fetch the JAR file. diff --git a/tools/cldr/lib/install-cldr-jars.sh b/tools/cldr/lib/install-cldr-jars.sh deleted file mode 100755 index 2ba989e9fa9..00000000000 --- a/tools/cldr/lib/install-cldr-jars.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -u -# -##################################################################### -### © 2020 and later: Unicode, Inc. and others. ### -### License & terms of use: http://www.unicode.org/copyright.html ### -##################################################################### -# -# This script will attempt to build and install the necessary CLDR JAR files -# from a given CLDR installation root directory. The JAR files are installed -# according to the manual instructions given in README.txt and lib/README.txt. -# -# The user must have installed both 'ant' and 'maven' in accordance with the -# instructions in README.txt before attempting to run this script. -# -# Usage (from the directory of this script): -# -# ./install-cldr-jars.sh -# -# Note to maintainers: This script cannot be assumed to run on a Unix/Linux -# based system, and while a Posix compliant bash shell is required, any -# assumptions about auxiliary Unix tools should be minimized (e.g. things -# like "dirname" or "tempfile" may not exist). Where bash-only alternatives -# have to be used, they should be clearly documented. - -# Exit with a message for fatal errors. -function die() { - echo "$1" - echo "Exiting..." - exit 1 -} >&2 - -# Runs a given command and captures output to the global log file. -# If a command errors, the user can then view the log file. -function run_with_logging() { - echo >> "${LOG_FILE}" - echo "Running: ${@}" >> "${LOG_FILE}" - echo -- "----------------------------------------------------------------" >> "${LOG_FILE}" - "${@}" >> "${LOG_FILE}" 2>&1 - if (( $? != 0 )) ; then - echo -- "---- Previous command failed ----" >> "${LOG_FILE}" - echo "Error running: ${@}" - read -p "Show log file? " -n 1 -r - echo - if [[ "${REPLY}" =~ ^[Yy]$ ]] ; then - less -RX "${LOG_FILE}" - fi - echo "Log file: ${LOG_FILE}" - exit 1 - fi - echo -- "---- Previous command succeeded ----" >> "${LOG_FILE}" -} - -# First require that we are run from the same directory as the script. -# Can't assume users have "dirname" available so hack it a bit with shell -# substitution (if no directory path was prepended, SCRIPT_DIR==$0). -SCRIPT_DIR=${0%/*} -if [[ "$SCRIPT_DIR" != "$0" ]] ; then - cd $SCRIPT_DIR -fi - -# Check for some expected environmental things early. -which ant > /dev/null || die "Cannot find Ant executable 'ant' in the current path." -which mvn > /dev/null || die "Cannot find Maven executable 'mvn' in the current path." - -# Check there's one argument that points at a directory (or a symbolic link to a directory). -(( $# == 1 )) && [[ -d "$1" ]] || die "Usage: ./install-cldr-jars.sh " - -# Set up a log file (and be nice about tidying it up). -# Cannot assume "tempfile" exists so use a timestamp (we expect "date" to exist though). -LOG_FILE="${TMPDIR:-/tmp}/cldr2icu_log_$(date '+%m%d_%H%M%S').txt" -touch $LOG_FILE || die "Cannot create temporary file: ${LOG_FILE}" -echo -- "---- LOG FILE ---- $(date '+%F %T') ----" >> "${LOG_FILE}" - -# Build the cldr-code.jar in the cldr-code/target subdirectory of the CLDR tools directory. -CLDR_TOOLS_DIR="$1/tools" -pushd "${CLDR_TOOLS_DIR}" > /dev/null || die "Cannot change directory to: ${CLDR_TOOLS_DIR}" - -echo "Building CLDR JAR file..." -run_with_logging mvn package -DskipTests=true -[[ -f "cldr-code/target/cldr-code.jar" ]] || die "Error creating cldr-code.jar file" - -popd > /dev/null - -# The -B flag is "batch" mode and won't mess about with escape codes in the log file. -echo "Installing CLDR JAR file..." -run_with_logging mvn -B install:install-file \ - -Dproject.parent.relativePath="" \ - -DgroupId=org.unicode.cldr \ - -DartifactId=cldr-api \ - -Dversion=0.1-SNAPSHOT \ - -Dpackaging=jar \ - -DgeneratePom=true \ - -DlocalRepositoryPath=. \ - -Dfile="${CLDR_TOOLS_DIR}/cldr-code/target/cldr-code.jar" - -echo "Syncing local Maven repository..." -run_with_logging mvn -B dependency:purge-local-repository \ - -Dproject.parent.relativePath="" \ - -DmanualIncludes=org.unicode.cldr:cldr-api:jar - -echo "All done!" -echo "Log file: ${LOG_FILE}" diff --git a/tools/cldr/lib/pom.xml b/tools/cldr/lib/pom.xml deleted file mode 100644 index 842e226dc3b..00000000000 --- a/tools/cldr/lib/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - 4.0.0 - - - - - pom - - - org.unicode.icu - cldr-lib - 1.0 - - - - - local-maven-repo - file://${project.basedir}/${project.parent.relativePath} - - - - - - - org.unicode.cldr - cldr-api - 0.1-SNAPSHOT - - - - diff --git a/vendor/double-conversion/upstream/.github/workflows/ci.yml b/vendor/double-conversion/upstream/.github/workflows/ci.yml index bbc25b74f45..4fa0c4e59c1 100644 --- a/vendor/double-conversion/upstream/.github/workflows/ci.yml +++ b/vendor/double-conversion/upstream/.github/workflows/ci.yml @@ -9,7 +9,10 @@ jobs: build: strategy: matrix: - container: [ ubuntu-latest, macos-latest, windows-latest ] + container: # Updated in BRS + - ubuntu-22.04 + - macos-14 + - windows-2022 build_type: [ Debug, Release ] diff --git a/vendor/double-conversion/upstream/.github/workflows/cifuzz.yml b/vendor/double-conversion/upstream/.github/workflows/cifuzz.yml index f29b4dc78b7..fdf828ad1da 100644 --- a/vendor/double-conversion/upstream/.github/workflows/cifuzz.yml +++ b/vendor/double-conversion/upstream/.github/workflows/cifuzz.yml @@ -4,7 +4,7 @@ permissions: contents: read jobs: Fuzzing: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS permissions: security-events: write steps: diff --git a/vendor/double-conversion/upstream/.github/workflows/scons.yml b/vendor/double-conversion/upstream/.github/workflows/scons.yml index 0505ced7fef..f3e72a33a4f 100644 --- a/vendor/double-conversion/upstream/.github/workflows/scons.yml +++ b/vendor/double-conversion/upstream/.github/workflows/scons.yml @@ -7,7 +7,7 @@ permissions: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 diff --git a/vendor/double-conversion/upstream/.github/workflows/scorecard.yml b/vendor/double-conversion/upstream/.github/workflows/scorecard.yml index b8d556fe190..fe575f44865 100644 --- a/vendor/double-conversion/upstream/.github/workflows/scorecard.yml +++ b/vendor/double-conversion/upstream/.github/workflows/scorecard.yml @@ -20,7 +20,7 @@ permissions: read-all jobs: analysis: name: Scorecard analysis - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Updated in BRS permissions: security-events: write # to upload the results to code-scanning dashboard id-token: write # to publish results and get a badge