Version 3.6.0-216.1.beta
Merge 3.6.0-216.0.dev into beta
diff --git a/.github/workflows/issue-triage.yml b/.github/workflows/issue-triage.yml
index faa96a0..fa0f414 100644
--- a/.github/workflows/issue-triage.yml
+++ b/.github/workflows/issue-triage.yml
@@ -19,6 +19,7 @@
jobs:
triage_issues:
runs-on: ubuntu-latest
+ if: ${{ github.repository_owner == 'dart-lang' }}
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
with:
diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml
index c8387b3..c88f096 100644
--- a/.github/workflows/scorecards-analysis.yml
+++ b/.github/workflows/scorecards-analysis.yml
@@ -52,6 +52,6 @@
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
- uses: github/codeql-action/upload-sarif@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa
+ uses: github/codeql-action/upload-sarif@2c779ab0d087cd7fe7b826087247c2c81f27bfa6
with:
sarif_file: results.sarif
diff --git a/BUILD.gn b/BUILD.gn
index c2ddf40..d649296 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -84,6 +84,7 @@
}
group("runtime_precompiled") {
+ import("runtime/runtime_args.gni")
deps = [
"runtime/bin:dart_precompiled_runtime",
"runtime/bin:gen_snapshot",
@@ -94,6 +95,10 @@
if (is_linux || is_android) {
deps += [ "runtime/bin:abstract_socket_test" ]
}
+ if (dart_dynamic_modules) {
+ deps += [ "utils/dart2bytecode:dart2bytecode_snapshot" ]
+ deps += [ "utils/dynamic_module_runner:dynamic_module_runner_snapshot" ]
+ }
}
group("create_sdk") {
@@ -188,6 +193,7 @@
"tests/ffi/abi_specific_int_test.dart",
"tests/ffi/abi_test.dart",
"tests/ffi/address_of_array_generated_test.dart",
+ "tests/ffi/address_of_cast_test.dart",
"tests/ffi/address_of_struct_generated_test.dart",
"tests/ffi/address_of_test.dart",
"tests/ffi/address_of_typeddata_generated_test.dart",
@@ -294,6 +300,8 @@
"tests/ffi/regress_51538_test.dart",
"tests/ffi/regress_52298_test.dart",
"tests/ffi/regress_52399_test.dart",
+ "tests/ffi/regress_56412_2_test.dart",
+ "tests/ffi/regress_56412_test.dart",
"tests/ffi/regress_b_261224444_test.dart",
"tests/ffi/regress_flutter79441_test.dart",
"tests/ffi/regress_flutter97301_test.dart",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dfbadbe..733ccfe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -41,7 +41,12 @@
- **Breaking Change** [#52444][]: Removed the `Platform()` constructor, which
has been deprecated since Dart 3.1.
+- **Breaking Change** [#53618][]: `HttpClient` now responds to a redirect
+ that is missing a "Location" header by throwing `RedirectException`, instead
+ of `StateError`.
+
[#52444]: https://github.com/dart-lang/sdk/issues/52444
+[#53618]: https://github.com/dart-lang/sdk/issues/53618
#### `dart:js_interop`
@@ -51,7 +56,67 @@
- Added `toJSCaptureThis` so `this` is passed in from JavaScript to the
callback as the first parameter.
-## 3.5.0
+### Tools
+
+#### CFE
+
+- **Breaking Change** [#56466][]: The implementation of the UP and
+ DOWN algorithms in the CFE are changed to match the specification
+ and the corresponding implementations in the Analyzer. The upper and
+ lower closures of type schemas are now computed just before they are
+ passed into the subtype testing procedure instead of at the very
+ beginning of the UP and DOWN algorithms.
+
+[#56466]: https://github.com/dart-lang/sdk/issues/56466
+
+#### Wasm compiler (dart2wasm)
+
+- The condition `dart.library.js` is now false on conditional imports in
+ dart2wasm. Note that it was already a static error to import `dart:js`
+ directly (see [#55266][]).
+
+[#55266]: https://github.com/dart-lang/sdk/issues/55266
+
+## 3.5.2 - 2024-08-28
+
+- Fixes a bug where `ZLibDecoder` would incorrectly attempt to decompress data
+ past the end of the zlib footer (issue [#56481][]).
+- Fixes issue where running `dart` from `PATH` could result in some commands not
+ working as expected (issues [#56080][], [#56306][], [#56499][]).
+- Fixes analysis server plugins not receiving `setContextRoots` requests or
+ being provided incorrect context roots in multi-package workspaces (issue
+ [#56475][]).
+
+[#56481]: https://github.com/dart-lang/sdk/issues/56481
+[#56080]: https://github.com/dart-lang/sdk/issues/56080
+[#56306]: https://github.com/dart-lang/sdk/issues/56306
+[#56499]: https://github.com/dart-lang/sdk/issues/56499
+[#56475]: https://github.com/dart-lang/sdk/issues/56475
+
+## 3.5.1 - 2024-08-14
+
+- Fixes resolving `include:` in `analysis_options.yaml` file in a nested
+ folder in the workspace (issue[#56464][]).
+- Fixes source maps generated by `dart compile wasm` when optimizations are
+ enabled (issue [#56423][]).
+- Fixes a bug in the `dart2wasm` compiler in unsound `-O3` / `-O4` modes where a
+ implicit setter for a field of generic type will store `null` instead of the
+ field value (issue [#56374][]).
+- Fixes a bug in the `dart2wasm` compiler that can trigger in certain situations
+ when using partial instantiations of generic tear-offs (constructors or static
+ methods) in constant expressions (issue [#56440][]).
+- The algorithm for computing the standard upper bound of two types,
+ also known is UP, is provided the missing implementation for
+ `StructuralParameterType` objects. In some corner cases cases the
+ lacking implementation resulted in a crash of the compiler (issue [#56457][]).
+
+[#56464]: https://github.com/dart-lang/sdk/issues/56464
+[#56423]: https://github.com/dart-lang/sdk/issues/56423
+[#56374]: https://github.com/dart-lang/sdk/issues/56374
+[#56440]: https://github.com/dart-lang/sdk/issues/56440
+[#56457]: https://github.com/dart-lang/sdk/issues/56457
+
+## 3.5.0 - 2024-08-06
### Language
@@ -173,7 +238,91 @@
- `Dart_DefaultCanonicalizeUrl` is removed from the Dart C API.
-## 3.4.0
+## 3.4.4 - 2024-06-12
+
+This is a patch release that:
+
+- Fixes an issue where pub would crash when failing to fetch advisories from
+ the server. (issue [pub#4269]).
+
+- Fixes an issue where `const bool.fromEnvironment('dart.library.ffi')` is true
+ and conditional import condition `dart.library.ffi` is true in dart2wasm.
+ (issue [#55948]).
+
+- Fixes an issue where FFI calls with variadic arguments on MacOS Arm64
+ would mangle the arguments. (issue [#55943]).
+
+[pub#4269]: https://github.com/dart-lang/pub/issues/4269
+[#55948]: https://github.com/dart-lang/sdk/issues/55948
+[#55943]: https://github.com/dart-lang/sdk/issues/55943
+
+## 3.4.3 - 2024-06-05
+
+This is a patch release that:
+
+- Fixes an issue where `DART_VM_OPTIONS` were not correctly parsed for
+ standalone Dart executables created with `dart compile exe` (issue
+ [#55818]).
+
+- Fixes a bug in dart2wasm that can result in a runtime error that says
+ `array.new_fixed()` has a constant larger than 10000 (issue [#55873]).
+
+- Adds support for `--enable-experiment` flag to `dart compile` wasm
+ (issue [#55894]).
+
+- Fixes an issue in dart2wasm compiler that can result in incorrect
+ nullability of type parameter (see [#55895]).
+
+- Disallows `dart:ffi` imports in user code in dart2wasm (e.g. issue
+ [#53910]) as dart2wasm's currently only supports a small subset of
+ `dart:ffi` (issue [#55890]).
+
+[#55818]: https://github.com/dart-lang/sdk/issues/55818
+[#55873]: https://github.com/dart-lang/sdk/issues/55873
+[#55894]: https://github.com/dart-lang/sdk/issues/55894
+[#55895]: https://github.com/dart-lang/sdk/issues/55895
+[#55910]: https://github.com/dart-lang/sdk/issues/53910
+[#55890]: https://github.com/dart-lang/sdk/issues/55890
+
+## 3.4.2 - 2024-05-29
+
+This is a patch release that:
+
+- Marks `dart compile wasm` as no longer experimental.
+
+- Fixes two bugs in exception handling in `async` functions in dart2wasm
+ (issues [#55347], [#55457]).
+
+- Fixes restoration of `this` variable in `sync*` and `async` functions in
+ dart2wasm.
+
+- Implements missing control flow constructs (exceptions, switch/case with
+ yields) in `sync*` in dart2wasm (issues [#51342], [#51343]).
+
+- Fixes a bug dart2wasm compiler that surfaces as a compiler crash when indexing
+ lists where the compiler proofs the list to be constant and the index is
+ out-of-bounds (issue [#55817]).
+
+[#55347]: https://github.com/dart-lang/sdk/issues/55347
+[#55457]: https://github.com/dart-lang/sdk/issues/55457
+[#51342]: https://github.com/dart-lang/sdk/issues/51342
+[#51343]: https://github.com/dart-lang/sdk/issues/51343
+[#55817]: https://github.com/dart-lang/sdk/issues/55817
+
+## 3.4.1 - 2024-05-22
+
+This is a patch release that:
+
+- Fixes a bug in the CFE which could manifest as compilation errors of Flutter
+ web apps when compiled with dart2wasm (issue [#55714]).
+
+- Fixes a bug in the pub client, such that `dart run` will not interfere with
+ Flutter l10n (at least for most cases) (issue [#55758]).
+
+[#55714]: https://github.com/dart-lang/sdk/issues/55714
+[#55758]: https://github.com/dart-lang/sdk/issues/55758
+
+## 3.4.0 - 2024-05-14
### Language
diff --git a/DEPS b/DEPS
index 4ac3073..e075762 100644
--- a/DEPS
+++ b/DEPS
@@ -54,7 +54,7 @@
# co19 is a cipd package automatically generated for each co19 commit.
# Use tests/co19/update.sh to update this hash.
- "co19_rev": "246914feafde6a63bb7d259425a1159812b88d83",
+ "co19_rev": "767bb1f623a4f005072224cd7a49726a5b644296",
# The internal benchmarks to use. See go/dart-benchmarks-internal
"benchmarks_internal_rev": "3bd6bc6d207dfb7cf687537e819863cf9a8f2470",
@@ -73,10 +73,10 @@
"checkout_javascript_engines": False,
"d8_tag": "version:12.9.98",
"jsshell_tag": "version:127.0.2",
- "jsc_tag": "version:280364",
+ "jsc_tag": "version:282418",
# https://chrome-infra-packages.appspot.com/p/fuchsia/third_party/clang
- "clang_version": "git_revision:3809e20afc68d7d03821f0ec59b928dcf9befbf4",
+ "clang_version": "git_revision:0cfd03ac0d3f9713090a581bda07584754c73a49",
# https://chrome-infra-packages.appspot.com/p/gn/gn
"gn_version": "git_revision:05eed8f6252e2dd6b555e0b65192ef03e2c4a276",
@@ -97,12 +97,12 @@
### /third_party/ dependencies
# Prefer to use hashes of binaryen that have been reviewed & rolled into g3.
- "binaryen_rev" : "654ee6e2504f11fb0e982a2cf276bafa750f694b",
+ "binaryen_rev" : "459bc0797f67cb2a8fd4598bb7143b34036608d9",
"boringssl_gen_rev": "fef055e8d2749b82c79c8f043be1cbe5e8e4b40c",
"boringssl_rev": "2db0eb3f96a5756298dcd7f9319e56a98585bd10",
"browser-compat-data_tag": "ac8cae697014da1ff7124fba33b0b4245cc6cd1b", # v1.0.22
"cpu_features_rev": "936b9ab5515dead115606559502e3864958f7f6e",
- "devtools_rev": "14084d20946268f2d22c5ed55bd53e0176748368",
+ "devtools_rev": "25053ae4af8f162188388c6f3786e03349652e51",
"icu_rev": "43953f57b037778a1b8005564afabe214834f7bd",
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
"libcxx_rev": "44079a4cc04cdeffb9cfe8067bfb3c276fb2bab0",
@@ -125,13 +125,13 @@
"bazel_worker_rev": "02f190b88df771fc8e05c07d4b64ae942c02f456",
"benchmark_harness_rev": "a06785cdfc51538e3556c1d59bb4f03426e9e1c5",
"boolean_selector_rev": "c5468f44fd9ca0ea3435e1a0a84ff9b6fac38261",
- "browser_launcher_rev": "fe7ffa13ba59ec6f7d56256f79059344555fdaf2",
+ "browser_launcher_rev": "fa98c77e7a2fee21a4ad3528dd79da0f4df6bd0f",
"characters_rev": "7633a16a22c626e19ca750223237396315268a06",
"cli_util_rev": "6a0bb9292ea4bb2c9e547af03da4c9948f9556a1",
"clock_rev": "6e43768a0b135a0d36fc886907b70c4bf27117e6",
"collection_rev": "0c1f829c29da1d63488be774f430b2035a565d6f",
"convert_rev": "9035cafefc1da4315f26058734d0c2a19d5ab56a",
- "crypto_rev": "1216790ba704a0ab194f9cd0da2d65e1767f3342",
+ "crypto_rev": "eede7d6918c51159c1422b7449f40dbac660ee57",
"csslib_rev": "192d720f121792ab05ca157ea280edc7e0410e9c",
# Note: Updates to dart_style have to be coordinated with the infrastructure
# team so that the internal formatter `tools/sdks/dart-sdk/bin/dart format`
@@ -144,32 +144,32 @@
#
# For more details, see https://github.com/dart-lang/sdk/issues/30164.
"dart_style_rev": "f7bd4c42ad6015143f08931540631448048f692d", # disable tools/rev_sdk_deps.dart
- "dartdoc_rev": "ce098154b16255bbc9ddfa89e3f6141262645513",
- "ecosystem_rev": "2719d0c077d76da6fb996820393f3cd96bec6591",
+ "dartdoc_rev": "b4449742c0f7d7fa0179897cac163388e03236c2",
+ "ecosystem_rev": "8626bffad30d08792f0acbc813391800838e8207",
"file_rev": "855831c242a17c2dee163828d52710d9043c7c8d",
"fixnum_rev": "6c19e60366ce3d5edfaed51a7c12c98e7977977e",
"flute_rev": "a531c96a8b43d015c6bfbbfe3ab54867b0763b8b",
"glob_rev": "8b05be87f84f74d90dc0c15956f3ff95805322e5",
"html_rev": "0da420ca1e196cda54ede476d0d8d3ecf55375ef",
- "http_rev": "76512c4cbf987361421030349fd1946e63e33359",
+ "http_rev": "b97b8dc22ea808c4fbd63f73abd7af8ecf694323",
"http_multi_server_rev": "8348be1bf8fd17881e2643086e68c9d2b28dd9ce",
"http_parser_rev": "ce528cf82f3d26ac761e29b2494a9e0c270d4939",
"intl_rev": "5d65e3808ce40e6282e40881492607df4e35669f",
"json_rpc_2_rev": "b4810dc7bee5828f240586c81f3f34853cacdbce",
"leak_tracker_rev": "f5620600a5ce1c44f65ddaa02001e200b096e14c", # manually rolled
- "lints_rev": "8f93c7998ac32bd07fcf4c4fdda60d164a2cb13a",
+ "lints_rev": "894b5006c463d2e1967fba3a8c3540d8ae249061",
"logging_rev": "8752902b75a476d2c7b64dcf01aaaee885f35c4c",
"markdown_rev": "f6eaea38146d8901756418c4e7123eb7bd77249e",
"matcher_rev": "d6d573d0f8d65b36550ce62aad3ce6b5e987b642",
"material_color_utilities_rev": "799b6ba2f3f1c28c67cc7e0b4f18e0c7d7f3c03e",
"mime_rev": "11fec7d6df509a4efd554051cc27e3bf82df9c96",
"mockito_rev": "eb4d1daa20c105c94ac29689c1975f0850fa18f2",
- "native_rev": "b01a3f3ef5e3a219fefb182d4cfc41d2895f32ca", # mosum@ and dacoharkes@ are rolling breaking changes manually while the assets features are in experimental.
+ "native_rev": "5e9e4795d1faa39efeb92ae42fc0fa353778308f", # dart-native-interop-team@ is rolling breaking changes manually while the assets features are in experimental.
"package_config_rev": "76934c2ca25922ec72909bbff7dfbddaf0d02bd9",
"path_rev": "e969f42ed112dd702a9453beb9df6c12ae2d3805",
"pool_rev": "924fb04353cec915d927f9f1aed88e2eda92b98a",
"protobuf_rev": "ccf104dbc36929c0f8708285d5f3a8fae206343e",
- "pub_rev": "570696dd6f7b1e0fb7516eacd197d31542d7168e", # disable tools/rev_sdk_deps.dart
+ "pub_rev": "31fa75baa5872e7f094a554c0ec7741742889530", # disable tools/rev_sdk_deps.dart
"pub_semver_rev": "d9e5ee68a350fbf4319bd4dfcb895fc016337d3a",
"shelf_rev": "9f2dffecbe8f219146a077e401758602752d486a",
"source_map_stack_trace_rev": "741b6ceb4b6cdb8ff620664337d7ecc63ca52cc1",
@@ -182,11 +182,11 @@
"sync_http_rev": "91c0dd5ef9a008f0277aadcfd83036f82e572d09",
"tar_rev": "32ceb55e673141abff4e84b99483fe5eb881c291",
"term_glyph_rev": "38a158f55006cf30942c928171ea601ee5e0308f",
- "test_rev": "8be3c948950c2c30e8f9c49d15ef6c04beb47238",
+ "test_rev": "cd3dbd51fe765f7243ea51783318d82b4031fa7a",
"test_descriptor_rev": "90743bc16bc00526a1b9a64f813614be9b2479d9",
"test_process_rev": "6223572ca16d7585d5f08d9281de6a5734e45150",
"test_reflective_loader_rev": "6e648863b39aab8d0204e769d25805eea9db0ac4",
- "tools_rev": "d563c38c7cfb03bbf5d1f9360b49c36ba45b97ef",
+ "tools_rev": "5b15f8b60bf950a2f06dad3258dee61c153fdb44",
"typed_data_rev": "365468a74251c930a463daf5b8f13227e269111a",
"vector_math_rev": "2cfbe2c115a57b368ccbc3c89ebd38a06764d3d1",
"watcher_rev": "0484625589d8512b36a7ad898a6cc6351d24c556",
@@ -207,7 +207,7 @@
# meant to be downloaded by users for local testing. You can self-service
# update these by following the go/dart-engprod/browsers.md instructions.
"download_chrome": False,
- "chrome_tag": "128.0.6613.5",
+ "chrome_tag": "128.0.6613.36",
"download_firefox": False,
"firefox_tag": "129.0",
@@ -701,7 +701,7 @@
"packages": [
{
"package": "chromium/fuchsia/test-scripts",
- "version": "8WCo7tLjg_GoImlj5eax_w-wxsvRPnmaChqN4ok-5rYC",
+ "version": "oGxqx29_HA1eEBnt9pRiZYDa_BkzACC6l3_3xYYKLjYC",
}
],
"condition": 'download_fuchsia_deps',
@@ -712,7 +712,7 @@
"packages": [
{
"package": "chromium/fuchsia/gn-sdk",
- "version": "sbh76PYVTMxav4ACTgA-TXWcbZTZcWWjsqATCxrGIvwC",
+ "version": "OKGFjciA5Vd0TQks4ow7-ppfxy_Y6v5hSjjn2w6LWjwC",
}
],
"condition": 'download_fuchsia_deps',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 54d4397..41fe279 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -513,6 +513,30 @@
'not runtime/observatory/tests/service:\n' + '\n'.join(files))
]
+
+def _CheckDevCompilerSync(input_api, output_api):
+ """Make sure that any changes in the original and the temporary forked
+ version of the DDC compiler are kept in sync. If a CL touches the
+ compiler.dart there should probably be in a change in compiler_new.dart
+ as well.
+ """
+ OLD = "pkg/dev_compiler/lib/src/kernel/compiler.dart"
+ NEW = "pkg/dev_compiler/lib/src/kernel/compiler_new.dart"
+
+ files = [git_file.LocalPath() for git_file in input_api.AffectedTextFiles()]
+
+ if (OLD in files and NEW not in files):
+ return [
+ output_api.PresubmitPromptWarning(
+ "Make sure to keep the original and temporary forked versions "
+ "of compiler.dart in sync.\n"
+ "You may need to copy or adapt changes between these files:\n" +
+ "\n".join([OLD, NEW]))
+ ]
+
+ return []
+
+
def _CommonChecks(input_api, output_api):
results = []
results.extend(_CheckValidHostsInDEPS(input_api, output_api))
@@ -527,6 +551,7 @@
results.extend(_CheckCopyrightYear(input_api, output_api))
results.extend(_CheckAnalyzerFiles(input_api, output_api))
results.extend(_CheckNoNewObservatoryServiceTests(input_api, output_api))
+ results.extend(_CheckDevCompilerSync(input_api, output_api))
return results
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 8022fe5..f5a30cc 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -210,13 +210,23 @@
is_nacl = false
is_posix = true
is_win = false
+} else if (current_os == "ios") {
+ is_android = false
+ is_chromeos = false
+ is_fuchsia = false
+ is_ios = true
+ is_linux = false
+ is_mac = false
+ is_nacl = false
+ is_posix = true
+ is_win = false
}
# =============================================================================
# BUILD OPTIONS
# =============================================================================
-use_flutter_cxx = is_clang && (is_msan || is_tsan)
+use_flutter_cxx = is_clang && (is_msan || is_tsan || is_ios)
# =============================================================================
# TARGET DEFAULTS
@@ -280,6 +290,8 @@
_native_compiler_configs += [ "//build/config/linux:sdk" ]
} else if (is_mac) {
_native_compiler_configs += [ "//build/config/mac:sdk" ]
+} else if (is_ios) {
+ _native_compiler_configs += [ "//build/config/ios:sdk" ]
} else if (is_android) {
_native_compiler_configs += [ "//build/config/android:sdk" ]
}
@@ -416,6 +428,18 @@
} else if (is_mac) {
host_toolchain = "//build/toolchain/mac:clang_$host_cpu"
set_default_toolchain("//build/toolchain/mac:clang_$current_cpu")
+} else if (is_ios) {
+ import("//build/config/ios/ios_sdk.gni") # For use_ios_simulator
+ host_toolchain = "//build/toolchain/mac:clang_$host_cpu"
+ if (use_ios_simulator) {
+ if (target_cpu == "arm64") {
+ set_default_toolchain("//build/toolchain/mac:ios_clang_arm64_sim")
+ } else {
+ set_default_toolchain("//build/toolchain/mac:ios_clang_x64_sim")
+ }
+ } else {
+ set_default_toolchain("//build/toolchain/mac:ios_clang_arm64")
+ }
} else if (is_fuchsia) {
assert(host_cpu == "x64")
if (host_os == "linux") {
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 29ada98..62fffd5 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -101,13 +101,13 @@
cflags_objcc += common_flags
# Linker warnings.
- if (current_cpu != "arm" && !is_mac) {
+ if (current_cpu != "arm" && !is_mac && !is_ios) {
# TODO(jochen): Enable this on ChromeOS on arm. http://crbug.com/356580
ldflags += [ "-Wl,--fatal-warnings" ]
}
# Enable mitigations for Cortex-A53 Erratum #843419 bug.
- if (current_cpu == "arm64" && is_clang && !is_mac) {
+ if (current_cpu == "arm64" && is_clang && !is_mac && !is_ios) {
ldflags += [ "-Wl,--fix-cortex-a53-843419" ]
}
@@ -166,7 +166,7 @@
# Mac-specific compiler flags setup.
# ----------------------------------
- if (is_mac) {
+ if (is_mac || is_ios) {
# These flags are shared between the C compiler and linker.
common_mac_flags = []
@@ -249,7 +249,7 @@
]
}
- if (is_android || is_linux || is_mac || is_fuchsia) {
+ if (is_android || is_linux || is_mac || is_ios || is_fuchsia) {
if (use_flutter_cxx) {
# shared_library_config isn't transitive, so we don't automatically get
# another versions of libcxx with and without -fPIC. Properly setting this
@@ -391,17 +391,17 @@
# changes since artifacts from an older version of the toolchain may or may
# not be compatible with newer ones. To achieve this, we insert a synthetic
# define into the compile line.
- if (is_clang && (is_linux || is_mac) && dart_sysroot != "alpine") {
+ if (is_clang && (is_linux || is_mac || is_ios) && dart_sysroot != "alpine") {
if (is_linux && host_cpu == "arm64") {
toolchain_stamp_file =
"//buildtools/linux-arm64/clang/.versions/clang.cipd_version"
} else if (is_linux) {
toolchain_stamp_file =
"//buildtools/linux-x64/clang/.versions/clang.cipd_version"
- } else if (is_mac && host_cpu == "arm64") {
+ } else if ((is_mac || is_ios) && host_cpu == "arm64") {
toolchain_stamp_file =
"//buildtools/mac-arm64/clang/.versions/clang.cipd_version"
- } else if (is_mac) {
+ } else if (is_mac || is_ios) {
toolchain_stamp_file =
"//buildtools/mac-x64/clang/.versions/clang.cipd_version"
}
@@ -649,7 +649,7 @@
]
}
- if (is_mac) {
+ if (is_mac || is_ios) {
# TODO(abarth): Re-enable once https://github.com/domokit/mojo/issues/728
# is fixed.
# default_warning_flags += [ "-Wnewline-eof" ]
@@ -825,7 +825,7 @@
]
}
- if (is_mac) {
+ if (is_mac || is_ios) {
# Mac dead code stripping requires symbols.
common_optimize_on_ldflags += [ "-Wl,-dead_strip" ]
} else {
diff --git a/build/config/fuchsia/gn_configs.gni b/build/config/fuchsia/gn_configs.gni
index 24a91f9..76d7bc4 100644
--- a/build/config/fuchsia/gn_configs.gni
+++ b/build/config/fuchsia/gn_configs.gni
@@ -5,12 +5,6 @@
assert(is_fuchsia)
declare_args() {
- # The target API level for this repository. Embedders should override this
- # value to specify the API level the packages produced from this repository
- # should be targeting, e.g. in their top-level //.gn file. A value of -1
- # means that no API level will be passed to the tools that consumes it.
- fuchsia_target_api_level = 12
-
# Path to the fuchsia SDK. This is intended for use in other templates &
# rules to reference the contents of the fuchsia SDK.
fuchsia_sdk = "//third_party/fuchsia/sdk/$host_os"
diff --git a/build/config/ios/BUILD.gn b/build/config/ios/BUILD.gn
new file mode 100644
index 0000000..d8a577b
--- /dev/null
+++ b/build/config/ios/BUILD.gn
@@ -0,0 +1,9 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import("//build/config/sysroot.gni")
+import("../clang/clang.gni")
+
+config("sdk") {
+ # We statically link a libcxx built from source on iOS.
+}
diff --git a/build/config/ios/ios_sdk.gni b/build/config/ios/ios_sdk.gni
new file mode 100644
index 0000000..4ee46a3
--- /dev/null
+++ b/build/config/ios/ios_sdk.gni
@@ -0,0 +1,66 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/toolchain/rbe.gni")
+
+declare_args() {
+ # SDK path to use. When empty this will use the default SDK based on the
+ # value of use_ios_simulator.
+ ios_sdk_path = ""
+
+ # Set to true when targeting a simulator build on iOS. False means that the
+ # target is for running on the device. The default value is to use the
+ # Simulator except when targeting GYP's Xcode builds (for compat with the
+ # existing GYP build).
+ use_ios_simulator = false
+
+ # Minimum supported version of the iOS SDK.
+ ios_sdk_min = "12.0"
+
+ # The path to the iOS device SDK.
+ ios_device_sdk_path = ""
+
+ # The path to the iOS simulator SDK.
+ ios_simulator_sdk_path = ""
+
+ ios_enable_relative_sdk_path = use_rbe
+}
+
+if (ios_sdk_path == "") {
+ _find_sdk_args = [
+ "--print_sdk_path",
+ ios_sdk_min,
+ ]
+
+ if (use_rbe) {
+ _find_sdk_args += [
+ "--create_symlink_at",
+
+ # $root_build_dir starts with "//", which is removed by rebase_path().
+ rebase_path("$root_build_dir/sdk/xcode_links", "//"),
+ ]
+ }
+
+ if (use_ios_simulator && ios_simulator_sdk_path == "") {
+ _find_sdk_args += [ "--platform=iphone_simulator" ]
+ _find_sdk_result =
+ exec_script("//build/mac/find_sdk.py", _find_sdk_args, "list lines")
+ ios_simulator_sdk_path = _find_sdk_result[0]
+ }
+
+ if (!use_ios_simulator && ios_device_sdk_path == "") {
+ _find_sdk_args += [ "--platform=iphone" ]
+ _find_sdk_result =
+ exec_script("//build/mac/find_sdk.py", _find_sdk_args, "list lines")
+ ios_device_sdk_path = _find_sdk_result[0]
+ }
+
+ if (use_ios_simulator) {
+ assert(ios_simulator_sdk_path != "")
+ ios_sdk_path = ios_simulator_sdk_path
+ } else {
+ assert(ios_device_sdk_path != "")
+ ios_sdk_path = ios_device_sdk_path
+ }
+}
diff --git a/build/mac/find_sdk.py b/build/mac/find_sdk.py
index 0b2c46b..04a06f9 100755
--- a/build/mac/find_sdk.py
+++ b/build/mac/find_sdk.py
@@ -34,7 +34,7 @@
dst = os.path.join(ROOT_SRC_DIR, dst)
if not os.path.isdir(dst):
- os.makedirs(dst)
+ os.makedirs(dst, exist_ok=True)
dst = os.path.join(dst, os.path.basename(src))
@@ -85,6 +85,16 @@
help=
"Create symlink to SDK at given location and return symlink path as SDK "
"info instead of the original location.")
+ parser.add_option("--platform",
+ action="store",
+ type="choice",
+ choices=[
+ "mac", "iphone", "iphone_simulator", "watch",
+ "watch_simulator"
+ ],
+ dest="platform",
+ default="mac",
+ help="SDK Platform")
(options, args) = parser.parse_args()
min_sdk_version = args[0]
@@ -92,20 +102,28 @@
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True)
+ platform = {
+ 'mac': 'MacOSX',
+ 'iphone': 'iPhoneOS',
+ 'iphone_simulator': 'iPhoneSimulator',
+ 'watch': 'WatchOS',
+ 'watch_simulator': 'WatchSimulator'
+ }[options.platform]
out, err = job.communicate()
if job.returncode != 0:
print(out, file=sys.stderr)
print(err, file=sys.stderr)
raise Exception('Error %d running xcode-select' % job.returncode)
sdk_dir = os.path.join(out.rstrip(),
- 'Platforms/MacOSX.platform/Developer/SDKs')
+ f'Platforms/{platform}.platform/Developer/SDKs')
if not os.path.isdir(sdk_dir):
raise Exception(
'Install Xcode, launch it, accept the license ' +
'agreement, and run `sudo xcode-select -s /path/to/Xcode.app` ' +
'to continue.')
sdks = [
- re.findall('^MacOSX(\d+\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)
+ re.findall(fr'^{platform}(\d+\.\d+)\.sdk$', s)
+ for s in os.listdir(sdk_dir)
]
sdks = [s[0] for s in sdks if s] # [['10.5'], ['10.6']] => ['10.5', '10.6']
sdks = [
@@ -130,9 +148,11 @@
return min_sdk_version
if options.print_sdk_path:
- sdk_path = subprocess.check_output(
- ['xcodebuild', '-version', '-sdk', 'macosx' + best_sdk, 'Path'],
- universal_newlines=True).strip()
+ sdk_path = subprocess.check_output([
+ 'xcodebuild', '-version', '-sdk',
+ platform.lower() + best_sdk, 'Path'
+ ],
+ universal_newlines=True).strip()
if options.create_symlink_at:
print(CreateSymlinkForSDKAt(sdk_path, options.create_symlink_at))
else:
diff --git a/build/rbe/rewrapper_dart.py b/build/rbe/rewrapper_dart.py
index 62faf8a..7e3aec5 100644
--- a/build/rbe/rewrapper_dart.py
+++ b/build/rbe/rewrapper_dart.py
@@ -564,6 +564,8 @@
self.outputs.append(self.rebase(self.optarg))
elif self.get_option(['--platform']):
self.extra_paths.add(self.rebase(self.optarg))
+ elif self.get_option(['--dynamic-interface']):
+ self.extra_paths.add(self.rebase(self.optarg))
elif self.get_option(['--packages', '-D']):
pass
elif arg in [
diff --git a/build/secondary/third_party/libcxxabi/BUILD.gn b/build/secondary/third_party/libcxxabi/BUILD.gn
index 7a101ac..a086276 100644
--- a/build/secondary/third_party/libcxxabi/BUILD.gn
+++ b/build/secondary/third_party/libcxxabi/BUILD.gn
@@ -57,7 +57,6 @@
"src/cxa_exception_storage.cpp",
"src/cxa_handlers.cpp",
"src/cxa_personality.cpp",
- "src/cxa_thread_atexit.cpp",
"src/cxa_vector.cpp",
"src/cxa_virtual.cpp",
"src/fallback_malloc.cpp",
@@ -70,4 +69,8 @@
if (!(is_tsan && is_linux)) {
sources += [ "src/cxa_guard.cpp" ]
}
+
+ if (is_fuchsia || (is_posix && !is_ios && !is_macos)) {
+ sources += [ "src/cxa_thread_atexit.cpp" ]
+ }
}
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index 21a228c..e0310ef 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -6,6 +6,7 @@
# some enhancements since the commands on Mac are slightly different than on
# Linux.
+import("//build/config/ios/ios_sdk.gni")
import("//build/config/mac/mac_sdk.gni")
assert(host_os == "mac")
@@ -269,6 +270,77 @@
}
}
+# Toolchain used for iOS device targets.
+mac_toolchain("ios_clang_arm64") {
+ toolchain_cpu = "arm64"
+ toolchain_os = "mac"
+ prefix = rebased_clang_dir
+ cc = "${compiler_prefix}${prefix}/clang"
+ cxx = "${compiler_prefix}${prefix}/clang++"
+ if (use_rbe) {
+ cc = "${cc} --target=arm64-apple-darwin"
+ cxx = "${cxx} --target=arm64-apple-darwin"
+ }
+ asm = "${assembler_prefix}${prefix}/clang"
+ ar = "${prefix}/llvm-ar"
+ ld = "${link_prefix}${prefix}/clang++"
+ strip = "${prefix}/llvm-strip"
+ nm = "${prefix}/llvm-nm"
+ is_clang = true
+ if (ios_enable_relative_sdk_path) {
+ ios_sdk_path = rebase_path(ios_sdk_path, root_build_dir)
+ }
+ sysroot_flags = "-isysroot $ios_sdk_path -miphoneos-version-min=$ios_sdk_min"
+}
+
+# Toolchain used for iOS simulator targets (arm64).
+mac_toolchain("ios_clang_arm64_sim") {
+ toolchain_cpu = "arm64"
+ toolchain_os = "mac"
+ prefix = rebased_clang_dir
+ cc = "${compiler_prefix}${prefix}/clang"
+ cxx = "${compiler_prefix}${prefix}/clang++"
+ if (use_rbe) {
+ cc = "${cc} --target=arm64-apple-darwin"
+ cxx = "${cxx} --target=arm64-apple-darwin"
+ }
+ asm = "${assembler_prefix}${prefix}/clang"
+ ar = "${prefix}/llvm-ar"
+ ld = "${link_prefix}${prefix}/clang++"
+ strip = "${prefix}/llvm-strip"
+ nm = "${prefix}/llvm-nm"
+ is_clang = true
+ if (ios_enable_relative_sdk_path) {
+ ios_sdk_path = rebase_path(ios_sdk_path, root_build_dir)
+ }
+ sysroot_flags =
+ "-isysroot $ios_sdk_path -mios-simulator-version-min=$ios_sdk_min"
+}
+
+# Toolchain used for iOS simulator targets (x64).
+mac_toolchain("ios_clang_x64_sim") {
+ toolchain_cpu = "x64"
+ toolchain_os = "mac"
+ prefix = rebased_clang_dir
+ cc = "${compiler_prefix}${prefix}/clang"
+ cxx = "${compiler_prefix}${prefix}/clang++"
+ if (use_rbe) {
+ cc = "${cc} --target=x86_64-apple-darwin"
+ cxx = "${cxx} --target=x86_64-apple-darwin"
+ }
+ asm = "${assembler_prefix}${prefix}/clang"
+ ar = "${prefix}/llvm-ar"
+ ld = "${link_prefix}${prefix}/clang++"
+ strip = "${prefix}/llvm-strip"
+ nm = "${prefix}/llvm-nm"
+ is_clang = true
+ if (ios_enable_relative_sdk_path) {
+ ios_sdk_path = rebase_path(ios_sdk_path, root_build_dir)
+ }
+ sysroot_flags =
+ "-isysroot $ios_sdk_path -mios-simulator-version-min=$ios_sdk_min"
+}
+
mac_toolchain("clang_x64") {
toolchain_cpu = "x64"
toolchain_os = "mac"
diff --git a/docs/Building-Dart-SDK-for-ARM-or-RISC-V.md b/docs/Building-Dart-SDK-for-ARM-or-RISC-V.md
index 425a317..c7a589a 100644
--- a/docs/Building-Dart-SDK-for-ARM-or-RISC-V.md
+++ b/docs/Building-Dart-SDK-for-ARM-or-RISC-V.md
@@ -1,26 +1,21 @@
-> [!IMPORTANT]
-> This page was copied from https://github.com/dart-lang/sdk/wiki and needs review.
-> Please [contribute](../CONTRIBUTING.md) changes to bring it up-to-date -
-> removing this header - or send a CL to delete the file.
-
----
-
# Introduction
The Dart VM runs on a variety of ARM processors on Linux and Android. This document explains how to build the Dart VM and SDK to target these platforms.
# Cross-compiling
-If you are building natively on the device you will be running on, you can skip this step. The build scripts download a cross-compilation toolchain using clang that supports ia32, x64, arm and arm64, so you do not need to install a cross-compiler yourself unless you want to target riscv.
+The build scripts download a Clang toolchain that can target IA32, X64, ARM, ARM64 or RISCV64 and run on an X64 or ARM64 host. For these cases, you do not need to install a cross-compiler yourself. For other cases, like building on a RISCV64 host or targeting RISCV32, you will need to manually install a toolchain.
## Linux
If you are running Debian/Ubuntu, you can obtain a cross-compiler by doing the following:
-```
-$ sudo apt-get install g++-arm-linux-gnueabihf # For 32-bit ARM (ARMv7)
-$ sudo apt-get install g++-aarch64-linux-gnu # For 64-bit ARM (ARMv8)
-$ sudo apt-get install g++-riscv64-linux-gnu # For 64-bit RISC-V (RV64GC)
+```bash
+$ sudo apt-get install g++-i686-linux-gnu # To target ia32
+$ sudo apt-get install g++-x86-64-linux-gnu # To target x64
+$ sudo apt-get install g++-arm-linux-gnueabihf # To target arm
+$ sudo apt-get install g++-aarch64-linux-gnu # To target arm64
+$ sudo apt-get install g++-riscv64-linux-gnu # To target riscv64
```
## Android
@@ -33,21 +28,21 @@
With the default Debian/Ubuntu toolchains, simply do:
-```
-$ ./tools/build.py --no-rbe --no-clang --mode release --arch arm create_sdk
-$ ./tools/build.py --no-rbe --no-clang --mode release --arch arm64 create_sdk
-$ ./tools/build.py --no-rbe --no-clang --mode release --arch riscv64 create_sdk
+```bash
+$ ./tools/build.py --no-clang --mode release --arch arm create_sdk
+$ ./tools/build.py --no-clang --mode release --arch arm64 create_sdk
+$ ./tools/build.py --no-clang --mode release --arch riscv64 create_sdk
```
You can also produce only a Dart VM runtime, no SDK, by replacing `create_sdk` with `runtime`. This process involves also building a VM that targets ia32/x64, which is used to generate a few parts of the SDK.
You can use a different toolchain using the -t switch. For example, if the path to your gcc is /path/to/toolchain/prefix-gcc, then you'd invoke the build script with:
-```
-$ ./tools/build.py --no-rbe --no-clang -m release -a arm -t arm=/path/to/toolchain/prefix create_sdk
-$ ./tools/build.py --no-rbe --no-clang -m release -a arm64 -t arm64=/path/to/toolchain/prefix create_sdk
-$ ./tools/build.py --no-rbe --no-clang -m release -a riscv32 -t riscv32=/path/to/toolchain/prefix create_sdk
-$ ./tools/build.py --no-rbe --no-clang -m release -a riscv64 -t riscv64=/path/to/toolchain/prefix create_sdk
+```bash
+$ ./tools/build.py --no-clang -m release -a arm -t arm=/path/to/toolchain/prefix create_sdk
+$ ./tools/build.py --no-clang -m release -a arm64 -t arm64=/path/to/toolchain/prefix create_sdk
+$ ./tools/build.py --no-clang -m release -a riscv32 -t riscv32=/path/to/toolchain/prefix create_sdk
+$ ./tools/build.py --no-clang -m release -a riscv64 -t riscv64=/path/to/toolchain/prefix create_sdk
```
## Android
@@ -60,8 +55,6 @@
$ ./tools/build.py --mode=release --arch=riscv64 --os=android create_sdk
```
-For all of these configurations, the runtime only can be built using the runtime target as above.
-
## Debian Packages
You can create Debian packages targeting ARM or RISC-V as follows:
diff --git a/docs/Building-for-Fuchsia.md b/docs/Building-for-Fuchsia.md
index df48e49..2ec27ed 100644
--- a/docs/Building-for-Fuchsia.md
+++ b/docs/Building-for-Fuchsia.md
@@ -2,13 +2,15 @@
Download and install the Dart source tree using the standard instructions for building Dart.
-To build for Fuchsia, you must first update your `.gclient file with:
+To build for Fuchsia, you must first update your `.gclient` file with:
```
"custom_vars": {
"download_fuchsia_deps": True,
},
```
+and re-run `gclient sync`.
+
# Building
```bash
diff --git a/docs/Building-the-Dart-VM-for-Android.md b/docs/Building-the-Dart-VM-for-Android.md
index 1407485..3cae102 100644
--- a/docs/Building-the-Dart-VM-for-Android.md
+++ b/docs/Building-the-Dart-VM-for-Android.md
@@ -1,17 +1,10 @@
-> [!IMPORTANT]
-> This page was copied from https://github.com/dart-lang/sdk/wiki and needs review.
-> Please [contribute](../CONTRIBUTING.md) changes to bring it up-to-date -
-> removing this header - or send a CL to delete the file.
-
----
-
# Introduction
-It is possible to build and run the standalone Dart VM for Android devices. This setup is not yet thoroughly tested, but is available for experimentation.
+It is possible to build and run the standalone Dart VM for Android devices.
## Limitations
-* The host (build) machine must be an x86 Linux machine.
+* The host (build) machine must be an x64 Linux machine or a Mac.
* The target (Android) device must be a device or emulator that supports the Android NDK.
* The resulting Android Dart VM can only be run from the Android command line.
* The resulting Android Dart VM only has access to dart:core APIs. It does not have access to the Android C or Java APIs.
@@ -33,7 +26,7 @@
Once you've set up your build tree, you can build the Dart VM for Android by using the standard Dart build script with the addition of the --os android build flag:
-`$ tools/build.py --no-rbe --arch=arm,arm64,ia32,x64 --os=android runtime`
+`$ tools/build.py --arch=arm,arm64,ia32,x64,riscv64 --os=android runtime`
# Testing the result
@@ -61,7 +54,7 @@
Copy the Dart VM executable to the Android emulator:
-`$ adb push out/android/ReleaseAndroid{ARM,ARM64,IA32,X64}/dart /data/local/tmp/dart/dart`
+`$ adb push out/android/ReleaseAndroid{ARM,ARM64,IA32,X64,RISCV64}/dart /data/local/tmp/dart/dart`
Create a simple Dart test script:
@@ -107,7 +100,3 @@
```
Now, you can copy dart and hello.dart to the device as above. If an emulator is also running, be sure to give adb the -d switch to tell it to use the attached device instead of the emulator. Use the -s switch to give the device ID explicitly.
-
-# Notes
-
-The only effect of the `target_os` line in the Dart `.gclient` configuration file is to install the Android tools. Despite what the name `target_os` implies, the target_os line does not affect which OS is targeted. Therefore, once you've installed the Android tools you can (and should) leave the `target_os = ["android"]` line in place even when switching back and forth between building for Android and building for Linux.
diff --git a/docs/assets/Dart-platforms.svg b/docs/assets/Dart-platforms.svg
index e35cb87..43b4b49 100644
--- a/docs/assets/Dart-platforms.svg
+++ b/docs/assets/Dart-platforms.svg
@@ -1 +1,120 @@
-<svg version="1.1" viewBox="0.0 0.0 960.0 540.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="g6d68e641dc_0_1.0"><path d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#g6d68e641dc_0_1.0)"><path fill="#ffffff" d="m0 0l960.0 0l0 540.0l-960.0 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m750.38715 323.95078l72.0 0l0 72.0l-72.0 0z" fill-rule="evenodd"/><g transform="matrix(0.375 0.0 0.0 0.375 750.3871391076116 323.95079002624675)"><clipPath id="g6d68e641dc_0_1.1"><path d="m0 1.1368684E-13l192.0 0l0 192.0l-192.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g6d68e641dc_0_1.1)" fill="#000" width="192.0" height="192.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAACnUlEQVR42u3dTU5TURiA4W+kGGEFJia1nZnIMlwBBDfjkFgS5yVlHy6hCRPAkRtQQ8D/Arb+4F0A2vaec3uw93m/BUC+h96e0wSIkCRJkiRJkiRJkiRJkiRJkiRJ7WwjnsUwDuM8pnHd8pnGWbWJYexUW1lKvTiIy9av/aa5qDbTa3b5a9H3Mz/j9bBXbamhOnFsxXPMSXSbWP/jeGe5c85pbOZe/8N4a7ELEWR9Fdyp3uctddEHUcb3gucWWmP6udb/IK6ss9aJKNNj6KVl1pxhnuf/uVXWnHGspwM8tciE2U4HeGGNCTNIB3hljQkzSgd4Y41JF7LkfACRMpN0AGegtEnugyUCAGAAtBbgoyUCAGAAADBlAD5ZIgAABgAAUwbgsyUCAGAAADBlAL5YIgAABgCApr7Aksv9/TcO8BUAAAAAALQW4BsAAAAAAAAAoAzAGAAAAAAAAABQBuACAAAAAAAAAFAG4BIAAAAAAAAAUAbgCgAAAAAAtBbgOwAAAADcXoC2/wIFgFUHmAAAAAAAAAAAygBMAdxuABcxAAAAAFhdgB8AAAAAAAAAgDIAPwEAAAAAQGsBfgEAAAAAAAAAygD8BgAAAAAAAACUAbgGAAAAAAAAAAAAAAAAAADL3c+q/4JGszNJBzizxoQ5TQc4tMaEGaUDDK0xYQbpADvWmDBb6QAbM/92rvnbjON+joPbgVXWnP08J+eeo2jNI+ijXJeXPeusMbv5bo/34rWFLjhHcTfnBb5bXSksdf55H53cn6FsIlhg/U+a+BirGyeWO9fDpxMNtRZ9J6IZJ5/dvM/+m14Hw5n/W6yt1679fAfPf7ce2zGIUfWuMPEzX21hVG1jK8+tV5IkSZIkSZIkSZIkSZIkSZIk/X/9AQVB8byLag0gAAAAAElFTkSuQmCC"/></g><path fill="#000000" fill-opacity="0.0" d="m153.50787 323.95078l72.0 0l0 71.997406l-72.0 0z" fill-rule="evenodd"/><g transform="matrix(0.375 0.0 0.0 0.3749863517060367 153.50787401574803 323.95079002624675)"><clipPath id="g6d68e641dc_0_1.2"><path d="m5.684342E-14 1.1368684E-13l192.0 0l0 192.0l-192.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g6d68e641dc_0_1.2)" fill="#000" width="192.0" height="192.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAChElEQVR42u3az04TURTA4bOiRPAVoDSuDL4NBJ6HEMIT8PeBmkwC8SEM0nQJJLQbHY0miO2VRe8dZ+b7nb2h58PhXoYISZIkSZIkSZIkSZIkSfrR+ziM66hiGvP41vGZ15+yiqs4iM3/Y/kf6tU/dX7ti+YxLmPU7PLX47QH3/OpmcVJDJpa/yg+93r5v+c2hk2s/1N8tfxfcxe75b/77y3+D4Jh2We/h8/ruSn5s+DUwhfMcbmD59y6F56IdsoAXFv2krkoc+t9suol8xAb+QEOLTox+x5AnX8IVdacmHF+gKk1J2aSH8ARNH0Uzd6/voSu1/jnBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFoAsOpXIKv+93N//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA9gN4IQMAAAAAAAAAAAAAQHkAf5gFAAAAAAAAAAAAAICLmBcyAAAAAAAAAAAAAAB04CLS8IIAAAAAAAAAAAAAAADgIuaFDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANA/AC9kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgPbX+hcyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwBuar/yVSpdmlh9gas2JmeQHqKw5MeP8AFfWnJjz/AAH1pyYvfwAm/Fo0UvmId6VOIhdWvWSOStzEh7Vhy3L/nueY7vUZeTEuhfMUbnb4CBuLfzVVLFW8kI+jDtLfzFfYqv070R2EbxY/8cmfi01jBvL//nw2YqGGsRxz09Ez/WP3rVotJ24qC8g/bx2nZU7eKbbiP2aYRyTHvx/mNWfchznsVfm1itJkiRJkiRJkiRJkiSp/X0HRZsvITTTpHoAAAAASUVORK5CYII="/></g><path fill="#000000" fill-opacity="0.0" d="m569.04724 323.95078l72.0 0l0 72.0l-72.0 0z" fill-rule="evenodd"/><g transform="matrix(0.375 0.0 0.0 0.375 569.0472440944882 323.95079002624675)"><clipPath id="g6d68e641dc_0_1.3"><path d="m2.2737368E-13 1.1368684E-13l192.0 0l0 192.0l-192.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g6d68e641dc_0_1.3)" fill="#000" width="192.0" height="192.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAACpUlEQVR42u3dTWoTYRjA8QcEaUvrzo24EFJ1WbyBh5DSHsQDKLho6d7ClJ7BO7gIZlfxArrRNPGzSTWpX7NxV0wy70xeyvz+zwECzy+ZvDNZJEKSJEmSJEmSJEmSJEmSJEmSJLWzjdiNInoxjGn8aflMY1BuooidcitL6V4cx3nr137ZjOMoNptd/mocxIVV//fzsB8rTa3/bryx4jnmJDpNrP9BnFrunNOPrfrf/da/GEGtn4I1F58KF6IavwsOLLTC7NV38HTyqXYiqukydGyZFaeoY/033HZVnlGspwPsWmTCbKcDFNaYMIfpAD1rTJhuOsDQGpNuyJLzwDllJukAs16i7TW+HwAAAACoup/fAAAAAJAP4BcAAAAAAGgtwE8AAAAAyAdwAQAAAAD5AKYAAAAAAKC1AH6UBwAAQEaAHwAAAACQD+A7AAAAAABoLcA5AAAAAOQDGAMAAABAPoARAAAAAABoLcAZAAAAAOQD+AYAAAAA+QC+AgAAAACA1gJ8AQAAAIB8AJ8BAAAAIB/AJwAAAAAA0FqAjwAAAACQD2AIAAAAAPkABgAAAAAAoLUApwAAAACQD6APAAAAAPkAPgAAAADAlQbwh84p8zYdYGCNCXOSDtCzxoR5kQ5QWGPCPEkH2LHGhHmYDrARY4usOO/jWh0HrSOrrDjP6jnpbjqKVpqzuFnXzca+dVaYx/Xd7a3GawtdcF7Wc/3/Vyf6lrrQHfCtup95bCGYe97F/SYeO3XKG2vLnT2v4nZTT/5WYs+JaMZ/xjyN680+fu1EESOrvvTY+TzuLOcZ+Hpsx2F0y2+FSevXPim30C238SjWmvnBxTQ7VgAAgAEAwAAAYAAAMAAAGAAADAAAZhkAkiRJkiRJkiRJkiRJkiRJkiTpqvcXJ/L3x3SkrnYAAAAASUVORK5CYII="/></g><path fill="#000000" fill-opacity="0.0" d="m329.84033 323.95078l72.0 0l0 72.0l-72.0 0z" fill-rule="evenodd"/><g transform="matrix(0.375 0.0 0.0 0.375 329.84033254593174 323.95079002624675)"><clipPath id="g6d68e641dc_0_1.4"><path d="m0 1.1368684E-13l192.0 0l0 192.0l-192.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g6d68e641dc_0_1.4)" fill="#000" width="192.0" height="192.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAADFElEQVR42u3ZXUpVYRgF4AXZAIxK7C7K0UjQTZF3gRAJRhBSY4jInIzgCArF6F6cgQj504Vmns4huop+iML9vjzrm8Ba36Pbs4+JiIiIiIjI/89MFrKWjexmP6cZXfA5HbfYHbdZy4Nc7371V/IkWxd+5b86m1ket2yZG3mTT4O+/O/nOK8z2+vyL+fFeNao0DnKSqa6XP9cPpS6/O/nfW51uP67OSx5/ZNzkDvVr/9RvpS9/sk5y2Lt6x81OIt1Hz5nLQDOaj6I5go/+3/8W1Duz/Hlop98fna2q30ofd7q+ifnWa233uN2AIeZqQPwpt31T86rOl+5fWoJcJTpGgBPWl7/5CzVANhqC/Cuxr9bRm3Pea4NH2ChMcAo94cPsNYaYHX4AButAdaHD7DbGmBn+AD7rQH2hg9w2hrgZPgAv6pfJaU3AFAeAADlAQBQHgAA5QEAUB4AAOUBAFAeAADlAQBQHoANygOwQXkANigPwAblAdigPAAblAdgAwAANgAAYAMAADYAAGADAAA2AABgAwAANgAAYAMA5W0AoLwNAJS3AYDyNgBQ3gYAytsAQHkbAChvAwDlAQBQHgAA5QEAUB4AAOUBAFAeAADlAQBQHgAA5QEAUB6ADcoDsEF5ADYoD8AG5QHYoDwAG5QHYAMAADYAAGADAAA2AABgAwAANgAAYAMAADYAKA/Q4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAktOBDf63bU6GD7DfGmBv+AC7rQF2hg+w0RpgffgAa60BVocP8KA1wL3hA8w0BjjP1RTIZluAtymR5bYvYY9rAFzJccvrP8p0iuR1S4CXKZPZ8U9Lt+s/yPUUyko7gKcplam8b3X9W7mUYrk9/qXtcv0fczMFcydnLa7/c+ZTNIstAB6mcBaL/xZ8rn393x5EB4Wf/fNpkFvZLvrJ52aaZCrPcljstetpvQ+ev/ua+lWR9+OjvKz11vvnmc5S3uV8sFd/nrd5XOcrt7/NtdzPatazk72cXPiln4xb7IzbrOZejX+3iIiIiIhI9XwF9HsrYIKAArIAAAAASUVORK5CYII="/></g><path fill="#000000" fill-opacity="0.0" d="m397.72223 323.95078l72.0 0l0 72.0l-72.0 0z" fill-rule="evenodd"/><g transform="matrix(0.375 0.0 0.0 0.375 397.7222223097113 323.95079002624675)"><clipPath id="g6d68e641dc_0_1.5"><path d="m0 1.1368684E-13l192.0 0l0 192.0l-192.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g6d68e641dc_0_1.5)" fill="#000" width="192.0" height="192.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAADtElEQVR42u3Zy0pbURiG4c/EKh4KRduBqb0LRS9A7AW0jeKNeBgbjbQUKlrRoSgIoiCV9j5CpvVYBxIzN5mkaw8KharJhrWM/+r7rYmz//DEnb13JEIIIYQQQggJl4zGtaBDlVVVXY02n7rroqwDzWvMdRZ93qioq7Yv/b5zqWW9jnf5L7X5BD7xzU5NGxqMcf0z7l+9YeTcaCqu5T/Tlpnl/zlf1RnL+nv13dz6k3Osnjg+/T9Mrj8532L4L9gyu/7krNv/6m0YP3nL639l6M7nvlPRgF2ATfPrT86a3afeehQAt8rZBChGsf7kFGy+cruKBuBCHfYAxqNZf3JG7QEsRAUwZw/gMCqAfXsA5agASvYAqlEBVOwB1KMCqNkDaER2AAAAAAAA8AdAvwwEAP0yEAD0y0AA0C8DAUC/AABAvwAAQL8AAEC/AABAvwAAQL8AAEC/AABAvwAAQL8AAEC/AABAvwAAQL8AAAAAAAAAAAAAAAAAAAAAAAAAAAwEAAAMBAAADAQAAAwEAAAMBAAADAQAAAwEAAAMBAAADAQAAAwEAAAMBAAADAQA/TIQAPTLQADQLwMBQL8MBAD9AgAA/QIAAP0CAAD9AgAA/QIAAP0CAAD9AgAA/QIAAP0CAAD9AgAA/QIAAP0CAAAAAAAAAAAAAAAAAAAAwEAAAMBAAADAQAAAwEAANB/I2gEAAAAAAAAAAAAAAAAA2g3wUwVNaEhd7uTcX0s6BeCxAE70Xpl/6mWU1xkA4QG21XtvzT7tABAWoNi07icAwgFst1R5F4AwACcPXHz+Tr/OAQgB8KHl2tMAKMCNZ6bl2pkA90P/PUAhVfUiAL4XMJGq+iQAvhcwlKr6MAC+F9CVqno3APWoAGr2AKqeV5Br6yWoYg+g3NYv4beeq5fsARx4XsFSquornqvv2wOY97yC0xQPYlnvLyNm7QGMeb8Pybdce8Z77RF7ABn98ryEM/W1VPm5Lj1XPleHDGbZ++dwp6W6e97rLspkht3ds+9VfGxa9bP3mrcpn8KfUDYCvBbeVf8DF5+9ABVXZTaDugmwkHNN33FHlHVfvRcBql3rhQxnKtAvtGcqatJd5LrdGXaPXStBfgVLzjsZz0agxTzOWZX5dOrY7PqP3IUtgvQYJThynUeSTq0bvPhkFVXyqphZ/rX9r967MqA191Dz1Jd/qy+2bzwfTk5LQe7WfT1hLNp96k3zmm5Uc9pXyV2Uam1fes11UXLdzGrE5is3QgghhBBCiNX8Bl8/v/b3kBTFAAAAAElFTkSuQmCC"/></g><path fill="#000000" fill-opacity="0.0" d="m153.50916 390.18634l72.0 0l0 35.24411l-72.0 0z" fill-rule="evenodd"/><path fill="#000000" d="m165.1771 403.74698l1.78125 0l5.078125 13.359375l-1.734375 0l-1.34375 -3.671875l-5.78125 0l-1.34375 3.671875l-1.734375 0l5.078125 -13.359375zm3.234375 8.1875l-1.78125 -4.8125l-0.53125 -1.4375l-0.0625 0l-0.53125 1.4375l-1.78125 4.8125l4.6875 0zm5.405945 -8.1875l4.5 0q1.109375 0 2.0625 0.515625q0.953125 0.5 1.515625 1.40625q0.578125 0.890625 0.578125 2.03125q0 0.9375 -0.421875 1.75q-0.421875 0.796875 -1.171875 1.34375q-0.734375 0.53125 -1.625 0.71875l-0.03125 0.046875l3.765625 5.46875l0 0.078125l-1.859375 0l-3.640625 -5.453125l-2.09375 0l0 5.453125l-1.578125 0l0 -13.359375zm4.40625 6.4375q0.703125 0 1.296875 -0.3125q0.609375 -0.328125 0.96875 -0.890625q0.375 -0.5625 0.375 -1.28125q0 -0.609375 -0.328125 -1.171875q-0.3125 -0.5625 -0.890625 -0.90625q-0.5625 -0.359375 -1.296875 -0.359375l-2.953125 0l0 4.921875l2.828125 0zm6.5263214 -6.4375l2.28125 0l4.265625 10.953125l0.0625 0l4.265625 -10.953125l2.28125 0l0 13.359375l-1.5625 0l0 -8.484375l0.078125 -2.546875l-0.078125 0l-4.359375 11.03125l-1.3125 0l-4.359375 -11.03125l-0.078125 0l0.078125 2.546875l0 8.484375l-1.5625 0l0 -13.359375zm19.531311 13.65625q-0.8125 0 -1.65625 -0.328125q-0.828125 -0.34375 -1.515625 -1.0625q-0.671875 -0.71875 -0.96875 -1.796875l1.4375 -0.59375q0.296875 1.078125 1.015625 1.671875q0.71875 0.59375 1.6875 0.59375q0.703125 0 1.3125 -0.296875q0.625 -0.3125 0.984375 -0.859375q0.359375 -0.546875 0.359375 -1.21875q0 -0.65625 -0.359375 -1.1875q-0.359375 -0.546875 -0.984375 -0.859375q-0.625 -0.3125 -1.375 -0.3125l-1.09375 0l0 -1.46875l0.984375 0q1.03125 0 1.71875 -0.578125q0.6875 -0.59375 0.6875 -1.578125q0 -0.890625 -0.671875 -1.421875q-0.671875 -0.546875 -1.65625 -0.546875q-0.96875 0 -1.53125 0.5q-0.546875 0.5 -0.78125 1.234375l-1.46875 -0.609375q0.34375 -1.015625 1.296875 -1.828125q0.96875 -0.8125 2.484375 -0.8125q1.109375 0 2.0 0.453125q0.90625 0.453125 1.421875 1.25q0.515625 0.796875 0.515625 1.78125q0 1.0 -0.515625 1.6875q-0.5 0.6875 -1.25 1.078125l0 0.078125q0.953125 0.390625 1.5625 1.203125q0.625 0.8125 0.625 1.90625q0 1.125 -0.578125 2.03125q-0.5625 0.890625 -1.546875 1.390625q-0.96875 0.5 -2.140625 0.5zm5.9498444 -1.875q3.65625 -3.6875 4.671875 -4.796875q0.953125 -1.03125 1.28125 -1.609375q0.34375 -0.578125 0.34375 -1.40625q0 -0.53125 -0.28125 -1.03125q-0.28125 -0.515625 -0.828125 -0.8125q-0.546875 -0.3125 -1.3125 -0.3125q-1.0 0 -1.625 0.59375q-0.609375 0.578125 -0.796875 1.265625l-1.4375 -0.578125q0.171875 -0.59375 0.65625 -1.234375q0.484375 -0.640625 1.296875 -1.09375q0.828125 -0.46875 1.9375 -0.46875q1.1875 0 2.09375 0.515625q0.90625 0.5 1.40625 1.34375q0.5 0.828125 0.5 1.796875q0 1.96875 -2.046875 4.046875l-3.828125 3.84375l6.03125 0l0 1.515625l-8.0625 0l0 -1.578125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m353.2301 390.1857l93.102356 0l0 35.24408l-93.102356 0z" fill-rule="evenodd"/><path fill="#000000" d="m374.61902 403.7463l1.78125 0l5.078125 13.359375l-1.734375 0l-1.34375 -3.671875l-5.78125 0l-1.34375 3.671875l-1.734375 0l5.078125 -13.359375zm3.234375 8.1875l-1.78125 -4.8125l-0.53125 -1.4375l-0.0625 0l-0.53125 1.4375l-1.78125 4.8125l4.6875 0zm5.405945 -8.1875l4.5 0q1.109375 0 2.0625 0.515625q0.953125 0.5 1.515625 1.40625q0.578125 0.890625 0.578125 2.03125q0 0.9375 -0.421875 1.75q-0.421875 0.796875 -1.171875 1.34375q-0.734375 0.53125 -1.625 0.71875l-0.03125 0.046875l3.765625 5.46875l0 0.078125l-1.859375 0l-3.640625 -5.453125l-2.09375 0l0 5.453125l-1.578125 0l0 -13.359375zm4.40625 6.4375q0.703125 0 1.296875 -0.3125q0.609375 -0.328125 0.96875 -0.890625q0.375 -0.5625 0.375 -1.28125q0 -0.609375 -0.328125 -1.171875q-0.3125 -0.5625 -0.890625 -0.90625q-0.5625 -0.359375 -1.296875 -0.359375l-2.953125 0l0 4.921875l2.828125 0zm6.526306 -6.4375l2.28125 0l4.265625 10.953125l0.0625 0l4.265625 -10.953125l2.28125 0l0 13.359375l-1.5625 0l0 -8.484375l0.078125 -2.546875l-0.078125 0l-4.359375 11.03125l-1.3125 0l-4.359375 -11.03125l-0.078125 0l0.078125 2.546875l0 8.484375l-1.5625 0l0 -13.359375zm19.859436 13.65625q-1.265625 0 -2.265625 -0.609375q-1.0 -0.625 -1.546875 -1.59375q-0.546875 -0.984375 -0.546875 -2.0625q0 -1.03125 0.40625 -1.96875q0.421875 -0.953125 1.21875 -2.109375l3.328125 -5.015625l1.28125 0.875l-3.21875 4.5l0.046875 0.03125q0.640625 -0.4375 1.640625 -0.4375q0.96875 0 1.890625 0.546875q0.9375 0.53125 1.515625 1.484375q0.59375 0.9375 0.59375 2.09375q0 1.109375 -0.59375 2.09375q-0.59375 0.984375 -1.59375 1.578125q-1.0 0.59375 -2.15625 0.59375zm0 -1.515625q0.75 0 1.375 -0.359375q0.640625 -0.359375 1.015625 -0.984375q0.375 -0.625 0.375 -1.390625q0 -0.75 -0.375 -1.375q-0.375 -0.625 -1.015625 -0.984375q-0.625 -0.359375 -1.375 -0.359375q-0.75 0 -1.390625 0.359375q-0.640625 0.359375 -1.015625 0.984375q-0.375 0.625 -0.375 1.375q0 0.765625 0.375 1.390625q0.375 0.625 1.015625 0.984375q0.640625 0.359375 1.390625 0.359375zm12.141541 -1.53125l-6.109375 0l0 -1.1875l5.96875 -8.828125l1.71875 0l0 8.53125l1.640625 0l0 1.484375l-1.640625 0l0 2.75l-1.578125 0l0 -2.75zm0 -1.484375l0 -6.21875l-0.0625 0l-4.234375 6.21875l4.296875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m569.04987 390.18634l72.0 0l0 35.24411l-72.0 0z" fill-rule="evenodd"/><path fill="#000000" d="m578.5977 412.27823l-3.28125 -4.6875l1.796875 0l2.4375 3.53125l2.375 -3.53125l1.859375 0l-3.328125 4.6875l3.390625 4.828125l-1.84375 0l-2.46875 -3.65625l-2.4375 3.65625l-1.84375 0l3.34375 -4.828125zm10.648071 5.125q-1.21875 0 -2.21875 -0.5q-0.984375 -0.5 -1.546875 -1.359375q-0.546875 -0.875 -0.546875 -1.9375q0 -1.09375 0.578125 -1.90625q0.59375 -0.8125 1.546875 -1.265625l0 -0.078125q-0.75 -0.453125 -1.234375 -1.1875q-0.46875 -0.734375 -0.46875 -1.546875q0 -1.0 0.484375 -1.8125q0.5 -0.828125 1.390625 -1.296875q0.890625 -0.46875 2.015625 -0.46875q1.09375 0 1.96875 0.46875q0.890625 0.46875 1.390625 1.296875q0.5 0.8125 0.5 1.8125q0 0.8125 -0.484375 1.546875q-0.46875 0.734375 -1.203125 1.1875l0 0.078125q0.953125 0.453125 1.53125 1.265625q0.59375 0.8125 0.59375 1.90625q0 1.0625 -0.5625 1.9375q-0.5625 0.859375 -1.5625 1.359375q-0.984375 0.5 -2.171875 0.5zm0 -7.71875q0.984375 0 1.609375 -0.578125q0.640625 -0.578125 0.640625 -1.515625q0 -0.9375 -0.640625 -1.484375q-0.640625 -0.546875 -1.609375 -0.546875q-1.0 0 -1.640625 0.546875q-0.640625 0.546875 -0.640625 1.484375q0 0.9375 0.640625 1.515625q0.640625 0.578125 1.640625 0.578125zm0 6.203125q1.125 0 1.890625 -0.65625q0.78125 -0.65625 0.78125 -1.71875q0 -1.03125 -0.78125 -1.6875q-0.765625 -0.671875 -1.890625 -0.671875q-1.140625 0 -1.9375 0.671875q-0.78125 0.65625 -0.78125 1.6875q0 1.0625 0.78125 1.71875q0.796875 0.65625 1.9375 0.65625zm10.326477 1.515625q-1.265625 0 -2.265625 -0.609375q-1.0 -0.625 -1.546875 -1.59375q-0.546875 -0.984375 -0.546875 -2.0625q0 -1.03125 0.40625 -1.96875q0.421875 -0.953125 1.21875 -2.109375l3.328125 -5.015625l1.28125 0.875l-3.21875 4.5l0.046875 0.03125q0.640625 -0.4375 1.640625 -0.4375q0.96875 0 1.890625 0.546875q0.9375 0.53125 1.515625 1.484375q0.59375 0.9375 0.59375 2.09375q0 1.109375 -0.59375 2.09375q-0.59375 0.984375 -1.59375 1.578125q-1.0 0.59375 -2.15625 0.59375zm0 -1.515625q0.75 0 1.375 -0.359375q0.640625 -0.359375 1.015625 -0.984375q0.375 -0.625 0.375 -1.390625q0 -0.75 -0.375 -1.375q-0.375 -0.625 -1.015625 -0.984375q-0.625 -0.359375 -1.375 -0.359375q-0.75 0 -1.390625 0.359375q-0.640625 0.359375 -1.015625 0.984375q-0.375 0.625 -0.375 1.375q0 0.765625 0.375 1.390625q0.375 0.625 1.015625 0.984375q0.640625 0.359375 1.390625 0.359375zm5.1884155 3.9375l8.875 0l0 1.3125l-8.875 0l0 -1.3125zm14.083496 -2.421875q-1.265625 0 -2.265625 -0.609375q-1.0 -0.625 -1.546875 -1.59375q-0.546875 -0.984375 -0.546875 -2.0625q0 -1.03125 0.40625 -1.96875q0.421875 -0.953125 1.21875 -2.109375l3.328125 -5.015625l1.28125 0.875l-3.21875 4.5l0.046875 0.03125q0.640625 -0.4375 1.640625 -0.4375q0.96875 0 1.890625 0.546875q0.9375 0.53125 1.515625 1.484375q0.59375 0.9375 0.59375 2.09375q0 1.109375 -0.59375 2.09375q-0.59375 0.984375 -1.59375 1.578125q-1.0 0.59375 -2.15625 0.59375zm0 -1.515625q0.75 0 1.375 -0.359375q0.640625 -0.359375 1.015625 -0.984375q0.375 -0.625 0.375 -1.390625q0 -0.75 -0.375 -1.375q-0.375 -0.625 -1.015625 -0.984375q-0.625 -0.359375 -1.375 -0.359375q-0.75 0 -1.390625 0.359375q-0.640625 0.359375 -1.015625 0.984375q-0.375 0.625 -0.375 1.375q0 0.765625 0.375 1.390625q0.375 0.625 1.015625 0.984375q0.640625 0.359375 1.390625 0.359375zm12.141541 -1.53125l-6.109375 0l0 -1.1875l5.96875 -8.828125l1.71875 0l0 8.53125l1.640625 0l0 1.484375l-1.640625 0l0 2.75l-1.578125 0l0 -2.75zm0 -1.484375l0 -6.21875l-0.0625 0l-4.234375 6.21875l4.296875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m728.2769 390.1857l116.22046 0l0 35.24408l-116.22046 0z" fill-rule="evenodd"/><path fill="#000000" d="m746.8374 417.40256q-1.46875 0 -2.578125 -0.8125q-1.09375 -0.8125 -1.546875 -2.28125l1.5 -0.625q0.671875 2.203125 2.625 2.203125q1.09375 0 1.75 -0.765625q0.671875 -0.765625 0.671875 -2.015625l0 -9.359375l1.59375 0l0 9.234375q0 1.40625 -0.515625 2.40625q-0.515625 0.984375 -1.421875 1.5q-0.90625 0.515625 -2.078125 0.515625zm9.497192 0q-1.046875 0 -1.875 -0.40625q-0.8125 -0.40625 -1.265625 -1.125q-0.4375 -0.71875 -0.4375 -1.640625q0 -1.515625 1.125 -2.359375q1.140625 -0.84375 2.875 -0.84375q0.859375 0 1.59375 0.1875q0.75 0.1875 1.140625 0.421875l0 -0.578125q0 -1.0625 -0.75 -1.703125q-0.75 -0.640625 -1.890625 -0.640625q-0.78125 0 -1.46875 0.34375q-0.671875 0.34375 -1.0625 0.953125l-1.203125 -0.890625q0.5625 -0.859375 1.546875 -1.34375q1.0 -0.484375 2.1875 -0.484375q1.9375 0 3.03125 1.015625q1.109375 1.015625 1.109375 2.765625l0 6.03125l-1.5 0l0 -1.359375l-0.078125 0q-0.40625 0.6875 -1.234375 1.171875q-0.8125 0.484375 -1.84375 0.484375zm0.140625 -1.390625q0.8125 0 1.5 -0.40625q0.6875 -0.421875 1.09375 -1.109375q0.421875 -0.6875 0.421875 -1.515625q-0.453125 -0.296875 -1.109375 -0.484375q-0.65625 -0.1875 -1.375 -0.1875q-1.3125 0 -1.984375 0.546875q-0.65625 0.53125 -0.65625 1.390625q0 0.78125 0.59375 1.28125q0.609375 0.484375 1.515625 0.484375zm5.4854126 -8.421875l1.703125 0l2.953125 7.65625l0.03125 0l2.984375 -7.65625l1.65625 0l-3.875 9.515625l-1.609375 0l-3.84375 -9.515625zm13.496399 9.8125q-1.046875 0 -1.875 -0.40625q-0.8125 -0.40625 -1.265625 -1.125q-0.4375 -0.71875 -0.4375 -1.640625q0 -1.515625 1.125 -2.359375q1.140625 -0.84375 2.875 -0.84375q0.859375 0 1.59375 0.1875q0.75 0.1875 1.140625 0.421875l0 -0.578125q0 -1.0625 -0.75 -1.703125q-0.75 -0.640625 -1.890625 -0.640625q-0.78125 0 -1.46875 0.34375q-0.671875 0.34375 -1.0625 0.953125l-1.203125 -0.890625q0.5625 -0.859375 1.546875 -1.34375q1.0 -0.484375 2.1875 -0.484375q1.9375 0 3.03125 1.015625q1.109375 1.015625 1.109375 2.765625l0 6.03125l-1.5 0l0 -1.359375l-0.078125 0q-0.40625 0.6875 -1.234375 1.171875q-0.8125 0.484375 -1.84375 0.484375zm0.140625 -1.390625q0.8125 0 1.5 -0.40625q0.6875 -0.421875 1.09375 -1.109375q0.421875 -0.6875 0.421875 -1.515625q-0.453125 -0.296875 -1.109375 -0.484375q-0.65625 -0.1875 -1.375 -0.1875q-1.3125 0 -1.984375 0.546875q-0.65625 0.53125 -0.65625 1.390625q0 0.78125 0.59375 1.28125q0.609375 0.484375 1.515625 0.484375zm10.765869 1.390625q-1.0 0 -1.953125 -0.421875q-0.9375 -0.421875 -1.671875 -1.234375q-0.71875 -0.8125 -1.03125 -1.96875l1.515625 -0.609375q0.3125 1.1875 1.171875 1.953125q0.859375 0.765625 2.015625 0.765625q1.15625 0 1.953125 -0.625q0.796875 -0.625 0.796875 -1.703125q0 -0.9375 -0.6875 -1.53125q-0.671875 -0.609375 -2.21875 -1.140625l-0.84375 -0.296875q-1.40625 -0.5 -2.3125 -1.3125q-0.890625 -0.828125 -0.890625 -2.28125q0 -0.953125 0.515625 -1.765625q0.53125 -0.8125 1.453125 -1.296875q0.9375 -0.484375 2.09375 -0.484375q1.15625 0 2.015625 0.4375q0.859375 0.421875 1.375 1.046875q0.515625 0.609375 0.71875 1.203125l-1.46875 0.640625q-0.203125 -0.703125 -0.875 -1.25q-0.65625 -0.5625 -1.734375 -0.5625q-1.03125 0 -1.765625 0.578125q-0.71875 0.578125 -0.71875 1.453125q0 0.78125 0.609375 1.28125q0.625 0.484375 1.875 0.921875l0.875 0.296875q1.6875 0.609375 2.640625 1.53125q0.953125 0.921875 0.953125 2.515625q0 1.28125 -0.671875 2.171875q-0.65625 0.875 -1.671875 1.28125q-1.0 0.40625 -2.0625 0.40625zm10.750427 0q-1.375 0 -2.484375 -0.65625q-1.09375 -0.671875 -1.71875 -1.8125q-0.609375 -1.15625 -0.609375 -2.578125q0 -1.4375 0.609375 -2.59375q0.625 -1.15625 1.71875 -1.8125q1.109375 -0.65625 2.484375 -0.65625q1.546875 0 2.59375 0.71875q1.0625 0.71875 1.515625 1.90625l-1.4375 0.609375q-0.359375 -0.890625 -1.0625 -1.34375q-0.6875 -0.453125 -1.6875 -0.453125q-0.828125 0 -1.5625 0.453125q-0.734375 0.453125 -1.171875 1.28125q-0.4375 0.8125 -0.4375 1.890625q0 1.0625 0.4375 1.890625q0.4375 0.8125 1.171875 1.265625q0.734375 0.453125 1.5625 0.453125q1.015625 0 1.734375 -0.46875q0.734375 -0.46875 1.09375 -1.3125l1.40625 0.59375q-0.484375 1.171875 -1.5625 1.90625q-1.0625 0.71875 -2.59375 0.71875zm5.7804565 -9.8125l1.515625 0l0 1.53125l0.078125 0q0.28125 -0.78125 1.078125 -1.296875q0.796875 -0.515625 1.671875 -0.515625q0.65625 0 1.125 0.1875l0 1.71875q-0.59375 -0.296875 -1.34375 -0.296875q-0.6875 0 -1.265625 0.390625q-0.578125 0.390625 -0.921875 1.0625q-0.34375 0.65625 -0.34375 1.421875l0 5.3125l-1.59375 0l0 -9.515625zm7.9335938 -1.75q-0.46875 0 -0.8125 -0.328125q-0.328125 -0.34375 -0.328125 -0.8125q0 -0.484375 0.328125 -0.8125q0.34375 -0.328125 0.8125 -0.328125q0.484375 0 0.8125 0.328125q0.328125 0.328125 0.328125 0.8125q0 0.46875 -0.328125 0.8125q-0.328125 0.328125 -0.8125 0.328125zm-0.78125 1.75l1.578125 0l0 9.515625l-1.578125 0l0 -9.515625zm3.9819336 0l1.515625 0l0 1.421875l0.078125 0q0.421875 -0.734375 1.28125 -1.21875q0.875 -0.5 1.96875 -0.5q1.28125 0 2.3125 0.65625q1.046875 0.65625 1.640625 1.8125q0.59375 1.15625 0.59375 2.59375q0 1.453125 -0.59375 2.609375q-0.59375 1.140625 -1.640625 1.796875q-1.03125 0.640625 -2.3125 0.640625q-1.09375 0 -1.96875 -0.484375q-0.859375 -0.5 -1.28125 -1.21875l-0.078125 0l0.078125 1.3125l0 4.125l-1.59375 0l0 -13.546875zm4.671875 8.375q0.8125 0 1.546875 -0.4375q0.734375 -0.453125 1.15625 -1.265625q0.4375 -0.828125 0.4375 -1.90625q0 -1.09375 -0.4375 -1.90625q-0.421875 -0.828125 -1.15625 -1.265625q-0.734375 -0.453125 -1.546875 -0.453125q-0.84375 0 -1.5625 0.453125q-0.71875 0.4375 -1.15625 1.265625q-0.4375 0.8125 -0.4375 1.90625q0 1.078125 0.4375 1.90625q0.4375 0.8125 1.15625 1.265625q0.71875 0.4375 1.5625 0.4375zm9.845642 1.296875q-0.578125 0 -1.078125 -0.1875q-0.484375 -0.1875 -0.828125 -0.515625q-0.734375 -0.703125 -0.734375 -1.953125l0 -5.578125l-1.671875 0l0 -1.4375l1.671875 0l0 -2.6875l1.578125 0l0 2.6875l2.328125 0l0 1.4375l-2.328125 0l0 5.1875q0 0.78125 0.296875 1.15625q0.359375 0.40625 1.03125 0.40625q0.578125 0 1.046875 -0.3125l0 1.546875q-0.28125 0.125 -0.578125 0.1875q-0.28125 0.0625 -0.734375 0.0625z" fill-rule="nonzero"/><path fill="#02589b" d="m138.76247 141.17389l346.07874 0l0 86.708664l-346.07874 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m221.27809 159.08884l4.265625 0q2.078125 0 3.609375 0.84375q1.546875 0.84375 2.375 2.359375q0.828125 1.515625 0.828125 3.484375q0 1.953125 -0.828125 3.484375q-0.828125 1.515625 -2.375 2.359375q-1.53125 0.828125 -3.609375 0.828125l-4.265625 0l0 -13.359375zm4.21875 11.421875q2.265625 0 3.515625 -1.25q1.265625 -1.265625 1.265625 -3.484375q0 -2.234375 -1.265625 -3.484375q-1.25 -1.265625 -3.515625 -1.265625l-2.171875 0l0 9.484375l2.171875 0zm12.933762 2.234375q-1.375 0 -2.484375 -0.640625q-1.109375 -0.65625 -1.734375 -1.796875q-0.625 -1.15625 -0.625 -2.59375q0 -1.359375 0.609375 -2.53125q0.609375 -1.171875 1.6875 -1.859375q1.078125 -0.6875 2.4375 -0.6875q1.4375 0 2.484375 0.625q1.046875 0.625 1.59375 1.734375q0.546875 1.09375 0.546875 2.484375q0 0.375 -0.03125 0.640625l-7.34375 0q0.125 1.359375 0.953125 2.09375q0.84375 0.734375 1.96875 0.734375q0.921875 0 1.5625 -0.40625q0.65625 -0.421875 1.046875 -1.109375l1.65625 0.796875q-0.640625 1.171875 -1.734375 1.84375q-1.078125 0.671875 -2.59375 0.671875zm2.53125 -6.140625q-0.046875 -0.515625 -0.34375 -1.03125q-0.296875 -0.53125 -0.875 -0.875q-0.5625 -0.34375 -1.40625 -0.34375q-1.0 0 -1.703125 0.625q-0.703125 0.609375 -0.953125 1.625l5.28125 0zm2.618805 -3.671875l2.25 0l2.65625 6.921875l0.09375 0l2.734375 -6.921875l2.203125 0l-3.984375 9.515625l-2.015625 0l-3.9375 -9.515625zm15.296936 9.8125q-1.375 0 -2.484375 -0.640625q-1.109375 -0.65625 -1.734375 -1.796875q-0.625 -1.15625 -0.625 -2.59375q0 -1.359375 0.609375 -2.53125q0.609375 -1.171875 1.6875 -1.859375q1.078125 -0.6875 2.4375 -0.6875q1.4375 0 2.484375 0.625q1.046875 0.625 1.59375 1.734375q0.546875 1.09375 0.546875 2.484375q0 0.375 -0.03125 0.640625l-7.34375 0q0.125 1.359375 0.953125 2.09375q0.84375 0.734375 1.96875 0.734375q0.921875 0 1.5625 -0.40625q0.65625 -0.421875 1.046875 -1.109375l1.65625 0.796875q-0.640625 1.171875 -1.734375 1.84375q-1.078125 0.671875 -2.59375 0.671875zm2.53125 -6.140625q-0.046875 -0.515625 -0.34375 -1.03125q-0.296875 -0.53125 -0.875 -0.875q-0.5625 -0.34375 -1.40625 -0.34375q-1.0 0 -1.703125 0.625q-0.703125 0.609375 -0.953125 1.625l5.28125 0zm3.852356 -7.515625l2.015625 0l0 13.359375l-2.015625 0l0 -13.359375zm8.775238 13.65625q-1.4375 0 -2.578125 -0.65625q-1.140625 -0.671875 -1.78125 -1.828125q-0.625 -1.15625 -0.625 -2.5625q0 -1.421875 0.625 -2.578125q0.640625 -1.15625 1.78125 -1.8125q1.140625 -0.671875 2.578125 -0.671875q1.421875 0 2.546875 0.671875q1.140625 0.671875 1.765625 1.828125q0.640625 1.15625 0.640625 2.5625q0 1.40625 -0.640625 2.5625q-0.625 1.15625 -1.75 1.828125q-1.125 0.65625 -2.5625 0.65625zm0 -1.84375q0.796875 0 1.46875 -0.390625q0.671875 -0.390625 1.078125 -1.109375q0.421875 -0.734375 0.421875 -1.703125q0 -0.984375 -0.421875 -1.703125q-0.40625 -0.734375 -1.078125 -1.125q-0.671875 -0.390625 -1.46875 -0.390625q-0.8125 0 -1.5 0.390625q-0.671875 0.390625 -1.078125 1.125q-0.40625 0.71875 -0.40625 1.703125q0 0.96875 0.40625 1.703125q0.40625 0.71875 1.078125 1.109375q0.6875 0.390625 1.5 0.390625zm6.631195 -7.96875l1.90625 0l0 1.28125l0.109375 0q0.421875 -0.671875 1.234375 -1.125q0.8125 -0.453125 1.828125 -0.453125q1.296875 0 2.328125 0.65625q1.046875 0.65625 1.640625 1.796875q0.609375 1.140625 0.609375 2.609375q0 1.453125 -0.609375 2.609375q-0.59375 1.15625 -1.640625 1.796875q-1.03125 0.640625 -2.328125 0.640625q-1.015625 0 -1.828125 -0.453125q-0.8125 -0.453125 -1.234375 -1.109375l-0.109375 0l0.109375 1.328125l0 3.96875l-2.015625 0l0 -13.546875zm4.78125 7.96875q0.765625 0 1.421875 -0.390625q0.671875 -0.40625 1.0625 -1.140625q0.390625 -0.734375 0.390625 -1.671875q0 -0.953125 -0.390625 -1.671875q-0.390625 -0.734375 -1.0625 -1.140625q-0.65625 -0.40625 -1.421875 -0.40625q-0.75 0 -1.40625 0.40625q-0.65625 0.40625 -1.0625 1.140625q-0.40625 0.71875 -0.40625 1.671875q0 0.9375 0.40625 1.671875q0.40625 0.734375 1.0625 1.140625q0.65625 0.390625 1.40625 0.390625zm6.6211853 -7.96875l1.90625 0l0 1.3125l0.109375 0q0.4375 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.71875 -0.453125q1.015625 0 1.765625 0.484375q0.765625 0.484375 1.109375 1.28125q0.5 -0.796875 1.3125 -1.28125q0.8125 -0.484375 1.90625 -0.484375q1.640625 0 2.484375 1.0q0.84375 1.0 0.84375 2.71875l0 6.09375l-2.0 0l0 -5.765625q0 -2.203125 -1.875 -2.203125q-1.015625 0 -1.671875 0.828125q-0.640625 0.8125 -0.640625 2.046875l0 5.09375l-1.984375 0l0 -5.765625q0 -2.203125 -1.921875 -2.203125q-1.0 0 -1.640625 0.828125q-0.625 0.828125 -0.625 2.0625l0 5.078125l-2.015625 0l0 -9.515625zm21.003784 9.8125q-1.375 0 -2.484375 -0.640625q-1.109375 -0.65625 -1.734375 -1.796875q-0.625 -1.15625 -0.625 -2.59375q0 -1.359375 0.609375 -2.53125q0.609375 -1.171875 1.6875 -1.859375q1.078125 -0.6875 2.4375 -0.6875q1.4375 0 2.484375 0.625q1.046875 0.625 1.59375 1.734375q0.546875 1.09375 0.546875 2.484375q0 0.375 -0.03125 0.640625l-7.34375 0q0.125 1.359375 0.953125 2.09375q0.84375 0.734375 1.96875 0.734375q0.921875 0 1.5625 -0.40625q0.65625 -0.421875 1.046875 -1.109375l1.65625 0.796875q-0.640625 1.171875 -1.734375 1.84375q-1.078125 0.671875 -2.59375 0.671875zm2.53125 -6.140625q-0.046875 -0.515625 -0.34375 -1.03125q-0.296875 -0.53125 -0.875 -0.875q-0.5625 -0.34375 -1.40625 -0.34375q-1.0 0 -1.703125 0.625q-0.703125 0.609375 -0.953125 1.625l5.28125 0zm3.8523254 -3.671875l1.90625 0l0 1.3125l0.109375 0q0.40625 -0.71875 1.234375 -1.15625q0.828125 -0.453125 1.765625 -0.453125q1.71875 0 2.609375 1.015625q0.90625 1.015625 0.90625 2.796875l0 6.0l-2.0 0l0 -5.75q0 -1.109375 -0.5625 -1.65625q-0.5625 -0.5625 -1.53125 -0.5625q-0.703125 0 -1.25 0.390625q-0.546875 0.390625 -0.859375 1.046875q-0.3125 0.65625 -0.3125 1.421875l0 5.109375l-2.015625 0l0 -9.515625zm14.260223 9.671875q-0.640625 0 -1.1875 -0.203125q-0.546875 -0.203125 -0.90625 -0.546875q-0.796875 -0.765625 -0.796875 -2.171875l0 -5.0l-1.671875 0l0 -1.75l1.671875 0l0 -2.6875l2.015625 0l0 2.6875l2.328125 0l0 1.75l-2.328125 0l0 4.578125q0 0.78125 0.296875 1.09375q0.3125 0.359375 0.96875 0.359375q0.328125 0 0.5625 -0.078125q0.25 -0.09375 0.546875 -0.28125l0 1.96875q-0.625 0.28125 -1.5 0.28125zm2.235138 -0.15625l0 0zm9.425018 0.15625q-0.640625 0 -1.1875 -0.203125q-0.546875 -0.203125 -0.90625 -0.546875q-0.796875 -0.765625 -0.796875 -2.171875l0 -5.0l-1.671875 0l0 -1.75l1.671875 0l0 -2.6875l2.015625 0l0 2.6875l2.328125 0l0 1.75l-2.328125 0l0 4.578125q0 0.78125 0.296875 1.09375q0.3125 0.359375 0.96875 0.359375q0.328125 0 0.5625 -0.078125q0.25 -0.09375 0.546875 -0.28125l0 1.96875q-0.625 0.28125 -1.5 0.28125zm7.518036 0.140625q-1.4375 0 -2.578125 -0.65625q-1.140625 -0.671875 -1.78125 -1.828125q-0.625 -1.15625 -0.625 -2.5625q0 -1.421875 0.625 -2.578125q0.640625 -1.15625 1.78125 -1.8125q1.140625 -0.671875 2.578125 -0.671875q1.421875 0 2.546875 0.671875q1.140625 0.671875 1.765625 1.828125q0.640625 1.15625 0.640625 2.5625q0 1.40625 -0.640625 2.5625q-0.625 1.15625 -1.75 1.828125q-1.125 0.65625 -2.5625 0.65625zm0 -1.84375q0.796875 0 1.46875 -0.390625q0.671875 -0.390625 1.078125 -1.109375q0.421875 -0.734375 0.421875 -1.703125q0 -0.984375 -0.421875 -1.703125q-0.40625 -0.734375 -1.078125 -1.125q-0.671875 -0.390625 -1.46875 -0.390625q-0.8125 0 -1.5 0.390625q-0.671875 0.390625 -1.078125 1.125q-0.40625 0.71875 -0.40625 1.703125q0 0.96875 0.40625 1.703125q0.40625 0.71875 1.078125 1.109375q0.6875 0.390625 1.5 0.390625zm11.287048 1.84375q-1.4375 0 -2.578125 -0.65625q-1.140625 -0.671875 -1.78125 -1.828125q-0.625 -1.15625 -0.625 -2.5625q0 -1.421875 0.625 -2.578125q0.640625 -1.15625 1.78125 -1.8125q1.140625 -0.671875 2.578125 -0.671875q1.421875 0 2.546875 0.671875q1.140625 0.671875 1.765625 1.828125q0.640625 1.15625 0.640625 2.5625q0 1.40625 -0.640625 2.5625q-0.625 1.15625 -1.75 1.828125q-1.125 0.65625 -2.5625 0.65625zm0 -1.84375q0.796875 0 1.46875 -0.390625q0.671875 -0.390625 1.078125 -1.109375q0.421875 -0.734375 0.421875 -1.703125q0 -0.984375 -0.421875 -1.703125q-0.40625 -0.734375 -1.078125 -1.125q-0.671875 -0.390625 -1.46875 -0.390625q-0.8125 0 -1.5 0.390625q-0.671875 0.390625 -1.078125 1.125q-0.40625 0.71875 -0.40625 1.703125q0 0.96875 0.40625 1.703125q0.40625 0.71875 1.078125 1.109375q0.6875 0.390625 1.5 0.390625zm6.70932 -11.8125l2.015625 0l0 13.359375l-2.015625 0l0 -13.359375zm8.697113 13.65625q-1.421875 0 -2.546875 -0.640625q-1.109375 -0.65625 -1.734375 -1.796875q-0.625 -1.15625 -0.625 -2.609375q0 -1.46875 0.625 -2.609375q0.625 -1.140625 1.734375 -1.796875q1.125 -0.65625 2.546875 -0.65625q1.5625 0 2.65625 0.703125q1.09375 0.703125 1.578125 1.921875l-1.828125 0.75q-0.671875 -1.53125 -2.4375 -1.53125q-0.796875 0 -1.453125 0.40625q-0.65625 0.40625 -1.046875 1.140625q-0.375 0.71875 -0.375 1.671875q0 0.9375 0.375 1.671875q0.390625 0.734375 1.046875 1.140625q0.65625 0.390625 1.453125 0.390625q0.890625 0 1.53125 -0.390625q0.640625 -0.40625 1.0 -1.171875l1.8125 0.78125q-0.5625 1.203125 -1.671875 1.921875q-1.09375 0.703125 -2.640625 0.703125zm6.0226135 -13.65625l2.015625 0l0 3.65625l-0.109375 1.5l0.109375 0q0.40625 -0.71875 1.21875 -1.15625q0.8125 -0.453125 1.78125 -0.453125q1.734375 0 2.640625 1.03125q0.921875 1.03125 0.921875 2.78125l0 6.0l-1.984375 0l0 -5.75q0 -1.09375 -0.59375 -1.65625q-0.59375 -0.5625 -1.5 -0.5625q-0.6875 0 -1.265625 0.40625q-0.5625 0.40625 -0.890625 1.078125q-0.328125 0.65625 -0.328125 1.40625l0 5.078125l-2.015625 0l0 -13.359375zm13.767639 13.65625q-1.015625 0 -1.828125 -0.390625q-0.796875 -0.40625 -1.25 -1.125q-0.4375 -0.734375 -0.4375 -1.671875q0 -0.984375 0.515625 -1.703125q0.515625 -0.71875 1.40625 -1.09375q0.90625 -0.390625 2.015625 -0.390625q0.828125 0 1.5 0.15625q0.6875 0.15625 1.109375 0.359375l0 -0.5q0 -0.921875 -0.671875 -1.484375q-0.671875 -0.5625 -1.734375 -0.5625q-0.734375 0 -1.390625 0.328125q-0.640625 0.3125 -1.046875 0.875l-1.375 -1.0625q0.609375 -0.875 1.625 -1.359375q1.03125 -0.484375 2.234375 -0.484375q2.0625 0 3.1875 1.015625q1.125 1.015625 1.125 2.84375l0 5.953125l-1.953125 0l0 -1.171875l-0.109375 0q-0.421875 0.625 -1.1875 1.046875q-0.765625 0.421875 -1.734375 0.421875zm0.359375 -1.640625q0.75 0 1.359375 -0.359375q0.625 -0.375 0.96875 -0.984375q0.34375 -0.609375 0.34375 -1.328125q-0.453125 -0.25 -1.03125 -0.40625q-0.578125 -0.15625 -1.21875 -0.15625q-1.171875 0 -1.71875 0.46875q-0.546875 0.46875 -0.546875 1.234375q0 0.671875 0.5 1.109375q0.5 0.421875 1.34375 0.421875zm7.99881 -9.5625q-0.5625 0 -0.96875 -0.40625q-0.390625 -0.40625 -0.390625 -0.96875q0 -0.546875 0.390625 -0.9375q0.40625 -0.40625 0.96875 -0.40625q0.5625 0 0.953125 0.40625q0.40625 0.390625 0.40625 0.9375q0 0.5625 -0.40625 0.96875q-0.390625 0.40625 -0.953125 0.40625zm-1.0 1.390625l2.015625 0l0 9.515625l-2.015625 0l0 -9.515625zm4.5078125 0l1.90625 0l0 1.3125l0.109375 0q0.40625 -0.71875 1.234375 -1.15625q0.828125 -0.453125 1.765625 -0.453125q1.71875 0 2.609375 1.015625q0.90625 1.015625 0.90625 2.796875l0 6.0l-2.0 0l0 -5.75q0 -1.109375 -0.5625 -1.65625q-0.5625 -0.5625 -1.53125 -0.5625q-0.703125 0 -1.25 0.390625q-0.546875 0.390625 -0.859375 1.046875q-0.3125 0.65625 -0.3125 1.421875l0 5.109375l-2.015625 0l0 -9.515625z" fill-rule="nonzero"/><path fill="#eeeeee" d="m221.04372 180.43509l6.625 0l0 1.296875l-5.265625 0l0 3.921875l4.75 0l0 1.28125l-4.75 0l0 4.953125l-1.359375 0l0 -11.453125zm10.504135 11.703125q-0.890625 0 -1.59375 -0.34375q-0.703125 -0.359375 -1.09375 -0.96875q-0.375 -0.625 -0.375 -1.40625q0 -1.296875 0.96875 -2.015625q0.984375 -0.734375 2.46875 -0.734375q0.734375 0 1.359375 0.171875q0.640625 0.15625 0.96875 0.359375l0 -0.5q0 -0.90625 -0.640625 -1.453125q-0.625 -0.5625 -1.609375 -0.5625q-0.671875 0 -1.265625 0.296875q-0.578125 0.296875 -0.90625 0.828125l-1.03125 -0.765625q0.484375 -0.734375 1.328125 -1.15625q0.859375 -0.421875 1.875 -0.421875q1.671875 0 2.609375 0.875q0.9375 0.875 0.9375 2.375l0 5.171875l-1.296875 0l0 -1.171875l-0.0625 0q-0.34375 0.59375 -1.046875 1.015625q-0.703125 0.40625 -1.59375 0.40625zm0.140625 -1.1875q0.6875 0 1.265625 -0.34375q0.59375 -0.359375 0.9375 -0.953125q0.359375 -0.59375 0.359375 -1.296875q-0.375 -0.265625 -0.9375 -0.421875q-0.5625 -0.15625 -1.1875 -0.15625q-1.109375 0 -1.6875 0.46875q-0.5625 0.453125 -0.5625 1.1875q0 0.671875 0.5 1.09375q0.515625 0.421875 1.3125 0.421875zm8.525391 1.1875q-1.3125 0 -2.203125 -0.609375q-0.875 -0.609375 -1.234375 -1.578125l1.203125 -0.546875q0.3125 0.734375 0.90625 1.140625q0.609375 0.40625 1.328125 0.40625q0.765625 0 1.3125 -0.3125q0.546875 -0.3125 0.546875 -0.890625q0 -0.515625 -0.4375 -0.828125q-0.4375 -0.3125 -1.359375 -0.53125l-1.0 -0.265625q-0.96875 -0.234375 -1.59375 -0.8125q-0.625 -0.578125 -0.625 -1.484375q0 -0.703125 0.421875 -1.234375q0.421875 -0.546875 1.125 -0.828125q0.703125 -0.296875 1.53125 -0.296875q1.0625 0 1.90625 0.46875q0.84375 0.46875 1.1875 1.296875l-1.171875 0.546875q-0.546875 -1.09375 -1.9375 -1.09375q-0.671875 0 -1.1875 0.3125q-0.5 0.3125 -0.5 0.796875q0 0.453125 0.34375 0.734375q0.359375 0.265625 1.0625 0.453125l1.1875 0.296875q1.203125 0.3125 1.8125 0.90625q0.609375 0.59375 0.609375 1.46875q0 0.75 -0.4375 1.3125q-0.4375 0.5625 -1.171875 0.875q-0.734375 0.296875 -1.625 0.296875zm7.7692566 -0.125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm1.7153931 -0.125l0 0zm5.5245056 -9.65625q-0.40625 0 -0.703125 -0.28125q-0.28125 -0.296875 -0.28125 -0.703125q0 -0.421875 0.28125 -0.6875q0.296875 -0.28125 0.703125 -0.28125q0.40625 0 0.6875 0.28125q0.28125 0.265625 0.28125 0.6875q0 0.40625 -0.28125 0.703125q-0.28125 0.28125 -0.6875 0.28125zm-0.671875 1.5l1.359375 0l0 8.15625l-1.359375 0l0 -8.15625zm3.4910278 0l1.28125 0l0 1.203125l0.078125 0q0.328125 -0.609375 1.0625 -1.03125q0.734375 -0.4375 1.578125 -0.4375q1.46875 0 2.234375 0.859375q0.78125 0.859375 0.78125 2.328125l0 5.234375l-1.359375 0l0 -5.03125q0 -1.125 -0.546875 -1.640625q-0.546875 -0.515625 -1.484375 -0.515625q-0.65625 0 -1.1875 0.375q-0.515625 0.359375 -0.796875 0.96875q-0.28125 0.59375 -0.28125 1.25l0 4.59375l-1.359375 0l0 -8.15625zm12.663513 8.40625q-1.1875 0 -2.140625 -0.5625q-0.9375 -0.5625 -1.46875 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.234375 0.515625 -2.21875q0.53125 -1.0 1.46875 -1.5625q0.953125 -0.5625 2.140625 -0.5625q1.328125 0 2.234375 0.625q0.90625 0.609375 1.28125 1.640625l-1.234375 0.515625q-0.296875 -0.765625 -0.90625 -1.15625q-0.59375 -0.390625 -1.4375 -0.390625q-0.71875 0 -1.34375 0.390625q-0.625 0.390625 -1.0 1.109375q-0.375 0.703125 -0.375 1.609375q0 0.90625 0.375 1.609375q0.375 0.703125 1.0 1.109375q0.625 0.390625 1.34375 0.390625q0.859375 0 1.484375 -0.40625q0.625 -0.40625 0.9375 -1.140625l1.203125 0.515625q-0.40625 1.015625 -1.328125 1.640625q-0.921875 0.609375 -2.234375 0.609375zm4.968506 -8.40625l1.28125 0l0 1.3125l0.078125 0q0.234375 -0.671875 0.921875 -1.109375q0.6875 -0.453125 1.4375 -0.453125q0.5625 0 0.96875 0.171875l0 1.46875q-0.515625 -0.265625 -1.15625 -0.265625q-0.59375 0 -1.09375 0.34375q-0.5 0.328125 -0.796875 0.90625q-0.28125 0.5625 -0.28125 1.21875l0 4.5625l-1.359375 0l0 -8.15625zm9.14502 8.40625q-1.171875 0 -2.109375 -0.546875q-0.921875 -0.5625 -1.4375 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.171875 0.484375 -2.171875q0.484375 -1.0 1.390625 -1.59375q0.90625 -0.59375 2.078125 -0.59375q1.203125 0 2.078125 0.546875q0.875 0.53125 1.34375 1.484375q0.484375 0.9375 0.484375 2.15625q0 0.1875 -0.03125 0.40625l-6.46875 0q0.046875 0.9375 0.4375 1.578125q0.40625 0.640625 1.015625 0.96875q0.625 0.3125 1.296875 0.3125q1.59375 0 2.421875 -1.484375l1.140625 0.5625q-0.5 0.984375 -1.421875 1.5625q-0.90625 0.578125 -2.1875 0.578125zm2.34375 -5.1875q-0.03125 -0.515625 -0.28125 -1.03125q-0.25 -0.515625 -0.796875 -0.859375q-0.546875 -0.359375 -1.375 -0.359375q-0.96875 0 -1.640625 0.625q-0.671875 0.609375 -0.875 1.625l4.96875 0zm3.0392761 -3.21875l1.28125 0l0 1.203125l0.078125 0q0.34375 -0.625 1.046875 -1.046875q0.703125 -0.421875 1.484375 -0.421875q0.90625 0 1.5625 0.4375q0.671875 0.4375 0.953125 1.15625q0.4375 -0.71875 1.140625 -1.15625q0.71875 -0.4375 1.65625 -0.4375q1.40625 0 2.125 0.859375q0.71875 0.859375 0.71875 2.328125l0 5.234375l-1.34375 0l0 -5.03125q0 -1.125 -0.46875 -1.640625q-0.46875 -0.515625 -1.375 -0.515625q-0.609375 0 -1.109375 0.359375q-0.5 0.34375 -0.78125 0.9375q-0.265625 0.59375 -0.265625 1.28125l0 4.609375l-1.359375 0l0 -5.015625q0 -1.140625 -0.46875 -1.65625q-0.46875 -0.515625 -1.359375 -0.515625q-0.609375 0 -1.109375 0.359375q-0.5 0.359375 -0.78125 0.96875q-0.265625 0.59375 -0.265625 1.28125l0 4.578125l-1.359375 0l0 -8.15625zm17.641022 8.40625q-1.171875 0 -2.109375 -0.546875q-0.921875 -0.5625 -1.4375 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.171875 0.484375 -2.171875q0.484375 -1.0 1.390625 -1.59375q0.90625 -0.59375 2.078125 -0.59375q1.203125 0 2.078125 0.546875q0.875 0.53125 1.34375 1.484375q0.484375 0.9375 0.484375 2.15625q0 0.1875 -0.03125 0.40625l-6.46875 0q0.046875 0.9375 0.4375 1.578125q0.40625 0.640625 1.015625 0.96875q0.625 0.3125 1.296875 0.3125q1.59375 0 2.421875 -1.484375l1.140625 0.5625q-0.5 0.984375 -1.421875 1.5625q-0.90625 0.578125 -2.1875 0.578125zm2.34375 -5.1875q-0.03125 -0.515625 -0.28125 -1.03125q-0.25 -0.515625 -0.796875 -0.859375q-0.546875 -0.359375 -1.375 -0.359375q-0.96875 0 -1.640625 0.625q-0.671875 0.609375 -0.875 1.625l4.96875 0zm3.0392456 -3.21875l1.28125 0l0 1.203125l0.078125 0q0.328125 -0.609375 1.0625 -1.03125q0.734375 -0.4375 1.578125 -0.4375q1.46875 0 2.234375 0.859375q0.78125 0.859375 0.78125 2.328125l0 5.234375l-1.359375 0l0 -5.03125q0 -1.125 -0.546875 -1.640625q-0.546875 -0.515625 -1.484375 -0.515625q-0.65625 0 -1.1875 0.375q-0.515625 0.359375 -0.796875 0.96875q-0.28125 0.59375 -0.28125 1.25l0 4.59375l-1.359375 0l0 -8.15625zm11.701019 8.28125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm5.1647644 0.125q-0.890625 0 -1.59375 -0.34375q-0.703125 -0.359375 -1.09375 -0.96875q-0.375 -0.625 -0.375 -1.40625q0 -1.296875 0.96875 -2.015625q0.984375 -0.734375 2.46875 -0.734375q0.734375 0 1.359375 0.171875q0.640625 0.15625 0.96875 0.359375l0 -0.5q0 -0.90625 -0.640625 -1.453125q-0.625 -0.5625 -1.609375 -0.5625q-0.671875 0 -1.265625 0.296875q-0.578125 0.296875 -0.90625 0.828125l-1.03125 -0.765625q0.484375 -0.734375 1.328125 -1.15625q0.859375 -0.421875 1.875 -0.421875q1.671875 0 2.609375 0.875q0.9375 0.875 0.9375 2.375l0 5.171875l-1.296875 0l0 -1.171875l-0.0625 0q-0.34375 0.59375 -1.046875 1.015625q-0.703125 0.40625 -1.59375 0.40625zm0.140625 -1.1875q0.6875 0 1.265625 -0.34375q0.59375 -0.359375 0.9375 -0.953125q0.359375 -0.59375 0.359375 -1.296875q-0.375 -0.265625 -0.9375 -0.421875q-0.5625 -0.15625 -1.1875 -0.15625q-1.109375 0 -1.6875 0.46875q-0.5625 0.453125 -0.5625 1.1875q0 0.671875 0.5 1.09375q0.515625 0.421875 1.3125 0.421875zm5.7616577 -10.515625l1.359375 0l0 11.453125l-1.359375 0l0 -11.453125zm2.360382 11.453125l0 0zm8.415131 0.25q-1.1875 0 -2.140625 -0.5625q-0.9375 -0.5625 -1.46875 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.234375 0.515625 -2.21875q0.53125 -1.0 1.46875 -1.5625q0.953125 -0.5625 2.140625 -0.5625q1.328125 0 2.234375 0.625q0.90625 0.609375 1.28125 1.640625l-1.234375 0.515625q-0.296875 -0.765625 -0.90625 -1.15625q-0.59375 -0.390625 -1.4375 -0.390625q-0.71875 0 -1.34375 0.390625q-0.625 0.390625 -1.0 1.109375q-0.375 0.703125 -0.375 1.609375q0 0.90625 0.375 1.609375q0.375 0.703125 1.0 1.109375q0.625 0.390625 1.34375 0.390625q0.859375 0 1.484375 -0.40625q0.625 -0.40625 0.9375 -1.140625l1.203125 0.515625q-0.40625 1.015625 -1.328125 1.640625q-0.921875 0.609375 -2.234375 0.609375zm8.718506 0q-1.203125 0 -2.171875 -0.5625q-0.953125 -0.578125 -1.484375 -1.5625q-0.53125 -1.0 -0.53125 -2.203125q0 -1.203125 0.53125 -2.1875q0.53125 -1.0 1.484375 -1.578125q0.96875 -0.578125 2.171875 -0.578125q1.203125 0 2.15625 0.578125q0.96875 0.578125 1.5 1.578125q0.53125 0.984375 0.53125 2.1875q0 1.203125 -0.53125 2.203125q-0.53125 0.984375 -1.5 1.5625q-0.953125 0.5625 -2.15625 0.5625zm0 -1.21875q0.75 0 1.390625 -0.375q0.65625 -0.390625 1.046875 -1.09375q0.390625 -0.703125 0.390625 -1.640625q0 -0.953125 -0.390625 -1.65625q-0.390625 -0.703125 -1.046875 -1.078125q-0.640625 -0.375 -1.390625 -0.375q-0.75 0 -1.40625 0.375q-0.65625 0.375 -1.046875 1.078125q-0.390625 0.703125 -0.390625 1.65625q0 0.9375 0.390625 1.640625q0.390625 0.703125 1.046875 1.09375q0.65625 0.375 1.40625 0.375zm5.6260376 -7.1875l1.28125 0l0 1.203125l0.078125 0q0.34375 -0.625 1.046875 -1.046875q0.703125 -0.421875 1.484375 -0.421875q0.90625 0 1.5625 0.4375q0.671875 0.4375 0.953125 1.15625q0.4375 -0.71875 1.140625 -1.15625q0.71875 -0.4375 1.65625 -0.4375q1.40625 0 2.125 0.859375q0.71875 0.859375 0.71875 2.328125l0 5.234375l-1.34375 0l0 -5.03125q0 -1.125 -0.46875 -1.640625q-0.46875 -0.515625 -1.375 -0.515625q-0.609375 0 -1.109375 0.359375q-0.5 0.34375 -0.78125 0.9375q-0.265625 0.59375 -0.265625 1.28125l0 4.609375l-1.359375 0l0 -5.015625q0 -1.140625 -0.46875 -1.65625q-0.46875 -0.515625 -1.359375 -0.515625q-0.609375 0 -1.109375 0.359375q-0.5 0.359375 -0.78125 0.96875q-0.265625 0.59375 -0.265625 1.28125l0 4.578125l-1.359375 0l0 -8.15625zm13.937897 0l1.296875 0l0 1.21875l0.0625 0q0.375 -0.625 1.109375 -1.046875q0.75 -0.4375 1.6875 -0.4375q1.09375 0 1.984375 0.5625q0.890625 0.5625 1.390625 1.5625q0.515625 0.984375 0.515625 2.21875q0 1.25 -0.515625 2.234375q-0.5 0.984375 -1.390625 1.546875q-0.890625 0.546875 -1.984375 0.546875q-0.9375 0 -1.6875 -0.421875q-0.734375 -0.421875 -1.109375 -1.03125l-0.0625 0l0.0625 1.125l0 3.53125l-1.359375 0l0 -11.609375zm4.0 7.1875q0.703125 0 1.328125 -0.390625q0.625 -0.390625 0.984375 -1.09375q0.375 -0.703125 0.375 -1.625q0 -0.9375 -0.375 -1.640625q-0.359375 -0.703125 -0.984375 -1.078125q-0.625 -0.390625 -1.328125 -0.390625q-0.71875 0 -1.34375 0.390625q-0.609375 0.375 -0.984375 1.078125q-0.375 0.703125 -0.375 1.640625q0 0.921875 0.375 1.625q0.375 0.703125 0.984375 1.09375q0.625 0.390625 1.34375 0.390625zm6.3630066 -8.6875q-0.40625 0 -0.703125 -0.28125q-0.28125 -0.296875 -0.28125 -0.703125q0 -0.421875 0.28125 -0.6875q0.296875 -0.28125 0.703125 -0.28125q0.40625 0 0.6875 0.28125q0.28125 0.265625 0.28125 0.6875q0 0.40625 -0.28125 0.703125q-0.28125 0.28125 -0.6875 0.28125zm-0.671875 1.5l1.359375 0l0 8.15625l-1.359375 0l0 -8.15625zm3.4910278 -3.296875l1.359375 0l0 11.453125l-1.359375 0l0 -11.453125zm5.88974 11.703125q-0.890625 0 -1.59375 -0.34375q-0.703125 -0.359375 -1.09375 -0.96875q-0.375 -0.625 -0.375 -1.40625q0 -1.296875 0.96875 -2.015625q0.984375 -0.734375 2.46875 -0.734375q0.734375 0 1.359375 0.171875q0.640625 0.15625 0.96875 0.359375l0 -0.5q0 -0.90625 -0.640625 -1.453125q-0.625 -0.5625 -1.609375 -0.5625q-0.671875 0 -1.265625 0.296875q-0.578125 0.296875 -0.90625 0.828125l-1.03125 -0.765625q0.484375 -0.734375 1.328125 -1.15625q0.859375 -0.421875 1.875 -0.421875q1.671875 0 2.609375 0.875q0.9375 0.875 0.9375 2.375l0 5.171875l-1.296875 0l0 -1.171875l-0.0625 0q-0.34375 0.59375 -1.046875 1.015625q-0.703125 0.40625 -1.59375 0.40625zm0.140625 -1.1875q0.6875 0 1.265625 -0.34375q0.59375 -0.359375 0.9375 -0.953125q0.359375 -0.59375 0.359375 -1.296875q-0.375 -0.265625 -0.9375 -0.421875q-0.5625 -0.15625 -1.1875 -0.15625q-1.109375 0 -1.6875 0.46875q-0.5625 0.453125 -0.5625 1.1875q0 0.671875 0.5 1.09375q0.515625 0.421875 1.3125 0.421875zm8.726654 1.0625q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm3.6078796 -9.78125q-0.40625 0 -0.703125 -0.28125q-0.28125 -0.296875 -0.28125 -0.703125q0 -0.421875 0.28125 -0.6875q0.296875 -0.28125 0.703125 -0.28125q0.40625 0 0.6875 0.28125q0.28125 0.265625 0.28125 0.6875q0 0.40625 -0.28125 0.703125q-0.28125 0.28125 -0.6875 0.28125zm-0.671875 1.5l1.359375 0l0 8.15625l-1.359375 0l0 -8.15625zm7.1610107 8.40625q-1.203125 0 -2.171875 -0.5625q-0.953125 -0.578125 -1.484375 -1.5625q-0.53125 -1.0 -0.53125 -2.203125q0 -1.203125 0.53125 -2.1875q0.53125 -1.0 1.484375 -1.578125q0.96875 -0.578125 2.171875 -0.578125q1.203125 0 2.15625 0.578125q0.96875 0.578125 1.5 1.578125q0.53125 0.984375 0.53125 2.1875q0 1.203125 -0.53125 2.203125q-0.53125 0.984375 -1.5 1.5625q-0.953125 0.5625 -2.15625 0.5625zm0 -1.21875q0.75 0 1.390625 -0.375q0.65625 -0.390625 1.046875 -1.09375q0.390625 -0.703125 0.390625 -1.640625q0 -0.953125 -0.390625 -1.65625q-0.390625 -0.703125 -1.046875 -1.078125q-0.640625 -0.375 -1.390625 -0.375q-0.75 0 -1.40625 0.375q-0.65625 0.375 -1.046875 1.078125q-0.390625 0.703125 -0.390625 1.65625q0 0.9375 0.390625 1.640625q0.390625 0.703125 1.046875 1.09375q0.65625 0.375 1.40625 0.375zm5.6260376 -7.1875l1.28125 0l0 1.203125l0.078125 0q0.328125 -0.609375 1.0625 -1.03125q0.734375 -0.4375 1.578125 -0.4375q1.46875 0 2.234375 0.859375q0.78125 0.859375 0.78125 2.328125l0 5.234375l-1.359375 0l0 -5.03125q0 -1.125 -0.546875 -1.640625q-0.546875 -0.515625 -1.484375 -0.515625q-0.65625 0 -1.1875 0.375q-0.515625 0.359375 -0.796875 0.96875q-0.28125 0.59375 -0.28125 1.25l0 4.59375l-1.359375 0l0 -8.15625z" fill-rule="nonzero"/><path fill="#eeeeee" d="m224.24684 211.13821q-0.875 0 -1.6875 -0.359375q-0.796875 -0.359375 -1.421875 -1.046875q-0.625 -0.703125 -0.890625 -1.6875l1.296875 -0.53125q0.265625 1.015625 1.0 1.671875q0.734375 0.65625 1.734375 0.65625q0.984375 0 1.671875 -0.53125q0.6875 -0.53125 0.6875 -1.46875q0 -0.796875 -0.578125 -1.3125q-0.578125 -0.515625 -1.90625 -0.96875l-0.734375 -0.25q-1.203125 -0.4375 -1.984375 -1.140625q-0.765625 -0.703125 -0.765625 -1.953125q0 -0.8125 0.453125 -1.5q0.453125 -0.703125 1.25 -1.125q0.796875 -0.421875 1.796875 -0.421875q0.984375 0 1.71875 0.375q0.734375 0.375 1.171875 0.90625q0.453125 0.515625 0.625 1.03125l-1.265625 0.546875q-0.171875 -0.59375 -0.75 -1.078125q-0.5625 -0.484375 -1.484375 -0.484375q-0.890625 0 -1.515625 0.5q-0.625 0.5 -0.625 1.25q0 0.671875 0.53125 1.09375q0.53125 0.421875 1.609375 0.796875l0.75 0.25q1.453125 0.53125 2.265625 1.328125q0.8125 0.78125 0.8125 2.140625q0 1.109375 -0.5625 1.859375q-0.5625 0.75 -1.4375 1.109375q-0.859375 0.34375 -1.765625 0.34375zm8.248276 -0.125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm5.1647644 0.125q-0.890625 0 -1.59375 -0.34375q-0.703125 -0.359375 -1.09375 -0.96875q-0.375 -0.625 -0.375 -1.40625q0 -1.296875 0.96875 -2.015625q0.984375 -0.734375 2.46875 -0.734375q0.734375 0 1.359375 0.171875q0.640625 0.15625 0.96875 0.359375l0 -0.5q0 -0.90625 -0.640625 -1.453125q-0.625 -0.5625 -1.609375 -0.5625q-0.671875 0 -1.265625 0.296875q-0.578125 0.296875 -0.90625 0.828125l-1.03125 -0.765625q0.484375 -0.734375 1.328125 -1.15625q0.859375 -0.421875 1.875 -0.421875q1.671875 0 2.609375 0.875q0.9375 0.875 0.9375 2.375l0 5.171875l-1.296875 0l0 -1.171875l-0.0625 0q-0.34375 0.59375 -1.046875 1.015625q-0.703125 0.40625 -1.59375 0.40625zm0.140625 -1.1875q0.6875 0 1.265625 -0.34375q0.59375 -0.359375 0.9375 -0.953125q0.359375 -0.59375 0.359375 -1.296875q-0.375 -0.265625 -0.9375 -0.421875q-0.5625 -0.15625 -1.1875 -0.15625q-1.109375 0 -1.6875 0.46875q-0.5625 0.453125 -0.5625 1.1875q0 0.671875 0.5 1.09375q0.515625 0.421875 1.3125 0.421875zm8.726639 1.0625q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm6.004013 0.125q-1.171875 0 -2.109375 -0.546875q-0.921875 -0.5625 -1.4375 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.171875 0.484375 -2.171875q0.484375 -1.0 1.390625 -1.59375q0.90625 -0.59375 2.078125 -0.59375q1.203125 0 2.078125 0.546875q0.875 0.53125 1.34375 1.484375q0.484375 0.9375 0.484375 2.15625q0 0.1875 -0.03125 0.40625l-6.46875 0q0.046875 0.9375 0.4375 1.578125q0.40625 0.640625 1.015625 0.96875q0.625 0.3125 1.296875 0.3125q1.59375 0 2.421875 -1.484375l1.140625 0.5625q-0.5 0.984375 -1.421875 1.5625q-0.90625 0.578125 -2.1875 0.578125zm2.34375 -5.1875q-0.03125 -0.515625 -0.28125 -1.03125q-0.25 -0.515625 -0.796875 -0.859375q-0.546875 -0.359375 -1.375 -0.359375q-0.96875 0 -1.640625 0.625q-0.671875 0.609375 -0.875 1.625l4.96875 0zm3.8167725 -1.984375l-1.5 0l0 -1.234375l1.5 0l0 -0.890625q0 -0.765625 0.34375 -1.328125q0.359375 -0.578125 0.953125 -0.890625q0.59375 -0.3125 1.3125 -0.3125q0.6875 0 1.203125 0.1875l0 1.328125q-0.296875 -0.109375 -0.5625 -0.171875q-0.25 -0.078125 -0.59375 -0.078125q-0.53125 0 -0.921875 0.375q-0.375 0.375 -0.375 1.046875l0 0.734375l2.09375 0l0 1.234375l-2.09375 0l0 6.921875l-1.359375 0l0 -6.921875zm7.9196167 7.171875q-1.46875 0 -2.25 -0.859375q-0.78125 -0.859375 -0.78125 -2.421875l0 -5.125l1.359375 0l0 4.921875q0 1.171875 0.53125 1.71875q0.53125 0.546875 1.421875 0.546875q0.6875 0 1.21875 -0.375q0.546875 -0.375 0.84375 -0.953125q0.296875 -0.59375 0.296875 -1.25l0 -4.609375l1.359375 0l0 8.15625l-1.296875 0l0 -1.1875l-0.0625 0q-0.34375 0.609375 -1.078125 1.03125q-0.734375 0.40625 -1.5625 0.40625zm6.022888 -11.703125l1.359375 0l0 11.453125l-1.359375 0l0 -11.453125zm2.360382 11.453125l0 0zm4.7276306 -11.453125l1.359375 0l0 3.375l-0.078125 1.125l0.078125 0q0.328125 -0.625 1.046875 -1.046875q0.734375 -0.421875 1.609375 -0.421875q1.484375 0 2.265625 0.875q0.78125 0.875 0.78125 2.3125l0 5.234375l-1.359375 0l0 -5.03125q0 -1.09375 -0.5625 -1.625q-0.5625 -0.53125 -1.453125 -0.53125q-0.640625 0 -1.1875 0.390625q-0.53125 0.375 -0.84375 0.984375q-0.296875 0.609375 -0.296875 1.265625l0 4.546875l-1.359375 0l0 -11.453125zm12.774017 11.703125q-1.203125 0 -2.171875 -0.5625q-0.953125 -0.578125 -1.484375 -1.5625q-0.53125 -1.0 -0.53125 -2.203125q0 -1.203125 0.53125 -2.1875q0.53125 -1.0 1.484375 -1.578125q0.96875 -0.578125 2.171875 -0.578125q1.203125 0 2.15625 0.578125q0.96875 0.578125 1.5 1.578125q0.53125 0.984375 0.53125 2.1875q0 1.203125 -0.53125 2.203125q-0.53125 0.984375 -1.5 1.5625q-0.953125 0.5625 -2.15625 0.5625zm0 -1.21875q0.75 0 1.390625 -0.375q0.65625 -0.390625 1.046875 -1.09375q0.390625 -0.703125 0.390625 -1.640625q0 -0.953125 -0.390625 -1.65625q-0.390625 -0.703125 -1.046875 -1.078125q-0.640625 -0.375 -1.390625 -0.375q-0.75 0 -1.40625 0.375q-0.65625 0.375 -1.046875 1.078125q-0.390625 0.703125 -0.390625 1.65625q0 0.9375 0.390625 1.640625q0.390625 0.703125 1.046875 1.09375q0.65625 0.375 1.40625 0.375zm8.6710205 1.09375q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm1.7153931 -0.125l0 0zm4.7276306 -8.15625l1.28125 0l0 1.3125l0.078125 0q0.234375 -0.671875 0.921875 -1.109375q0.6875 -0.453125 1.4375 -0.453125q0.5625 0 0.96875 0.171875l0 1.46875q-0.515625 -0.265625 -1.15625 -0.265625q-0.59375 0 -1.09375 0.34375q-0.5 0.328125 -0.796875 0.90625q-0.28125 0.5625 -0.28125 1.21875l0 4.5625l-1.359375 0l0 -8.15625zm9.14502 8.40625q-1.171875 0 -2.109375 -0.546875q-0.921875 -0.5625 -1.4375 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.171875 0.484375 -2.171875q0.484375 -1.0 1.390625 -1.59375q0.90625 -0.59375 2.078125 -0.59375q1.203125 0 2.078125 0.546875q0.875 0.53125 1.34375 1.484375q0.484375 0.9375 0.484375 2.15625q0 0.1875 -0.03125 0.40625l-6.46875 0q0.046875 0.9375 0.4375 1.578125q0.40625 0.640625 1.015625 0.96875q0.625 0.3125 1.296875 0.3125q1.59375 0 2.421875 -1.484375l1.140625 0.5625q-0.5 0.984375 -1.421875 1.5625q-0.90625 0.578125 -2.1875 0.578125zm2.34375 -5.1875q-0.03125 -0.515625 -0.28125 -1.03125q-0.25 -0.515625 -0.796875 -0.859375q-0.546875 -0.359375 -1.375 -0.359375q-0.96875 0 -1.640625 0.625q-0.671875 0.609375 -0.875 1.625l4.96875 0zm3.0392761 -6.515625l1.359375 0l0 11.453125l-1.359375 0l0 -11.453125zm7.04599 11.703125q-1.203125 0 -2.171875 -0.5625q-0.953125 -0.578125 -1.484375 -1.5625q-0.53125 -1.0 -0.53125 -2.203125q0 -1.203125 0.53125 -2.1875q0.53125 -1.0 1.484375 -1.578125q0.96875 -0.578125 2.171875 -0.578125q1.203125 0 2.15625 0.578125q0.96875 0.578125 1.5 1.578125q0.53125 0.984375 0.53125 2.1875q0 1.203125 -0.53125 2.203125q-0.53125 0.984375 -1.5 1.5625q-0.953125 0.5625 -2.15625 0.5625zm0 -1.21875q0.75 0 1.390625 -0.375q0.65625 -0.390625 1.046875 -1.09375q0.390625 -0.703125 0.390625 -1.640625q0 -0.953125 -0.390625 -1.65625q-0.390625 -0.703125 -1.046875 -1.078125q-0.640625 -0.375 -1.390625 -0.375q-0.75 0 -1.40625 0.375q-0.65625 0.375 -1.046875 1.078125q-0.390625 0.703125 -0.390625 1.65625q0 0.9375 0.390625 1.640625q0.390625 0.703125 1.046875 1.09375q0.65625 0.375 1.40625 0.375zm8.379791 1.21875q-0.890625 0 -1.59375 -0.34375q-0.703125 -0.359375 -1.09375 -0.96875q-0.375 -0.625 -0.375 -1.40625q0 -1.296875 0.96875 -2.015625q0.984375 -0.734375 2.46875 -0.734375q0.734375 0 1.359375 0.171875q0.640625 0.15625 0.96875 0.359375l0 -0.5q0 -0.90625 -0.640625 -1.453125q-0.625 -0.5625 -1.609375 -0.5625q-0.671875 0 -1.265625 0.296875q-0.578125 0.296875 -0.90625 0.828125l-1.03125 -0.765625q0.484375 -0.734375 1.328125 -1.15625q0.859375 -0.421875 1.875 -0.421875q1.671875 0 2.609375 0.875q0.9375 0.875 0.9375 2.375l0 5.171875l-1.296875 0l0 -1.171875l-0.0625 0q-0.34375 0.59375 -1.046875 1.015625q-0.703125 0.40625 -1.59375 0.40625zm0.140625 -1.1875q0.6875 0 1.265625 -0.34375q0.59375 -0.359375 0.9375 -0.953125q0.359375 -0.59375 0.359375 -1.296875q-0.375 -0.265625 -0.9375 -0.421875q-0.5625 -0.15625 -1.1875 -0.15625q-1.109375 0 -1.6875 0.46875q-0.5625 0.453125 -0.5625 1.1875q0 0.671875 0.5 1.09375q0.515625 0.421875 1.3125 0.421875zm9.150391 1.1875q-1.109375 0 -2.0 -0.546875q-0.890625 -0.5625 -1.40625 -1.546875q-0.5 -0.984375 -0.5 -2.234375q0 -1.234375 0.5 -2.21875q0.515625 -1.0 1.40625 -1.5625q0.890625 -0.5625 2.0 -0.5625q0.921875 0 1.65625 0.4375q0.734375 0.421875 1.125 1.046875l0.0625 0l-0.0625 -1.140625l0 -3.375l1.359375 0l0 11.453125l-1.296875 0l0 -1.203125l-0.0625 0q-0.390625 0.609375 -1.125 1.03125q-0.734375 0.421875 -1.65625 0.421875zm0.140625 -1.21875q0.71875 0 1.328125 -0.390625q0.625 -0.390625 1.0 -1.09375q0.375 -0.703125 0.375 -1.625q0 -0.9375 -0.375 -1.640625q-0.375 -0.703125 -1.0 -1.078125q-0.609375 -0.390625 -1.328125 -0.390625q-0.703125 0 -1.328125 0.390625q-0.625 0.375 -1.0 1.09375q-0.375 0.71875 -0.375 1.625q0 0.90625 0.375 1.625q0.375 0.703125 1.0 1.09375q0.625 0.390625 1.328125 0.390625z" fill-rule="nonzero"/><path fill="#2bb7f6" d="m484.84122 141.17389l346.0787 0l0 86.708664l-346.0787 0z" fill-rule="evenodd"/><path fill="#000000" d="m567.37244 159.08884l4.703125 0q1.265625 0 2.3125 0.53125q1.046875 0.53125 1.640625 1.5q0.59375 0.953125 0.59375 2.1875q0 1.234375 -0.59375 2.203125q-0.59375 0.96875 -1.640625 1.5q-1.046875 0.53125 -2.3125 0.53125l-2.1875 0l0 4.90625l-2.515625 0l0 -13.359375zm4.78125 6.0625q0.921875 0 1.453125 -0.53125q0.53125 -0.546875 0.53125 -1.3125q0 -0.765625 -0.53125 -1.296875q-0.53125 -0.53125 -1.453125 -0.53125l-2.265625 0l0 3.671875l2.265625 0zm6.25531 -2.21875l2.296875 0l0 1.265625l0.15625 0q0.359375 -0.671875 1.09375 -1.109375q0.75 -0.4375 1.640625 -0.4375q0.65625 0 1.203125 0.203125l0 2.453125q-0.5 -0.1875 -0.859375 -0.265625q-0.34375 -0.09375 -0.734375 -0.09375q-1.078125 0 -1.71875 0.78125q-0.625 0.78125 -0.625 1.984375l0 4.734375l-2.453125 0l0 -9.515625zm11.96875 9.8125q-1.484375 0 -2.640625 -0.65625q-1.15625 -0.671875 -1.796875 -1.8125q-0.640625 -1.15625 -0.640625 -2.578125q0 -1.421875 0.640625 -2.578125q0.640625 -1.15625 1.796875 -1.8125q1.15625 -0.671875 2.640625 -0.671875q1.453125 0 2.609375 0.671875q1.15625 0.65625 1.796875 1.8125q0.640625 1.15625 0.640625 2.578125q0 1.421875 -0.640625 2.578125q-0.640625 1.140625 -1.796875 1.8125q-1.15625 0.65625 -2.609375 0.65625zm0 -2.25q0.703125 0 1.296875 -0.328125q0.609375 -0.34375 0.953125 -0.984375q0.359375 -0.640625 0.359375 -1.484375q0 -0.84375 -0.359375 -1.46875q-0.34375 -0.640625 -0.953125 -0.96875q-0.59375 -0.34375 -1.296875 -0.34375q-0.71875 0 -1.3125 0.34375q-0.59375 0.328125 -0.96875 0.96875q-0.359375 0.625 -0.359375 1.46875q0 0.828125 0.359375 1.484375q0.375 0.640625 0.96875 0.984375q0.59375 0.328125 1.3125 0.328125zm11.004822 2.25q-1.28125 0 -2.34375 -0.640625q-1.046875 -0.640625 -1.65625 -1.78125q-0.609375 -1.15625 -0.609375 -2.625q0 -1.46875 0.609375 -2.625q0.609375 -1.15625 1.65625 -1.796875q1.0625 -0.640625 2.34375 -0.640625q0.96875 0 1.71875 0.421875q0.75 0.421875 1.140625 1.03125l0.140625 0l-0.140625 -1.34375l0 -3.65625l2.421875 0l0 13.359375l-2.28125 0l0 -1.140625l-0.140625 0q-0.375 0.625 -1.140625 1.03125q-0.75 0.40625 -1.71875 0.40625zm0.40625 -2.25q0.6875 0 1.28125 -0.359375q0.609375 -0.359375 0.953125 -0.984375q0.359375 -0.640625 0.359375 -1.453125q0 -0.828125 -0.359375 -1.453125q-0.34375 -0.640625 -0.953125 -0.984375q-0.59375 -0.34375 -1.28125 -0.34375q-0.671875 0 -1.265625 0.34375q-0.59375 0.34375 -0.953125 0.984375q-0.359375 0.625 -0.359375 1.453125q0 0.8125 0.359375 1.453125q0.359375 0.625 0.953125 0.984375q0.59375 0.359375 1.265625 0.359375zm10.709595 2.25q-1.71875 0 -2.609375 -1.0625q-0.890625 -1.0625 -0.890625 -2.96875l0 -5.78125l2.4375 0l0 5.484375q0 0.96875 0.46875 1.53125q0.46875 0.546875 1.234375 0.546875q1.046875 0 1.65625 -0.765625q0.609375 -0.765625 0.609375 -1.953125l0 -4.84375l2.453125 0l0 9.515625l-2.296875 0l0 -1.1875l-0.15625 0q-0.421875 0.6875 -1.203125 1.09375q-0.765625 0.390625 -1.703125 0.390625zm12.128662 0q-1.4375 0 -2.578125 -0.640625q-1.140625 -0.640625 -1.78125 -1.796875q-0.640625 -1.15625 -0.640625 -2.609375q0 -1.46875 0.640625 -2.609375q0.640625 -1.140625 1.78125 -1.796875q1.140625 -0.65625 2.578125 -0.65625q1.578125 0 2.71875 0.6875q1.140625 0.671875 1.640625 1.921875l-2.234375 0.9375q-0.59375 -1.265625 -2.125 -1.265625q-1.125 0 -1.84375 0.765625q-0.71875 0.765625 -0.71875 2.015625q0 1.265625 0.71875 2.03125q0.71875 0.765625 1.84375 0.765625q1.546875 0 2.234375 -1.34375l2.21875 0.96875q-0.609375 1.25 -1.75 1.9375q-1.140625 0.6875 -2.703125 0.6875zm10.25293 -0.140625q-0.703125 0 -1.296875 -0.21875q-0.59375 -0.21875 -0.96875 -0.59375q-0.875 -0.84375 -0.875 -2.390625l0 -4.375l-1.671875 0l0 -2.09375l1.671875 0l0 -2.6875l2.4375 0l0 2.6875l2.328125 0l0 2.09375l-2.328125 0l0 3.9375q0 0.71875 0.3125 1.046875q0.265625 0.296875 0.90625 0.296875q0.34375 0 0.578125 -0.09375q0.234375 -0.09375 0.609375 -0.328125l0 2.390625q-0.796875 0.328125 -1.703125 0.328125zm5.1416626 -10.71875q-0.65625 0 -1.125 -0.46875q-0.46875 -0.46875 -0.46875 -1.109375q0 -0.65625 0.46875 -1.109375q0.46875 -0.46875 1.125 -0.46875q0.65625 0 1.109375 0.46875q0.453125 0.453125 0.453125 1.109375q0 0.640625 -0.453125 1.109375q-0.453125 0.46875 -1.109375 0.46875zm-1.234375 1.046875l2.4375 0l0 9.515625l-2.4375 0l0 -9.515625zm9.443359 9.8125q-1.484375 0 -2.640625 -0.65625q-1.15625 -0.671875 -1.796875 -1.8125q-0.640625 -1.15625 -0.640625 -2.578125q0 -1.421875 0.640625 -2.578125q0.640625 -1.15625 1.796875 -1.8125q1.15625 -0.671875 2.640625 -0.671875q1.453125 0 2.609375 0.671875q1.15625 0.65625 1.796875 1.8125q0.640625 1.15625 0.640625 2.578125q0 1.421875 -0.640625 2.578125q-0.640625 1.140625 -1.796875 1.8125q-1.15625 0.65625 -2.609375 0.65625zm0 -2.25q0.703125 0 1.296875 -0.328125q0.609375 -0.34375 0.953125 -0.984375q0.359375 -0.640625 0.359375 -1.484375q0 -0.84375 -0.359375 -1.46875q-0.34375 -0.640625 -0.953125 -0.96875q-0.59375 -0.34375 -1.296875 -0.34375q-0.71875 0 -1.3125 0.34375q-0.59375 0.328125 -0.96875 0.96875q-0.359375 0.625 -0.359375 1.46875q0 0.828125 0.359375 1.484375q0.375 0.640625 0.96875 0.984375q0.59375 0.328125 1.3125 0.328125zm6.7244263 -7.5625l2.296875 0l0 1.1875l0.15625 0q0.421875 -0.6875 1.203125 -1.078125q0.796875 -0.40625 1.703125 -0.40625q1.71875 0 2.609375 1.046875q0.90625 1.046875 0.90625 2.859375l0 5.90625l-2.453125 0l0 -5.609375q0 -0.921875 -0.46875 -1.421875q-0.46875 -0.5 -1.296875 -0.5q-1.0 0 -1.609375 0.765625q-0.59375 0.765625 -0.59375 1.921875l0 4.84375l-2.453125 0l0 -9.515625zm9.98761 9.515625l0 0zm9.693726 0.15625q-0.703125 0 -1.296875 -0.21875q-0.59375 -0.21875 -0.96875 -0.59375q-0.875 -0.84375 -0.875 -2.390625l0 -4.375l-1.671875 0l0 -2.09375l1.671875 0l0 -2.6875l2.4375 0l0 2.6875l2.328125 0l0 2.09375l-2.328125 0l0 3.9375q0 0.71875 0.3125 1.046875q0.265625 0.296875 0.90625 0.296875q0.34375 0 0.578125 -0.09375q0.234375 -0.09375 0.609375 -0.328125l0 2.390625q-0.796875 0.328125 -1.703125 0.328125zm7.8841553 0.140625q-1.484375 0 -2.640625 -0.65625q-1.15625 -0.671875 -1.796875 -1.8125q-0.640625 -1.15625 -0.640625 -2.578125q0 -1.421875 0.640625 -2.578125q0.640625 -1.15625 1.796875 -1.8125q1.15625 -0.671875 2.640625 -0.671875q1.453125 0 2.609375 0.671875q1.15625 0.65625 1.796875 1.8125q0.640625 1.15625 0.640625 2.578125q0 1.421875 -0.640625 2.578125q-0.640625 1.140625 -1.796875 1.8125q-1.15625 0.65625 -2.609375 0.65625zm0 -2.25q0.703125 0 1.296875 -0.328125q0.609375 -0.34375 0.953125 -0.984375q0.359375 -0.640625 0.359375 -1.484375q0 -0.84375 -0.359375 -1.46875q-0.34375 -0.640625 -0.953125 -0.96875q-0.59375 -0.34375 -1.296875 -0.34375q-0.71875 0 -1.3125 0.34375q-0.59375 0.328125 -0.96875 0.96875q-0.359375 0.625 -0.359375 1.46875q0 0.828125 0.359375 1.484375q0.375 0.640625 0.96875 0.984375q0.59375 0.328125 1.3125 0.328125zm11.473633 2.25q-1.484375 0 -2.640625 -0.65625q-1.15625 -0.671875 -1.796875 -1.8125q-0.640625 -1.15625 -0.640625 -2.578125q0 -1.421875 0.640625 -2.578125q0.640625 -1.15625 1.796875 -1.8125q1.15625 -0.671875 2.640625 -0.671875q1.453125 0 2.609375 0.671875q1.15625 0.65625 1.796875 1.8125q0.640625 1.15625 0.640625 2.578125q0 1.421875 -0.640625 2.578125q-0.640625 1.140625 -1.796875 1.8125q-1.15625 0.65625 -2.609375 0.65625zm0 -2.25q0.703125 0 1.296875 -0.328125q0.609375 -0.34375 0.953125 -0.984375q0.359375 -0.640625 0.359375 -1.484375q0 -0.84375 -0.359375 -1.46875q-0.34375 -0.640625 -0.953125 -0.96875q-0.59375 -0.34375 -1.296875 -0.34375q-0.71875 0 -1.3125 0.34375q-0.59375 0.328125 -0.96875 0.96875q-0.359375 0.625 -0.359375 1.46875q0 0.828125 0.359375 1.484375q0.375 0.640625 0.96875 0.984375q0.59375 0.328125 1.3125 0.328125zm6.817749 -11.40625l2.453125 0l0 13.359375l-2.453125 0l0 -13.359375zm9.241638 13.65625q-1.4375 0 -2.578125 -0.640625q-1.140625 -0.640625 -1.78125 -1.796875q-0.640625 -1.15625 -0.640625 -2.609375q0 -1.46875 0.640625 -2.609375q0.640625 -1.140625 1.78125 -1.796875q1.140625 -0.65625 2.578125 -0.65625q1.578125 0 2.71875 0.6875q1.140625 0.671875 1.640625 1.921875l-2.234375 0.9375q-0.59375 -1.265625 -2.125 -1.265625q-1.125 0 -1.84375 0.765625q-0.71875 0.765625 -0.71875 2.015625q0 1.265625 0.71875 2.03125q0.71875 0.765625 1.84375 0.765625q1.546875 0 2.234375 -1.34375l2.21875 0.96875q-0.609375 1.25 -1.75 1.9375q-1.140625 0.6875 -2.703125 0.6875zm6.2056885 -13.65625l2.453125 0l0 3.375l-0.15625 1.65625l0.15625 0q0.40625 -0.671875 1.1875 -1.078125q0.78125 -0.40625 1.703125 -0.40625q1.734375 0 2.65625 1.03125q0.921875 1.03125 0.921875 2.875l0 5.90625l-2.4375 0l0 -5.609375q0 -0.921875 -0.5 -1.421875q-0.5 -0.5 -1.3125 -0.5q-0.96875 0 -1.59375 0.78125q-0.625 0.78125 -0.625 1.921875l0 4.828125l-2.453125 0l0 -13.359375zm14.05957 13.65625q-1.515625 0 -2.484375 -0.875q-0.96875 -0.890625 -0.96875 -2.328125q0 -0.953125 0.5 -1.671875q0.5 -0.734375 1.375 -1.125q0.890625 -0.390625 1.953125 -0.390625q1.46875 0 2.515625 0.421875l0 -0.40625q0 -0.78125 -0.59375 -1.265625q-0.578125 -0.484375 -1.578125 -0.484375q-0.671875 0 -1.296875 0.3125q-0.625 0.296875 -1.03125 0.796875l-1.5625 -1.234375q0.6875 -0.890625 1.734375 -1.375q1.046875 -0.484375 2.265625 -0.484375q2.1875 0 3.328125 1.015625q1.140625 1.0 1.140625 2.9375l0 5.859375l-2.40625 0l0 -0.96875l-0.15625 0q-0.421875 0.5625 -1.125 0.921875q-0.703125 0.34375 -1.609375 0.34375zm0.578125 -1.90625q1.0625 0 1.6875 -0.671875q0.625 -0.6875 0.625 -1.59375q-0.953125 -0.453125 -2.0 -0.453125q-1.90625 0 -1.90625 1.421875q0 0.578125 0.40625 0.9375q0.421875 0.359375 1.1875 0.359375zm8.356812 -8.953125q-0.65625 0 -1.125 -0.46875q-0.46875 -0.46875 -0.46875 -1.109375q0 -0.65625 0.46875 -1.109375q0.46875 -0.46875 1.125 -0.46875q0.65625 0 1.109375 0.46875q0.453125 0.453125 0.453125 1.109375q0 0.640625 -0.453125 1.109375q-0.453125 0.46875 -1.109375 0.46875zm-1.234375 1.046875l2.4375 0l0 9.515625l-2.4375 0l0 -9.515625zm4.974182 0l2.296875 0l0 1.1875l0.15625 0q0.421875 -0.6875 1.203125 -1.078125q0.796875 -0.40625 1.703125 -0.40625q1.71875 0 2.609375 1.046875q0.90625 1.046875 0.90625 2.859375l0 5.90625l-2.453125 0l0 -5.609375q0 -0.921875 -0.46875 -1.421875q-0.46875 -0.5 -1.296875 -0.5q-1.0 0 -1.609375 0.765625q-0.59375 0.765625 -0.59375 1.921875l0 4.84375l-2.453125 0l0 -9.515625z" fill-rule="nonzero"/><path fill="#222222" d="m567.12244 180.43509l6.625 0l0 1.296875l-5.265625 0l0 3.921875l4.75 0l0 1.28125l-4.75 0l0 4.953125l-1.359375 0l0 -11.453125zm10.50415 11.703125q-0.890625 0 -1.59375 -0.34375q-0.703125 -0.359375 -1.09375 -0.96875q-0.375 -0.625 -0.375 -1.40625q0 -1.296875 0.96875 -2.015625q0.984375 -0.734375 2.46875 -0.734375q0.734375 0 1.359375 0.171875q0.640625 0.15625 0.96875 0.359375l0 -0.5q0 -0.90625 -0.640625 -1.453125q-0.625 -0.5625 -1.609375 -0.5625q-0.671875 0 -1.265625 0.296875q-0.578125 0.296875 -0.90625 0.828125l-1.03125 -0.765625q0.484375 -0.734375 1.328125 -1.15625q0.859375 -0.421875 1.875 -0.421875q1.671875 0 2.609375 0.875q0.9375 0.875 0.9375 2.375l0 5.171875l-1.296875 0l0 -1.171875l-0.0625 0q-0.34375 0.59375 -1.046875 1.015625q-0.703125 0.40625 -1.59375 0.40625zm0.140625 -1.1875q0.6875 0 1.265625 -0.34375q0.59375 -0.359375 0.9375 -0.953125q0.359375 -0.59375 0.359375 -1.296875q-0.375 -0.265625 -0.9375 -0.421875q-0.5625 -0.15625 -1.1875 -0.15625q-1.109375 0 -1.6875 0.46875q-0.5625 0.453125 -0.5625 1.1875q0 0.671875 0.5 1.09375q0.515625 0.421875 1.3125 0.421875zm8.525391 1.1875q-1.3125 0 -2.203125 -0.609375q-0.875 -0.609375 -1.234375 -1.578125l1.203125 -0.546875q0.3125 0.734375 0.90625 1.140625q0.609375 0.40625 1.328125 0.40625q0.765625 0 1.3125 -0.3125q0.546875 -0.3125 0.546875 -0.890625q0 -0.515625 -0.4375 -0.828125q-0.4375 -0.3125 -1.359375 -0.53125l-1.0 -0.265625q-0.96875 -0.234375 -1.59375 -0.8125q-0.625 -0.578125 -0.625 -1.484375q0 -0.703125 0.421875 -1.234375q0.421875 -0.546875 1.125 -0.828125q0.703125 -0.296875 1.53125 -0.296875q1.0625 0 1.90625 0.46875q0.84375 0.46875 1.1875 1.296875l-1.171875 0.546875q-0.546875 -1.09375 -1.9375 -1.09375q-0.671875 0 -1.1875 0.3125q-0.5 0.3125 -0.5 0.796875q0 0.453125 0.34375 0.734375q0.359375 0.265625 1.0625 0.453125l1.1875 0.296875q1.203125 0.3125 1.8125 0.90625q0.609375 0.59375 0.609375 1.46875q0 0.75 -0.4375 1.3125q-0.4375 0.5625 -1.171875 0.875q-0.734375 0.296875 -1.625 0.296875zm7.769287 -0.125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm6.0039673 0.125q-1.171875 0 -2.109375 -0.546875q-0.921875 -0.5625 -1.4375 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.171875 0.484375 -2.171875q0.484375 -1.0 1.390625 -1.59375q0.90625 -0.59375 2.078125 -0.59375q1.203125 0 2.078125 0.546875q0.875 0.53125 1.34375 1.484375q0.484375 0.9375 0.484375 2.15625q0 0.1875 -0.03125 0.40625l-6.46875 0q0.046875 0.9375 0.4375 1.578125q0.40625 0.640625 1.015625 0.96875q0.625 0.3125 1.296875 0.3125q1.59375 0 2.421875 -1.484375l1.140625 0.5625q-0.5 0.984375 -1.421875 1.5625q-0.90625 0.578125 -2.1875 0.578125zm2.34375 -5.1875q-0.03125 -0.515625 -0.28125 -1.03125q-0.25 -0.515625 -0.796875 -0.859375q-0.546875 -0.359375 -1.375 -0.359375q-0.96875 0 -1.640625 0.625q-0.671875 0.609375 -0.875 1.625l4.96875 0zm5.9630127 5.1875q-1.3125 0 -2.203125 -0.609375q-0.875 -0.609375 -1.234375 -1.578125l1.203125 -0.546875q0.3125 0.734375 0.90625 1.140625q0.609375 0.40625 1.328125 0.40625q0.765625 0 1.3125 -0.3125q0.546875 -0.3125 0.546875 -0.890625q0 -0.515625 -0.4375 -0.828125q-0.4375 -0.3125 -1.359375 -0.53125l-1.0 -0.265625q-0.96875 -0.234375 -1.59375 -0.8125q-0.625 -0.578125 -0.625 -1.484375q0 -0.703125 0.421875 -1.234375q0.421875 -0.546875 1.125 -0.828125q0.703125 -0.296875 1.53125 -0.296875q1.0625 0 1.90625 0.46875q0.84375 0.46875 1.1875 1.296875l-1.171875 0.546875q-0.546875 -1.09375 -1.9375 -1.09375q-0.671875 0 -1.1875 0.3125q-0.5 0.3125 -0.5 0.796875q0 0.453125 0.34375 0.734375q0.359375 0.265625 1.0625 0.453125l1.1875 0.296875q1.203125 0.3125 1.8125 0.90625q0.609375 0.59375 0.609375 1.46875q0 0.75 -0.4375 1.3125q-0.4375 0.5625 -1.171875 0.875q-0.734375 0.296875 -1.625 0.296875zm7.769287 -0.125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm1.7153931 -0.125l0 0zm4.7276 -8.15625l1.28125 0l0 1.203125l0.078125 0q0.328125 -0.609375 1.0625 -1.03125q0.734375 -0.4375 1.578125 -0.4375q1.46875 0 2.234375 0.859375q0.78125 0.859375 0.78125 2.328125l0 5.234375l-1.359375 0l0 -5.03125q0 -1.125 -0.546875 -1.640625q-0.546875 -0.515625 -1.484375 -0.515625q-0.65625 0 -1.1875 0.375q-0.515625 0.359375 -0.796875 0.96875q-0.28125 0.59375 -0.28125 1.25l0 4.59375l-1.359375 0l0 -8.15625zm11.489807 8.40625q-0.890625 0 -1.59375 -0.34375q-0.703125 -0.359375 -1.09375 -0.96875q-0.375 -0.625 -0.375 -1.40625q0 -1.296875 0.96875 -2.015625q0.984375 -0.734375 2.46875 -0.734375q0.734375 0 1.359375 0.171875q0.640625 0.15625 0.96875 0.359375l0 -0.5q0 -0.90625 -0.640625 -1.453125q-0.625 -0.5625 -1.609375 -0.5625q-0.671875 0 -1.265625 0.296875q-0.578125 0.296875 -0.90625 0.828125l-1.03125 -0.765625q0.484375 -0.734375 1.328125 -1.15625q0.859375 -0.421875 1.875 -0.421875q1.671875 0 2.609375 0.875q0.9375 0.875 0.9375 2.375l0 5.171875l-1.296875 0l0 -1.171875l-0.0625 0q-0.34375 0.59375 -1.046875 1.015625q-0.703125 0.40625 -1.59375 0.40625zm0.140625 -1.1875q0.6875 0 1.265625 -0.34375q0.59375 -0.359375 0.9375 -0.953125q0.359375 -0.59375 0.359375 -1.296875q-0.375 -0.265625 -0.9375 -0.421875q-0.5625 -0.15625 -1.1875 -0.15625q-1.109375 0 -1.6875 0.46875q-0.5625 0.453125 -0.5625 1.1875q0 0.671875 0.5 1.09375q0.515625 0.421875 1.3125 0.421875zm8.726624 1.0625q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm3.6079102 -9.78125q-0.40625 0 -0.703125 -0.28125q-0.28125 -0.296875 -0.28125 -0.703125q0 -0.421875 0.28125 -0.6875q0.296875 -0.28125 0.703125 -0.28125q0.40625 0 0.6875 0.28125q0.28125 0.265625 0.28125 0.6875q0 0.40625 -0.28125 0.703125q-0.28125 0.28125 -0.6875 0.28125zm-0.671875 1.5l1.359375 0l0 8.15625l-1.359375 0l0 -8.15625zm2.5847168 0l1.453125 0l2.53125 6.5625l0.03125 0l2.5625 -6.5625l1.421875 0l-3.328125 8.15625l-1.375 0l-3.296875 -8.15625zm12.515259 8.40625q-1.171875 0 -2.109375 -0.546875q-0.921875 -0.5625 -1.4375 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.171875 0.484375 -2.171875q0.484375 -1.0 1.390625 -1.59375q0.90625 -0.59375 2.078125 -0.59375q1.203125 0 2.078125 0.546875q0.875 0.53125 1.34375 1.484375q0.484375 0.9375 0.484375 2.15625q0 0.1875 -0.03125 0.40625l-6.46875 0q0.046875 0.9375 0.4375 1.578125q0.40625 0.640625 1.015625 0.96875q0.625 0.3125 1.296875 0.3125q1.59375 0 2.421875 -1.484375l1.140625 0.5625q-0.5 0.984375 -1.421875 1.5625q-0.90625 0.578125 -2.1875 0.578125zm2.34375 -5.1875q-0.03125 -0.515625 -0.28125 -1.03125q-0.25 -0.515625 -0.796875 -0.859375q-0.546875 -0.359375 -1.375 -0.359375q-0.96875 0 -1.640625 0.625q-0.671875 0.609375 -0.875 1.625l4.96875 0zm2.0236816 4.9375l0 0zm8.4776 0.25q-1.203125 0 -2.171875 -0.5625q-0.953125 -0.578125 -1.484375 -1.5625q-0.53125 -1.0 -0.53125 -2.203125q0 -1.203125 0.53125 -2.1875q0.53125 -1.0 1.484375 -1.578125q0.96875 -0.578125 2.171875 -0.578125q1.203125 0 2.15625 0.578125q0.96875 0.578125 1.5 1.578125q0.53125 0.984375 0.53125 2.1875q0 1.203125 -0.53125 2.203125q-0.53125 0.984375 -1.5 1.5625q-0.953125 0.5625 -2.15625 0.5625zm0 -1.21875q0.75 0 1.390625 -0.375q0.65625 -0.390625 1.046875 -1.09375q0.390625 -0.703125 0.390625 -1.640625q0 -0.953125 -0.390625 -1.65625q-0.390625 -0.703125 -1.046875 -1.078125q-0.640625 -0.375 -1.390625 -0.375q-0.75 0 -1.40625 0.375q-0.65625 0.375 -1.046875 1.078125q-0.390625 0.703125 -0.390625 1.65625q0 0.9375 0.390625 1.640625q0.390625 0.703125 1.046875 1.09375q0.65625 0.375 1.40625 0.375zm8.65918 1.21875q-1.46875 0 -2.25 -0.859375q-0.78125 -0.859375 -0.78125 -2.421875l0 -5.125l1.359375 0l0 4.921875q0 1.171875 0.53125 1.71875q0.53125 0.546875 1.421875 0.546875q0.6875 0 1.21875 -0.375q0.546875 -0.375 0.84375 -0.953125q0.296875 -0.59375 0.296875 -1.25l0 -4.609375l1.359375 0l0 8.15625l-1.296875 0l0 -1.1875l-0.0625 0q-0.34375 0.609375 -1.078125 1.03125q-0.734375 0.40625 -1.5625 0.40625zm9.227844 -0.125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm2.7329102 -8.28125l1.296875 0l0 1.21875l0.0625 0q0.375 -0.625 1.109375 -1.046875q0.75 -0.4375 1.6875 -0.4375q1.09375 0 1.984375 0.5625q0.890625 0.5625 1.390625 1.5625q0.515625 0.984375 0.515625 2.21875q0 1.25 -0.515625 2.234375q-0.5 0.984375 -1.390625 1.546875q-0.890625 0.546875 -1.984375 0.546875q-0.9375 0 -1.6875 -0.421875q-0.734375 -0.421875 -1.109375 -1.03125l-0.0625 0l0.0625 1.125l0 3.53125l-1.359375 0l0 -11.609375zm4.0 7.1875q0.703125 0 1.328125 -0.390625q0.625 -0.390625 0.984375 -1.09375q0.375 -0.703125 0.375 -1.625q0 -0.9375 -0.375 -1.640625q-0.359375 -0.703125 -0.984375 -1.078125q-0.625 -0.390625 -1.328125 -0.390625q-0.71875 0 -1.34375 0.390625q-0.609375 0.375 -0.984375 1.078125q-0.375 0.703125 -0.375 1.640625q0 0.921875 0.375 1.625q0.375 0.703125 0.984375 1.09375q0.625 0.390625 1.34375 0.390625zm8.519287 1.21875q-1.46875 0 -2.25 -0.859375q-0.78125 -0.859375 -0.78125 -2.421875l0 -5.125l1.359375 0l0 4.921875q0 1.171875 0.53125 1.71875q0.53125 0.546875 1.421875 0.546875q0.6875 0 1.21875 -0.375q0.546875 -0.375 0.84375 -0.953125q0.296875 -0.59375 0.296875 -1.25l0 -4.609375l1.359375 0l0 8.15625l-1.296875 0l0 -1.1875l-0.0625 0q-0.34375 0.609375 -1.078125 1.03125q-0.734375 0.40625 -1.5625 0.40625zm9.227905 -0.125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875z" fill-rule="nonzero"/><path fill="#222222" d="m570.32556 211.13821q-0.875 0 -1.6875 -0.359375q-0.796875 -0.359375 -1.421875 -1.046875q-0.625 -0.703125 -0.890625 -1.6875l1.296875 -0.53125q0.265625 1.015625 1.0 1.671875q0.734375 0.65625 1.734375 0.65625q0.984375 0 1.671875 -0.53125q0.6875 -0.53125 0.6875 -1.46875q0 -0.796875 -0.578125 -1.3125q-0.578125 -0.515625 -1.90625 -0.96875l-0.734375 -0.25q-1.203125 -0.4375 -1.984375 -1.140625q-0.765625 -0.703125 -0.765625 -1.953125q0 -0.8125 0.453125 -1.5q0.453125 -0.703125 1.25 -1.125q0.796875 -0.421875 1.796875 -0.421875q0.984375 0 1.71875 0.375q0.734375 0.375 1.171875 0.90625q0.453125 0.515625 0.625 1.03125l-1.265625 0.546875q-0.171875 -0.59375 -0.75 -1.078125q-0.5625 -0.484375 -1.484375 -0.484375q-0.890625 0 -1.515625 0.5q-0.625 0.5 -0.625 1.25q0 0.671875 0.53125 1.09375q0.53125 0.421875 1.609375 0.796875l0.75 0.25q1.453125 0.53125 2.265625 1.328125q0.8125 0.78125 0.8125 2.140625q0 1.109375 -0.5625 1.859375q-0.5625 0.75 -1.4375 1.109375q-0.859375 0.34375 -1.765625 0.34375zm5.5233154 -8.40625l1.28125 0l0 1.203125l0.078125 0q0.34375 -0.625 1.046875 -1.046875q0.703125 -0.421875 1.484375 -0.421875q0.90625 0 1.5625 0.4375q0.671875 0.4375 0.953125 1.15625q0.4375 -0.71875 1.140625 -1.15625q0.71875 -0.4375 1.65625 -0.4375q1.40625 0 2.125 0.859375q0.71875 0.859375 0.71875 2.328125l0 5.234375l-1.34375 0l0 -5.03125q0 -1.125 -0.46875 -1.640625q-0.46875 -0.515625 -1.375 -0.515625q-0.609375 0 -1.109375 0.359375q-0.5 0.34375 -0.78125 0.9375q-0.265625 0.59375 -0.265625 1.28125l0 4.609375l-1.359375 0l0 -5.015625q0 -1.140625 -0.46875 -1.65625q-0.46875 -0.515625 -1.359375 -0.515625q-0.609375 0 -1.109375 0.359375q-0.5 0.359375 -0.78125 0.96875q-0.265625 0.59375 -0.265625 1.28125l0 4.578125l-1.359375 0l0 -8.15625zm16.529724 8.40625q-0.890625 0 -1.59375 -0.34375q-0.703125 -0.359375 -1.09375 -0.96875q-0.375 -0.625 -0.375 -1.40625q0 -1.296875 0.96875 -2.015625q0.984375 -0.734375 2.46875 -0.734375q0.734375 0 1.359375 0.171875q0.640625 0.15625 0.96875 0.359375l0 -0.5q0 -0.90625 -0.640625 -1.453125q-0.625 -0.5625 -1.609375 -0.5625q-0.671875 0 -1.265625 0.296875q-0.578125 0.296875 -0.90625 0.828125l-1.03125 -0.765625q0.484375 -0.734375 1.328125 -1.15625q0.859375 -0.421875 1.875 -0.421875q1.671875 0 2.609375 0.875q0.9375 0.875 0.9375 2.375l0 5.171875l-1.296875 0l0 -1.171875l-0.0625 0q-0.34375 0.59375 -1.046875 1.015625q-0.703125 0.40625 -1.59375 0.40625zm0.140625 -1.1875q0.6875 0 1.265625 -0.34375q0.59375 -0.359375 0.9375 -0.953125q0.359375 -0.59375 0.359375 -1.296875q-0.375 -0.265625 -0.9375 -0.421875q-0.5625 -0.15625 -1.1875 -0.15625q-1.109375 0 -1.6875 0.46875q-0.5625 0.453125 -0.5625 1.1875q0 0.671875 0.5 1.09375q0.515625 0.421875 1.3125 0.421875zm5.7616577 -10.515625l1.359375 0l0 11.453125l-1.359375 0l0 -11.453125zm3.3760376 0l1.359375 0l0 11.453125l-1.359375 0l0 -11.453125zm6.9209595 11.703125q-1.171875 0 -2.109375 -0.546875q-0.921875 -0.5625 -1.4375 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.171875 0.484375 -2.171875q0.484375 -1.0 1.390625 -1.59375q0.90625 -0.59375 2.078125 -0.59375q1.203125 0 2.078125 0.546875q0.875 0.53125 1.34375 1.484375q0.484375 0.9375 0.484375 2.15625q0 0.1875 -0.03125 0.40625l-6.46875 0q0.046875 0.9375 0.4375 1.578125q0.40625 0.640625 1.015625 0.96875q0.625 0.3125 1.296875 0.3125q1.59375 0 2.421875 -1.484375l1.140625 0.5625q-0.5 0.984375 -1.421875 1.5625q-0.90625 0.578125 -2.1875 0.578125zm2.34375 -5.1875q-0.03125 -0.515625 -0.28125 -1.03125q-0.25 -0.515625 -0.796875 -0.859375q-0.546875 -0.359375 -1.375 -0.359375q-0.96875 0 -1.640625 0.625q-0.671875 0.609375 -0.875 1.625l4.96875 0zm5.9630127 5.1875q-1.3125 0 -2.203125 -0.609375q-0.875 -0.609375 -1.234375 -1.578125l1.203125 -0.546875q0.3125 0.734375 0.90625 1.140625q0.609375 0.40625 1.328125 0.40625q0.765625 0 1.3125 -0.3125q0.546875 -0.3125 0.546875 -0.890625q0 -0.515625 -0.4375 -0.828125q-0.4375 -0.3125 -1.359375 -0.53125l-1.0 -0.265625q-0.96875 -0.234375 -1.59375 -0.8125q-0.625 -0.578125 -0.625 -1.484375q0 -0.703125 0.421875 -1.234375q0.421875 -0.546875 1.125 -0.828125q0.703125 -0.296875 1.53125 -0.296875q1.0625 0 1.90625 0.46875q0.84375 0.46875 1.1875 1.296875l-1.171875 0.546875q-0.546875 -1.09375 -1.9375 -1.09375q-0.671875 0 -1.1875 0.3125q-0.5 0.3125 -0.5 0.796875q0 0.453125 0.34375 0.734375q0.359375 0.265625 1.0625 0.453125l1.1875 0.296875q1.203125 0.3125 1.8125 0.90625q0.609375 0.59375 0.609375 1.46875q0 0.75 -0.4375 1.3125q-0.4375 0.5625 -1.171875 0.875q-0.734375 0.296875 -1.625 0.296875zm7.769287 -0.125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm1.7153931 -0.125l0 0zm4.7276 -8.15625l1.28125 0l0 1.3125l0.078125 0q0.234375 -0.671875 0.921875 -1.109375q0.6875 -0.453125 1.4375 -0.453125q0.5625 0 0.96875 0.171875l0 1.46875q-0.515625 -0.265625 -1.15625 -0.265625q-0.59375 0 -1.09375 0.34375q-0.5 0.328125 -0.796875 0.90625q-0.28125 0.5625 -0.28125 1.21875l0 4.5625l-1.359375 0l0 -8.15625zm8.953186 8.40625q-1.46875 0 -2.25 -0.859375q-0.78125 -0.859375 -0.78125 -2.421875l0 -5.125l1.359375 0l0 4.921875q0 1.171875 0.53125 1.71875q0.53125 0.546875 1.421875 0.546875q0.6875 0 1.21875 -0.375q0.546875 -0.375 0.84375 -0.953125q0.296875 -0.59375 0.296875 -1.25l0 -4.609375l1.359375 0l0 8.15625l-1.296875 0l0 -1.1875l-0.0625 0q-0.34375 0.609375 -1.078125 1.03125q-0.734375 0.40625 -1.5625 0.40625zm6.022888 -8.40625l1.28125 0l0 1.203125l0.078125 0q0.328125 -0.609375 1.0625 -1.03125q0.734375 -0.4375 1.578125 -0.4375q1.46875 0 2.234375 0.859375q0.78125 0.859375 0.78125 2.328125l0 5.234375l-1.359375 0l0 -5.03125q0 -1.125 -0.546875 -1.640625q-0.546875 -0.515625 -1.484375 -0.515625q-0.65625 0 -1.1875 0.375q-0.515625 0.359375 -0.796875 0.96875q-0.28125 0.59375 -0.28125 1.25l0 4.59375l-1.359375 0l0 -8.15625zm11.700989 8.28125q-0.5 0 -0.921875 -0.15625q-0.421875 -0.15625 -0.703125 -0.4375q-0.640625 -0.609375 -0.640625 -1.671875l0 -4.78125l-1.421875 0l0 -1.234375l1.421875 0l0 -2.3125l1.359375 0l0 2.3125l2.0 0l0 1.234375l-2.0 0l0 4.4375q0 0.671875 0.25 1.0q0.3125 0.34375 0.890625 0.34375q0.484375 0 0.890625 -0.265625l0 1.328125q-0.234375 0.109375 -0.484375 0.15625q-0.25 0.046875 -0.640625 0.046875zm3.6079102 -9.78125q-0.40625 0 -0.703125 -0.28125q-0.28125 -0.296875 -0.28125 -0.703125q0 -0.421875 0.28125 -0.6875q0.296875 -0.28125 0.703125 -0.28125q0.40625 0 0.6875 0.28125q0.28125 0.265625 0.28125 0.6875q0 0.40625 -0.28125 0.703125q-0.28125 0.28125 -0.6875 0.28125zm-0.671875 1.5l1.359375 0l0 8.15625l-1.359375 0l0 -8.15625zm3.4910278 0l1.28125 0l0 1.203125l0.078125 0q0.34375 -0.625 1.046875 -1.046875q0.703125 -0.421875 1.484375 -0.421875q0.90625 0 1.5625 0.4375q0.671875 0.4375 0.953125 1.15625q0.4375 -0.71875 1.140625 -1.15625q0.71875 -0.4375 1.65625 -0.4375q1.40625 0 2.125 0.859375q0.71875 0.859375 0.71875 2.328125l0 5.234375l-1.34375 0l0 -5.03125q0 -1.125 -0.46875 -1.640625q-0.46875 -0.515625 -1.375 -0.515625q-0.609375 0 -1.109375 0.359375q-0.5 0.34375 -0.78125 0.9375q-0.265625 0.59375 -0.265625 1.28125l0 4.609375l-1.359375 0l0 -5.015625q0 -1.140625 -0.46875 -1.65625q-0.46875 -0.515625 -1.359375 -0.515625q-0.609375 0 -1.109375 0.359375q-0.5 0.359375 -0.78125 0.96875q-0.265625 0.59375 -0.265625 1.28125l0 4.578125l-1.359375 0l0 -8.15625zm17.640991 8.40625q-1.171875 0 -2.109375 -0.546875q-0.921875 -0.5625 -1.4375 -1.546875q-0.515625 -0.984375 -0.515625 -2.21875q0 -1.171875 0.484375 -2.171875q0.484375 -1.0 1.390625 -1.59375q0.90625 -0.59375 2.078125 -0.59375q1.203125 0 2.078125 0.546875q0.875 0.53125 1.34375 1.484375q0.484375 0.9375 0.484375 2.15625q0 0.1875 -0.03125 0.40625l-6.46875 0q0.046875 0.9375 0.4375 1.578125q0.40625 0.640625 1.015625 0.96875q0.625 0.3125 1.296875 0.3125q1.59375 0 2.421875 -1.484375l1.140625 0.5625q-0.5 0.984375 -1.421875 1.5625q-0.90625 0.578125 -2.1875 0.578125zm2.34375 -5.1875q-0.03125 -0.515625 -0.28125 -1.03125q-0.25 -0.515625 -0.796875 -0.859375q-0.546875 -0.359375 -1.375 -0.359375q-0.96875 0 -1.640625 0.625q-0.671875 0.609375 -0.875 1.625l4.96875 0z" fill-rule="nonzero"/><path fill="#02589b" d="m375.6601 300.09384l8.637817 0l0 -54.72441l17.275574 0l0 54.72441l8.637787 0l-17.275574 17.275574z" fill-rule="evenodd"/><path fill="#2bb7f6" d="m389.35303 300.09384l8.637787 0l0 -54.72441l17.275604 0l0 54.72441l8.637787 0l-17.275604 17.275574z" fill-rule="evenodd"/><path fill="#02589b" d="m580.9252 300.09384l8.637817 0l0 -54.72441l17.275574 0l0 54.72441l8.637817 0l-17.275574 17.275574z" fill-rule="evenodd"/><path fill="#2bb7f6" d="m594.6181 300.09384l8.637817 0l0 -54.72441l17.275574 0l0 54.72441l8.637817 0l-17.275635 17.275574z" fill-rule="evenodd"/><path fill="#02589b" d="m762.2638 300.109l8.637756 0l0 -51.974l17.275635 0l0 51.974l8.637756 0l-17.275574 17.275604z" fill-rule="evenodd"/><path fill="#2bb7f6" d="m775.95667 300.109l8.637817 0l0 -51.974l17.275574 0l0 51.974l8.637817 0l-17.275574 17.275604z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m155.68706 160.40747l48.24411 0l0 48.24411l-48.24411 0z" fill-rule="evenodd"/><g transform="matrix(0.25127139107611546 0.0 0.0 0.25127139107611546 155.68705643044618 160.40747375328084)"><clipPath id="g6d68e641dc_0_1.6"><path d="m0 0l192.0 0l0 192.0l-192.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g6d68e641dc_0_1.6)" fill="#000" width="192.0" height="192.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAFLUlEQVR42u3dzWtUZxiG8Wj82LiwHxGkkILQiqZzKoIrW9xqcaEIKq2I0JSs3AmCEgkEXAgiZGUM7oILdSVI40okGhEijMFCUj8ISCAkad0ITaPt1akNpU1NZubMmdznmd7Pf/BeP+bjzHnfM01NHo/H4/F4PB6Px1OHoZmtHOIkPVznHo8YY5wJnjHCEAP00clRdrLOpbIO/yEHuchDfqGS+Y1RrnCczS5Xe/o2uinyO+lmnF720OyOadJv5DSPyWImucB2F60m/g76mSPbGeIAK922kvytTFOfeUoHq1y4PEGhbgSUPqD3ubCWAAZJ3FhLMEcXq11ZSUDpQm6bK2sJZvnWlbUE0Mdad9YSPKDFnbUEo7S681IESd0JXrDFnbUE0ybQvwr8RiQmGGODO2sJ7rPGnbUEva6sJmh3ZS3BLG2urCUY9m2b8gQzdSU448ZagjlflqkJBlxYTbDXhbUEY97SpSb4ujEStYYleMyK+Pl3MEUhLMH++AD9pWXEJbgdPf/G+T2e9Sf4vE4En8QGOP33QqISnIsN8M8N5jEJJgPvqeazBYuJSfBFXIDu/ywmIsH5uADFdywnHsHzqPlbFjnbNR2OYFNMgINL7MGJRXAsJsDFJbdBFQIBXI4J8LDMTrRCmLeg0Yj5m5ktuxmwECI/vAm4hZ2tFe3HLATI/+fEO1PGoQq3xBYC5IfD8QBOVrwruZD7/HAqHkBPFRvDk5znh554ANer2puf5Do/XI0HcK/K4xFJjvPDnXgAj6o+oZLkNj8MxwMYS3FIKMlpfhiJBzCe6pxWksv8Ea+FmUh5VC7JYX54Eg/gWerTiknu8kMxHsBIDQdGk5zlh7vxAIZqWG4FBMuaH27FAxioacEzSxMsc37ojwfQV+OSlyBY9vxwNh5AZ82LXoRAkB864gEczWDZ7yCQ5Ifd8QB2ZrLwBQSi/PBRPIB1qR84vCiBLP9UU8RhNKPlzxPI8kf8Evo22JXMApQIhPmhOybA8QwTzAjzw66YAJtpjHkV9hE2qX6Szt/cbIo69DYEQNzH17CnAfL/yntxAZqZDA9woynycCE8wKXYANsb4E2oKzbBkAm0AAca4ptQXAJW8tQEWoKOBrkijkrAqsx+FzVBSoJ9YAItwaAJtABJ5n9NaIIqCbrABEqA1VWfGDBBxgTbyp4cNkGdCdrBBFqCPhNoAdbywARagpaGuS4OS9DKCxNoCbbU/X9gTFCWwK8CMcHH/GgCLcEG7ptAS7CGSyZQI3znHyjUBG0Mm0B90/KM7xfov5gOmECNsDfFQ25MkClBM9/wgwm0CCvYz20TqBk+5Vwmm9vnuCG72ohN8HZb45ec53nK5b/iJu1/Ha+QbQmITjAPsYljXGaUNxUteopbdLPr30frTJDN/bSEw5yih6vcKV2+jZRQnlDkbil5P2fpYPfiDxUwgR7QBCYwgQlMYAITmMAEJjCBCUxgAhOYwAQmMIEJTGACE5jABCYwgQlMYAITmMAEJjCBCUxgAhOYwAQmMIEJTGACE5jABCYwgQlMYAITmMAEJvjfEnS6vZrgiNtrCX5ivdtrCU64vJZg0N21BC9dXUvw2s21BBMuriW45t5agq9cW0nwvUsrCYq87846giIfuLGOwPmlBM4vJXB+KYHzSwmcX0rg/FIC55cSOL+UwPmlBM4vJXB+KYHzSwmcX0rg/FIC55cSOL+UwPmXiaDT+dUER/h54a123+tdXoL1nGCQl7xmgmveaOLxeDwej8fj8XiqnT8AnPz04cgGlTEAAAAASUVORK5CYII="/></g><path fill="#000000" fill-opacity="0.0" d="m498.46494 160.40675l48.24411 0l0 48.244812l-48.24411 0z" fill-rule="evenodd"/><g transform="matrix(0.25127139107611546 0.0 0.0 0.2512750656167979 498.4649322834646 160.406756167979)"><clipPath id="g6d68e641dc_0_1.7"><path d="m2.2737368E-13 1.1368684E-13l192.0 0l0 192.0l-192.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g6d68e641dc_0_1.7)" fill="#000" width="192.0" height="192.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAGVElEQVR42u3de5BOdRzH8be1uZWdcklTVFMUqRRdDOlitpVmtDKSHU2NS0wTuhmbLkOktKnJoFKRbkINLcWIUq0uRptGyBQiJXJr07ru7unsZEfYZ/dcfufZ5/fs5/Wd8ec+j+/nec5zzu98zzkgIiIiIiIiIiIiIiIiIiIiIiIiIiJiQhqZtFUb4i+VjoziSw7jsJfOakj8tGQIuRS4jT9aB+iuxkStMVlM49djGn+0irhTLYpKA3JYSUmM1pdVCUPVqmjUYEUlzS+rUWpWNDp6DMBhghuXROBdzxFMp6baZV4zCj1HMJfaaph5Iz0H4PAJp6hhptWNuQtaXi13953EsN4+AnBYzZlqmWl5viLYyHlqmVltKfYVwVYuUdPMmuorAIfdtFfTTGrC3z4j+Id0tc2k4T4DcDhID7XNnFr87DuCIvqqceZk+g6gdK30ATXOnI8DROAwRo0zpbW7UQkSwUStlZoyKVAADm+RquaZ0IBdASPIpY7aZ8LggAE4LKW+2hdeKqsDR7CChmpgeOmBA3BYy1lqYHi5ISL4heZqYFjNORgigj+4VC0MKydEAA576KAWhlOfbaEiKCRDTQynf6gAStdKe6qJYaSQHzKCIjdECeGakAGU1jC1MYyZBiIYqzYG14x9BiJ4UWulwT1hIACHd7RWGlQ9X3NzsetD6qqZwWQZCcDhc9LUzGCWGYogn0ZqZhDtKr2MyWv96P6sSwDTDAXgsJkWcXvXadzCeBa637x8998cuti7K3CG77m52LWdyyJ+t6nuIWTZtc7Hz7Q+RC07I8g2FoDDX26DotGKocyr5MOy1s7F8lqsNxhBIV2Nvrsm9GE6vyX3VGt3gwE4HKKXkaOUm3iOVb53EgrdHQsLLTYaQTEDA7+TFK7iEZaGOG+3gZPtC+DigHNzsSvb93s4n0G8z24Drz3axu/AZMMBOIzz+MoNuI1X2Gh0V8DCKz6Dz83FrpfdDUpstenM03zr8xIqb9XHxu/AkAgaMZOTTnidGrRhGIuMLIfHqjdtDCCVNRG0YsH/1kqb0pcZ7uGaE3mtsvOQLCOSZuTRjEwmsi4OjS+rHbYuTMyPY5OirD22BtAi1Nxc4tRGe1dHn02KABbYG0BaXH4ko65sLDbA+vaX2H3HixS+szyAD2w/S9bJ6vYfoKX9JypnWRxAJLfibME9DI/jrfXOjnShIMp6wWwjGnE7r7HpyB9fHMfhj9EWNr+IEab++3W4kWfcH8OSEyYPoj/fU59uTIjrwoGZWs7VZhpwqvtJ3x/zZfbTL7LFuI6MZFk5EweJXlvdrcR1JltR2ej4FMMDGK0Ywrzj7q5uQ+3lI+6ntfnPYuWj49/Q1MDr/DdxsMXCbf3XjOHacs41GFP56Ph2bggxcdA10MRB1ddPTOZWdyMdOS+j40W+LxKq6f5MPcpnFq547nA3y/05J56HQt5Gx2d5PP1cehwxhz3WNX6/u0MynMur5jocb6Pja7jA83GETctp+YwjvWpvk3OFx210QTlPg4l1HJH4tYlX6ZUoVxu87vnzMvbIAEiKe6CWzZIKjiMS9yTiHHczmWA3A/EzOr6Igcxmp3WNP+juFDzm7hwk6CMksq1rqPf6gee5OdHnOGsbHR1PjPqdN7jD/XZbonvSNH4v87mPi+w7ObLE8sYf5iv3yL5TlAsH0TI/Oh6vWsckMpPhGuLJljX+T2bQL5kuW21o5LKF6GufuzM8jDbJeAOPoQnd+GJW8BSdk/lZZNGMjoevDUyhZ/V4/FVGQjV+F+8xqLo9cSkRRscP8CkjuLLCS4+SVlWOjpfwPePpQj2qtfFV0PotTCOL0xHiOzpeQC6DuVBNP9aAOCwc5DGSDroTXPmiHB1fywS66UENlTE/Or6Nt7lLzwbwztToeCELeVCP7vQv7Oh4Mct5kuttvb9UIgh6y9X1vEQPTlMDw/J7y9WdzOZuzlXjzMnyuHCwhIdpVz0XDqKWV+HCwUpyyNAthaNU/qPKNzOV3jRWe+Jh6jH3iJrLvRVOiYpxTSjgEF/wOO0Tda4s2bWy8d5oIiIiIiIiIiIiIiIiIiIiIiIiVctR+SoFoAAUgAJQAApAASgABaAAFIACUAAKQAEoAAWgABSAAlAACsDGAERERERERERERERERERERERExBb/Arh3RgeJOOlVAAAAAElFTkSuQmCC"/></g><path fill="#02589b" d="m306.5433 227.8819l10.519684 0l0 19.685028l-10.519684 0z" fill-rule="evenodd"/><path stroke="#02589b" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m306.5433 227.8819l10.519684 0l0 19.685028l-10.519684 0z" fill-rule="evenodd"/><path fill="#02589b" d="m165.38583 300.09384l8.637787 0l0 -54.72441l17.275589 0l0 54.72441l8.637802 0l-17.275589 17.275574z" fill-rule="evenodd"/><path fill="#2bb7f6" d="m179.07874 300.09384l8.637802 0l0 -54.72441l17.275589 0l0 54.72441l8.637802 0l-17.275604 17.275574z" fill-rule="evenodd"/><path fill="#02589b" d="m174.66405 243.4252l610.01575 0l0 8.535431l-610.01575 0z" fill-rule="evenodd"/><path stroke="#02589b" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m174.66405 243.4252l610.01575 0l0 8.535431l-610.01575 0z" fill-rule="evenodd"/><path fill="#2bb7f6" d="m652.6221 227.8819l10.519653 0l0 22.015747l-10.519653 0z" fill-rule="evenodd"/><path stroke="#2bb7f6" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m652.6221 227.8819l10.519653 0l0 22.015747l-10.519653 0z" fill-rule="evenodd"/><path fill="#2bb7f6" d="m188.39629 248.6693l611.5275 0l0 8.535416l-611.5275 0z" fill-rule="evenodd"/><path stroke="#2bb7f6" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m188.39629 248.6693l611.5275 0l0 8.535416l-611.5275 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m153.9029 446.72867l485.3543 0l0 35.24411l-485.3543 0z" fill-rule="evenodd"/><path fill="#000000" d="m155.43414 460.2893l4.515625 0q2.09375 0 3.640625 0.84375q1.546875 0.84375 2.375 2.359375q0.84375 1.5 0.84375 3.484375q0 1.96875 -0.84375 3.484375q-0.828125 1.515625 -2.375 2.359375q-1.546875 0.828125 -3.640625 0.828125l-4.515625 0l0 -13.359375zm4.40625 10.96875q2.15625 0 3.296875 -1.140625q1.140625 -1.15625 1.140625 -3.140625q0 -2.0 -1.140625 -3.140625q-1.140625 -1.15625 -3.296875 -1.15625l-1.890625 0l0 8.578125l1.890625 0zm11.940186 2.6875q-1.515625 0 -2.484375 -0.875q-0.96875 -0.890625 -0.96875 -2.328125q0 -0.953125 0.5 -1.671875q0.5 -0.734375 1.375 -1.125q0.890625 -0.390625 1.953125 -0.390625q1.46875 0 2.515625 0.421875l0 -0.40625q0 -0.78125 -0.59375 -1.265625q-0.578125 -0.484375 -1.578125 -0.484375q-0.671875 0 -1.296875 0.3125q-0.625 0.296875 -1.03125 0.796875l-1.5625 -1.234375q0.6875 -0.890625 1.734375 -1.375q1.046875 -0.484375 2.265625 -0.484375q2.1875 0 3.328125 1.015625q1.140625 1.0 1.140625 2.9375l0 5.859375l-2.40625 0l0 -0.96875l-0.15625 0q-0.421875 0.5625 -1.125 0.921875q-0.703125 0.34375 -1.609375 0.34375zm0.578125 -1.90625q1.0625 0 1.6875 -0.671875q0.625 -0.6875 0.625 -1.59375q-0.953125 -0.453125 -2.0 -0.453125q-1.90625 0 -1.90625 1.421875q0 0.578125 0.40625 0.9375q0.421875 0.359375 1.1875 0.359375zm19.169281 1.765625q-0.703125 0 -1.296875 -0.21875q-0.59375 -0.21875 -0.96875 -0.59375q-0.875 -0.84375 -0.875 -2.390625l0 -4.375l-1.671875 0l0 -2.09375l1.671875 0l0 -2.6875l2.4375 0l0 2.6875l2.328125 0l0 2.09375l-2.328125 0l0 3.9375q0 0.71875 0.3125 1.046875q0.265625 0.296875 0.90625 0.296875q0.34375 0 0.578125 -0.09375q0.234375 -0.09375 0.609375 -0.328125l0 2.390625q-0.796875 0.328125 -1.703125 0.328125zm-12.203125 -9.671875l2.296875 0l0 1.265625l0.15625 0q0.375 -0.6875 1.140625 -1.109375q0.765625 -0.421875 1.640625 -0.421875q0.625 0 0.890625 0.125l0 2.375q-0.46875 -0.1875 -1.15625 -0.1875q-1.15625 0 -1.84375 0.75q-0.671875 0.75 -0.671875 2.03125l0 4.6875l-2.453125 0l0 -9.515625zm14.670319 9.515625l0 0zm5.89682 -13.359375l2.921875 0l5.375 8.953125l0.15625 0l-0.15625 -2.578125l0 -6.375l2.5 0l0 13.359375l-2.640625 0l-5.671875 -9.453125l-0.15625 0l0.15625 2.5625l0 6.890625l-2.484375 0l0 -13.359375zm16.159729 13.65625q-1.515625 0 -2.484375 -0.875q-0.96875 -0.890625 -0.96875 -2.328125q0 -0.953125 0.5 -1.671875q0.5 -0.734375 1.375 -1.125q0.890625 -0.390625 1.953125 -0.390625q1.46875 0 2.515625 0.421875l0 -0.40625q0 -0.78125 -0.59375 -1.265625q-0.578125 -0.484375 -1.578125 -0.484375q-0.671875 0 -1.296875 0.3125q-0.625 0.296875 -1.03125 0.796875l-1.5625 -1.234375q0.6875 -0.890625 1.734375 -1.375q1.046875 -0.484375 2.265625 -0.484375q2.1875 0 3.328125 1.015625q1.140625 1.0 1.140625 2.9375l0 5.859375l-2.40625 0l0 -0.96875l-0.15625 0q-0.421875 0.5625 -1.125 0.921875q-0.703125 0.34375 -1.609375 0.34375zm0.578125 -1.90625q1.0625 0 1.6875 -0.671875q0.625 -0.6875 0.625 -1.59375q-0.953125 -0.453125 -2.0 -0.453125q-1.90625 0 -1.90625 1.421875q0 0.578125 0.40625 0.9375q0.421875 0.359375 1.1875 0.359375zm10.92012 1.765625q-0.703125 0 -1.296875 -0.21875q-0.59375 -0.21875 -0.96875 -0.59375q-0.875 -0.84375 -0.875 -2.390625l0 -4.375l-1.671875 0l0 -2.09375l1.671875 0l0 -2.6875l2.4375 0l0 2.6875l2.328125 0l0 2.09375l-2.328125 0l0 3.9375q0 0.71875 0.3125 1.046875q0.265625 0.296875 0.90625 0.296875q0.34375 0 0.578125 -0.09375q0.234375 -0.09375 0.609375 -0.328125l0 2.390625q-0.796875 0.328125 -1.703125 0.328125zm5.1416473 -10.71875q-0.65625 0 -1.125 -0.46875q-0.46875 -0.46875 -0.46875 -1.109375q0 -0.65625 0.46875 -1.109375q0.46875 -0.46875 1.125 -0.46875q0.65625 0 1.109375 0.46875q0.453125 0.453125 0.453125 1.109375q0 0.640625 -0.453125 1.109375q-0.453125 0.46875 -1.109375 0.46875zm-1.234375 1.046875l2.4375 0l0 9.515625l-2.4375 0l0 -9.515625zm3.9117126 0l2.78125 0l2.40625 6.1875l0.15625 0l2.4375 -6.1875l2.75 0l-4.078125 9.515625l-2.421875 0l-4.03125 -9.515625zm16.034561 9.8125q-1.421875 0 -2.5625 -0.640625q-1.140625 -0.65625 -1.78125 -1.796875q-0.640625 -1.15625 -0.640625 -2.59375q0 -1.359375 0.625 -2.53125q0.640625 -1.171875 1.75 -1.859375q1.125 -0.6875 2.515625 -0.6875q1.46875 0 2.53125 0.640625q1.0625 0.625 1.609375 1.734375q0.56248474 1.09375 0.56248474 2.4375q0 0.421875 -0.06248474 0.828125l-7.140625 0q0.1875 1.125 0.90625 1.71875q0.71875 0.59375 1.71875 0.59375q0.84375 0 1.453125 -0.359375q0.609375 -0.375 0.953125 -0.984375l1.984375 0.96875q-1.453125 2.53125 -4.421875 2.53125zm2.25 -6.203125q-0.03125 -0.453125 -0.328125 -0.890625q-0.28125 -0.4375 -0.796875 -0.71875q-0.515625 -0.296875 -1.203125 -0.296875q-0.875 0 -1.5 0.515625q-0.625 0.5 -0.90625 1.390625l4.734375 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m153.50919 446.72867l486.14175 0" fill-rule="evenodd"/><path stroke="#02589b" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m153.50919 446.72867l486.14175 0" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m742.3884 443.74442l93.102356 0l0 35.24411l-93.102356 0z" fill-rule="evenodd"/><path fill="#000000" d="m743.9197 457.30505l4.515625 0q2.09375 0 3.640625 0.84375q1.546875 0.84375 2.375 2.359375q0.84375 1.5 0.84375 3.484375q0 1.96875 -0.84375 3.484375q-0.828125 1.515625 -2.375 2.359375q-1.546875 0.828125 -3.640625 0.828125l-4.515625 0l0 -13.359375zm4.40625 10.96875q2.15625 0 3.296875 -1.140625q1.140625 -1.15625 1.140625 -3.140625q0 -2.0 -1.140625 -3.140625q-1.140625 -1.15625 -3.296875 -1.15625l-1.890625 0l0 8.578125l1.890625 0zm11.940186 2.6875q-1.515625 0 -2.484375 -0.875q-0.96875 -0.890625 -0.96875 -2.328125q0 -0.953125 0.5 -1.671875q0.5 -0.734375 1.375 -1.125q0.890625 -0.390625 1.953125 -0.390625q1.46875 0 2.515625 0.421875l0 -0.40625q0 -0.78125 -0.59375 -1.265625q-0.578125 -0.484375 -1.578125 -0.484375q-0.671875 0 -1.296875 0.3125q-0.625 0.296875 -1.03125 0.796875l-1.5625 -1.234375q0.6875 -0.890625 1.734375 -1.375q1.046875 -0.484375 2.265625 -0.484375q2.1875 0 3.328125 1.015625q1.140625 1.0 1.140625 2.9375l0 5.859375l-2.40625 0l0 -0.96875l-0.15625 0q-0.421875 0.5625 -1.125 0.921875q-0.703125 0.34375 -1.609375 0.34375zm0.578125 -1.90625q1.0625 0 1.6875 -0.671875q0.625 -0.6875 0.625 -1.59375q-0.953125 -0.453125 -2.0 -0.453125q-1.90625 0 -1.90625 1.421875q0 0.578125 0.40625 0.9375q0.421875 0.359375 1.1875 0.359375zm19.169312 1.765625q-0.703125 0 -1.296875 -0.21875q-0.59375 -0.21875 -0.96875 -0.59375q-0.875 -0.84375 -0.875 -2.390625l0 -4.375l-1.671875 0l0 -2.09375l1.671875 0l0 -2.6875l2.4375 0l0 2.6875l2.328125 0l0 2.09375l-2.328125 0l0 3.9375q0 0.71875 0.3125 1.046875q0.265625 0.296875 0.90625 0.296875q0.34375 0 0.578125 -0.09375q0.234375 -0.09375 0.609375 -0.328125l0 2.390625q-0.796875 0.328125 -1.703125 0.328125zm-12.203125 -9.671875l2.296875 0l0 1.265625l0.15625 0q0.375 -0.6875 1.140625 -1.109375q0.765625 -0.421875 1.640625 -0.421875q0.625 0 0.890625 0.125l0 2.375q-0.46875 -0.1875 -1.15625 -0.1875q-1.15625 0 -1.84375 0.75q-0.671875 0.75 -0.671875 2.03125l0 4.6875l-2.453125 0l0 -9.515625zm14.670288 9.515625l0 0zm3.9313965 -13.359375l2.796875 0l1.828125 7.5l0.234375 1.40625l0.140625 0l0.296875 -1.40625l2.359375 -7.5l2.484375 0l2.296875 7.5l0.296875 1.359375l0.140625 0l0.21875 -1.359375l1.8125 -7.5l2.796875 0l-3.4375 13.359375l-2.71875 0l-2.265625 -8.0625l-0.296875 -1.4375l-0.15625 0l-0.296875 1.4375l-2.390625 8.0625l-2.59375 0l-3.546875 -13.359375zm22.60022 13.65625q-1.421875 0 -2.5625 -0.640625q-1.140625 -0.65625 -1.78125 -1.796875q-0.640625 -1.15625 -0.640625 -2.59375q0 -1.359375 0.625 -2.53125q0.640625 -1.171875 1.75 -1.859375q1.125 -0.6875 2.515625 -0.6875q1.46875 0 2.53125 0.640625q1.0625 0.625 1.609375 1.734375q0.5625 1.09375 0.5625 2.4375q0 0.421875 -0.0625 0.828125l-7.140625 0q0.1875 1.125 0.90625 1.71875q0.71875 0.59375 1.71875 0.59375q0.84375 0 1.453125 -0.359375q0.609375 -0.375 0.953125 -0.984375l1.984375 0.96875q-1.453125 2.53125 -4.421875 2.53125zm2.25 -6.203125q-0.03125 -0.453125 -0.328125 -0.890625q-0.28125 -0.4375 -0.796875 -0.71875q-0.515625 -0.296875 -1.203125 -0.296875q-0.875 0 -1.5 0.515625q-0.625 0.5 -0.90625 1.390625l4.734375 0zm9.544922 6.203125q-0.984375 0 -1.734375 -0.40625q-0.75 -0.40625 -1.125 -1.03125l-0.15625 0l0 1.140625l-2.296875 0l0 -13.359375l2.453125 0l0 3.65625l-0.15625 1.34375l0.15625 0q0.390625 -0.609375 1.125 -1.03125q0.75 -0.421875 1.734375 -0.421875q1.28125 0 2.328125 0.640625q1.0625 0.640625 1.65625 1.796875q0.59375 1.15625 0.59375 2.625q0 1.46875 -0.59375 2.625q-0.59375 1.140625 -1.65625 1.78125q-1.046875 0.640625 -2.328125 0.640625zm-0.4375 -2.25q0.6875 0 1.28125 -0.359375q0.609375 -0.359375 0.953125 -0.984375q0.359375 -0.640625 0.359375 -1.453125q0 -0.828125 -0.359375 -1.453125q-0.34375 -0.640625 -0.953125 -0.984375q-0.59375 -0.34375 -1.28125 -0.34375q-0.671875 0 -1.265625 0.34375q-0.59375 0.34375 -0.953125 0.984375q-0.359375 0.625 -0.359375 1.453125q0 0.8125 0.359375 1.453125q0.359375 0.625 0.953125 0.984375q0.59375 0.359375 1.265625 0.359375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m742.38715 443.7454l92.12598 0" fill-rule="evenodd"/><path stroke="#02589b" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m742.38715 443.7454l92.12598 0" fill-rule="evenodd"/></g></svg>
\ No newline at end of file
+<svg viewBox="100 70 760 420" fill="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" style="background:#fff">
+ <g clip-path="url(#a)">
+ <path fill="#02589b" d="M652.598 259.606h8.638v-51.974h17.276v51.974h8.638l-17.276 17.276z" fill-rule="evenodd"/>
+ <path fill="#2bb7f6" d="M666.291 259.606h8.638v-51.974h17.276v51.974h8.638l-17.276 17.276z" fill-rule="evenodd"/>
+ <path fill="#02589b" d="M268.192 253.705h8.637v-46.724h17.276v46.724h8.638l-17.276 17.276z" fill-rule="evenodd"/>
+ <path d="M738.543 282.377h72v72h-72z"/>
+ <g transform="translate(738.543 282.377)scale(.375)">
+ <clipPath id="b">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#b)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAEWElEQVR4Xu3dTW4dVRRF4dsKQSQjQEIKdg+JDIMRJAqToYlwJPpGzjwYgqV0gmkxAYis8I8D2PyE6tBZF5+qevvypHLWt/r7leoksYOQ05okSZIkSZIkSZIkSZIkSZIkSXo93W0ftpP2tH3brtqr17yr9mJ6Eyft0fRW9uKwPWm/do9hr9rL6c0c8nWNdbsd+Wu+7Ko9nt7S/+Re+6L7QOs7awd8dSO8177pPsr+u/N2n68v9U77uvsYu77zsb8Lbk1f5/kRVnc28mvBR928zXfE17irt9tv3bjNdzXqj6FPu2lb1glf5S5uTX/f5bAt66Ld4etc74Nu1pb3kK9zvU+6UVveMV/nep93o7a8U77O9b7qRm1553yd6/kfIJIu+TrX83ugrNh33aStKeYBsmIeICvmAbJi33eTtqaYB8iKeYCsmAfIinmArNgP3aStKeYBsmIeICvmAbJiHiAr9mM3aWuKeYCsmAfIinmArJgHyIr91E3ammIeICvmAbJiHiArNneArRn9/NxjsZ+7ycEfsGejn597LOYBatxjMQ9Q4x6LeYAa91jsl25y8Afs2ejn5x6LeYAa91jMA9S4x2IeoMY9FvMANe6x2EU3OfgD9mz083OPxTxAjXss5gFq3GMxD1DjHot5gBr3WOxlNzn4A/Zs9PNzj8U8QI17LOYBatxjMQ9Q4x6LeYAa91hs7scUb83o5+cei3mAGvdYzAPUuMdiHqDGPRbzADXusdjcD23dmtHPzz0W8wA17rGYB6hxj8U8QI17LPZ7Nzn4A/Zs9PNzj8U8QI17LOYBatxjsbkDbL0U91jMA9S4x2KX3eTNKsU9FvMANe6xmAeocY/FPECNeyzmAWrcY7Gb/o93prjHYnMH2JrRz889FvMANe6xmAeocY/FPECNeyz2Rzc5+AP2bPTzc4/FPECNeyzmAWrcYzEPUOMei3mAGvdY7M9ucvAH7Nno5+cei3mAGvdYzAPUuMdiHqDGPRb7q5sc/AF7Nvr5ucdiHqDGPRbzADXusZgHqHGPxTxAjXss9nc3OfgD9mz083OPxTxAjXss5gFq3GMxD1DjHot5gBr3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WGzuf861qku+zvVedKO2vHO+zvWedqO2vFO+zvVOulFb3jFf53qPulFb3gO+zvXuzv7sXLuui/YWX+cunnTDtqzP+Cp3c+i3ojt12d7lq9zV427c5vuYr3F3b7Yvu3mre9be4GtMHEx/peBH2PU9b/f4ClP3PcHinrf3+fpGOGhn3UdZ37Pxv/r/dbsd+R1R2eX0pXfon/29g3Yy+2+LvZ5dTN/3D/vGs3anPWzH7XT6qnDTf5zTfJfTWzid3saDMX/rlSRJkiRJkiRJkiRJkiRJkiRJ2/MPBUHxvBiv7XcAAAAASUVORK5CYII="/>
+ </g>
+ <path d="M148.45 282.377h72v71.998h-72z"/>
+ <g transform="matrix(.375 0 0 .37499 148.45 282.377)">
+ <clipPath id="c">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#c)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAGhUlEQVR4Xu3XW6odVRCA4fVkxOgUNAafJM5G0fFICI7AeBlQ4IDiICQa8hgFT17ikaAHvsaURe3qjb3r+x9Xsaq7cztZa4wxxhhjjDHGGGOMMcYYY4wxxhhjjDH+8t76Yn2/rtbz9XK9Ongvb97yan23Pl/v+hnO46ObT//75jEvod/Wt+u+n2Nfb6+vLuD3/Ju6Xo/WHT/LXu6vnzYPdIn9uO75afbwyfpl8yiX2tP1wM/T7f76dfMYl9zTff8UvD1/+Wz6Yc9/C77arJ9erYd+pi4fXfhPPv/W9frQT9Xj+83q6XXf+Kk6vHeh/+36L71Yd/1cp/fFZu1022d+rtObv4De1A5/CV1tlk63PfFznd7zzdLptmd+rtObH0Hf1LWf6/RcaUfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caBHnq8nzbBHns5V5oUWcrybPs0Wcz1bmhRZxvpo8zxZxPluZF1rE+WryPFvE+WxlXmgR56vJ82wR57OVeaFFnK8mz7NFnM9W5oUWcb6aPM8WcT5bmRdaxPlq8jxbxPlsZV5oEeeryfNsEeezlXmhRZyvJs+zRZzPVuaFFnG+mjzPFnE+W5kXWsT5avI8W8T5bGVeaBHnq8nzbBHns5V5oUWcrybPs0Wcz1bmhRZxvpo8zxZxPluZF1rE+WryPFvE+WxlXmgR56vJ82wR562dCy3ifDV5ni3ivLVzoUWcrybPs0Wct3YutIjz1eR5tojz1s6FFnG+mjzPFnHe2rnQIs5Xk+fZIs5bOxdaxPlq8jxbxHlr50KLOF9NnmeLOG/tXGgR56vtzf3WzoUWcb7a3txv7VxoEeer7c391s6FFnG+2t7cb+1caBHnq+3N/dbOhRZxvtre3G/tXGgR56vtzf3WzoUWcb7a3txv7VxoEeeryfNsEeezlXmhRZyvJs+zRZzPVuaFFnG+mjzPFnE+W5kXWsT5avI8W8T5bGVeaBHnq8nzbBHns5V5oUWcrybPs0Wcz1bmhRZxvpo8zxZxPluZF1rE+WryPFvE+WxlXmjn5vNkizifrcwL7dx8nmwR57OVeaGdm8+TLeJ8tjIvtHPzebJFnM9W5oV2bj5Ptojz2cq80M7N58kWcT5bmRfaufk82SLOZyvzQjs3nydbxPlsZV5oEeeryfNsEeetnQst4nw1eZ4t4ry1c6FFnK8mz7NFnLd2LrSI89XkebaI89bOhRZxvpo8zxZx3tq50CLOV5Pn2SLOWzsXWsT5avI8W8R5a+dCizhfTZ5nizhv7VxoEeeryfNsEeetnQst4nw1eZ4t4ry1c6FFnK8mz7NFnLd2LrSI89XkebaI89bOhRZxvpo8zxZx3tq50CLOV5Pn2SLOWzsXWsT5avI8W8R5a+dCizhfTZ5nizhv7VxoEeeryfNsEeezlXmhRZyvJs+zRZzPVuaFFnG+mjzPFnE+W5kXWsT5avI8W8T5bGVeaBHnq8nzbBHns5V5oUWcrybPs0Wcz1bmhRZxvpo8zxZxPluZF1rE+WryPFvE+WxlXmgR56vJ82wR57OVeaFFnK8mz7NFnM9W5oUWcb6aPM8WcT5bmRdaxPlq8jxbxPlsZV5oEeeryfNsEeezlXmhRZyvJs+zRZzPVuaFFnG+mjzPFnE+W5kXWsT5avI8W8T5bGVeaEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1eblZOt137uU7v+WbpdNszP9fpXW2WTrc98XOd3nebpdNtj/1cp/f5Zul026d+rtN7d/22WTu97sV6x8/V4dvN4ul1X/upety/+WHL1dOr9cf6wE/V5dFm+fRqfeln6nNn/bhZf+ldrbf8TJ3uraebR7jkfl7v+4m6PZhfgn/6eX3s59nDvfXD5lEusav9f/f/7c56eOE/Ef1x80/vrn/3b324vrn5D4gPdgm9uPm5f7cfPN/s7vrs5pfhyXp2AX8erm/e8sl6vD7d53+9Y4wxxhhjjDHGGGOMMcYYY4wxxhhjjP+/PwFFmy8hR66dpgAAAABJRU5ErkJggg=="/>
+ </g>
+ <path d="M531.971 282.377h72v72h-72z"/>
+ <g transform="translate(531.971 282.377)scale(.375)">
+ <clipPath id="d">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#d)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAESUlEQVR4Xu2dzWqdVRRANwjSltaZE3EgpK3D4hv4EFLaB/EBFBy0dG7hlj6D7+AgmFnEF6gTTRN/m7TNrVqvA5G9jrbfuffbH8hZa80Oh/2FtcnNTTK4ESIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiMiZX4nas4iBOYh0vB3cdx5sSq7i1qbII1+NhPG2+DH0ZZ/EgrjLXvFyMe/GiebD+4zruxgVmm4tr8U3zQG09jD2mm4MP4nHzKP13j+IG8+3KNfN3eTTvd8ElX3y6PZzzZ8G9Zry+3jvMuC3Xfeezleu5XoYeNqN1mium3Ia3/LVra0/jMnP2c7sZq9O9yZz9rJqhOt37zNnPQTNUp7vPnP2cNEN1ukfM2Y9/cN7Fc+bshyPp6LAH3RkOpKPDHnRnOJCODnvQneFAOjrskf2D1/vhSDo67JF1AeWwR9YFlMMe2d95vR+OpKPDHlkXUA57ZF1AOeyRdQHlsEf2N17vhyPp6LBH1gWUwx5ZF1AOe2Rf8Ho/HElHhz2yLqAc9si6gHLYI7vm9X44ko4Oe2RdQDnskXUB5bBH1gWUwx5Z/ylfDntkXUA57JF1AeWwR/Y5r/fDkXR02CPrAsphj6wLKIc9ss94vR+OpKPDHlkXUA57ZF1AOeyRdQHlsEf2Ka/3w5F0dNgj6wLKYY+sCyiHPbJnvN4PR9LRYY+sCyiHPbIuoBz2yJ7yej8cSUeHPbIuoBz2yLqActgj6wLKYY/sE17vhyPp6LBH1gWUwx5ZF1AOe2R/5fV+OJKODntkXUA57JF1AeWwR/YXXu+HI+nosEfWBZTDHlkXUA57ZF1AOeyR/ZnX++FIOjrskXUB5bBH1gWUwx7Zn3i9H46ko8MeWRdQDntkXUA57JH9kdf74Ug6OuyRdQHlsEfWBZTDHlkXUA57ZH/g9X44ko4Oe2RdQDnskXUB5bBH9oTX++FIOjrskXUB5bBH1gWUwx7ZY17vhyPp6LBH1gWUwx5ZF1AOe2RdQDnskX3M6/1wJB0d9si6gHLYI+sCymGP7AwfZciRdHTYI+sCymGPrAsohz2y3/N6PxxJR4c9si6gHPbIuoBy2CM7wwL8QOddfMSc/Rw3Q3W6h8zZz0EzVKf7BXP2s2qG6nQ/Yc5+bjVDdbofMmc/V+KsGavT/C7eYM5teNAM1ml+xpTbcdW3olv5JN5mym252wzX1/sxM27Pxfi6Ga+v9st5Xv//Zi+Omkfof/so3mHCXbnhCib7bbzPfHOwt/nFmo/S1q/iXaabiwtxx3dEr/R5fBpvMtu87MUqTpsH619vOz+P95irhstxM+7H/uanwnnzZYzm+abC/qbGR3GJmabBgbqszYEua3Ogy9oc6LI2B7qszYEua3Ogy9oc6LI2B7qszYEua3Ogy9oc6LI2B7qszYEua3Ogy9oc6LKKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiMj/nj8BJ/L3xz/yZd4AAAAASUVORK5CYII="/>
+ </g>
+ <path d="M148.451 348.612h72v35.244h-72z"/>
+ <path fill="#000" d="m155.041 375.532 5.078-13.36h1.782l5.078 13.36h-1.735l-3.672-9.984-.53-1.438h-.063l-.532 1.438-3.671 9.984zm5.781-3.672v-1.5h3.079l.546 1.5zm-3.625 0 .547-1.5h3.078v1.5zm11.563 3.672v-13.36h4.5q1.125 0 2.062.516.953.5 1.516 1.391.578.875.578 2.047 0 .719-.266 1.422-.265.687-.812 1.265-.547.579-1.406.922-.844.344-2.016.344h-3.328v-1.469h3.578q.703 0 1.297-.312.594-.328.969-.875.375-.563.375-1.297 0-.594-.313-1.156-.312-.563-.875-.922-.547-.36-1.328-.36h-2.953v11.844zm3.218-6.125 1.735-.094 4.219 6.141v.078h-1.86zm7.714 6.125v-13.36h2.281l4.266 10.954h.063l4.265-10.953h2.281v13.36h-1.562v-8.485l.078-2.547h-.078l-4.36 11.031h-1.312l-4.36-11.031h-.077l.078 2.547v8.484zm19.532.297q-.75 0-1.594-.312-.844-.313-1.531-1.016-.688-.703-1.016-1.86l1.437-.593q.313 1.078 1.016 1.672.719.593 1.688.593.718 0 1.328-.296.61-.313.968-.844.36-.547.36-1.235 0-.671-.375-1.203-.36-.53-.985-.843-.609-.313-1.359-.313h-1.094v-1.469h.985q.672 0 1.218-.265.547-.266.86-.75.328-.485.328-1.14 0-.907-.688-1.438-.671-.532-1.64-.532-.719 0-1.188.282-.453.265-.734.671-.266.391-.39.782l-1.47-.61q.188-.562.657-1.172t1.234-1.03q.781-.438 1.89-.438 1.126 0 2.016.453t1.407 1.25q.515.781.515 1.781 0 .719-.265 1.266-.25.53-.657.906-.39.375-.843.594v.078q.61.234 1.093.687.5.438.797 1.047.297.594.297 1.375 0 1.14-.578 2.031t-1.547 1.391-2.14.5m5.95-.297v-1.578q.046-.062.437-.453l.969-.969q.578-.594 1.218-1.234.641-.656 1.188-1.219.547-.578.86-.922.577-.64.937-1.094.36-.453.515-.89.172-.453.172-1.031 0-.532-.281-1.016-.281-.5-.812-.813-.532-.328-1.329-.328-.75 0-1.265.328-.5.313-.781.75-.282.438-.375.782l-1.438-.578q.11-.391.39-.86.298-.484.766-.922.485-.437 1.157-.718.687-.297 1.578-.297 1.218 0 2.109.515.906.516 1.39 1.344.5.828.5 1.797 0 .844-.327 1.61-.313.75-.782 1.359-.453.61-.937 1.078l-.688.687q-.422.422-.906.922l-.953.953q-.469.47-.813.828-.343.344-.468.454h6.03v1.515z"/>
+ <path d="M531.971 348.612h72v35.244h-72z"/>
+ <path fill="#000" d="m538.175 375.532 3.797-5.469h.172l2.703-4.046h1.86l-3.72 5.25h-.124l-2.844 4.265zm.063-9.515h1.797l2.953 4.234h.062l3.719 5.281h-1.844l-2.844-4.219h-.125zm13.93 9.812q-1.235 0-2.22-.5-.984-.5-1.547-1.36-.546-.874-.546-1.937 0-.765.28-1.375.282-.61.766-1.062.485-.47 1.079-.735v-.078q-.72-.437-1.22-1.156-.484-.734-.484-1.578 0-1.016.485-1.813.5-.812 1.375-1.28.89-.485 2.031-.485 1.125 0 1.984.484.875.469 1.375 1.281.5.797.5 1.813 0 .562-.234 1.078-.219.516-.61.937-.374.422-.843.72v.077q.875.422 1.5 1.235.625.797.625 1.937 0 1.063-.563 1.938-.562.86-1.546 1.36-.97.5-2.188.5m0-1.516q.733 0 1.343-.296.61-.297.969-.829.359-.546.359-1.25 0-.718-.36-1.234-.359-.531-.968-.828-.61-.297-1.344-.297-.75 0-1.375.297-.61.297-.984.828-.36.516-.36 1.234 0 .704.36 1.25.375.532.984.829.625.296 1.375.296m0-6.203q.64 0 1.14-.265.515-.266.812-.72.297-.468.297-1.108 0-.97-.672-1.5-.656-.532-1.578-.532-.953 0-1.625.532-.656.53-.656 1.5 0 .64.297 1.109.297.453.812.719.531.265 1.172.265m10.326 7.72q-.985 0-1.797-.376-.797-.375-1.375-.969-.578-.593-.89-1.36-.298-.765-.298-1.562 0-1.125.485-2.109.5-1 1.14-1.969.547-.828 1.11-1.672.562-.843 1.109-1.671.562-.829 1.11-1.672l1.28.875-.812 1.125q-.39.562-.797 1.14l-.812 1.125q-.407.547-.797 1.11l.047.03q.312-.202.703-.312.406-.125.937-.125.72 0 1.422.297.719.297 1.297.86.594.562.938 1.312t.343 1.656q0 1.11-.593 2.094-.594.985-1.579 1.578-.968.594-2.171.594m0-1.517q.765 0 1.39-.359.625-.36 1-.984.375-.625.375-1.39 0-.767-.39-1.376-.375-.625-1-.984-.625-.36-1.375-.36t-1.391.36q-.625.36-1.016.984-.375.61-.375 1.375 0 .766.375 1.39.375.626 1 .985.64.36 1.407.36m5.188 5.25v-1.312h8.875v1.312zm14.083-3.734q-.984 0-1.796-.375-.797-.375-1.375-.969-.579-.593-.891-1.36-.297-.765-.297-1.562 0-1.125.484-2.109.5-1 1.141-1.969.547-.828 1.11-1.672.562-.843 1.109-1.671.562-.829 1.11-1.672l1.28.875-.812 1.125q-.39.562-.797 1.14l-.812 1.125q-.407.547-.797 1.11l.047.03q.312-.202.703-.312.406-.125.937-.125.719 0 1.422.297.719.297 1.297.86.594.562.937 1.312t.344 1.656q0 1.11-.594 2.094-.593.985-1.578 1.578-.968.594-2.172.594m0-1.516q.766 0 1.391-.359.625-.36 1-.984.375-.625.375-1.39 0-.767-.39-1.376-.376-.625-1-.984-.626-.36-1.376-.36t-1.39.36q-.625.36-1.016.984-.375.61-.375 1.375 0 .766.375 1.39.375.626 1 .985.64.36 1.406.36m6.033-1.53v-1.188l5.968-8.828h1.72v12.765h-1.579V365.08h-.062l-4.172 6.219h7.453v1.484z"/>
+ <path d="M723.22 348.612h102.646v35.244H723.22z"/>
+ <path fill="#000" d="M734.965 375.83q-1.453 0-2.562-.798-1.094-.812-1.563-2.297l1.5-.625q.36 1.25 1.063 1.735.703.468 1.562.468 1.125 0 1.766-.765.656-.781.656-2.016v-9.36h1.594v9.235q0 1.422-.516 2.406-.515.985-1.421 1.5-.907.516-2.079.516m9.498 0q-1.063 0-1.875-.407-.797-.406-1.25-1.125-.454-.719-.454-1.64 0-1.048.532-1.766.547-.72 1.453-1.079.922-.359 2.015-.359.641 0 1.172.11.547.093.938.234.406.14.625.265v-.578q0-1.078-.766-1.703-.765-.64-1.875-.64-.781 0-1.469.343-.671.344-1.062.953l-1.203-.89q.375-.563.937-.969t1.282-.625q.718-.234 1.515-.234 1.938 0 3.031 1.03 1.11 1.017 1.11 2.75v6.032h-1.5v-1.36h-.078q-.25.407-.703.798-.438.375-1.047.61-.61.25-1.328.25m.14-1.392q.828 0 1.5-.406.688-.422 1.094-1.11.422-.687.422-1.515-.438-.297-1.078-.484-.64-.188-1.407-.188-1.359 0-2 .563-.64.562-.64 1.375 0 .781.594 1.281.609.484 1.515.484m9.33 1.094-3.844-9.515h1.703l2.953 7.656h.031l2.985-7.656h1.656l-3.875 9.515zm9.652.297q-1.062 0-1.875-.406-.797-.406-1.25-1.125t-.453-1.64q0-1.048.531-1.766.547-.72 1.453-1.079.922-.359 2.016-.359.64 0 1.172.11.547.093.937.234.407.14.625.265v-.578q0-1.078-.765-1.703-.766-.64-1.875-.64-.782 0-1.469.343-.672.344-1.063.953l-1.203-.89q.375-.563.938-.969t1.281-.625q.719-.234 1.516-.234 1.937 0 3.031 1.03 1.11 1.017 1.11 2.75v6.032h-1.5v-1.36h-.079q-.25.407-.703.798-.437.375-1.047.61-.61.25-1.328.25m.14-1.39q.829 0 1.5-.407.688-.422 1.094-1.11.422-.687.422-1.515-.437-.297-1.078-.484-.64-.188-1.406-.188-1.36 0-2 .563t-.64 1.375q0 .781.593 1.281.61.484 1.516.484m10.767 1.39q-.97 0-1.922-.406-.953-.406-1.688-1.203-.719-.813-1.047-2.016l1.516-.61q.312 1.157 1.14 1.938.844.781 2.047.781.735 0 1.36-.265.625-.266 1-.781.39-.532.39-1.282 0-.672-.328-1.14-.312-.47-.968-.828-.657-.36-1.61-.704l-.844-.296q-.546-.204-1.125-.485-.562-.297-1.046-.719-.47-.421-.75-1-.282-.593-.282-1.39 0-.969.516-1.766.531-.812 1.437-1.297.922-.484 2.11-.484 1.25 0 2.094.453.859.453 1.343 1.078.5.625.672 1.156l-1.469.641q-.109-.406-.437-.812-.313-.422-.844-.704-.531-.296-1.328-.296-.656 0-1.234.265-.563.25-.907.719-.343.453-.343 1.047 0 .844.672 1.328.671.484 1.812.875l.875.297q.594.203 1.219.5t1.156.765q.547.47.875 1.157.344.672.344 1.625 0 1.03-.406 1.765-.391.735-1.047 1.203-.657.47-1.438.672-.765.22-1.515.22m10.75 0q-1.406 0-2.5-.656-1.078-.672-1.703-1.813-.61-1.156-.61-2.578 0-1.469.61-2.594.625-1.14 1.703-1.796 1.094-.672 2.5-.672 1.61 0 2.64.734 1.032.734 1.47 1.89l-1.438.61q-.36-.89-1.063-1.344-.687-.453-1.687-.453-.828 0-1.547.453-.719.438-1.172 1.25t-.453 1.922q0 1.078.453 1.906.453.813 1.172 1.266.719.438 1.547.438 1.015 0 1.734-.47.735-.468 1.094-1.312l1.406.594q-.469 1.094-1.515 1.86-1.032.765-2.641.765m5.78-.297v-9.515h1.516v1.53h.078q.188-.546.625-.937.438-.406 1-.64.578-.235 1.125-.235.438 0 .672.047.25.047.453.14v1.72q-.297-.157-.64-.22-.344-.077-.704-.077-.687 0-1.265.39t-.922 1.047-.344 1.438v5.312zm7.153 0v-9.515h1.578v9.515zm.781-11.265q-.469 0-.812-.329-.329-.343-.329-.812 0-.484.329-.813.343-.328.812-.328.484 0 .813.328.328.329.328.813 0 .469-.328.812-.329.329-.813.329m3.279 15.296v-13.546h1.515v1.421h.079q.25-.453.718-.843.485-.39 1.125-.625.641-.25 1.391-.25 1.312 0 2.328.656 1.031.656 1.625 1.797.61 1.125.61 2.61 0 1.468-.61 2.609-.594 1.14-1.625 1.796-1.016.641-2.328.641-1.125 0-1.984-.516-.86-.53-1.25-1.187h-.079l.079 1.312v4.125zm4.672-5.171q.812 0 1.531-.438.719-.437 1.156-1.25.438-.828.438-1.922 0-1.125-.438-1.937-.437-.813-1.156-1.25t-1.531-.438q-.828 0-1.547.438-.719.437-1.172 1.25-.438.812-.438 1.937 0 1.11.438 1.922.453.813 1.172 1.25t1.547.438m5.53-8.375h5.577v1.437h-5.578zm1.671 7.015v-9.703h1.578v9.313q0 .75.313 1.156.312.406 1.015.406.313 0 .579-.094.265-.093.468-.218v1.546q-.25.11-.547.172-.28.078-.765.078-1.188 0-1.922-.703-.719-.703-.719-1.953"/>
+ <path fill="#02589b" d="M133.705 99.6h346.078v86.71H133.705z" fill-rule="evenodd"/>
+ <path fill="#fff" d="M216.22 130.875v-13.36h4.266q2.11 0 3.625.86 1.531.843 2.36 2.36.827 1.5.827 3.468 0 1.953-.828 3.469-.828 1.5-2.359 2.359-1.516.844-3.625.844zm2.047-1.938h2.172q1.5 0 2.578-.562 1.094-.578 1.64-1.64.563-1.063.563-2.532 0-1.485-.562-2.547-.547-1.063-1.64-1.625-1.079-.578-2.579-.578h-2.172zm15.106 2.235q-1.39 0-2.5-.641-1.094-.656-1.719-1.797-.625-1.14-.625-2.594 0-1.359.594-2.515t1.672-1.86 2.468-.703q1.485 0 2.516.64 1.031.626 1.563 1.735.546 1.094.546 2.469 0 .219-.015.39 0 .157-.016.25h-8.187v-1.515h6.234q-.031-.344-.203-.75-.156-.406-.484-.734-.313-.344-.797-.547-.485-.219-1.14-.219-.813 0-1.454.422-.625.422-.984 1.172-.36.734-.36 1.718 0 1.094.406 1.829.422.718 1.094 1.093.672.36 1.453.36.953 0 1.594-.438.64-.437 1.016-1.078l1.656.797q-.61 1.125-1.672 1.828-1.062.688-2.656.688m9.087-.297-3.937-9.516h2.25l2.656 6.922h.094l2.734-6.922h2.203l-3.984 9.516zm11.36.297q-1.39 0-2.5-.641-1.094-.656-1.719-1.797-.625-1.14-.625-2.594 0-1.359.594-2.515t1.672-1.86 2.468-.703q1.485 0 2.516.64 1.031.626 1.563 1.735.546 1.094.546 2.469 0 .219-.015.39 0 .157-.016.25h-8.187v-1.515h6.234q-.031-.344-.203-.75-.156-.406-.484-.734-.313-.344-.797-.547-.485-.219-1.14-.219-.813 0-1.454.422-.625.422-.984 1.172-.36.734-.36 1.718 0 1.094.406 1.829.422.718 1.094 1.093.672.36 1.453.36.953 0 1.594-.438.64-.437 1.016-1.078l1.656.797q-.61 1.125-1.672 1.828-1.062.688-2.656.688m6.4-.297v-13.36h2.015v13.36zm8.777.297q-1.484 0-2.609-.672-1.11-.672-1.75-1.813-.625-1.156-.625-2.562 0-1.422.625-2.563.64-1.156 1.75-1.828 1.125-.672 2.61-.672 1.452 0 2.562.688 1.125.672 1.75 1.812.64 1.14.64 2.563 0 1.406-.64 2.562-.625 1.14-1.75 1.813-1.11.672-2.563.672m0-1.844q.782 0 1.453-.375.672-.39 1.094-1.11.422-.718.422-1.718 0-1.016-.422-1.735-.422-.718-1.094-1.093-.671-.391-1.453-.391-.78 0-1.468.39-.688.376-1.11 1.094-.406.72-.406 1.735 0 1 .406 1.718.422.72 1.11 1.11.703.375 1.468.375m6.694 5.578v-13.547h1.89v1.281h.11q.266-.406.703-.765.438-.36 1.031-.578.594-.235 1.329-.235 1.296 0 2.328.656 1.03.657 1.625 1.797.609 1.125.609 2.61 0 1.468-.61 2.61-.593 1.14-1.624 1.796-1.032.64-2.328.64-1.094 0-1.891-.484t-1.172-1.078h-.11l.11 1.328v3.969zm4.75-5.578q.75 0 1.406-.39.672-.391 1.063-1.11.406-.735.406-1.703 0-1-.406-1.719-.39-.719-1.063-1.11-.656-.39-1.406-.39-.734 0-1.39.39-.657.391-1.063 1.11t-.406 1.719q0 .984.406 1.703t1.062 1.11 1.391.39m6.627 1.547v-9.516h1.907v1.313h.109q.281-.47.719-.829.453-.359 1.015-.562.578-.219 1.203-.219 1.063 0 1.797.5.75.5 1.078 1.266.454-.735 1.25-1.25.813-.516 1.97-.516 1.687 0 2.5 1.016.827 1.015.827 2.703v6.094h-2v-5.766q0-1.156-.5-1.672-.484-.531-1.375-.531-.687 0-1.218.39-.516.376-.813 1.032-.281.656-.281 1.453v5.094h-1.985v-5.766q0-1.14-.515-1.672-.5-.531-1.406-.531-.657 0-1.172.39-.516.391-.813 1.047-.281.657-.281 1.454v5.078zm20.985.297q-1.39 0-2.5-.641-1.093-.656-1.718-1.797-.625-1.14-.625-2.594 0-1.359.593-2.515.594-1.157 1.672-1.86t2.469-.703q1.484 0 2.516.64 1.03.626 1.562 1.735.547 1.094.547 2.469 0 .219-.016.39 0 .157-.015.25h-8.188v-1.515h6.235q-.032-.344-.203-.75-.157-.406-.485-.734-.312-.344-.797-.547-.484-.219-1.14-.219-.813 0-1.453.422-.625.422-.985 1.172-.36.734-.36 1.718 0 1.094.407 1.829.422.718 1.094 1.093.672.36 1.453.36.953 0 1.594-.438.64-.437 1.015-1.078l1.657.797q-.61 1.125-1.672 1.828-1.063.688-2.657.688m6.384-.297v-9.516h1.906v1.313h.11q.406-.704 1.218-1.157.813-.453 1.782-.453 1.765 0 2.64 1.031.875 1.032.875 2.782v6h-2v-5.75q0-1.157-.578-1.688t-1.516-.531q-.718 0-1.265.406-.531.406-.844 1.063-.312.64-.312 1.39v5.11zm9.698-9.516h6.015v1.75h-6.015zm1.672 6.75v-9.437h2.015v9.015q0 .703.281 1.078.297.375.985.375.328 0 .594-.093.265-.11.515-.266v1.969q-.312.125-.672.203-.343.078-.828.078-1.328 0-2.11-.781-.78-.782-.78-2.14m9.97-6.75h6.015v1.75h-6.016zm1.671 6.75v-9.437h2.016v9.015q0 .703.281 1.078.297.375.984.375.328 0 .594-.093.266-.11.516-.266v1.969q-.313.125-.672.203-.344.078-.828.078-1.328 0-2.11-.781-.78-.782-.78-2.14m10.39 3.063q-1.484 0-2.61-.672-1.109-.672-1.75-1.813-.624-1.156-.624-2.562 0-1.422.625-2.563.64-1.156 1.75-1.828 1.125-.672 2.61-.672 1.452 0 2.562.688 1.125.672 1.75 1.812.64 1.14.64 2.563 0 1.406-.64 2.562-.625 1.14-1.75 1.813-1.11.672-2.563.672m0-1.844q.781 0 1.453-.375.672-.39 1.094-1.11.422-.718.422-1.718 0-1.016-.422-1.735-.422-.718-1.094-1.093-.672-.391-1.453-.391t-1.469.39q-.687.376-1.109 1.094-.406.72-.406 1.735 0 1 .406 1.718.422.72 1.11 1.11.702.375 1.468.375m11.287 1.844q-1.484 0-2.61-.672-1.109-.672-1.75-1.813-.624-1.156-.624-2.562 0-1.422.625-2.563.64-1.156 1.75-1.828 1.125-.672 2.61-.672 1.452 0 2.562.688 1.125.672 1.75 1.812.64 1.14.64 2.563 0 1.406-.64 2.562-.625 1.14-1.75 1.813-1.11.672-2.563.672m0-1.844q.781 0 1.453-.375.672-.39 1.094-1.11.422-.718.422-1.718 0-1.016-.422-1.735-.422-.718-1.094-1.093-.672-.391-1.453-.391t-1.469.39q-.687.376-1.109 1.094-.406.72-.406 1.735 0 1 .406 1.718.422.72 1.11 1.11.703.375 1.468.375m6.725 1.547v-13.36h2.016v13.36zm8.7.297q-1.437 0-2.547-.641-1.109-.656-1.734-1.797-.625-1.156-.625-2.61 0-1.468.625-2.593.625-1.14 1.734-1.797 1.11-.672 2.547-.672 1.578 0 2.672.719 1.094.703 1.563 1.906l-1.828.75q-.329-.765-.954-1.14-.625-.391-1.484-.391-.797 0-1.453.406-.64.406-1.031 1.11-.391.703-.391 1.703 0 .968.39 1.703.391.719 1.032 1.11.656.39 1.453.39.906 0 1.531-.406.64-.422 1-1.157l1.797.782q-.531 1.14-1.625 1.89-1.094.735-2.672.735m6.023-.297v-13.36h2.015v3.657l-.109 1.5h.11q.39-.704 1.203-1.157.812-.453 1.796-.453 1.204 0 1.985.485.797.484 1.187 1.343.391.844.391 1.985v6h-1.984v-5.75q0-.766-.297-1.25-.282-.485-.75-.719-.469-.25-1.047-.25-.735 0-1.297.422-.547.406-.875 1.062-.313.657-.313 1.407v5.078zm13.767.297q-1.015 0-1.812-.407t-1.25-1.125-.453-1.656q0-1.031.531-1.734t1.422-1.078 1.984-.375q.594 0 1.094.093.516.078.89.188.391.11.626.234v-.5q0-.937-.672-1.484-.672-.563-1.735-.563-.734 0-1.39.328-.64.313-1.047.875l-1.375-1.062q.406-.578 1-.984t1.328-.625q.734-.235 1.531-.235 2.078 0 3.188 1.016 1.125 1.015 1.125 2.844v5.953h-1.953v-1.172h-.11q-.25.375-.672.719-.421.328-1 .53-.562.22-1.25.22m.36-1.641q.781 0 1.39-.375.61-.375.938-.969.344-.61.344-1.328-.422-.234-1.016-.39-.578-.172-1.234-.172-1.219 0-1.75.5-.516.484-.516 1.203 0 .672.5 1.11.5.421 1.344.421m6.999 1.344v-9.516h2.015v9.516zm1-10.907q-.563 0-.97-.406-.39-.406-.39-.969 0-.578.39-.953.407-.39.97-.39.578 0 .968.39.391.375.391.953 0 .563-.39.97-.391.405-.97.405m3.507 10.907v-9.516h1.907v1.313h.11q.405-.704 1.218-1.157t1.781-.453q1.766 0 2.64 1.031.876 1.032.876 2.782v6h-2v-5.75q0-1.157-.578-1.688-.579-.531-1.516-.531-.719 0-1.266.406-.53.406-.843 1.063-.313.64-.313 1.39v5.11z"/>
+ <path fill="#eee" d="M215.986 150.315v-11.453h6.625v1.296h-5.266v10.157zm.719-4.953v-1.282h5.39v1.282zm9.785 5.203q-.906 0-1.594-.344-.687-.36-1.078-.969-.39-.625-.39-1.406 0-.89.453-1.5.468-.625 1.25-.938.797-.312 1.734-.312.547 0 1 .094.469.078.813.203t.515.234v-.5q0-.922-.656-1.469-.64-.546-1.594-.546-.672 0-1.265.296-.579.297-.907.829l-1.03-.766q.327-.484.796-.828.484-.36 1.094-.547.625-.203 1.312-.203 1.672 0 2.61.89.937.875.937 2.36v5.172h-1.297v-1.172h-.062q-.203.36-.594.687-.375.328-.906.532-.516.203-1.14.203m.14-1.188q.704 0 1.282-.344.578-.359.922-.953.36-.593.36-1.297-.36-.265-.923-.421-.547-.157-1.203-.157-1.156 0-1.703.485-.547.468-.547 1.172 0 .671.5 1.093.516.422 1.313.422m8.526 1.188q-.922 0-1.625-.297-.687-.297-1.14-.797-.454-.5-.672-1.094l1.203-.547q.328.735.937 1.141.61.406 1.39.406.75 0 1.25-.297.517-.312.517-.906 0-.375-.22-.625-.202-.25-.609-.422-.39-.172-.968-.312l-1-.266q-.563-.156-1.078-.437-.516-.297-.829-.75-.312-.454-.312-1.11 0-.734.422-1.265.437-.532 1.14-.813.704-.281 1.516-.281.703 0 1.313.203.625.203 1.078.594.468.39.703.968l-1.172.547q-.313-.609-.828-.843-.5-.25-1.125-.25-.672 0-1.172.296-.5.297-.5.813t.406.766 1 .421l1.188.297q1.203.313 1.812.907.61.593.61 1.468 0 .766-.438 1.328-.437.547-1.172.86-.734.297-1.625.297m4.082-8.407h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .641.265 1 .265.344.875.344.265 0 .484-.078.235-.078.406-.188v1.329q-.203.093-.453.14-.25.063-.672.063-1.015 0-1.64-.594-.625-.61-.625-1.672m8.817 2.14v-8.156h1.36v8.157zm.672-9.656q-.406 0-.703-.28-.281-.298-.281-.704 0-.422.281-.687.297-.282.703-.282.407 0 .688.282.281.265.281.687 0 .406-.281.703-.281.281-.688.281m2.82 9.657v-8.157h1.28v1.204h.079q.312-.594 1.031-1.032.734-.437 1.61-.437 1.5 0 2.25.875.765.875.765 2.312v5.235h-1.36v-5.032q0-1.171-.577-1.656-.563-.5-1.454-.5-.671 0-1.187.375t-.797.969-.281 1.25v4.594zm12.663.25q-1.203 0-2.14-.563t-1.47-1.547q-.515-.984-.515-2.218 0-1.25.516-2.22.53-.984 1.468-1.546.938-.578 2.14-.578 1.376 0 2.267.64.89.625 1.25 1.625l-1.235.516q-.297-.766-.906-1.156-.594-.39-1.438-.39-.718 0-1.343.39-.61.375-1 1.078-.375.687-.375 1.64 0 .922.375 1.626.39.703 1 1.093.625.391 1.343.391.86 0 1.485-.406t.937-1.14l1.203.515q-.39.937-1.296 1.593-.891.657-2.266.657m4.968-.25v-8.157h1.282v1.313h.078q.156-.469.531-.813t.86-.546.968-.204q.375 0 .578.047t.39.125v1.47q-.265-.126-.562-.188-.296-.079-.593-.079-.594 0-1.094.344-.5.328-.797.89-.281.563-.281 1.235v4.563zm9.145.25q-1.187 0-2.109-.547-.922-.563-1.437-1.531-.516-.985-.516-2.235 0-1.172.484-2.156.485-1 1.375-1.594.891-.61 2.094-.61 1.219 0 2.078.548.875.531 1.344 1.484.484.938.484 2.156 0 .11-.015.22 0 .108-.016.187h-7.031v-1.11h5.61q-.016-.344-.157-.734-.125-.39-.422-.735-.297-.343-.75-.562t-1.125-.219q-.797 0-1.39.406-.579.407-.891 1.125-.313.704-.313 1.594 0 1.031.391 1.735.406.687 1.031 1.03.64.329 1.328.329.891 0 1.47-.422.593-.437.952-1.062l1.14.562q-.468.938-1.374 1.547-.89.594-2.235.594m5.383-.25v-8.157h1.282v1.204h.078q.219-.407.61-.735.39-.328.89-.531.515-.203 1.031-.203.922 0 1.578.453.656.437.938 1.14.422-.687 1.125-1.14t1.672-.453q1.468 0 2.156.89.687.875.687 2.297v5.235h-1.343v-5.032q0-1.171-.485-1.656-.484-.5-1.36-.5-.624 0-1.124.36-.485.359-.766.953-.265.578-.265 1.265v4.61h-1.36v-5.016q0-1.172-.484-1.672-.485-.5-1.344-.5-.625 0-1.125.375-.484.36-.766.953-.265.594-.265 1.282v4.578zm17.626.25q-1.188 0-2.11-.547-.922-.563-1.437-1.531-.516-.985-.516-2.235 0-1.172.484-2.156.485-1 1.375-1.594.891-.61 2.094-.61 1.219 0 2.078.548.875.531 1.344 1.484.484.938.484 2.156 0 .11-.015.22 0 .108-.016.187h-7.031v-1.11h5.61q-.016-.344-.157-.734-.125-.39-.422-.735-.297-.343-.75-.562t-1.125-.219q-.797 0-1.39.406-.579.407-.891 1.125-.313.704-.313 1.594 0 1.031.391 1.735.406.687 1.031 1.03.64.329 1.328.329.891 0 1.47-.422.593-.437.952-1.062l1.14.562q-.468.938-1.374 1.547-.89.594-2.234.594m5.383-.25v-8.157h1.28v1.204h.079q.312-.594 1.031-1.032.735-.437 1.61-.437 1.5 0 2.25.875.765.875.765 2.312v5.235h-1.36v-5.032q0-1.171-.577-1.656-.563-.5-1.453-.5-.672 0-1.188.375t-.797.969-.281 1.25v4.594zm8.013-8.157h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .641.265 1 .266.344.875.344.266 0 .484-.078.235-.078.407-.188v1.329q-.204.093-.454.14-.25.063-.671.063-1.016 0-1.641-.594-.625-.61-.625-1.672m7.414 2.39q-.906 0-1.593-.343-.688-.36-1.079-.969-.39-.625-.39-1.406 0-.89.453-1.5.469-.625 1.25-.938.797-.312 1.734-.312.547 0 1 .094.469.078.813.203t.515.234v-.5q0-.922-.656-1.469-.64-.546-1.594-.546-.671 0-1.265.296-.578.297-.906.829l-1.032-.766q.328-.484.797-.828.485-.36 1.094-.547.625-.203 1.312-.203 1.672 0 2.61.89.937.875.937 2.36v5.172h-1.297v-1.172h-.062q-.203.36-.594.687-.375.328-.906.532-.516.203-1.14.203m.14-1.187q.704 0 1.282-.344.578-.359.922-.953.36-.593.36-1.297-.36-.265-.922-.421-.547-.157-1.204-.157-1.156 0-1.703.485-.547.468-.547 1.172 0 .671.5 1.093.516.422 1.313.422m5.763.938v-11.453h1.359v11.453zm10.775.25q-1.203 0-2.14-.563t-1.47-1.547q-.515-.984-.515-2.218 0-1.25.516-2.22.53-.984 1.468-1.546.938-.578 2.141-.578 1.375 0 2.266.64.89.625 1.25 1.625l-1.235.516q-.297-.766-.906-1.156-.594-.39-1.437-.39-.72 0-1.344.39-.61.375-1 1.078-.375.687-.375 1.64 0 .922.375 1.626.39.703 1 1.093.625.391 1.344.391.859 0 1.484-.406t.937-1.14l1.204.515q-.391.937-1.297 1.593-.89.657-2.266.657m8.719 0q-1.235 0-2.188-.563-.937-.578-1.469-1.562-.53-.985-.53-2.203 0-1.22.53-2.204.532-.984 1.47-1.562.952-.578 2.187-.578t2.171.594q.954.578 1.485 1.562t.531 2.188q0 1.218-.531 2.203t-1.485 1.562q-.937.563-2.171.563m0-1.219q.734 0 1.375-.375.656-.375 1.046-1.063.407-.703.407-1.671 0-.985-.407-1.672-.39-.703-1.046-1.063-.641-.375-1.375-.375-.735 0-1.391.375-.656.36-1.063 1.063-.39.687-.39 1.672 0 .968.39 1.671.407.688 1.063 1.063t1.39.375m5.626.969v-8.157h1.28v1.204h.079q.219-.407.61-.735.39-.328.89-.531.516-.203 1.031-.203.922 0 1.578.453.657.437.938 1.14.422-.687 1.125-1.14t1.672-.453q1.468 0 2.156.89.687.875.687 2.297v5.235h-1.343v-5.032q0-1.171-.485-1.656-.484-.5-1.359-.5-.625 0-1.125.36-.484.359-.766.953-.265.578-.265 1.265v4.61h-1.36V145.3q0-1.172-.484-1.672t-1.344-.5q-.625 0-1.125.375-.484.36-.765.953-.266.594-.266 1.282v4.578zm14 3.453v-11.61h1.28v1.22h.079q.219-.391.625-.72.406-.343.953-.546.547-.22 1.203-.22 1.11 0 1.985.563.89.563 1.406 1.547.516.969.516 2.235 0 1.265-.516 2.25-.516.968-1.406 1.53-.875.548-1.985.548-.984 0-1.718-.438-.735-.453-1.063-1.015h-.078l.078 1.125v3.53zm4-4.422q.703 0 1.312-.375.61-.39.985-1.094.39-.703.39-1.64 0-.97-.39-1.657-.375-.703-.985-1.078t-1.312-.375q-.72 0-1.328.375-.61.375-1 1.078-.391.688-.391 1.657 0 .953.39 1.656.391.687 1 1.078.61.375 1.329.375m5.677.969v-8.157h1.359v8.157zm.672-9.657q-.407 0-.704-.28-.28-.298-.28-.704 0-.422.28-.687.297-.282.704-.282t.687.282q.281.265.281.687 0 .406-.281.703-.281.281-.687.281m2.819 9.657v-11.453h1.359v11.453zm5.89.25q-.907 0-1.594-.344-.688-.36-1.078-.969-.391-.625-.391-1.406 0-.89.453-1.5.469-.625 1.25-.938.797-.312 1.734-.312.547 0 1 .094.47.078.813.203.344.125.516.234v-.5q0-.922-.657-1.469-.64-.546-1.593-.546-.672 0-1.266.296-.578.297-.906.829l-1.032-.766q.329-.484.797-.828.485-.36 1.094-.547.625-.203 1.313-.203 1.671 0 2.609.89.937.875.937 2.36v5.172h-1.296v-1.172h-.063q-.203.36-.594.687-.375.328-.906.532-.516.203-1.14.203m.14-1.188q.703 0 1.281-.344.578-.359.922-.953.36-.593.36-1.297-.36-.265-.922-.421-.547-.157-1.203-.157-1.157 0-1.704.485-.546.468-.546 1.172 0 .671.5 1.093.515.422 1.312.422m5.04-7.219h4.78v1.235h-4.78zm1.421 6.016v-8.328h1.36v7.984q0 .641.265 1 .266.344.875.344.266 0 .484-.078.235-.078.407-.188v1.329q-.203.093-.453.14-.25.063-.672.063-1.016 0-1.64-.594-.626-.61-.626-1.672m5.186 2.14v-8.156h1.36v8.157zm.672-9.656q-.407 0-.704-.28-.28-.298-.28-.704 0-.422.28-.687.297-.282.704-.282t.687.282q.281.265.281.687 0 .406-.28.703-.282.281-.688.281m6.489 9.907q-1.235 0-2.188-.563-.937-.578-1.469-1.562-.53-.985-.53-2.203 0-1.22.53-2.204.532-.984 1.47-1.562.952-.578 2.187-.578t2.172.594q.953.578 1.484 1.562t.531 2.188q0 1.218-.531 2.203t-1.484 1.562q-.938.563-2.172.563m0-1.219q.734 0 1.375-.375.656-.375 1.047-1.063.406-.703.406-1.671 0-.985-.406-1.672-.391-.703-1.047-1.063-.64-.375-1.375-.375t-1.39.375q-.657.36-1.063 1.063-.391.687-.391 1.672 0 .968.39 1.671.407.688 1.063 1.063t1.39.375m5.626.969v-8.157h1.281v1.204H415q.313-.594 1.031-1.032.735-.437 1.61-.437 1.5 0 2.25.875.765.875.765 2.312v5.235h-1.359v-5.032q0-1.171-.578-1.656-.563-.5-1.453-.5-.672 0-1.188.375t-.797.969q-.28.594-.28 1.25v4.594zM219.19 169.565q-.845 0-1.657-.344-.813-.36-1.438-1.047t-.906-1.703l1.297-.531q.266.984.984 1.656.72.672 1.75.672.641 0 1.172-.219.531-.234.86-.687t.328-1.094q0-.563-.282-.969-.28-.406-.843-.719-.547-.312-1.36-.593l-.734-.25q-.469-.188-.969-.422-.484-.25-.89-.61-.407-.359-.657-.859-.234-.516-.234-1.203 0-.828.453-1.516.453-.687 1.234-1.11.782-.421 1.813-.421 1.062 0 1.781.406.735.39 1.156.922.438.531.579.984l-1.266.547q-.094-.343-.375-.703-.266-.36-.719-.61t-1.14-.25q-.563 0-1.063.235-.484.219-.781.61-.297.39-.297.906 0 .719.578 1.14.578.407 1.563.75l.75.25q.515.172 1.046.438.532.25 1 .656.47.39.75.985.282.578.282 1.39 0 .89-.344 1.531-.344.625-.906 1.032-.547.39-1.219.562-.656.188-1.297.188m4.56-8.407h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .641.265 1 .265.344.875.344.265 0 .484-.078.235-.078.406-.188v1.329q-.203.093-.453.14-.25.063-.672.063-1.015 0-1.64-.594-.625-.61-.625-1.672m7.414 2.39q-.906 0-1.594-.343-.687-.36-1.078-.969-.39-.625-.39-1.406 0-.89.453-1.5.469-.625 1.25-.938.797-.312 1.734-.312.547 0 1 .094.469.078.813.203t.515.234v-.5q0-.922-.656-1.469-.64-.546-1.594-.546-.672 0-1.265.296-.578.297-.907.829l-1.03-.766q.327-.484.796-.828.484-.36 1.094-.547.625-.203 1.312-.203 1.672 0 2.61.89.937.875.937 2.36v5.172h-1.297v-1.172h-.062q-.203.36-.594.687-.375.328-.906.532-.516.203-1.14.203m.14-1.187q.704 0 1.282-.344.578-.359.922-.953.36-.593.36-1.297-.36-.265-.923-.421-.546-.157-1.203-.157-1.156 0-1.703.485-.547.468-.547 1.172 0 .671.5 1.093.516.422 1.313.422m5.04-7.219h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .641.265 1 .265.344.875.344.265 0 .484-.078.235-.078.406-.188v1.329q-.203.093-.453.14-.25.063-.672.063-1.015 0-1.64-.594-.625-.61-.625-1.672m8.253 2.39q-1.187 0-2.109-.546-.922-.563-1.437-1.531-.516-.985-.516-2.235 0-1.172.484-2.156.485-1 1.375-1.594.89-.61 2.094-.61 1.219 0 2.078.548.875.531 1.344 1.484.484.938.484 2.156 0 .11-.015.22 0 .108-.016.187h-7.031v-1.11h5.61q-.016-.344-.157-.734-.125-.39-.422-.735-.297-.343-.75-.562t-1.125-.219q-.797 0-1.39.406-.579.407-.891 1.125-.313.704-.313 1.594 0 1.031.39 1.735.407.687 1.032 1.03.64.329 1.328.329.89 0 1.469-.422.594-.437.953-1.062l1.14.562q-.468.938-1.374 1.547-.89.594-2.235.594m4.66-7.171v-1.235h4.954v1.235zm1.5 6.922v-9.047q0-.797.345-1.36.359-.562.953-.859.61-.312 1.312-.312.469 0 .735.062.265.047.468.125v1.328q-.218-.078-.484-.156-.266-.094-.672-.094-.5 0-.906.36-.39.359-.39 1.062v8.89zm7.92.25q-1.5 0-2.265-.875t-.766-2.407v-5.125h1.36v4.922q0 1.22.562 1.75.563.516 1.39.516.72 0 1.25-.375.532-.39.813-.969.297-.594.297-1.234v-4.61h1.36v8.157h-1.297v-1.188h-.063q-.203.39-.625.719-.406.328-.922.516-.515.203-1.093.203m6.023-.25v-11.453h1.36v11.453zm7.088 0v-11.453h1.36v3.375l-.078 1.125h.078q.312-.61 1.031-1.032.734-.437 1.625-.437 1.031 0 1.703.422t1 1.14q.344.703.344 1.625v5.235h-1.36v-5.032q0-.78-.28-1.25-.282-.468-.735-.687t-1-.219q-.672 0-1.203.39-.531.376-.828.985-.297.61-.297 1.266v4.547zm12.774.25q-1.234 0-2.187-.563-.938-.578-1.469-1.562t-.531-2.203q0-1.22.531-2.204t1.469-1.562q.953-.578 2.187-.578 1.235 0 2.172.594.953.578 1.485 1.562.531.984.531 2.188 0 1.218-.531 2.203-.532.984-1.485 1.562-.937.563-2.172.563m0-1.219q.735 0 1.375-.375.657-.375 1.047-1.063.407-.703.407-1.671 0-.985-.407-1.672-.39-.703-1.047-1.063-.64-.375-1.375-.375-.734 0-1.39.375-.656.36-1.063 1.063-.39.687-.39 1.672 0 .968.39 1.671.407.688 1.063 1.063t1.39.375m4.984-7.188h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .641.265 1 .265.344.875.344.265 0 .484-.078.235-.078.406-.188v1.329q-.203.093-.453.14-.25.063-.672.063-1.015 0-1.64-.594-.625-.61-.625-1.672m8.692 2.14v-8.156h1.282v1.313h.078q.156-.469.531-.813t.86-.546.968-.204q.375 0 .578.047t.391.125v1.47q-.266-.126-.563-.188-.296-.079-.593-.079-.594 0-1.094.344-.5.328-.797.89-.281.563-.281 1.235v4.563zm9.146.25q-1.188 0-2.11-.546-.922-.563-1.437-1.531-.516-.985-.516-2.235 0-1.172.484-2.156.485-1 1.375-1.594.891-.61 2.094-.61 1.219 0 2.078.548.875.531 1.344 1.484.484.938.484 2.156 0 .11-.015.22 0 .108-.016.187h-7.031v-1.11h5.61q-.016-.344-.157-.734-.125-.39-.422-.735-.297-.343-.75-.562t-1.125-.219q-.797 0-1.39.406-.579.407-.891 1.125-.313.704-.313 1.594 0 1.031.391 1.735.406.687 1.031 1.03.64.329 1.328.329.891 0 1.47-.422.593-.437.952-1.062l1.14.562q-.468.938-1.374 1.547-.89.594-2.234.594m5.383-.25v-11.452h1.359v11.453zm7.046.25q-1.235 0-2.188-.562-.937-.578-1.469-1.562-.531-.985-.531-2.203 0-1.22.531-2.204.532-.984 1.469-1.562.953-.578 2.188-.578 1.234 0 2.171.594.954.578 1.485 1.562t.531 2.188q0 1.218-.531 2.203t-1.485 1.562q-.937.563-2.171.563m0-1.218q.734 0 1.375-.375.656-.375 1.046-1.063.407-.703.407-1.671 0-.985-.407-1.672-.39-.703-1.046-1.063-.641-.375-1.375-.375-.735 0-1.391.375-.656.36-1.063 1.063-.39.687-.39 1.672 0 .968.39 1.671.407.688 1.063 1.063t1.39.375m8.38 1.219q-.907 0-1.594-.344-.688-.36-1.079-.969-.39-.625-.39-1.406 0-.89.453-1.5.469-.625 1.25-.938.797-.312 1.734-.312.547 0 1 .094.47.078.813.203.344.125.515.234v-.5q0-.922-.656-1.469-.64-.546-1.594-.546-.671 0-1.265.296-.578.297-.906.829l-1.032-.766q.328-.484.797-.828.485-.36 1.094-.547.625-.203 1.312-.203 1.672 0 2.61.89.937.875.937 2.36v5.172h-1.297v-1.172h-.062q-.203.36-.594.687-.375.328-.906.532-.516.203-1.14.203m.14-1.188q.703 0 1.281-.344.578-.359.922-.953.36-.593.36-1.297-.36-.265-.922-.421-.547-.157-1.204-.157-1.156 0-1.703.485-.547.468-.547 1.172 0 .671.5 1.093.516.422 1.313.422m9.15 1.188q-1.109 0-2-.547-.89-.563-1.406-1.531-.5-.985-.5-2.25t.5-2.235q.516-.984 1.406-1.547.891-.562 2-.562.657 0 1.188.219.547.203.953.546.422.329.64.72h.063l-.062-1.141v-3.375h1.359v11.453h-1.297v-1.203h-.062q-.22.375-.641.718-.406.328-.953.532-.531.203-1.188.203m.141-1.219q.703 0 1.312-.375.625-.39 1-1.078.391-.703.391-1.656 0-.97-.39-1.657-.376-.703-1-1.078-.61-.375-1.313-.375t-1.328.375q-.61.375-1 1.078-.375.688-.375 1.657 0 .937.375 1.64.39.703 1 1.094.625.375 1.328.375"/>
+ <path fill="#2bb7f6" d="M479.785 99.601h346.079v86.583h-346.08z" fill-rule="evenodd"/>
+ <path fill="#000" d="M562.316 130.812v-13.359h4.703q1.281 0 2.313.531 1.03.532 1.625 1.485.609.953.609 2.203t-.61 2.219q-.593.953-1.624 1.484t-2.313.531h-3.312v-2.39h3.39q.64 0 1.094-.25.453-.266.672-.688t.219-.906-.22-.89q-.218-.423-.671-.673-.453-.265-1.094-.265h-2.265v10.968zm11.037 0v-9.515h2.296v1.265h.157q.234-.437.64-.78.407-.36.938-.563.547-.203 1.156-.203.375 0 .672.062.297.047.531.14v2.454q-.39-.156-.781-.25-.375-.11-.813-.11-.718 0-1.25.375-.53.36-.812.985-.281.625-.281 1.406v4.734zm11.968.297q-1.5 0-2.656-.656-1.14-.672-1.781-1.812-.64-1.157-.64-2.579 0-1.437.64-2.578.64-1.156 1.781-1.812 1.156-.672 2.656-.672 1.485 0 2.625.672t1.782 1.812q.64 1.14.64 2.578 0 1.422-.64 2.579-.641 1.14-1.782 1.812-1.14.656-2.625.656m0-2.281q.703 0 1.282-.312.593-.329.953-.954.375-.625.375-1.5 0-.89-.375-1.5-.36-.609-.953-.937-.579-.344-1.266-.344-.703 0-1.313.344-.609.328-.984.937-.36.61-.36 1.5 0 .875.36 1.5.375.625.984.954.61.312 1.297.312m11.005 2.281q-1.312 0-2.36-.64-1.03-.641-1.64-1.782-.61-1.14-.61-2.625 0-1.5.61-2.64t1.64-1.781q1.048-.641 2.36-.641.688 0 1.25.203t.969.547q.406.328.64.703h.141l-.14-1.344v-3.656h2.421v13.36h-2.28v-1.141h-.141q-.235.375-.641.703t-.969.531q-.562.203-1.25.203m.406-2.25q.688 0 1.282-.36.593-.358.953-.983t.36-1.454q0-.843-.36-1.468t-.953-.97-1.282-.343q-.671 0-1.265.344-.578.344-.953.969-.36.609-.36 1.468 0 .829.36 1.47.375.624.953.984.594.343 1.265.343m10.71 2.25q-1.75 0-2.625-1.078t-.875-2.953v-5.781h2.438v5.484q0 .969.468 1.531.485.547 1.235.547.718 0 1.218-.36.516-.374.782-.983.265-.625.265-1.375v-4.844h2.453v9.515h-2.296v-1.187h-.157q-.281.437-.734.781-.438.328-.984.516-.547.187-1.188.187m12.129 0q-1.454 0-2.594-.64-1.125-.641-1.766-1.782-.64-1.156-.64-2.625 0-1.484.64-2.609.64-1.14 1.766-1.797 1.14-.656 2.594-.656 1.578 0 2.718.672 1.141.672 1.641 1.937l-2.234.938q-.297-.656-.844-.953-.531-.313-1.281-.313-.735 0-1.313.344t-.922.969q-.328.609-.328 1.468 0 .844.328 1.47.344.624.922.984.578.343 1.313.343.828 0 1.359-.36.547-.374.875-1.015l2.187.985q-.562 1.187-1.703 1.922-1.14.718-2.718.718m5.44-9.812h6.438v2.094h-6.438zm1.672 6.469v-9.157h2.437v8.719q0 .656.282 1t.937.344q.375 0 .625-.11.25-.125.563-.312v2.39q-.39.157-.813.235-.422.094-.89.094-1.47 0-2.313-.844-.828-.86-.828-2.36m7.048 3.046v-9.515h2.437v9.515zm1.234-10.562q-.656 0-1.125-.469t-.469-1.11q0-.655.47-1.109.468-.468 1.124-.468t1.11.468q.453.454.453 1.11 0 .64-.453 1.11-.454.468-1.11.468m8.21 10.86q-1.5 0-2.657-.657-1.14-.672-1.781-1.812-.64-1.157-.64-2.579 0-1.437.64-2.578.64-1.156 1.781-1.812 1.156-.672 2.656-.672 1.485 0 2.625.672t1.782 1.812q.64 1.14.64 2.578 0 1.422-.64 2.579-.641 1.14-1.782 1.812-1.14.656-2.625.656m0-2.282q.702 0 1.28-.312.594-.329.954-.954.375-.625.375-1.5 0-.89-.375-1.5-.36-.609-.953-.937-.579-.344-1.266-.344-.703 0-1.313.344-.609.328-.984.937-.36.61-.36 1.5 0 .875.36 1.5.375.625.984.954.61.312 1.297.312m6.724 1.984v-9.515h2.297v1.187h.156q.422-.687 1.203-1.078.797-.406 1.703-.406 1.75 0 2.625 1.062.89 1.063.89 2.844v5.906h-2.452v-5.609q0-.937-.485-1.422-.469-.5-1.281-.5-.672 0-1.172.36-.5.359-.766.968-.265.61-.265 1.36v4.843zm14.868-9.515h6.438v2.094h-6.438zm1.672 6.469v-9.157h2.438v8.719q0 .656.281 1t.938.344q.375 0 .625-.11.25-.125.562-.312v2.39q-.39.157-.812.235-.422.094-.891.094-1.469 0-2.313-.844-.828-.86-.828-2.36m11.025 3.343q-1.5 0-2.656-.656-1.14-.672-1.781-1.812-.641-1.157-.641-2.579 0-1.437.64-2.578.641-1.156 1.782-1.812 1.156-.672 2.656-.672 1.485 0 2.625.672t1.781 1.812.641 2.578q0 1.422-.64 2.579-.641 1.14-1.782 1.812-1.14.656-2.625.656m0-2.281q.703 0 1.281-.312.594-.329.954-.954.375-.625.375-1.5 0-.89-.375-1.5-.36-.609-.954-.937-.578-.344-1.265-.344-.703 0-1.313.344-.61.328-.984.937-.36.61-.36 1.5 0 .875.36 1.5.375.625.984.954.61.312 1.297.312m11.474 2.281q-1.5 0-2.657-.656-1.14-.672-1.78-1.812-.641-1.157-.641-2.579 0-1.437.64-2.578.64-1.156 1.781-1.812 1.157-.672 2.657-.672 1.484 0 2.625.672 1.14.672 1.781 1.812.64 1.14.64 2.578 0 1.422-.64 2.579-.64 1.14-1.781 1.812-1.14.656-2.625.656m0-2.281q.703 0 1.281-.312.594-.329.953-.954.375-.625.375-1.5 0-.89-.375-1.5-.36-.609-.953-.937-.578-.344-1.266-.344-.703 0-1.312.344-.61.328-.985.937-.359.61-.359 1.5 0 .875.36 1.5.374.625.984.954.61.312 1.297.312m6.849 1.984V117.45h2.437v13.36zm9.229.297q-1.453 0-2.594-.64-1.125-.641-1.766-1.782-.64-1.156-.64-2.625 0-1.484.64-2.609.641-1.14 1.766-1.797 1.14-.656 2.594-.656 1.578 0 2.719.672t1.64 1.937l-2.234.938q-.297-.656-.844-.953-.531-.313-1.281-.313-.735 0-1.313.344t-.922.969q-.328.609-.328 1.468 0 .844.328 1.47.344.624.922.984.578.343 1.313.343.828 0 1.36-.36.546-.374.874-1.015l2.188.985q-.563 1.187-1.703 1.922-1.141.718-2.72.718m6.205-.297V117.45h2.454v3.375l-.157 1.656h.157q.406-.64 1.171-1.062.782-.422 1.72-.422 1.171 0 1.968.484.812.469 1.203 1.344.406.875.406 2.078v5.906h-2.437V125.2q0-.64-.235-1.062t-.64-.641q-.39-.219-.938-.219-.656 0-1.156.36-.5.359-.781.984-.281.61-.281 1.36v4.827zm14.06.297q-1.016 0-1.797-.39-.765-.407-1.219-1.125-.437-.735-.437-1.688 0-1 .5-1.703.516-.703 1.39-1.094.876-.39 1.938-.39.578 0 1.047.062.469.063.844.156.375.094.625.204v-.407q0-.765-.578-1.25-.579-.5-1.594-.5-.672 0-1.297.313-.625.297-1.031.797l-1.563-1.235q.469-.593 1.078-1.015t1.36-.625q.75-.22 1.562-.22 2.188 0 3.328 1.017 1.14 1 1.14 2.937v5.86h-2.405v-.97h-.157q-.265.329-.656.626-.39.28-.922.453-.515.187-1.156.187m.578-1.906q.735 0 1.25-.312.516-.329.781-.844.282-.531.282-1.11-.422-.203-.938-.328-.515-.125-1.062-.125-1.078 0-1.5.422-.407.406-.407 1 0 .563.407.938.406.359 1.187.359m7.123 1.61v-9.516h2.437v9.515zm1.234-10.563q-.656 0-1.125-.469t-.469-1.11q0-.655.469-1.109.469-.468 1.125-.468t1.11.468q.453.454.453 1.11 0 .64-.454 1.11-.453.468-1.109.468m3.74 10.562v-9.515h2.297v1.187h.156q.422-.687 1.203-1.078.797-.406 1.703-.406 1.75 0 2.625 1.062.89 1.063.89 2.844v5.906h-2.452V125.2q0-.937-.485-1.422-.468-.5-1.28-.5-.673 0-1.173.36-.5.359-.765.968-.266.61-.266 1.36v4.843z"/>
+ <path fill="#222" d="M562.066 150.252V138.8h6.625v1.297h-5.266v10.156zm.719-4.953v-1.281h5.39v1.281zm9.785 5.203q-.906 0-1.594-.343-.687-.36-1.078-.97-.39-.624-.39-1.405 0-.891.453-1.5.469-.625 1.25-.938.797-.312 1.734-.312.547 0 1 .093.469.079.813.204t.515.234v-.5q0-.922-.656-1.469-.64-.547-1.594-.547-.672 0-1.265.297-.578.297-.907.828l-1.03-.765q.327-.485.796-.828.484-.36 1.094-.547.625-.203 1.312-.203 1.672 0 2.61.89.937.875.937 2.36v5.171h-1.297v-1.171h-.062q-.203.359-.594.687-.375.328-.906.531-.516.203-1.14.203m.14-1.187q.704 0 1.282-.344.578-.36.922-.953.36-.594.36-1.297-.36-.265-.923-.422-.546-.156-1.203-.156-1.156 0-1.703.484-.547.47-.547 1.172 0 .672.5 1.094.516.422 1.313.422m8.526 1.187q-.922 0-1.625-.296-.687-.297-1.14-.797-.454-.5-.672-1.094l1.203-.547q.328.734.937 1.14.61.407 1.391.407.75 0 1.25-.297.516-.312.516-.906 0-.375-.22-.625-.202-.25-.609-.422-.39-.172-.968-.313l-1-.265q-.563-.156-1.078-.438-.516-.297-.829-.75t-.312-1.11q0-.733.422-1.265.437-.531 1.14-.812.704-.281 1.516-.281.703 0 1.313.203.625.203 1.078.593.468.391.703.97l-1.172.546q-.313-.61-.828-.844-.5-.25-1.125-.25-.672 0-1.172.297t-.5.813.406.765 1 .422l1.188.297q1.203.313 1.812.906.61.594.61 1.469 0 .766-.438 1.328-.437.547-1.172.86-.734.296-1.625.296m4.082-8.406h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .64.265 1 .265.344.875.344.265 0 .484-.078.235-.078.406-.188v1.328q-.203.094-.453.14-.25.063-.672.063-1.015 0-1.64-.593-.625-.61-.625-1.672m8.253 2.39q-1.187 0-2.109-.546-.922-.563-1.437-1.532-.516-.984-.516-2.234 0-1.172.484-2.156.485-1 1.375-1.594.891-.61 2.094-.61 1.219 0 2.078.547.875.532 1.344 1.485.484.937.484 2.156 0 .11-.015.219 0 .11-.016.187h-7.031v-1.11h5.61q-.016-.343-.157-.733-.125-.391-.422-.735t-.75-.562-1.125-.22q-.797 0-1.39.407-.579.406-.891 1.125-.313.703-.313 1.594 0 1.031.391 1.734.406.688 1.031 1.032.64.328 1.328.328.891 0 1.47-.422.593-.438.952-1.063l1.14.563q-.468.937-1.374 1.547-.89.593-2.235.593m8.307 0q-.922 0-1.625-.296-.687-.297-1.14-.797-.454-.5-.672-1.094l1.203-.547q.328.734.937 1.14.61.407 1.391.407.75 0 1.25-.297.516-.312.516-.906 0-.375-.22-.625-.202-.25-.609-.422-.39-.172-.968-.313l-1-.265q-.563-.156-1.078-.438-.516-.297-.829-.75t-.312-1.11q0-.733.422-1.265.437-.531 1.14-.812.704-.281 1.516-.281.703 0 1.313.203.625.203 1.078.593.468.391.703.97l-1.172.546q-.313-.61-.828-.844-.5-.25-1.125-.25-.672 0-1.172.297t-.5.813.406.765 1 .422l1.188.297q1.203.313 1.812.906.61.594.61 1.469 0 .766-.438 1.328-.437.547-1.172.86-.734.296-1.625.296m4.082-8.406h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .64.265 1 .265.344.875.344.265 0 .484-.078.235-.078.406-.188v1.328q-.203.094-.453.14-.25.063-.672.063-1.015 0-1.64-.593-.625-.61-.625-1.672m8.692 2.14v-8.156h1.282v1.203h.078q.312-.593 1.031-1.031.734-.437 1.61-.437 1.5 0 2.25.875.765.875.765 2.312v5.234h-1.36v-5.03q0-1.173-.577-1.657-.563-.5-1.454-.5-.671 0-1.187.375t-.797.969-.281 1.25v4.593zm11.49.25q-.906 0-1.593-.343-.688-.36-1.079-.97-.39-.624-.39-1.405 0-.891.453-1.5.469-.625 1.25-.938.797-.312 1.734-.312.547 0 1 .093.469.079.813.204t.515.234v-.5q0-.922-.656-1.469-.64-.547-1.594-.547-.671 0-1.265.297-.578.297-.906.828l-1.032-.765q.328-.485.797-.828.485-.36 1.094-.547.625-.203 1.312-.203 1.672 0 2.61.89.937.875.937 2.36v5.171h-1.297v-1.171h-.062q-.203.359-.594.687-.375.328-.906.531-.516.203-1.14.203m.14-1.187q.704 0 1.282-.344.578-.36.922-.953.36-.594.36-1.297-.36-.265-.922-.422-.547-.156-1.204-.156-1.156 0-1.703.484-.547.47-.547 1.172 0 .672.5 1.094.516.422 1.313.422m5.04-7.219h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .64.265 1 .266.344.875.344.266 0 .484-.078.235-.078.407-.188v1.328q-.204.094-.454.14-.25.063-.671.063-1.016 0-1.641-.593-.625-.61-.625-1.672m5.185 2.14v-8.156h1.36v8.156zm.672-9.656q-.406 0-.703-.281-.281-.297-.281-.703 0-.422.281-.688.297-.281.703-.281.407 0 .688.281.281.266.281.688 0 .406-.281.703-.281.281-.688.281m5.21 9.656-3.297-8.156h1.453l2.532 6.563h.03l2.563-6.563h1.422l-3.328 8.156zm9.219.25q-1.188 0-2.11-.546-.922-.563-1.437-1.532-.516-.984-.516-2.234 0-1.172.484-2.156.485-1 1.375-1.594.891-.61 2.094-.61 1.219 0 2.078.547.875.532 1.344 1.485.484.937.484 2.156 0 .11-.015.219 0 .11-.016.187h-7.031v-1.11h5.61q-.016-.343-.157-.733-.125-.391-.422-.735t-.75-.562-1.125-.22q-.797 0-1.39.407-.579.406-.891 1.125-.313.703-.313 1.594 0 1.031.391 1.734.406.688 1.031 1.032.64.328 1.328.328.891 0 1.47-.422.593-.438.952-1.063l1.14.563q-.468.937-1.374 1.547-.89.593-2.234.593m12.845 0q-1.235 0-2.188-.562-.937-.578-1.469-1.563-.53-.984-.53-2.203t.53-2.203 1.47-1.562q.952-.578 2.187-.578t2.171.593q.954.578 1.485 1.563.531.984.531 2.187 0 1.219-.531 2.203-.531.985-1.485 1.563-.937.562-2.171.562m0-1.218q.734 0 1.375-.375.656-.375 1.046-1.063.407-.703.407-1.672 0-.984-.407-1.672-.39-.703-1.046-1.062-.641-.375-1.375-.375-.735 0-1.391.375-.656.36-1.063 1.062-.39.688-.39 1.672 0 .969.39 1.672.407.688 1.063 1.063t1.39.375m8.659 1.218q-1.5 0-2.266-.875t-.766-2.406v-5.125h1.36v4.922q0 1.219.562 1.75.563.516 1.39.516.72 0 1.25-.375.532-.391.813-.97.297-.593.297-1.233v-4.61h1.36v8.156h-1.297v-1.187h-.063q-.203.39-.625.719-.406.328-.922.515-.515.203-1.093.203m5.54-8.406h4.781v1.235h-4.78zm1.422 6.016v-8.328h1.36v7.984q0 .64.265 1 .266.344.875.344.266 0 .484-.078.235-.078.407-.188v1.328q-.204.094-.454.14-.25.063-.671.063-1.016 0-1.641-.593-.625-.61-.625-1.672m5.06 5.594v-11.61h1.282v1.219h.078q.219-.39.625-.719.406-.344.953-.547.547-.218 1.203-.218 1.11 0 1.985.562.89.563 1.406 1.547.516.969.516 2.234t-.516 2.25q-.516.969-1.406 1.532-.875.546-1.985.546-.984 0-1.718-.437-.735-.453-1.063-1.016h-.078l.078 1.125v3.532zm4-4.422q.704 0 1.313-.375.61-.391.985-1.094.39-.703.39-1.64 0-.97-.39-1.657-.375-.703-.985-1.078t-1.312-.375q-.72 0-1.328.375-.61.375-1 1.078-.391.688-.391 1.656 0 .953.39 1.657.391.687 1 1.078.61.375 1.329.375m8.506 1.218q-1.5 0-2.266-.875-.765-.875-.765-2.406v-5.125h1.359v4.922q0 1.219.562 1.75.563.516 1.391.516.719 0 1.25-.375.531-.391.813-.97.296-.593.296-1.233v-4.61h1.36v8.156h-1.297v-1.187h-.063q-.203.39-.625.719-.406.328-.921.515-.516.203-1.094.203m5.54-8.406h4.781v1.235h-4.78zm1.422 6.016v-8.328h1.36v7.984q0 .64.265 1 .266.344.875.344.266 0 .484-.078.235-.078.407-.188v1.328q-.203.094-.453.14-.25.063-.672.063-1.016 0-1.641-.593-.625-.61-.625-1.672m-143.602 21.39q-.845 0-1.657-.343-.813-.36-1.438-1.047-.625-.688-.906-1.703l1.297-.532q.266.985.984 1.657.72.672 1.75.672.641 0 1.172-.22.532-.234.86-.687t.328-1.093q0-.563-.281-.97-.282-.405-.844-.718-.547-.312-1.36-.594l-.734-.25q-.469-.187-.969-.422-.484-.25-.89-.609-.407-.36-.657-.86-.234-.515-.234-1.202 0-.829.453-1.516t1.235-1.11q.78-.421 1.812-.421 1.063 0 1.781.406.735.39 1.157.922.437.531.578.984l-1.266.547q-.094-.344-.375-.703-.266-.36-.719-.61t-1.14-.25q-.563 0-1.063.235-.484.219-.781.61-.297.39-.297.906 0 .718.578 1.14.578.406 1.563.75l.75.25q.515.172 1.047.438.53.25 1 .656.468.39.75.984.28.578.28 1.39 0 .892-.343 1.532-.344.625-.906 1.031-.547.391-1.219.563-.656.187-1.297.187m5.522-.25v-8.156h1.282v1.203h.078q.219-.406.61-.734.39-.328.89-.531.515-.203 1.031-.203.922 0 1.578.453.656.437.938 1.14.422-.687 1.125-1.14t1.672-.453q1.468 0 2.156.89.687.875.687 2.297v5.234h-1.343v-5.03q0-1.173-.485-1.657-.484-.5-1.36-.5-.624 0-1.124.36-.485.359-.766.952-.265.579-.265 1.266v4.61h-1.36v-5.016q0-1.172-.484-1.672-.485-.5-1.344-.5-.625 0-1.125.375-.484.36-.766.953-.265.594-.265 1.281v4.578zm16.514.25q-.906 0-1.594-.343-.687-.36-1.078-.97-.39-.624-.39-1.405 0-.891.453-1.5.469-.625 1.25-.938.797-.312 1.734-.312.547 0 1 .093.469.079.813.204t.515.234v-.5q0-.922-.656-1.469-.64-.547-1.594-.547-.672 0-1.265.297-.578.297-.907.828l-1.03-.765q.327-.485.796-.828.484-.36 1.094-.547.625-.203 1.312-.203 1.672 0 2.61.89.937.875.937 2.36v5.171h-1.297v-1.171h-.062q-.203.359-.594.687-.375.328-.906.531-.516.203-1.14.203m.14-1.187q.704 0 1.282-.344.578-.36.922-.953.36-.594.36-1.297-.36-.265-.923-.422-.546-.156-1.203-.156-1.156 0-1.703.484-.547.47-.547 1.172 0 .672.5 1.094.516.422 1.313.422m5.763.937V157.8h1.359v11.453zm3.375 0V157.8h1.36v11.453zm6.921.25q-1.187 0-2.109-.546-.922-.563-1.437-1.532-.516-.984-.516-2.234 0-1.172.484-2.156.485-1 1.375-1.594.891-.61 2.094-.61 1.219 0 2.078.547.875.532 1.344 1.485.484.937.484 2.156 0 .11-.015.219 0 .11-.016.187h-7.031v-1.11h5.61q-.016-.343-.157-.733-.125-.391-.422-.735t-.75-.562-1.125-.22q-.797 0-1.39.407-.579.406-.891 1.125-.313.703-.313 1.594 0 1.031.391 1.734.406.688 1.031 1.032.64.328 1.328.328.891 0 1.47-.422.593-.438.952-1.063l1.14.563q-.468.937-1.374 1.547-.89.593-2.235.593m8.307 0q-.922 0-1.625-.296-.687-.297-1.14-.797t-.672-1.094l1.203-.547q.328.734.937 1.14.61.407 1.391.407.75 0 1.25-.297.516-.312.516-.906 0-.375-.22-.625-.202-.25-.608-.422-.391-.172-.97-.313l-1-.265q-.562-.156-1.077-.438-.516-.297-.828-.75-.313-.453-.313-1.11 0-.733.422-1.265.437-.531 1.14-.812.704-.281 1.516-.281.703 0 1.313.203.625.203 1.078.593.469.391.703.97l-1.172.546q-.312-.61-.828-.844-.5-.25-1.125-.25-.672 0-1.172.297t-.5.813.406.765 1 .422l1.188.297q1.203.313 1.812.906.61.594.61 1.469 0 .766-.438 1.328-.437.547-1.172.86-.734.296-1.625.296m4.082-8.406h4.781v1.235h-4.781zm1.422 6.016v-8.328h1.36v7.984q0 .64.265 1 .265.344.875.344.265 0 .484-.078.235-.078.406-.188v1.328q-.203.094-.453.14-.25.063-.672.063-1.015 0-1.64-.593-.625-.61-.625-1.672m8.693 2.14v-8.156h1.28v1.313h.079q.156-.47.531-.813.375-.344.86-.547.484-.203.968-.203.375 0 .578.047.204.047.391.125v1.469q-.266-.125-.562-.188-.297-.078-.594-.078-.594 0-1.094.344-.5.328-.797.89-.281.563-.281 1.235v4.562zm8.953.25q-1.5 0-2.266-.875t-.766-2.406v-5.125h1.36v4.922q0 1.219.562 1.75.563.516 1.39.516.72 0 1.25-.375.532-.391.813-.97.297-.593.297-1.233v-4.61h1.36v8.156h-1.297v-1.187h-.063q-.203.39-.625.719-.406.328-.922.515-.515.203-1.093.203m6.023-.25v-8.156h1.28v1.203h.079q.312-.593 1.031-1.031.735-.437 1.61-.437 1.5 0 2.25.875.765.875.765 2.312v5.234h-1.36v-5.03q0-1.173-.577-1.657-.563-.5-1.453-.5-.672 0-1.188.375t-.797.969-.281 1.25v4.593zm8.013-8.156h4.781v1.235H649zm1.422 6.016v-8.328h1.36v7.984q0 .64.265 1 .266.344.875.344.266 0 .484-.078.235-.078.407-.188v1.328q-.204.094-.454.14-.25.063-.671.063-1.016 0-1.641-.593-.625-.61-.625-1.672m5.186 2.14v-8.156h1.359v8.156zm.671-9.656q-.406 0-.703-.281-.28-.297-.28-.703 0-.422.28-.688.297-.281.703-.281.407 0 .688.281.281.266.281.688 0 .406-.281.703-.281.281-.688.281m2.82 9.656v-8.156h1.28v1.203h.079q.219-.406.61-.734.39-.328.89-.531.516-.203 1.031-.203.922 0 1.578.453.657.437.938 1.14.422-.687 1.125-1.14t1.672-.453q1.468 0 2.156.89.687.875.687 2.297v5.234H669.8v-5.03q0-1.173-.485-1.657-.484-.5-1.359-.5-.625 0-1.125.36-.484.359-.766.952-.265.579-.265 1.266v4.61h-1.36v-5.016q0-1.172-.484-1.672t-1.344-.5q-.625 0-1.125.375-.484.36-.765.953-.266.594-.266 1.281v4.578zm17.625.25q-1.188 0-2.11-.546-.922-.563-1.437-1.532-.516-.984-.516-2.234 0-1.172.484-2.156.485-1 1.375-1.594.891-.61 2.094-.61 1.219 0 2.078.547.875.532 1.344 1.485.484.937.484 2.156 0 .11-.015.219 0 .11-.016.187h-7.031v-1.11h5.61q-.016-.343-.157-.733-.125-.391-.422-.735t-.75-.562-1.125-.22q-.797 0-1.39.407-.579.406-.891 1.125-.313.703-.313 1.594 0 1.031.391 1.734.406.688 1.031 1.032.641.328 1.328.328.891 0 1.47-.422.593-.438.952-1.063l1.141.563q-.469.937-1.375 1.547-.89.593-2.234.593"/>
+ <path fill="#02589b" d="M407.54 256.578h8.637v-54.724h17.276v54.724h8.638l-17.276 17.276z" fill-rule="evenodd"/>
+ <path fill="#2bb7f6" d="M421.232 256.578h8.638v-54.724h17.276v54.724h8.637l-17.275 17.276z" fill-rule="evenodd"/>
+ <path fill="#02589b" d="M543.867 258.52h8.638v-54.724h17.276v54.724h8.638l-17.276 17.276z" fill-rule="evenodd"/>
+ <path fill="#2bb7f6" d="M557.56 258.52h8.638v-54.724h17.276v54.724h8.638l-17.276 17.276z" fill-rule="evenodd"/>
+ <path fill="#02589b" d="M750.421 258.536h8.638v-51.974h17.275v51.974h8.638l-17.275 17.275z" fill-rule="evenodd"/>
+ <path fill="#2bb7f6" d="M764.114 258.536h8.638v-51.974h17.275v51.974h8.638L781.39 275.81z" fill-rule="evenodd"/>
+ <path d="M150.63 118.834h48.243v48.244H150.63z"/>
+ <g transform="translate(150.63 118.834)scale(.25127)">
+ <clipPath id="e">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#e)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAGZklEQVR4Xu3dS2hUdxTHcTVaNy7sQ0EKFoRW1JqK4MoWt1pcKIJKKyLUkpU7QVAiFwIuBBGy8oG74EJdCaKuROIDQSEGC0l9IEhAjK0boTbafjs+kJlfksk87v+ee5rzWQqZ8/+dHzGZmXsnM2aEEEIIIYQQQgJ0sJxt7KOXc1znLsM8ZoSHDHKDS5ykm52sZZ5+XWgTX7CVY9zhLxrxD0OcZg9L9XFC01hBDwP8qztu0GOOs4EOfdTQABZxgHu60ZY85Sir9fFDHayhjzHdY5tusIVZOilMgMWM6vZy8oAuZuu8MA4rk1VA5Qf0Jp0XxklaAfTTqRODSFzBGBlzdGaokbgCKk/kVunMUCN5Ba/4RWeGGskrgJPM1amhSgEV3GKBTg1VCqhgiMU6NVShM3kFT1imU0OVAioYjQrqKqCCJ/EfUV0FVDDMQp0aqhRQwU0+0amhSgEVHNeZoUYBFezWmaFG8gpesUJnhhrJK7gdb9tMoVLBc91arg7qxCASVzAWT8umlLiCSzovjJO4go06L4yTtILhuKSrAUkr+EmnuZT6Ja6EFdxjpk5zhzU8Y6X+a74SVrBZZ7lDXyWG3wqu6CRnWPThGs/0FXyXqIKvdZIrHPgYxGsFh3WOKzUXmPus4Knja6r5VsL4rOB7neIGPZrFZQVHdIYbDGgWPFbwSCc4wYJJ7u0adVfBEp3gAls1x0feKtilj+8CxzRHlcQV5FzAKX18F7ijOWokrCDn9cOQTnCADl5pDpGogtzXD28cXsLOck0xgQQVJFj/W/7uKWObZphQzhUkWj9s10mlxz7NMIkcK0i2ftivs0qPXs0wqdF8vsETrh96dVrpcU4z1JFDBUnXD2d0XulxXTPU1WYFidcPV3Vi6XFXM0yhjQqSrx9u68zSY1gzTKnFCgpYPwzq1NLjsWZoQAsVFLJ+j8+FGdEMDWmygoLWD/d1cunxUDM0qIkKCls/DOjs0mNQMzSswQoKXD9c0+mlxw3N0IQGKih0/XBZ55celzRDU57Xr6Dg9UOfnqD0OKkZmlSngsLXD4f0DKVHt2Zo2iQVGKwfuvQUpcdOzdCCCSowWT+s13OUHms1Q0ukAqP1w5fVp3CBeZNclNKsqgrM1v+sOpkbDGmOFn2owGz9Hn8JfYvTmqNllQoM1w89ms0F9miONjw3XD+s02wusFRzOPXS7UfYtPSSdPlc0FxucFyzuOT342vYoFkc+ptPNZcbdPBU87hzXlO5wlHN484JzeQKqzWPQ5mmcqWtN2bKItNUjrBF07iUaS43mMUDTeNSpsncoEuzOJVpMieYndvrotYyzeYEmzSJW5lmc4J+TeJWptlcoDP3P01oJ9N0LpBpDscyTecAc5q+Y6DMMs3nAKumvHPYk0zzOcBuTeFapvkcaPuCxXLJNF/pMZdbmsK1TBOWHgv+N8+L38s0YemxmCeawrVME5Yey0j7FzCKlmnC0qtUEN8FtviK3zWFa5kmLD0WclNTuJZpwtLjE05oCtcyTegAv8YLFMZYwW3N4Vim+RxgNgfj/QJjlV9M27uzuEwyTecEG1v4kJtyyjSbE3TwM79pGpcyzeYGM9nMFc3jUKbJXOEbDudycfsY582ebWSayhlm8QNHeKS5GvSSC+x+f3uF2SUBmUTyiSXs4hRDvNF8E3rGZXpYV3trXVSQA+bSyXb208sZrlaevg1WSrnPANcqK+/jEF2sn/xDBaICc1GBuajAXFRgLiowFxWYiwrMRQXmogJzUYG5qMBcVGAuKjAXFZiLCsxFBeaiAnNRgbmowFxUYC4qMBcVmIsKzEUF5qICc1GBuajAXFRgLiowFxWYiwrMRQXmogJzUYG5qMBcVGAuKjAXFZiLCsxFBebMKujWk0xbZhXs0JNMW0YV/MF8Pcm0ZVTBXj3HNGZSQb+eYlozqOCFnmGaK7yC13qCaa/gCkZ0fii2grM6PcwotIIfdXZ4p6AKLurc8FEBFQzwmU4NVRJXMMDnOjGIhBXE+huTqIJYf+MSVBDrb07OFcT6m5djBbH+1uRUQay/dTlUEOtvT5sVxPrb10YFsf58tFhBrD8/LVQQ689XkxXE+vPXRAWx/jQarCDWn04DFcT605qiglh/enUqiPUXg27d/Dux/uKwgz9l/Rfjvd5CMZ+99POC14xwNi40CSGEEEIIITTrP5z89OGgMhR8AAAAAElFTkSuQmCC"/>
+ </g>
+ <path d="M493.407 118.833h48.244v48.245h-48.244z"/>
+ <g transform="matrix(.25127 0 0 .25128 493.407 118.833)">
+ <clipPath id="f">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#f)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAG/ElEQVR4Xu3de5BOZRwH8K+1uWzZKZc0RTVFkUrRxZAuRqQZrYzEaGpQjAndDOkyRLpsajKoVKSbUJNQjCgVXYw2jZApRErkumlZrLeOiez+fu973nN5zrvn2f1+vjP+2N3zPPv8dr17znl/5xyAiIiIiIiIiIiIiIiIiIiIiIiIiIjIhFzkoYX8IEUvG20wEl/iEP7BXrSTn6boNMEgzEahU/jjKUYX+WVkWj30xBT8Wqbwx1OC2+UGZEpt5GMFEqroZZPAYLkhmVEFy1W5k2ek3JTMaKNKnSrjnB8XReAdVepUmYqqcmMKryGKVKlTZRaqy80pvBGq0KnzCU6Sm1NYNVPugibLMmffiQzrocrsllU4XQ5AYS1RZXbLBpwjB6BwWuCwKrNbtuAiOQSFM1kV2T270EoOQWHUx1+qyO75G+3lIBTGUFXidDmArnIQCq4aflYlTpcS9JbDUHB5qsDpk8B9chgK7mNVYC8ZLYehoJo5LyqyvF4ynudKTZmgiustbyJbDkVB1MZOVVxvmY0acjAKYqAqrdcsRi05GPmXjVWqtF6zHHXkcORfe1VY71mDM+Rw5N9sVVjv+QWN5HDkVyMcUIX1nj9wsRyQ/MpXZfWT3WgtByR/amGrKqufFKGDHJL86auK6i8H0E0OSX5koUAV1V9KnB8ihXCVKqn/DJGDkh/TVUH9Z4wclLxriH2qoP7zAs+VBveYKmeQvM1zpUHl+OqbS50PUVMOTd70VMUMls+RK4cmb5aqYgZLAerKocmLlmkvY/KaH50/6xTAFFXKoNmExnLwyOTiJozFfOd/XoHzbz462rsrcJrvvrnU2YZL5PCGZTuHkMeudS6bLXgA1eSX22GYWkzw7HEKFI2mGIw5aX5Z1th5srwa1qmlBE8ROskJQqmPXpiK39Q8yWNpV2sXtZAwOYjucoIAcnADnsVK3zsJRc6OhYUWqoWEyWH0kxN4loUr8BAWh3jfbj1OlIPG34UB++ZSZ5icIq1z0R/vYZcayX9GyaFtMFEtI2yeklOkUBu34GVsUNsHzx4br/gM3jeXOi85LyipVUc7PIlvfV5C5S295GQ2GKSWET7TcYKcBlXQHEOwwMjp8FR5Q05qg2ysVgsJn3mlzpU2QG9Mcw7X5NeYz8pS67JIB7UQE1mChsjDeKxVn4ku2+XSbDFXLcXO7JYLs0XjEPvfccoGuTB7PKMWY2PmyWXZIzcjfySjjv/DwBi5Uy3HtiTsvuNFFr5TS7IrH8gl2aatWpJNKUYTuSD7zFDLsieR3IqzMQZgaAZvrXdmpCcKoszzcinh1MWteBUbjw6+MIPNH6PU0uKfEgyXywiqBq7H084fQ/l+0KYMvN9TC50xLqMnDsxkGa6USwnmZOc3fb8a/lj2o4/cwJAjd1cfgaVJOg7ini3Oq8Q1cjlhpGsdn2S4AaMpBmGOuLu6DdmLj3AvmsnlhJe+dfwbNJAbBfBfx8FmNXrcU4KvMRpXJ3mvwZj0rePbcJ3cyLMcdArUcVD++QkTcbPzIh05L63jJb4vEqrq/Jl6GJ9ZeMZzu/Oy3BdnyQVFyVvr+AyPbz8fOY54H7vV9nHPfmeHZCguLZ/rcLy1jq/GeXLDUsoeR9iTBArwFNqX721yLvP4Gl2Y5GkwqY4j4p+NeAXdM3jA6eo19e0lTwJjjjaAZDkHasOwyOU4Iq7Z7bxEDojbzUD8tI4vQD/MxA718bjngLNT8Iizc5C581y+mGwdj1t+wHO4Me59nNWNto7HI7/jddzm/O+2hNnW8fLMXszFPbhALjD+Fqml2JVD+Mo5sm8b5YmDaJlvHc9U1mIC8irCNcTmW8ejzZ+Yhj4V6bLVOkYuW4g++5yd4SFoXj4nDqI1WC02TjmM5XgC7Srys8iiaR0Pn/WYhG6V4/FX0bSOB81OvIv+dvef+ReH1vFifIrhuNz10qMKqzxbxxP4HmPRETnym6pcxqrCRJ/NmIKeOFV+K5VTJlvHCzEbA3G+/BYqu+hbxw9hCUagtb23f4lWlK3jazAOnfmghnTMt45vxVu4g88G8M5U63gR5uN+PrrTv7Ct44exDI/jWsPtjZVK+r655FmHF9EVp8jhyC8vfXOlswMzcRfOlsNQcN765oqxCA+iZeU8cRA1t0eVJ7AC+ejAWwpHKfmjyjdhMnqgnvxiikLpR5XvwSzc7dolSsbVRyEO4gs8ilZx7Sur6Jp6bE4nIiIiIiIiIiIiIiIiIiIiIiKi/8neT8Y9xskJGPcYJydg3GOcnIBxj3FyAsY9xskJGPcYJydg3GOcnIBxj3FyAsY9xskJGPcYJydg3GOcnIBxj3FyAsY9xskJGPcYJydg3GOcnIBxDxERERERERERERERERERERERVVr/Arh3RgfbS5XuAAAAAElFTkSuQmCC"/>
+ </g>
+ <path fill="#02589b" d="M301.486 186.308h10.52v19.685h-10.52z" fill-rule="evenodd"/>
+ <path stroke="#02589b" stroke-linejoin="round" stroke-linecap="butt" d="M301.486 186.308h10.52v19.685h-10.52z"/>
+ <path fill="#02589b" d="M160.328 258.52h8.638v-54.724h17.275v54.724h8.638l-17.275 17.276z" fill-rule="evenodd"/>
+ <path fill="#2bb7f6" d="M174.021 258.52h8.638v-54.724h17.275v54.724h8.638l-17.275 17.276z" fill-rule="evenodd"/>
+ <path fill="#02589b" d="M169.606 201.852h610.016v8.535H169.606z" fill-rule="evenodd"/>
+ <path stroke="#02589b" stroke-linejoin="round" stroke-linecap="butt" d="M169.606 201.852h610.016v8.535H169.606z"/>
+ <path fill="#2bb7f6" d="M647.564 186.308h10.52v22.016h-10.52z" fill-rule="evenodd"/>
+ <path stroke="#2bb7f6" stroke-linejoin="round" stroke-linecap="butt" d="M647.564 186.308h10.52v22.016h-10.52z"/>
+ <path fill="#2bb7f6" d="M183.339 207.096h611.527v8.535H183.34z" fill-rule="evenodd"/>
+ <path stroke="#2bb7f6" stroke-linejoin="round" stroke-linecap="butt" d="M183.339 207.096h611.527v8.535H183.34z"/>
+ <path d="M148.451 402.17h485.355v35.245H148.45z"/>
+ <path fill="#000" d="M149.983 429.09v-13.358h4.515q2.125 0 3.657.859 1.546.844 2.375 2.344.828 1.5.828 3.484 0 1.969-.828 3.484-.829 1.516-2.375 2.36-1.532.828-3.657.828zm2.515-2.39h1.891q1.469 0 2.453-.53 1-.532 1.484-1.5.5-.97.5-2.25 0-1.313-.5-2.267-.484-.968-1.484-1.5-.984-.53-2.453-.53h-1.89zm13.831 2.688q-1.015 0-1.797-.39-.765-.407-1.218-1.126-.438-.734-.438-1.687 0-1 .5-1.703.516-.704 1.39-1.094.876-.39 1.938-.39.578 0 1.047.062t.844.156.625.203v-.406q0-.766-.578-1.25-.578-.5-1.594-.5-.672 0-1.297.312-.625.297-1.031.797l-1.563-1.234q.469-.594 1.078-1.016t1.36-.625q.75-.219 1.562-.219 2.188 0 3.328 1.016 1.141 1 1.141 2.938v5.859h-2.406v-.969h-.156q-.266.328-.657.625-.39.281-.922.453-.515.188-1.156.188m.578-1.906q.735 0 1.25-.313.516-.328.782-.844.28-.53.28-1.11-.421-.202-.937-.327-.515-.125-1.062-.125-1.078 0-1.5.422-.406.406-.406 1 0 .562.406.937.406.36 1.187.36m6.966 1.609v-9.516h2.297v1.266h.157q.234-.438.64-.781.406-.36.938-.563.547-.203 1.156-.203.375 0 .672.063.297.046.531.14v2.453q-.39-.156-.781-.25-.375-.11-.813-.11-.718 0-1.25.376-.531.36-.812.984-.281.625-.281 1.407v4.734zm7.481-9.516h6.438v2.094h-6.438zm1.672 6.47v-9.157h2.438v8.719q0 .656.281 1t.938.343q.375 0 .625-.11.25-.124.562-.312v2.391q-.39.156-.812.234-.422.094-.891.094-1.469 0-2.313-.844-.828-.859-.828-2.359m11.508 3.046v-13.36h2.922l5.375 8.954h.156l-.156-2.578v-6.375h2.5v13.359h-2.64l-5.673-9.453h-.156l.156 2.562v6.89zm16.16.297q-1.016 0-1.797-.39-.766-.407-1.219-1.126-.437-.734-.437-1.687 0-1 .5-1.703.515-.704 1.39-1.094t1.938-.39q.578 0 1.047.062t.843.156.625.203v-.406q0-.766-.578-1.25-.578-.5-1.594-.5-.671 0-1.296.312-.625.297-1.032.797l-1.562-1.234q.469-.594 1.078-1.016t1.36-.625q.75-.219 1.562-.219 2.187 0 3.328 1.016 1.14 1 1.14 2.938v5.859h-2.406v-.969h-.156q-.266.328-.656.625-.39.281-.922.453-.516.188-1.156.188m.578-1.906q.734 0 1.25-.313.515-.328.781-.844.281-.53.281-1.11-.422-.202-.937-.327t-1.063-.125q-1.078 0-1.5.422-.406.406-.406 1 0 .562.406.937.407.36 1.188.36m6.107-7.907h6.438v2.094h-6.438zm1.672 6.47v-9.157h2.438v8.719q0 .656.281 1t.938.343q.375 0 .625-.11.25-.124.562-.312v2.391q-.39.156-.812.234-.422.094-.891.094-1.469 0-2.313-.844-.828-.859-.828-2.359m7.048 3.046v-9.516h2.438v9.516zm1.235-10.563q-.657 0-1.125-.468-.47-.47-.47-1.11 0-.656.47-1.11.468-.468 1.125-.468.656 0 1.109.469.453.453.453 1.11 0 .64-.453 1.109t-1.11.468m6.708 10.563-4.031-9.516h2.781l2.406 6.188h.157l2.437-6.188h2.75l-4.078 9.516zm12.003.297q-1.437 0-2.578-.64-1.125-.657-1.765-1.798-.64-1.14-.64-2.593 0-1.36.624-2.516.64-1.156 1.734-1.86 1.11-.703 2.532-.703 1.53 0 2.562.657 1.047.656 1.594 1.75.547 1.078.547 2.406 0 .297-.031.516-.016.218-.032.312h-8.172v-1.734h5.875q-.015-.328-.187-.657-.156-.343-.469-.625-.297-.28-.719-.453-.406-.172-.953-.172-.703 0-1.297.375-.593.36-.937 1.032-.328.656-.328 1.578 0 .953.36 1.61.359.655.952 1.015.61.344 1.36.344.875 0 1.468-.375.61-.391.938-.97l1.984.97q-.672 1.171-1.765 1.859-1.078.672-2.657.672"/>
+ <path d="M148.451 402.176h464.032"/>
+ <path stroke="#02589b" stroke-width="2" stroke-linejoin="round" stroke-linecap="butt" d="M148.451 402.176h464.032"/>
+ <path d="M640.029 402.17H817.32v35.245H640.03z"/>
+ <path fill="#000" d="M641.56 429.09v-13.359h4.516q2.125 0 3.656.86 1.547.843 2.375 2.343t.828 3.485q0 1.968-.828 3.484t-2.375 2.36q-1.531.828-3.656.828zm2.516-2.39h1.89q1.47 0 2.453-.531 1-.532 1.485-1.5.5-.969.5-2.25 0-1.313-.5-2.266-.485-.969-1.485-1.5-.984-.531-2.453-.531h-1.89zm13.83 2.687q-1.015 0-1.796-.39-.766-.406-1.22-1.125-.437-.735-.437-1.688 0-1 .5-1.703.516-.703 1.391-1.094.875-.39 1.938-.39.578 0 1.046.062.47.063.844.157.375.093.625.203v-.407q0-.765-.578-1.25-.578-.5-1.594-.5-.672 0-1.297.313-.625.297-1.03.797l-1.563-1.235q.468-.593 1.078-1.015t1.36-.625q.75-.219 1.562-.219 2.187 0 3.328 1.016 1.14 1 1.14 2.937v5.86h-2.406v-.97h-.156q-.266.329-.656.626-.391.281-.922.453-.516.187-1.156.187m.579-1.906q.734 0 1.25-.312.515-.328.78-.844.282-.531.282-1.11-.422-.203-.937-.328t-1.063-.125q-1.078 0-1.5.422-.406.407-.406 1 0 .563.406.938.406.36 1.188.36m6.966 1.61v-9.516h2.297v1.266h.156q.234-.438.64-.782.407-.359.938-.562.547-.203 1.156-.203.375 0 .672.062.297.047.531.14v2.454q-.39-.156-.78-.25-.376-.11-.813-.11-.719 0-1.25.376-.532.359-.813.984t-.281 1.406v4.735zm7.48-9.516h6.438v2.094h-6.437zm1.673 6.469v-9.157h2.437v8.72q0 .655.281 1 .282.343.938.343.375 0 .625-.11.25-.124.562-.312v2.39q-.39.157-.812.235-.422.094-.89.094-1.47 0-2.313-.844-.828-.86-.828-2.36m13.089 3.047-3.547-13.36h2.797l1.828 7.5.234 1.406h.14l.298-1.406 2.36-7.5h2.484l2.296 7.5.297 1.36h.14l.22-1.36 1.812-7.5h2.797l-3.437 13.36h-2.72l-2.265-8.063-.297-1.437h-.156l-.297 1.437-2.39 8.063zm19.053.296q-1.437 0-2.578-.64-1.125-.656-1.766-1.797-.64-1.14-.64-2.594 0-1.36.625-2.515.64-1.157 1.734-1.86 1.11-.703 2.531-.703 1.532 0 2.563.656 1.047.657 1.594 1.75.546 1.078.546 2.407 0 .296-.03.515-.016.219-.032.313h-8.172v-1.735h5.875q-.016-.328-.187-.656-.157-.344-.47-.625-.296-.281-.718-.453-.406-.172-.953-.172-.703 0-1.297.375-.594.36-.937 1.031-.329.657-.329 1.578 0 .954.36 1.61t.953 1.015q.61.344 1.36.344.874 0 1.468-.375.61-.39.938-.969l1.984.97q-.672 1.171-1.766 1.859-1.078.671-2.656.671m11.795 0q-.703 0-1.266-.203-.546-.203-.953-.53-.406-.329-.64-.704h-.157v1.14h-2.296v-13.359h2.453v3.656l-.157 1.344h.157q.234-.375.64-.703.407-.344.953-.547.563-.203 1.266-.203 1.297 0 2.328.64 1.047.641 1.64 1.782.61 1.14.61 2.64 0 1.485-.61 2.626-.593 1.14-1.64 1.78-1.031.641-2.328.641m-.437-2.25q.687 0 1.265-.343.594-.36.953-.985.375-.64.375-1.468 0-.86-.375-1.47-.36-.624-.953-.968-.578-.344-1.265-.344-.672 0-1.266.344-.578.344-.953.969-.36.625-.36 1.469 0 .828.36 1.453.375.625.953.984.594.36 1.266.36"/>
+ <path d="m635.774 401.762 190.079.41"/>
+ <path stroke="#02589b" stroke-width="2" stroke-linejoin="round" stroke-linecap="butt" d="m635.774 401.762 190.079.41"/>
+ <path d="M382.999 348.612h93.102v35.244H383z"/>
+ <path fill="#000" d="m399.31 375.532 5.078-13.36h1.781l5.078 13.36h-1.734l-3.672-9.984-.531-1.438h-.063l-.531 1.438-3.672 9.984zm5.781-3.672v-1.5h3.078l.547 1.5zm-3.625 0 .547-1.5h3.078v1.5zm11.562 3.672v-13.36h4.5q1.125 0 2.063.516.953.5 1.515 1.391.578.875.578 2.047 0 .719-.265 1.422-.266.687-.813 1.265-.547.579-1.406.922-.844.344-2.016.344h-3.328v-1.469h3.578q.704 0 1.297-.312.594-.328.97-.875.374-.563.374-1.297 0-.594-.312-1.156-.313-.563-.875-.922-.547-.36-1.329-.36h-2.953v11.844zm3.219-6.125 1.734-.094 4.22 6.141v.078h-1.86zm7.714 6.125v-13.36h2.281l4.266 10.954h.062l4.266-10.953h2.281v13.36h-1.562v-8.485l.078-2.547h-.078l-4.36 11.031h-1.312l-4.36-11.031h-.078l.078 2.547v8.484zm19.86.297q-.985 0-1.798-.375-.797-.375-1.375-.969-.578-.593-.89-1.36-.297-.765-.297-1.562 0-1.125.484-2.109.5-1 1.14-1.969.548-.828 1.11-1.672.563-.843 1.11-1.671.562-.829 1.109-1.672l1.281.875-.812 1.125q-.39.562-.797 1.14l-.813 1.125q-.406.547-.797 1.11l.047.03q.313-.202.703-.312.407-.125.938-.125.719 0 1.422.297.719.297 1.297.86.593.562.937 1.312t.344 1.656q0 1.11-.594 2.094-.594.985-1.578 1.578-.969.594-2.172.594m0-1.516q.765 0 1.39-.359.625-.36 1-.984.375-.625.375-1.39 0-.767-.39-1.376-.376-.625-1-.984-.626-.36-1.376-.36t-1.39.36q-.625.36-1.016.984-.375.61-.375 1.375 0 .766.375 1.39.375.626 1 .985.64.36 1.406.36m6.031-1.53v-1.188l5.97-8.828h1.718v12.765h-1.578V365.08h-.063l-4.172 6.219h7.454v1.484z"/>
+ <path d="M361.808 304.679h38.981v39.664h-38.98z"/>
+ <g transform="matrix(.20302 0 0 .20659 361.808 304.679)">
+ <clipPath id="g">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#g)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAF7UlEQVR4Xu3aT2rXVxhG8ReqC4hUg86KdTVFcKLorBAQBaUg0q5BxJjNBLICxaB0HrKDIBhjB9GY9ld4BnJuW2wv1nsu3/POL58n1fyrVUtLS0tLS0tLS0tLS1++9bpVW7VT+/W63tfvX/nerxT7K81W3awLpM7Wubpfu82HYKR7UfdWyim7VE/rt2bwiPeuntRF8t2drV9Wszh05Duqh3WGM6xdqV+bgYZ7VZc5xdi1ettMs9xhXeUcW7frYzPLdCe1wUmmbjeDjKf9T3Bt9eeHY4x34vxEdEX8uZ936PtyfFb6nc/f3UvbN6U/NxPs94ATR+6S7Meuz7m3tc6Z4/a04c9wjzlz1M5Jfufzb++o1jh1zO439FnuLqeO2di/cO6555w6YusNe547rfOcO163GvZMd4Nzx2urQc90m5w7XjsNeqbb5tzx2m/QM90e547X6wY90x1w7nh9/X9o8iXvmHPHi+RPzxLdqg0Eq/CJbtUGglX4RLdqA8EqfKJbtYFgFT7RrdpAsAqf6FZtIFiFT3SrNhCswie6VRsIVuET3aoNBKvwiW7VBoJV+ES3agPBKnyiW7WBYBU+0a3aQLAKn+hWbSBYhU90qzYQrMInulUbCFbhE92qDQSr8Ilu1QaCVfhEt2oDwSp8olu1gWAVPtGt2kCwCp/oVm0gWIVPdKs2EKzCJ7pVGwhW4RPdqg0Eq/CJbtUGglX4RLdqA8EqfKJbtYFgFT7RrdpAsAqf6FZtIFiFT3SrNhCswie6VRsIVuET3aoNBKvwiW7VBoJV+ES3agPBKnyiW7WBYBU+0a3aQLAKn+hWbSBYhU90qzYQrMInulUbCFbhE92qDQSr8Ilu1QaCVfhEt2oDwSp8olu1gWAVPtGt2kCwCp/oVm0gWIVPdKs2EKzCJ7pVGwhW4RPdqg0Eq/CJbtUGglX4RLdqA8EqfKJbtYFgFT7RrdpAsAqf6FZtIFiFT3SrNhCswie6VRsIVuET3aoNBKvwiW7VBoJV+ES3agPBKnyiW7WBYBU+0a3aQLAKn+hWbSBYhU90qzYQrMInulUbCFbhE92qDQSr8Ilu1QaCVfhEt2oDwSp8olu1gWAVPtGt2kCwCp/oVm0gWIVPdKs2EKzCJ7pVGwhW4RPdqg0Eq/CJbtUGglX4RLdqA8EqfKJbtYFgFT7RrdpAsAqf6FZtIFiFT3SrNhCswie6VRsIVuET3aoNBKvwiW7VBoJV+ES3agPBKnyiW7WBYBU+0a3aQLAKn+hWbSBYhU90qzYQrMInulUbCFbhE92qDQSr8Ilu1QaCVfhEt2oDwSp8olu1gWAVPtGt2kCwCp/oVm0gWIVPdKs2EKzCJ7pVGwhW4RPdqg0Eq/CJbtUGglX4RLdqA8EqfKJbtYFgFT7RrdpAsAqf6FZtIFiFT3SrNhCswie6VRsIVuET3aoNBKvwiW7VBoJV+ES3agPBKnyiW7WBYBU+0a3aQLAKn+hWbSBYhU90qzYQrMInulUbCJ7tho/g2W74CJ7tho/g2W74CJ7tho/g2W74CJ7tho/g2W74CJ7tho/g2W74CJ7tho/g2W74CJ7tho/g2W74CJ7tho/g2W743jfkvuuN7/XdMZ8fr9cNuu9643t9d8Dnx2u/Qfddb3yv7/b4/HjtNOi+643v9d02nx+vrQbdd73xvb7b5PPjdbNB911vfK/vrvP58Vpv0H3XG9/rudP6ls+P2IsG3nO98b2ee8bHx+xeA5/l7nDqmJ2rdw19hjuqNU4dtScNfoZ7xJnjdnH1p4V8+x3WBc4cuYfNAPv9xIljd6ZeNRPMt1vfcOLofb/6S8sZ1ntT33Geoat10kwx3of6gdMsbTRjjPcjZ5nakP8t+OD+8P/ZVfHXgjfeTz6fdrleNtMMt+v80vtXnakH9bYZOPIdrr7v133j+c+t12PJz8dH9cj1U+/nt1Z363mdNpNHudN6Vnc8v3L7r52vG7VZ27VXB3XcfBD+7zteKfZWms267vjfLUtLS0tLS0tLS0tL9v4A9HsrYKJBvccAAAAASUVORK5CYII="/>
+ </g>
+ <path d="M388.81 304.679h38.981v39.664h-38.98z"/>
+ <g transform="matrix(.20302 0 0 .20659 388.81 304.679)">
+ <clipPath id="h">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#h)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAGQklEQVR4Xu3Yy4ofZQKG8c82Kp5g8LAwxrtQ9ALEuYCZiZIb8bA2sWUGQdERZykKA0FBRsb7CNmqiYeFRPdJNk5t4oTf12lt6t/6vk09zyaELr73SXeqq/5jbGxsbGxsbGxsbGxsHB9747nx2vh0XB4/jZvj5z/Ym8uKy+OT8ep4dll24nlq7I/vp3+EFL8db4wnnXxyeGx8EPAT/2veGO+PR51+Eji3/Fc3NtUfx4vO7+ae8a8pMt1/jlNmtPLA+O+U1+Dn435TGrlnfDGltfifk/C/oO/mc7vvmdPGuSmpzbMmNfF40ZPPnbw2HjGrhw+mnEbfNauFpwpeu36L18dp0zrYn1JaPW9aA3vBn/kc1W/GXebl89yU0ewz5uXz2hTR7Cvm5fPpFNHsRfPyuTxFNHvJvHz6X8Fu95p5+ZyMd4Bb3jAvHxParcOAduswoN06DGi3DgM0DfdpHQZoGu7TOgzQNNyndRigabhP6zBA03Cf1mGApuE+rcMATcN9WocBmob7tA4DNA33aR0GaBru0zoM0DTcp3UYoGm4T+swQNNwn9ZhgKbhPq3DAE3DfVqHAZqG+7QOAzQN92kdBmga7tM6DNA03Kd1GKBpuE/rMEDTcJ/WYYCm4T6twwBNw31ahwGahvu0DgM0DfdpHQZoGu7TOgzQNNyndRigabhP6zBA03Cf1mGApuE+rcMATcN9WocBmob7tA4DNA33aR0GaBru0zoM0DTcp3UYoGm4T+swQNNwn9ZhgKbhPq3DAE3DfVqHAZqG+7QOAzQN92kdBmga7tM6DNA03Kd1GKBpuE/rMEDTcJ/WYYCm4T6twwBNw31ahwGahvu0DgM0DfdpHQZoGu7TOgzQNNyndRigabhP6zBA03Cf1mGApuE+rcMATcN9WocBmob7tA4DNA33aR0GaBru0zoM0DTcp3UYoGm4T+swQNNwn9ZhgKbhPq3DAE3DfVqHAZqG+7QOAzQN92kdBmga7tM6DNA03Kd1GKBpuE/rMEDTcJ/WYYCm4T6twwBNw31ahwGahvu0DgM0DfdpHQZoGu7TOgzQNNyndRigabhP6zBA03Cf1mGApuE+rcMATcN9WocBmob7tA4DNA33aR0GaBru0zoM0DTcp3UYoGm4T+swQNNwn9ZhgKbhPq3DAE3DfVqHAZqG+7QOAzQN92kdBmga7tM6DNA03Kd1GKBpuE/rMEDTcJ/WYYCm4T6twwBNw31ahwGahvu0DgM0DfdpHQZoGu7TOgzQNNyndRigabhP6zBA03Cf1mGApuE+rcMATcN9WocBmob7tA4DNA33aR0GaBru0zoM0DTcp3UYoGm4T+swQNNwn9ZhgKbhPq3DAE3DfVqHAZqG+7QOA9qtw4B26zCg3ToMaLcOA9qtw4B26zCg3ToMaLcOA3brl+P8eH48Me5dPL386cL4evqa3VqHAbvzq/HXsedxy9+cHVemr92ddRiwKz8cD3jULzw4Ppq+flfWYcBu3PeYiX9M1+zGOgzYhR96yIF8PF23C+swYL1fHXLzuZ2HxtXp2vXWYcB6/+YRd+Sl6dr11mHAWr884MnnTuwdw/NQHQas9bwHHMr+dP1a6zBgrc97wKG8MF2/1joMWOsTHnAoZ6br11qHAWu91wMO5b7p+rXWcXNKWOcf+w244QH5/DRFrPO0BxzKrm9B1zwgn8tTxDqP9kv4z9P167zkAfl8MkWs84IHHMqb0/XrvOgB+bw6Razz6yO8iN298w8jXvaIfJ6dItZ61iPuyLnp2rU+7RH57I3vpox1XhkPesiBPDy+na5d59Vxl4c08MYUstaPPOJA/j1dt9bXPaKDM8vTsylr/buHTLw1XbPW60d8Cw/i/SlmvR+PhzzmFx4+hp/+n8c7HtPDo+PHKWe9V8dLBzwR3b386v1m+tr1/jD+5FFNvDgF7cYrY3+8sNzk7ls8s7x2vbnzB89b/sWkNo7jNvT7WXz7ucWp8fmU1eJny43tBHB/6bfgs2X5CeHUeG/KS/edk/HT/3/OjmtTZKo/9P/qPYhHxrvLS42xaV4fb3c/eB7O6XHhWJ7Wd+PV8XrvW+9vZ288M14ZF8el5aa0+w8rjuqNZcWlZc3L4+nOj9w2NjY2NjY2NjY2Nlr5H18/v/Zvp0asAAAAAElFTkSuQmCC"/>
+ </g>
+ <path d="M425.292 282.378h72v72h-72z"/>
+ <g transform="translate(425.292 282.378)scale(.375)">
+ <clipPath id="i">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#i)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAESUlEQVR4Xu2dzWqdVRRANwjSltaZE3EgpK3D4hv4EFLaB/EBFBy0dG7hlj6D7+AgmFnEF6gTTRN/m7TNrVqvA5G9jrbfuffbH8hZa80Oh/2FtcnNTTK4ESIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiMiZX4nas4iBOYh0vB3cdx5sSq7i1qbII1+NhPG2+DH0ZZ/EgrjLXvFyMe/GiebD+4zruxgVmm4tr8U3zQG09jD2mm4MP4nHzKP13j+IG8+3KNfN3eTTvd8ElX3y6PZzzZ8G9Zry+3jvMuC3Xfeezleu5XoYeNqN1mium3Ia3/LVra0/jMnP2c7sZq9O9yZz9rJqhOt37zNnPQTNUp7vPnP2cNEN1ukfM2Y9/cN7Fc+bshyPp6LAH3RkOpKPDHnRnOJCODnvQneFAOjrskf2D1/vhSDo67JF1AeWwR9YFlMMe2d95vR+OpKPDHlkXUA57ZF1AOeyRdQHlsEf2N17vhyPp6LBH1gWUwx5ZF1AOe2Rf8Ho/HElHhz2yLqAc9si6gHLYI7vm9X44ko4Oe2RdQDnskXUB5bBH1gWUwx5Z/ylfDntkXUA57JF1AeWwR/Y5r/fDkXR02CPrAsphj6wLKIc9ss94vR+OpKPDHlkXUA57ZF1AOeyRdQHlsEf2Ka/3w5F0dNgj6wLKYY+sCyiHPbJnvN4PR9LRYY+sCyiHPbIuoBz2yJ7yej8cSUeHPbIuoBz2yLqActgj6wLKYY/sE17vhyPp6LBH1gWUwx5ZF1AOe2R/5fV+OJKODntkXUA57JF1AeWwR/YXXu+HI+nosEfWBZTDHlkXUA57ZF1AOeyR/ZnX++FIOjrskXUB5bBH1gWUwx7Zn3i9H46ko8MeWRdQDntkXUA57JH9kdf74Ug6OuyRdQHlsEfWBZTDHlkXUA57ZH/g9X44ko4Oe2RdQDnskXUB5bBH9oTX++FIOjrskXUB5bBH1gWUwx7ZY17vhyPp6LBH1gWUwx5ZF1AOe2RdQDnskX3M6/1wJB0d9si6gHLYI+sCymGP7AwfZciRdHTYI+sCymGPrAsohz2y3/N6PxxJR4c9si6gHPbIuoBy2CM7wwL8QOddfMSc/Rw3Q3W6h8zZz0EzVKf7BXP2s2qG6nQ/Yc5+bjVDdbofMmc/V+KsGavT/C7eYM5teNAM1ml+xpTbcdW3olv5JN5mym252wzX1/sxM27Pxfi6Ga+v9st5Xv//Zi+Omkfof/so3mHCXbnhCib7bbzPfHOwt/nFmo/S1q/iXaabiwtxx3dEr/R5fBpvMtu87MUqTpsH619vOz+P95irhstxM+7H/uanwnnzZYzm+abC/qbGR3GJmabBgbqszYEua3Ogy9oc6LI2B7qszYEua3Ogy9oc6LI2B7qszYEua3Ogy9oc6LI2B7qszYEua3Ogy9oc6LKKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiMj/nj8BJ/L3xz/yZd4AAAAASUVORK5CYII="/>
+ </g>
+ <path d="M255.13 282.377h72v71.998h-72z"/>
+ <g transform="matrix(.375 0 0 .37499 255.13 282.377)">
+ <clipPath id="j">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#j)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAGhUlEQVR4Xu3XW6odVRCA4fVkxOgUNAafJM5G0fFICI7AeBlQ4IDiICQa8hgFT17ikaAHvsaURe3qjb3r+x9Xsaq7cztZa4wxxhhjjDHGGGOMMcYYY4wxxhhjjDH+8t76Yn2/rtbz9XK9Ongvb97yan23Pl/v+hnO46ObT//75jEvod/Wt+u+n2Nfb6+vLuD3/Ju6Xo/WHT/LXu6vnzYPdIn9uO75afbwyfpl8yiX2tP1wM/T7f76dfMYl9zTff8UvD1/+Wz6Yc9/C77arJ9erYd+pi4fXfhPPv/W9frQT9Xj+83q6XXf+Kk6vHeh/+36L71Yd/1cp/fFZu1022d+rtObv4De1A5/CV1tlk63PfFznd7zzdLptmd+rtObH0Hf1LWf6/RcaUfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caBHnq8nzbBHns5V5oUWcrybPs0Wcz1bmhRZxvpo8zxZxPluZF1rE+WryPFvE+WxlXmgR56vJ82wR57OVeaFFnK8mz7NFnM9W5oUWcb6aPM8WcT5bmRdaxPlq8jxbxPlsZV5oEeeryfNsEeezlXmhRZyvJs+zRZzPVuaFFnG+mjzPFnE+W5kXWsT5avI8W8T5bGVeaBHnq8nzbBHns5V5oUWcrybPs0Wcz1bmhRZxvpo8zxZxPluZF1rE+WryPFvE+WxlXmgR56vJ82wR562dCy3ifDV5ni3ivLVzoUWcrybPs0Wct3YutIjz1eR5tojz1s6FFnG+mjzPFnHe2rnQIs5Xk+fZIs5bOxdaxPlq8jxbxHlr50KLOF9NnmeLOG/tXGgR56vtzf3WzoUWcb7a3txv7VxoEeer7c391s6FFnG+2t7cb+1caBHnq+3N/dbOhRZxvtre3G/tXGgR56vtzf3WzoUWcb7a3txv7VxoEeeryfNsEeezlXmhRZyvJs+zRZzPVuaFFnG+mjzPFnE+W5kXWsT5avI8W8T5bGVeaBHnq8nzbBHns5V5oUWcrybPs0Wcz1bmhRZxvpo8zxZxPluZF1rE+WryPFvE+WxlXmjn5vNkizifrcwL7dx8nmwR57OVeaGdm8+TLeJ8tjIvtHPzebJFnM9W5oV2bj5Ptojz2cq80M7N58kWcT5bmRfaufk82SLOZyvzQjs3nydbxPlsZV5oEeeryfNsEeetnQst4nw1eZ4t4ry1c6FFnK8mz7NFnLd2LrSI89XkebaI89bOhRZxvpo8zxZx3tq50CLOV5Pn2SLOWzsXWsT5avI8W8R5a+dCizhfTZ5nizhv7VxoEeeryfNsEeetnQst4nw1eZ4t4ry1c6FFnK8mz7NFnLd2LrSI89XkebaI89bOhRZxvpo8zxZx3tq50CLOV5Pn2SLOWzsXWsT5avI8W8R5a+dCizhfTZ5nizhv7VxoEeeryfNsEeezlXmhRZyvJs+zRZzPVuaFFnG+mjzPFnE+W5kXWsT5avI8W8T5bGVeaBHnq8nzbBHns5V5oUWcrybPs0Wcz1bmhRZxvpo8zxZxPluZF1rE+WryPFvE+WxlXmgR56vJ82wR57OVeaFFnK8mz7NFnM9W5oUWcb6aPM8WcT5bmRdaxPlq8jxbxPlsZV5oEeeryfNsEeezlXmhRZyvJs+zRZzPVuaFFnG+mjzPFnE+W5kXWsT5avI8W8T5bGVeaEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1caEfn+1o7F9rR+b7WzoV2dL6vtXOhHZ3va+1eblZOt137uU7v+WbpdNszP9fpXW2WTrc98XOd3nebpdNtj/1cp/f5Zul026d+rtN7d/22WTu97sV6x8/V4dvN4ul1X/upety/+WHL1dOr9cf6wE/V5dFm+fRqfeln6nNn/bhZf+ldrbf8TJ3uraebR7jkfl7v+4m6PZhfgn/6eX3s59nDvfXD5lEusav9f/f/7c56eOE/Ef1x80/vrn/3b324vrn5D4gPdgm9uPm5f7cfPN/s7vrs5pfhyXp2AX8erm/e8sl6vD7d53+9Y4wxxhhjjDHGGGOMMcYYY4wxxhhjjP+/PwFFmy8hR66dpgAAAABJRU5ErkJggg=="/>
+ </g>
+ <path d="M255.13 348.612h72v35.244h-72z"/>
+ <path fill="#000" d="M265.69 375.532v-13.36h4.5q1.125 0 2.063.516.953.5 1.515 1.391.578.875.578 2.047 0 .719-.265 1.422-.266.687-.813 1.265-.547.579-1.406.922-.844.344-2.016.344h-3.328v-1.469h3.578q.703 0 1.297-.312.594-.328.969-.875.375-.563.375-1.297 0-.594-.313-1.156-.312-.563-.875-.922-.546-.36-1.328-.36h-2.953v11.844zm3.219-6.125 1.734-.094 4.219 6.141v.078h-1.86zm7.542 6.125v-9.515h1.578v9.515zm.781-11.265q-.469 0-.813-.329-.328-.343-.328-.812 0-.484.328-.813.344-.328.813-.328.484 0 .812.328.329.329.329.813 0 .469-.329.812-.328.329-.812.329m6.607 11.562q-1.063 0-1.875-.344t-1.344-.922q-.531-.593-.797-1.28l1.422-.641q.375.859 1.078 1.328.703.468 1.625.468.875 0 1.453-.359.594-.36.594-1.047 0-.422-.25-.703-.234-.297-.703-.5-.453-.219-1.125-.375l-1.156-.312q-.672-.188-1.281-.516-.594-.344-.954-.875-.359-.531-.359-1.297 0-.844.5-1.453.5-.625 1.313-.953.828-.328 1.765-.328.813 0 1.531.234.72.234 1.266.688.547.453.813 1.125l-1.375.64q-.36-.703-.954-.984-.593-.281-1.328-.281-.781 0-1.36.343-.577.344-.577.938t.469.906q.484.297 1.171.469l1.391.36q1.39.359 2.094 1.062.719.687.719 1.703 0 .89-.516 1.547-.5.656-1.36 1.015-.843.344-1.89.344m9.902 0q-1.406 0-2.5-.656-1.078-.672-1.703-1.813-.61-1.156-.61-2.578 0-1.469.61-2.594.625-1.14 1.703-1.796 1.094-.672 2.5-.672 1.61 0 2.64.734 1.032.734 1.47 1.89l-1.438.61q-.36-.89-1.063-1.344-.687-.453-1.687-.453-.828 0-1.547.453-.719.438-1.172 1.25t-.453 1.922q0 1.078.453 1.906.453.813 1.172 1.266.719.438 1.547.438 1.016 0 1.734-.47.735-.468 1.094-1.312l1.406.594q-.468 1.094-1.515 1.86-1.032.765-2.64.765m5.858-5.422v-1.312h5.922v1.312zm11.698 5.125-4.734-13.36h1.75l3.297 9.688.453 1.328h.078l.469-1.328 3.437-9.687h1.766l-4.89 13.36z"/>
+ <path fill="#2bb7f6" d="M281.885 253.705h8.637v-46.724h17.276v46.724h8.638l-17.276 17.276z" fill-rule="evenodd"/>
+ <path d="M638.65 282.377h72v72h-72z"/>
+ <g transform="translate(638.65 282.377)scale(.375)">
+ <clipPath id="k">
+ <path d="M0 0h192v192H0z" clip-rule="evenodd"/>
+ </clipPath>
+ <image clip-path="url(#k)" fill="#000" width="192" height="192" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAEWElEQVR4Xu3dTW4dVRRF4dsKQSQjQEIKdg+JDIMRJAqToYlwJPpGzjwYgqV0gmkxAYis8I8D2PyE6tBZF5+qevvypHLWt/r7leoksYOQ05okSZIkSZIkSZIkSZIkSZIkSXo93W0ftpP2tH3brtqr17yr9mJ6Eyft0fRW9uKwPWm/do9hr9rL6c0c8nWNdbsd+Wu+7Ko9nt7S/+Re+6L7QOs7awd8dSO8177pPsr+u/N2n68v9U77uvsYu77zsb8Lbk1f5/kRVnc28mvBR928zXfE17irt9tv3bjNdzXqj6FPu2lb1glf5S5uTX/f5bAt66Ld4etc74Nu1pb3kK9zvU+6UVveMV/nep93o7a8U77O9b7qRm1553yd6/kfIJIu+TrX83ugrNh33aStKeYBsmIeICvmAbJi33eTtqaYB8iKeYCsmAfIinmArNgP3aStKeYBsmIeICvmAbJiHiAr9mM3aWuKeYCsmAfIinmArJgHyIr91E3ammIeICvmAbJiHiArNneArRn9/NxjsZ+7ycEfsGejn597LOYBatxjMQ9Q4x6LeYAa91jsl25y8Afs2ejn5x6LeYAa91jMA9S4x2IeoMY9FvMANe6x2EU3OfgD9mz083OPxTxAjXss5gFq3GMxD1DjHot5gBr3WOxlNzn4A/Zs9PNzj8U8QI17LOYBatxjMQ9Q4x6LeYAa91hs7scUb83o5+cei3mAGvdYzAPUuMdiHqDGPRbzADXusdjcD23dmtHPzz0W8wA17rGYB6hxj8U8QI17LPZ7Nzn4A/Zs9PNzj8U8QI17LOYBatxjsbkDbL0U91jMA9S4x2KX3eTNKsU9FvMANe6xmAeocY/FPECNeyzmAWrcY7Gb/o93prjHYnMH2JrRz889FvMANe6xmAeocY/FPECNeyz2Rzc5+AP2bPTzc4/FPECNeyzmAWrcYzEPUOMei3mAGvdY7M9ucvAH7Nno5+cei3mAGvdYzAPUuMdiHqDGPRb7q5sc/AF7Nvr5ucdiHqDGPRbzADXusZgHqHGPxTxAjXss9nc3OfgD9mz083OPxTxAjXss5gFq3GMxD1DjHot5gBr3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WIyDbGtGPz/3WGzuf861qku+zvVedKO2vHO+zvWedqO2vFO+zvVOulFb3jFf53qPulFb3gO+zvXuzv7sXLuui/YWX+cunnTDtqzP+Cp3c+i3ojt12d7lq9zV427c5vuYr3F3b7Yvu3mre9be4GtMHEx/peBH2PU9b/f4ClP3PcHinrf3+fpGOGhn3UdZ37Pxv/r/dbsd+R1R2eX0pXfon/29g3Yy+2+LvZ5dTN/3D/vGs3anPWzH7XT6qnDTf5zTfJfTWzid3saDMX/rlSRJkiRJkiRJkiRJkiRJkiRJ2/MPBUHxvBiv7XcAAAAASUVORK5CYII="/>
+ </g>
+ <path d="M638.65 348.612h79.37v35.244h-79.37z"/>
+ <path fill="#000" d="m656.406 375.532-3.625-13.36h1.766l2.422 9.813.219.922h.078l.281-.922 2.984-9.812h1.641l2.86 9.812.265.922h.078l.235-.922 2.406-9.812h1.75l-3.61 13.36h-1.64l-2.828-9.657-.297-1.047h-.078l-.313 1.047-2.953 9.656zm17.146.297q-1.062 0-1.875-.406-.796-.406-1.25-1.125t-.453-1.64q0-1.048.532-1.766.546-.72 1.453-1.079.922-.359 2.015-.359.641 0 1.172.11.547.093.938.234.406.14.625.265v-.578q0-1.078-.766-1.703-.766-.64-1.875-.64-.781 0-1.469.343-.672.344-1.062.953l-1.203-.89q.375-.563.937-.969t1.281-.625q.72-.234 1.516-.234 1.938 0 3.031 1.03 1.11 1.017 1.11 2.75v6.032h-1.5v-1.36h-.078q-.25.407-.704.798-.437.375-1.046.61-.61.25-1.329.25m.141-1.39q.828 0 1.5-.407.688-.422 1.094-1.11.422-.687.422-1.515-.438-.297-1.078-.484-.641-.188-1.407-.188-1.359 0-2 .563-.64.562-.64 1.375 0 .781.593 1.281.61.484 1.516.484m9.954 1.39q-1.063 0-1.875-.344t-1.344-.922q-.531-.593-.797-1.28l1.422-.641q.375.859 1.078 1.328.703.468 1.625.468.875 0 1.453-.359.594-.36.594-1.047 0-.422-.25-.703-.234-.297-.703-.5-.453-.219-1.125-.375l-1.156-.312q-.672-.188-1.281-.516-.594-.344-.954-.875-.359-.531-.359-1.297 0-.844.5-1.453.5-.625 1.313-.953.828-.328 1.765-.328.813 0 1.531.234.72.234 1.266.688.547.453.813 1.125l-1.375.64q-.36-.703-.954-.984-.593-.281-1.328-.281-.781 0-1.36.343-.577.344-.577.938t.469.906q.484.297 1.171.469l1.391.36q1.39.359 2.094 1.062.719.687.719 1.703 0 .89-.516 1.547-.5.656-1.36 1.015-.843.344-1.89.344m5.403-.297v-9.515h1.515v1.406h.079q.25-.469.703-.844.468-.39 1.047-.625.593-.234 1.218-.234 1.063 0 1.828.515.766.516 1.094 1.328.485-.796 1.297-1.312.828-.531 1.969-.531 1.703 0 2.5 1.03.797 1.017.797 2.688v6.094h-1.563v-5.86q0-1.374-.562-1.937-.563-.578-1.578-.578-.735 0-1.313.422-.562.422-.89 1.11-.313.671-.313 1.468v5.375h-1.594v-5.844q0-1.375-.562-1.953t-1.563-.578q-.734 0-1.297.438-.562.422-.89 1.11-.328.687-.328 1.5v5.327z"/>
+ </g>
+</svg>
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index b21a283..6a6273a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -5145,7 +5145,7 @@
required Type knownType,
bool matchFailsIfWrongType = true,
bool matchMayFailEvenIfCorrectType = false}) {
- if (knownType is SharedInvalidType) {
+ if (knownType is SharedInvalidTypeStructure) {
_unmatched = _join(_unmatched!, _current);
return false;
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 0b7f11e..3ba6203 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -8047,6 +8047,42 @@
);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+ templateImplicitSuperInitializerMissingArguments =
+ const Template<Message Function(String name)>(
+ "ImplicitSuperInitializerMissingArguments",
+ problemMessageTemplate:
+ r"""The implicitly called unnamed constructor from '#name' has required parameters.""",
+ correctionMessageTemplate:
+ r"""Try adding an explicit super initializer with the required arguments.""",
+ withArguments: _withArgumentsImplicitSuperInitializerMissingArguments,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+ codeImplicitSuperInitializerMissingArguments =
+ const Code<Message Function(String name)>(
+ "ImplicitSuperInitializerMissingArguments",
+ analyzerCodes: <String>["IMPLICIT_SUPER_INITIALIZER_MISSING_ARGUMENTS"],
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsImplicitSuperInitializerMissingArguments(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(
+ codeImplicitSuperInitializerMissingArguments,
+ problemMessage:
+ """The implicitly called unnamed constructor from '${name}' has required parameters.""",
+ correctionMessage:
+ """Try adding an explicit super initializer with the required arguments.""",
+ arguments: {
+ 'name': name,
+ },
+ );
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeImportAfterPart = messageImportAfterPart;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9120,41 +9156,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name, Uri uri_)>
- templateInternalProblemUnfinishedTypeVariable =
- const Template<Message Function(String name, Uri uri_)>(
- "InternalProblemUnfinishedTypeVariable",
- problemMessageTemplate:
- r"""Unfinished type variable '#name' found in non-source library '#uri'.""",
- withArguments: _withArgumentsInternalProblemUnfinishedTypeVariable,
-);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, Uri uri_)>
- codeInternalProblemUnfinishedTypeVariable =
- const Code<Message Function(String name, Uri uri_)>(
- "InternalProblemUnfinishedTypeVariable",
- severity: Severity.internalProblem,
-);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsInternalProblemUnfinishedTypeVariable(
- String name, Uri uri_) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- String? uri = relativizeUri(uri_);
- return new Message(
- codeInternalProblemUnfinishedTypeVariable,
- problemMessage:
- """Unfinished type variable '${name}' found in non-source library '${uri}'.""",
- arguments: {
- 'name': name,
- 'uri': uri_,
- },
- );
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String string, String string2)>
templateInternalProblemUnhandled =
const Template<Message Function(String string, String string2)>(
@@ -12095,6 +12096,19 @@
);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeMissingNamedSuperConstructorParameter =
+ messageMissingNamedSuperConstructorParameter;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageMissingNamedSuperConstructorParameter =
+ const MessageCode(
+ "MissingNamedSuperConstructorParameter",
+ analyzerCodes: <String>["SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED"],
+ problemMessage:
+ r"""The super constructor has no corresponding named parameter.""",
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeMissingOperatorKeyword = messageMissingOperatorKeyword;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -12136,6 +12150,21 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeMissingPositionalSuperConstructorParameter =
+ messageMissingPositionalSuperConstructorParameter;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageMissingPositionalSuperConstructorParameter =
+ const MessageCode(
+ "MissingPositionalSuperConstructorParameter",
+ analyzerCodes: <String>[
+ "SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL"
+ ],
+ problemMessage:
+ r"""The super constructor has no corresponding positional parameter.""",
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeMissingPrefixInDeferredImport =
messageMissingPrefixInDeferredImport;
@@ -16256,7 +16285,6 @@
const Code<Message Function(String name)> codeThisAccessInFieldInitializer =
const Code<Message Function(String name)>(
"ThisAccessInFieldInitializer",
- analyzerCodes: <String>["THIS_ACCESS_FROM_FIELD_INITIALIZER"],
);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index 992404b..a0fea03 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -1149,8 +1149,8 @@
@override
void endOptionalFormalParameters(
- int count, Token beginToken, Token endToken) {
- listener?.endOptionalFormalParameters(count, beginToken, endToken);
+ int count, Token beginToken, Token endToken, MemberKind kind) {
+ listener?.endOptionalFormalParameters(count, beginToken, endToken, kind);
}
@override
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 435134a..d96dfe2 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -1332,7 +1332,7 @@
void beginOptionalFormalParameters(Token token) {}
void endOptionalFormalParameters(
- int count, Token beginToken, Token endToken) {
+ int count, Token beginToken, Token endToken, MemberKind kind) {
logEvent("OptionalFormalParameters");
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index aa9a3ee..4f37e6e 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -2248,7 +2248,7 @@
}
token = token.next!;
assert(optional(']', token));
- listener.endOptionalFormalParameters(parameterCount, begin, token);
+ listener.endOptionalFormalParameters(parameterCount, begin, token, kind);
return token;
}
@@ -2299,7 +2299,7 @@
}
token = token.next!;
assert(optional('}', token));
- listener.endOptionalFormalParameters(parameterCount, begin, token);
+ listener.endOptionalFormalParameters(parameterCount, begin, token, kind);
return token;
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
index a775270..f44f6af 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
@@ -142,10 +142,11 @@
final bool inRecoveryOption;
int recoveryCount = 0;
+ final bool allowLazyStrings;
AbstractScanner(ScannerConfiguration? config, this.includeComments,
this.languageVersionChanged,
- {int? numberOfBytesHint})
+ {int? numberOfBytesHint, this.allowLazyStrings = true})
: lineStarts = new LineStarts(numberOfBytesHint),
inRecoveryOption = false {
this.tail = this.tokens;
@@ -159,7 +160,8 @@
: lineStarts = [],
includeComments = false,
languageVersionChanged = null,
- inRecoveryOption = true {
+ inRecoveryOption = true,
+ allowLazyStrings = true {
this.tail = this.tokens;
this.errorTail = this.tokens;
this._enableExtensionMethods = copyFrom._enableExtensionMethods;
@@ -265,7 +267,8 @@
*/
void appendSubstringToken(TokenType type, int start, bool asciiOnly,
[int extraOffset = 0]) {
- appendToken(createSubstringToken(type, start, asciiOnly, extraOffset));
+ appendToken(createSubstringToken(
+ type, start, asciiOnly, extraOffset, allowLazyStrings));
}
/**
@@ -277,9 +280,8 @@
* Note that [extraOffset] can only be used if the covered character(s) are
* known to be ASCII.
*/
- analyzer.StringToken createSubstringToken(
- TokenType type, int start, bool asciiOnly,
- [int extraOffset = 0]);
+ analyzer.StringToken createSubstringToken(TokenType type, int start,
+ bool asciiOnly, int extraOffset, bool allowLazy);
/**
* Appends a substring from the scan offset [start] to the current
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/scanner.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/scanner.dart
index 2505efa..f76528d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/scanner.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/scanner.dart
@@ -71,14 +71,16 @@
ScannerResult scan(Uint8List bytes,
{ScannerConfiguration? configuration,
bool includeComments = false,
- LanguageVersionChanged? languageVersionChanged}) {
+ LanguageVersionChanged? languageVersionChanged,
+ bool allowLazyStrings = true}) {
if (bytes.last != 0) {
throw new ArgumentError("[bytes]: the last byte must be 0.");
}
Scanner scanner = new Utf8BytesScanner(bytes,
configuration: configuration,
includeComments: includeComments,
- languageVersionChanged: languageVersionChanged);
+ languageVersionChanged: languageVersionChanged,
+ allowLazyStrings: allowLazyStrings);
return _tokenizeAndRecover(scanner, bytes: bytes);
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/string_scanner.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/string_scanner.dart
index 2b89816..6646339 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/string_scanner.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/string_scanner.dart
@@ -86,12 +86,13 @@
void handleUnicode(int startScanOffset) {}
@override
- analyzer.StringToken createSubstringToken(
- TokenType type, int start, bool asciiOnly,
- [int extraOffset = 0]) {
+ analyzer.StringToken createSubstringToken(TokenType type, int start,
+ bool asciiOnly, int extraOffset, bool allowLazy) {
return new StringTokenImpl.fromSubstring(
type, string, start, scanOffset + extraOffset, tokenStart,
- canonicalize: true, precedingComments: comments);
+ canonicalize: true,
+ precedingComments: comments,
+ allowLazyFoo: allowLazy);
}
@override
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/token_impl.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/token_impl.dart
index ecaa879..980a30d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/token_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/token_impl.dart
@@ -35,7 +35,7 @@
*/
static const int LAZY_THRESHOLD = 4;
- dynamic /* String | LazySubstring */ valueOrLazySubstring;
+ late Object /* String | LazySubstring */ valueOrLazySubstring;
/**
* Creates a non-lazy string token. If [canonicalize] is true, the string
@@ -52,10 +52,12 @@
*/
StringTokenImpl.fromSubstring(
TokenType type, String data, int start, int end, int charOffset,
- {bool canonicalize = false, CommentToken? precedingComments})
+ {bool canonicalize = false,
+ CommentToken? precedingComments,
+ bool allowLazyFoo = true})
: super(type, charOffset, precedingComments) {
int length = end - start;
- if (length <= LAZY_THRESHOLD) {
+ if (!allowLazyFoo || length <= LAZY_THRESHOLD) {
valueOrLazySubstring = canonicalize
? canonicalizeSubString(data, start, end)
: data.substring(start, end);
@@ -71,10 +73,10 @@
*/
StringTokenImpl.fromUtf8Bytes(TokenType type, Uint8List data, int start,
int end, bool asciiOnly, int charOffset,
- {CommentToken? precedingComments})
+ {CommentToken? precedingComments, bool allowLazyFoo = true})
: super(type, charOffset, precedingComments) {
int length = end - start;
- if (length <= LAZY_THRESHOLD) {
+ if (!allowLazyFoo || length <= LAZY_THRESHOLD) {
valueOrLazySubstring =
canonicalizeUtf8SubString(data, start, end, asciiOnly);
} else {
@@ -83,27 +85,7 @@
}
@override
- String get lexeme {
- if (valueOrLazySubstring is String) {
- return valueOrLazySubstring;
- } else {
- assert(valueOrLazySubstring is _LazySubstring);
- dynamic data = valueOrLazySubstring.data;
- int start = valueOrLazySubstring.start;
- int end = start + (valueOrLazySubstring as _LazySubstring).length;
- if (data is String) {
- final bool canonicalize = valueOrLazySubstring.boolValue;
- valueOrLazySubstring = canonicalize
- ? canonicalizeSubString(data, start, end)
- : data.substring(start, end);
- } else {
- final bool isAscii = valueOrLazySubstring.boolValue;
- valueOrLazySubstring =
- canonicalizeUtf8SubString(data, start, end, isAscii);
- }
- return valueOrLazySubstring;
- }
- }
+ String get lexeme => valueOrLazySubstring = valueOrLazySubstring.toString();
@override
bool get isIdentifier => identical(kind, IDENTIFIER_TOKEN);
@@ -194,7 +176,7 @@
*/
abstract class _LazySubstring {
/** The original data, either a string or a Uint8List */
- get data;
+ Object get data;
int get start;
int get length;
@@ -211,7 +193,7 @@
_LazySubstring.internal();
- factory _LazySubstring(data, int start, int length, bool b) {
+ factory _LazySubstring(Object data, int start, int length, bool b) {
// See comment on [CompactLazySubstring].
if (start < 0x100000 && length < 0x200) {
int fields = (start << 9);
@@ -223,6 +205,25 @@
return new _FullLazySubstring(data, start, length, b);
}
}
+
+ String _resolve() {
+ Object data = this.data;
+ int start = this.start;
+ int end = start + this.length;
+ if (data is String) {
+ final bool canonicalize = this.boolValue;
+ return canonicalize
+ ? canonicalizeSubString(data, start, end)
+ : data.substring(start, end);
+ } else {
+ final Uint8List bytes = data as Uint8List;
+ final bool isAscii = this.boolValue;
+ return canonicalizeUtf8SubString(bytes, start, end, isAscii);
+ }
+ }
+
+ @override
+ String toString() => _resolve();
}
/**
@@ -234,7 +235,7 @@
*/
class _CompactLazySubstring extends _LazySubstring {
@override
- final dynamic data;
+ final Object data;
final int fields;
_CompactLazySubstring(this.data, this.fields) : super.internal();
@@ -249,7 +250,7 @@
class _FullLazySubstring extends _LazySubstring {
@override
- final dynamic data;
+ final Object data;
@override
final int start;
@override
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/utf8_bytes_scanner.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/utf8_bytes_scanner.dart
index bba4d72..764ea95e 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/utf8_bytes_scanner.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/utf8_bytes_scanner.dart
@@ -97,9 +97,11 @@
Utf8BytesScanner(this.bytes,
{ScannerConfiguration? configuration,
bool includeComments = false,
- LanguageVersionChanged? languageVersionChanged})
+ LanguageVersionChanged? languageVersionChanged,
+ bool allowLazyStrings = true})
: super(configuration, includeComments, languageVersionChanged,
- numberOfBytesHint: bytes.length) {
+ numberOfBytesHint: bytes.length,
+ allowLazyStrings: allowLazyStrings) {
assert(bytes.last == 0);
// Skip a leading BOM.
if (containsBomAt(/* offset = */ 0)) {
@@ -241,12 +243,11 @@
}
@override
- analyzer.StringToken createSubstringToken(
- TokenType type, int start, bool asciiOnly,
- [int extraOffset = 0]) {
+ analyzer.StringToken createSubstringToken(TokenType type, int start,
+ bool asciiOnly, int extraOffset, bool allowLazy) {
return new StringTokenImpl.fromUtf8Bytes(
type, bytes, start, byteOffset + extraOffset, asciiOnly, tokenStart,
- precedingComments: comments);
+ precedingComments: comments, allowLazyFoo: allowLazy);
}
@override
diff --git a/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart b/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart
index d99c777..1ccdf14 100644
--- a/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/type_inference/shared_inference_log.dart
@@ -121,7 +121,9 @@
/// This class defines methods that the analyzer or CFE can use to instrument
/// their type inference logic. The implementations are found in
/// [SharedInferenceLogWriterImpl].
-abstract interface class SharedInferenceLogWriter<Type extends SharedType<Type>,
+abstract interface class SharedInferenceLogWriter<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Type extends SharedTypeStructure<Type>,
TypeParameter extends Object> {
/// If [inProgress] is `true`, verifies that generic type inference is in
/// progress; otherwise, verifies that generic type inference is not in
@@ -238,7 +240,7 @@
/// type schema to another.
void recordGeneratedConstraint(
TypeParameter parameter,
- MergedTypeConstraint<Type, Type, TypeParameter, Object, Type, Object>
+ MergedTypeConstraint<TypeStructure, TypeParameter, Object, Type, Object>
constraint);
/// Records that type inference has resolved a method name.
@@ -266,9 +268,11 @@
/// from classes derived from [SharedInferenceLogWriterImpl], but these methods
/// are not exposed in [SharedInferenceLogWriter] so that they won't be called
/// accidentally on their own.
-abstract class SharedInferenceLogWriterImpl<Type extends SharedType<Type>,
+abstract class SharedInferenceLogWriterImpl<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Type extends SharedTypeStructure<Type>,
TypeParameter extends Object>
- implements SharedInferenceLogWriter<Type, TypeParameter> {
+ implements SharedInferenceLogWriter<TypeStructure, Type, TypeParameter> {
/// A stack of [State] objects representing the calls that have been made to
/// `enter...` methods without any matched `exit...` method.
///
@@ -685,7 +689,7 @@
@override
void recordGeneratedConstraint(
TypeParameter parameter,
- MergedTypeConstraint<Type, Type, TypeParameter, Object, Type, Object>
+ MergedTypeConstraint<TypeStructure, TypeParameter, Object, Type, Object>
constraint) {
checkCall(
method: 'recordGeneratedConstraint',
diff --git a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analysis_result.dart b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analysis_result.dart
index 0c1030b..336b486 100644
--- a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analysis_result.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analysis_result.dart
@@ -2,12 +2,14 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import '../types/shared_type.dart';
import 'type_analyzer.dart';
/// Result for analyzing an assigned variable pattern in
/// [TypeAnalyzer.analyzeAssignedVariablePattern].
-class AssignedVariablePatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class AssignedVariablePatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// Error for when a variable was assigned multiple times within a pattern.
final Error? duplicateAssignmentPatternVariableError;
@@ -23,10 +25,11 @@
/// Result for analyzing a constant pattern in
/// [TypeAnalyzer.analyzeConstantPattern].
-class ConstantPatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class ConstantPatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// The static type of the constant expression.
- final Type expressionType;
+ final SharedTypeView<TypeStructure> expressionType;
/// Error for when the pattern occurred in an irrefutable context.
final Error? refutablePatternInIrrefutableContextError;
@@ -44,10 +47,11 @@
/// Result for analyzing a declared variable pattern in
/// [TypeAnalyzer.analyzeDeclaredVariablePattern].
-class DeclaredVariablePatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class DeclaredVariablePatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// The static type of the variable.
- final Type staticType;
+ final SharedTypeView<TypeStructure> staticType;
/// Error for when the matched value type is not assignable to the static
/// type in an irrefutable context.
@@ -64,7 +68,8 @@
/// This class keeps track of a provisional type of the expression (prior to
/// resolving null shorting) as well as the information necessary to resolve
/// null shorting.
-abstract class ExpressionTypeAnalysisResult<Type extends Object> {
+abstract class ExpressionTypeAnalysisResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>> {
/// Type of the expression before resolving null shorting.
///
/// For example, if `this` is the result of analyzing `(... as int?)?.isEven`,
@@ -72,7 +77,7 @@
/// `bool`, and it is not yet known (until looking at the surrounding code)
/// whether there will be additional selectors after `isEven` that should act
/// on the `bool` type.
- Type get provisionalType;
+ SharedTypeView<TypeStructure> get provisionalType;
/// Resolves any pending null shorting. For example, if `this` is the result
/// of analyzing `(... as int?)?.isEven`, then calling [resolveShorting] will
@@ -81,21 +86,22 @@
///
/// TODO(paulberry): document what calls back to the client might be made by
/// invoking this method.
- Type resolveShorting();
+ SharedTypeView<TypeStructure> resolveShorting();
}
/// Result for analyzing an if-case statement or element in
/// [TypeAnalyzer.analyzeIfCaseStatement] and
/// [TypeAnalyzer.analyzeIfCaseElement].
-class IfCaseStatementResult<Type extends Object, Error> {
+class IfCaseStatementResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>, Error> {
/// The static type of the matched expression.
- final Type matchedExpressionType;
+ final SharedTypeView<TypeStructure> matchedExpressionType;
/// Error for when the guard has a non-bool type.
final Error? nonBooleanGuardError;
/// The type of the guard expression, if present.
- final Type? guardType;
+ final SharedTypeView<TypeStructure>? guardType;
IfCaseStatementResult(
{required this.matchedExpressionType,
@@ -104,8 +110,9 @@
}
/// Container for the result of running type analysis on an integer literal.
-class IntTypeAnalysisResult<Type extends Object>
- extends SimpleTypeAnalysisResult<Type> {
+class IntTypeAnalysisResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ extends SimpleTypeAnalysisResult<TypeStructure> {
/// Whether the integer literal was converted to a double.
final bool convertedToDouble;
@@ -113,10 +120,11 @@
}
/// Result for analyzing a list pattern in [TypeAnalyzer.analyzeListPattern].
-class ListPatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class ListPatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// The required type of the list pattern.
- final Type requiredType;
+ final SharedTypeView<TypeStructure> requiredType;
/// Errors for when multiple rest patterns occurred within the list pattern.
///
@@ -138,8 +146,9 @@
/// Result for analyzing a logical or pattern in
/// [TypeAnalyzer.analyzeLogicalOrPattern].
-class LogicalOrPatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class LogicalOrPatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// Error for when the pattern occurred in an irrefutable context.
final Error? refutablePatternInIrrefutableContextError;
@@ -149,17 +158,18 @@
}
/// Result for analyzing a pattern in [TypeAnalyzer].
-class PatternResult<Type extends Object> {
+class PatternResult<TypeStructure extends SharedTypeStructure<TypeStructure>> {
/// The matched value type that was used to type check the pattern.
- final Type matchedValueType;
+ final SharedTypeView<TypeStructure> matchedValueType;
PatternResult({required this.matchedValueType});
}
/// Result for analyzing a map pattern in [TypeAnalyzer.analyzeMapPattern].
-class MapPatternResult<Type extends Object, Error> extends PatternResult<Type> {
+class MapPatternResult<TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// The required type of the map pattern.
- final Type requiredType;
+ final SharedTypeView<TypeStructure> requiredType;
/// Error for when the matched value type is not assignable to the required
/// type in an irrefutable context.
@@ -269,8 +279,9 @@
/// Result for analyzing a null check or null assert pattern in
/// [TypeAnalyzer.analyzeNullCheckOrAssertPattern].
-class NullCheckOrAssertPatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class NullCheckOrAssertPatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// Error for when the pattern occurred in an irrefutable context.
final Error? refutablePatternInIrrefutableContextError;
@@ -285,10 +296,11 @@
/// Result for analyzing an object pattern in
/// [TypeAnalyzer.analyzeObjectPattern].
-class ObjectPatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class ObjectPatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// The required type of the object pattern.
- final Type requiredType;
+ final SharedTypeView<TypeStructure> requiredType;
/// Errors for when the same property name was used multiple times in the
/// object pattern.
@@ -310,10 +322,11 @@
}
/// Container for the result of running type analysis on a pattern assignment.
-class PatternAssignmentAnalysisResult<Type extends Object,
- TypeSchema extends Object> extends SimpleTypeAnalysisResult<Type> {
+class PatternAssignmentAnalysisResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ extends SimpleTypeAnalysisResult<TypeStructure> {
/// The type schema of the pattern on the left hand size of the assignment.
- final TypeSchema patternSchema;
+ final SharedTypeSchemaView<TypeStructure> patternSchema;
PatternAssignmentAnalysisResult({
required this.patternSchema,
@@ -323,13 +336,13 @@
/// Container for the result of running type analysis on a pattern variable
/// declaration.
-class PatternVariableDeclarationAnalysisResult<Type extends Object,
- TypeSchema extends Object> {
+class PatternVariableDeclarationAnalysisResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>> {
/// The type schema of the pattern on the left hand size of the declaration.
- final TypeSchema patternSchema;
+ final SharedTypeSchemaView<TypeStructure> patternSchema;
/// The type of the initializer expression.
- final Type initializerType;
+ final SharedTypeView<TypeStructure> initializerType;
PatternVariableDeclarationAnalysisResult({
required this.patternSchema,
@@ -339,12 +352,13 @@
/// Result for analyzing a pattern-for-in statement or element in
/// [TypeAnalyzer.analyzePatternForIn].
-class PatternForInResult<Type extends Object, Error> {
+class PatternForInResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>, Error> {
/// The static type of the elements of the for in expression.
- final Type elementType;
+ final SharedTypeView<TypeStructure> elementType;
/// The static type of the collection of elements of the for in expression.
- final Type expressionType;
+ final SharedTypeView<TypeStructure> expressionType;
/// Error for when the expression is not an iterable.
final Error? patternForInExpressionIsNotIterableError;
@@ -357,10 +371,11 @@
/// Result for analyzing a record pattern in
/// [TypeAnalyzer.analyzeRecordPattern].
-class RecordPatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class RecordPatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// The required type of the record pattern.
- final Type requiredType;
+ final SharedTypeView<TypeStructure> requiredType;
/// Errors for when the same property name was used multiple times in the
/// record pattern.
@@ -383,10 +398,11 @@
/// Result for analyzing a relational pattern in
/// [TypeAnalyzer.analyzeRelationalPattern].
-class RelationalPatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class RelationalPatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// The static type of the operand.
- final Type operandType;
+ final SharedTypeView<TypeStructure> operandType;
/// Error for when the pattern occurred in an irrefutable context.
final Error? refutablePatternInIrrefutableContextError;
@@ -408,24 +424,26 @@
/// Container for the result of running type analysis on an expression that does
/// not contain any null shorting.
-class SimpleTypeAnalysisResult<Type extends Object>
- implements ExpressionTypeAnalysisResult<Type> {
+class SimpleTypeAnalysisResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ implements ExpressionTypeAnalysisResult<TypeStructure> {
/// The static type of the expression.
- final Type type;
+ final SharedTypeView<TypeStructure> type;
SimpleTypeAnalysisResult({required this.type});
@override
- Type get provisionalType => type;
+ SharedTypeView<TypeStructure> get provisionalType => type;
@override
- Type resolveShorting() => type;
+ SharedTypeView<TypeStructure> resolveShorting() => type;
}
/// Result for analyzing a switch expression in
/// [TypeAnalyzer.analyzeSwitchExpression].
-class SwitchExpressionResult<Type extends Object, Error>
- extends SimpleTypeAnalysisResult<Type> {
+class SwitchExpressionResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends SimpleTypeAnalysisResult<TypeStructure> {
/// Errors for non-bool guards.
///
/// The key is the case index of the erroneous guard.
@@ -438,7 +456,7 @@
/// The key is the case index of the guard.
///
/// This is `null` if no such guards where present.
- final Map<int, Type>? guardTypes;
+ final Map<int, SharedTypeView<TypeStructure>>? guardTypes;
SwitchExpressionResult(
{required super.type,
@@ -447,7 +465,8 @@
}
/// Container for the result of running type analysis on an integer literal.
-class SwitchStatementTypeAnalysisResult<Type extends Object, Error> {
+class SwitchStatementTypeAnalysisResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>, Error> {
/// Whether the switch statement had a `default` clause.
final bool hasDefault;
@@ -466,7 +485,7 @@
final bool requiresExhaustivenessValidation;
/// The static type of the scrutinee expression.
- final Type scrutineeType;
+ final SharedTypeView<TypeStructure> scrutineeType;
/// Errors for the cases that don't complete normally.
///
@@ -485,7 +504,7 @@
/// The keys of the maps are case and head indices of the guard.
///
/// This is `null` if no such guards where present.
- final Map<int, Map<int, Type>>? guardTypes;
+ final Map<int, Map<int, SharedTypeView<TypeStructure>>>? guardTypes;
SwitchStatementTypeAnalysisResult({
required this.hasDefault,
@@ -513,8 +532,9 @@
/// Result for analyzing a wildcard pattern
/// [TypeAnalyzer.analyzeWildcardPattern].
-class WildcardPatternResult<Type extends Object, Error>
- extends PatternResult<Type> {
+class WildcardPatternResult<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Error> extends PatternResult<TypeStructure> {
/// Error for when the matched value type is not assignable to the wildcard
/// type in an irrefutable context.
final Error? patternTypeMismatchInIrrefutableContextError;
diff --git a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart
index 93e847d..e41a822 100644
--- a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer.dart
@@ -130,10 +130,11 @@
}
/// Information about a relational operator.
-class RelationalOperatorResolution<Type extends SharedType<Type>> {
+class RelationalOperatorResolution<
+ TypeStructure extends SharedTypeStructure<TypeStructure>> {
final RelationalOperatorKind kind;
- final Type parameterType;
- final Type returnType;
+ final SharedTypeView<TypeStructure> parameterType;
+ final SharedTypeView<TypeStructure> returnType;
RelationalOperatorResolution({
required this.kind,
@@ -261,26 +262,26 @@
/// of each entry in order to verify that when an entity is popped, it has the
/// expected kind.
mixin TypeAnalyzer<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
Node extends Object,
Statement extends Node,
Expression extends Node,
Variable extends Object,
- Type extends SharedType<Type>,
Pattern extends Node,
Error,
- TypeSchema extends SharedType<TypeSchema>,
InferableParameter extends Object,
TypeDeclarationType extends Object,
TypeDeclaration extends Object> {
- TypeAnalyzerErrors<Node, Statement, Expression, Variable, Type, Pattern,
- Error> get errors;
+ TypeAnalyzerErrors<Node, Statement, Expression, Variable,
+ SharedTypeView<TypeStructure>, Pattern, Error> get errors;
/// Returns the client's [FlowAnalysis] object.
- FlowAnalysis<Node, Statement, Expression, Variable, Type> get flow;
+ FlowAnalysis<Node, Statement, Expression, Variable,
+ SharedTypeView<TypeStructure>> get flow;
/// The [TypeAnalyzerOperations], used to access types, check subtyping, and
/// query variable types.
- TypeAnalyzerOperations<Variable, Type, TypeSchema, InferableParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration> get operations;
/// Options affecting the behavior of [TypeAnalyzer].
@@ -299,11 +300,14 @@
/// [analyzeDeclaredVariablePattern] should be used instead.
///
/// Stack effect: none.
- AssignedVariablePatternResult<Type, Error> analyzeAssignedVariablePattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
- Pattern node,
- Variable variable) {
- Type matchedValueType = flow.getMatchedValueType();
+ AssignedVariablePatternResult<TypeStructure, Error>
+ analyzeAssignedVariablePattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
+ Pattern node,
+ Variable variable) {
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
Error? duplicateAssignmentPatternVariableError;
Map<Variable, Pattern>? assignedVariables = context.assignedVariables;
if (assignedVariables != null) {
@@ -320,14 +324,15 @@
}
}
- Type variableDeclaredType = operations.variableType(variable);
+ SharedTypeView<TypeStructure> variableDeclaredType =
+ operations.variableType(variable);
Node? irrefutableContext = context.irrefutableContext;
assert(irrefutableContext != null,
'Assigned variables must only appear in irrefutable pattern contexts');
Error? patternTypeMismatchInIrrefutableContextError;
if (irrefutableContext != null &&
- matchedValueType is! SharedDynamicType &&
- matchedValueType is! SharedInvalidType &&
+ matchedValueType is! SharedDynamicTypeStructure &&
+ matchedValueType is! SharedInvalidTypeStructure &&
!operations.isSubtypeOf(matchedValueType, variableDeclaredType)) {
patternTypeMismatchInIrrefutableContextError =
errors.patternTypeMismatchInIrrefutableContext(
@@ -349,7 +354,8 @@
/// Computes the type schema for a variable pattern appearing in an assignment
/// context. [variable] is the variable being referenced.
- TypeSchema analyzeAssignedVariablePatternSchema(Variable variable) =>
+ SharedTypeSchemaView<TypeStructure> analyzeAssignedVariablePatternSchema(
+ Variable variable) =>
operations.typeToSchema(
flow.promotedType(variable) ?? operations.variableType(variable));
@@ -359,19 +365,21 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (Pattern innerPattern).
- PatternResult<Type> analyzeCastPattern({
- required MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ PatternResult<TypeStructure> analyzeCastPattern({
+ required MatchContext<Node, Expression, Pattern,
+ SharedTypeView<TypeStructure>, Variable>
+ context,
required Pattern pattern,
required Pattern innerPattern,
- required Type requiredType,
+ required SharedTypeView<TypeStructure> requiredType,
}) {
- Type matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
flow.promoteForPattern(
matchedType: matchedValueType,
knownType: requiredType,
matchFailsIfWrongType: false);
if (operations.isSubtypeOf(matchedValueType, requiredType) &&
- requiredType is! SharedInvalidType) {
+ requiredType is! SharedInvalidTypeStructure) {
errors.matchedTypeIsSubtypeOfRequired(
pattern: pattern,
matchedType: matchedValueType,
@@ -394,7 +402,8 @@
/// Computes the type schema for a cast pattern.
///
/// Stack effect: none.
- TypeSchema analyzeCastPatternSchema() => operations.unknownType;
+ SharedTypeSchemaView<TypeStructure> analyzeCastPatternSchema() =>
+ operations.unknownType;
/// Analyzes a constant pattern. [node] is the pattern itself, and
/// [expression] is the constant expression. Depending on the client's
@@ -406,11 +415,13 @@
/// and information about reported errors.
///
/// Stack effect: pushes (Expression).
- ConstantPatternResult<Type, Error> analyzeConstantPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ ConstantPatternResult<TypeStructure, Error> analyzeConstantPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Node node,
Expression expression) {
- Type matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
// Stack: ()
Node? irrefutableContext = context.irrefutableContext;
Error? refutablePatternInIrrefutableContextError;
@@ -419,7 +430,7 @@
errors.refutablePatternInIrrefutableContext(
pattern: node, context: irrefutableContext);
}
- Type expressionType = analyzeExpression(
+ SharedTypeView<TypeStructure> expressionType = analyzeExpression(
expression, operations.typeToSchema(matchedValueType));
flow.constantPattern_end(expression, expressionType,
patternsEnabled: options.patternsEnabled,
@@ -454,7 +465,7 @@
/// Computes the type schema for a constant pattern.
///
/// Stack effect: none.
- TypeSchema analyzeConstantPatternSchema() {
+ SharedTypeSchemaView<TypeStructure> analyzeConstantPatternSchema() {
// Constant patterns are only allowed in refutable contexts, and refutable
// contexts don't propagate a type schema into the scrutinee. So this
// code path is only reachable if the user's code contains errors.
@@ -475,21 +486,24 @@
/// variable (possibly inferred) and information about reported errors.
///
/// Stack effect: none.
- DeclaredVariablePatternResult<Type, Error> analyzeDeclaredVariablePattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ DeclaredVariablePatternResult<TypeStructure, Error>
+ analyzeDeclaredVariablePattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Pattern node,
Variable variable,
String variableName,
- Type? declaredType,
+ SharedTypeView<TypeStructure>? declaredType,
) {
- Type matchedValueType = flow.getMatchedValueType();
- Type staticType =
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> staticType =
declaredType ?? variableTypeFromInitializerType(matchedValueType);
Node? irrefutableContext = context.irrefutableContext;
Error? patternTypeMismatchInIrrefutableContextError;
if (irrefutableContext != null &&
- matchedValueType is! SharedDynamicType &&
- matchedValueType is! SharedInvalidType &&
+ matchedValueType is! SharedDynamicTypeStructure &&
+ matchedValueType is! SharedInvalidTypeStructure &&
!operations.isSubtypeOf(matchedValueType, staticType)) {
patternTypeMismatchInIrrefutableContextError =
errors.patternTypeMismatchInIrrefutableContext(
@@ -503,7 +517,8 @@
// The promotion may have made the matched type even more specific than
// either `matchedType` or `staticType`, so fetch it again and use that
// in the call to `declaredVariablePattern` below.
- Type promotedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> promotedValueType =
+ flow.getMatchedValueType();
bool isImplicitlyTyped = declaredType == null;
// TODO(paulberry): are we handling _isFinal correctly?
int promotionKey = context.patternVariablePromotionKeys[variableName] =
@@ -528,7 +543,8 @@
/// declared type (if present).
///
/// Stack effect: none.
- TypeSchema analyzeDeclaredVariablePatternSchema(Type? declaredType) {
+ SharedTypeSchemaView<TypeStructure> analyzeDeclaredVariablePatternSchema(
+ SharedTypeView<TypeStructure>? declaredType) {
return declaredType == null
? operations.unknownType
: operations.typeToSchema(declaredType);
@@ -538,12 +554,13 @@
/// [schema] is the type schema which should be used for type inference.
///
/// Stack effect: pushes (Expression).
- Type analyzeExpression(Expression node, TypeSchema schema) {
+ SharedTypeView<TypeStructure> analyzeExpression(
+ Expression node, SharedTypeSchemaView<TypeStructure> schema) {
// Stack: ()
- if (schema is SharedDynamicType<TypeSchema>) {
+ if (schema is SharedDynamicTypeSchemaView<TypeStructure>) {
schema = operations.unknownType;
}
- ExpressionTypeAnalysisResult<Type> result =
+ ExpressionTypeAnalysisResult<TypeStructure> result =
dispatchExpression(node, schema);
// Stack: (Expression)
if (operations.isNever(result.provisionalType)) {
@@ -572,7 +589,7 @@
/// `else` clause, the representation for `ifFalse` will be pushed by
/// [handleNoCollectionElement]. If there is no guard, the representation
/// for `guard` will be pushed by [handleNoGuard].
- IfCaseStatementResult<Type, Error> analyzeIfCaseElement({
+ IfCaseStatementResult<TypeStructure, Error> analyzeIfCaseElement({
required Node node,
required Expression expression,
required Pattern pattern,
@@ -584,7 +601,7 @@
}) {
// Stack: ()
flow.ifCaseStatement_begin();
- Type initializerType =
+ SharedTypeView<TypeStructure> initializerType =
analyzeExpression(expression, operations.unknownType);
flow.ifCaseStatement_afterExpression(expression, initializerType);
// Stack: (Expression)
@@ -592,7 +609,8 @@
Map<String, int> patternVariablePromotionKeys = {};
// TODO(paulberry): rework handling of isFinal
dispatchPattern(
- new MatchContext<Node, Expression, Pattern, Type, Variable>(
+ new MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>(
isFinal: false,
componentVariables: componentVariables,
patternVariablePromotionKeys: patternVariablePromotionKeys,
@@ -604,7 +622,7 @@
variables, componentVariables, patternVariablePromotionKeys,
location: JoinedPatternVariableLocation.singlePattern);
Error? nonBooleanGuardError;
- Type? guardType;
+ SharedTypeView<TypeStructure>? guardType;
if (guard != null) {
guardType = analyzeExpression(
guard, operations.typeToSchema(operations.boolType));
@@ -636,7 +654,7 @@
/// representation for `ifFalse` will be pushed by [handleNoStatement]. If
/// there is no guard, the representation for `guard` will be pushed by
/// [handleNoGuard].
- IfCaseStatementResult<Type, Error> analyzeIfCaseStatement(
+ IfCaseStatementResult<TypeStructure, Error> analyzeIfCaseStatement(
Statement node,
Expression expression,
Pattern pattern,
@@ -647,7 +665,7 @@
) {
// Stack: ()
flow.ifCaseStatement_begin();
- Type initializerType =
+ SharedTypeView<TypeStructure> initializerType =
analyzeExpression(expression, operations.unknownType);
flow.ifCaseStatement_afterExpression(expression, initializerType);
// Stack: (Expression)
@@ -655,7 +673,8 @@
Map<String, int> patternVariablePromotionKeys = {};
// TODO(paulberry): rework handling of isFinal
dispatchPattern(
- new MatchContext<Node, Expression, Pattern, Type, Variable>(
+ new MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>(
isFinal: false,
componentVariables: componentVariables,
patternVariablePromotionKeys: patternVariablePromotionKeys,
@@ -673,7 +692,7 @@
handle_ifCaseStatement_afterPattern(node: node);
// Stack: (Expression, Pattern)
Error? nonBooleanGuardError;
- Type? guardType;
+ SharedTypeView<TypeStructure>? guardType;
if (guard != null) {
guardType = analyzeExpression(
guard, operations.typeToSchema(operations.boolType));
@@ -741,13 +760,15 @@
/// Analyzes an integer literal, given the type schema [schema].
///
/// Stack effect: none.
- IntTypeAnalysisResult<Type> analyzeIntLiteral(TypeSchema schema) {
+ IntTypeAnalysisResult<TypeStructure> analyzeIntLiteral(
+ SharedTypeSchemaView<TypeStructure> schema) {
bool convertToDouble = !operations.isTypeSchemaSatisfied(
type: operations.intType, typeSchema: schema) &&
operations.isTypeSchemaSatisfied(
type: operations.doubleType, typeSchema: schema);
- Type type = convertToDouble ? operations.doubleType : operations.intType;
- return new IntTypeAnalysisResult<Type>(
+ SharedTypeView<TypeStructure> type =
+ convertToDouble ? operations.doubleType : operations.intType;
+ return new IntTypeAnalysisResult<TypeStructure>(
type: type, convertedToDouble: convertToDouble);
}
@@ -761,28 +782,31 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (n * Pattern) where n = elements.length.
- ListPatternResult<Type, Error> analyzeListPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ ListPatternResult<TypeStructure, Error> analyzeListPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Pattern node,
- {Type? elementType,
+ {SharedTypeView<TypeStructure>? elementType,
required List<Node> elements}) {
- Type matchedValueType = flow.getMatchedValueType();
- Type valueType;
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> valueType;
if (elementType != null) {
valueType = elementType;
} else {
- Type? listElementType = operations.matchListType(matchedValueType);
+ SharedTypeView<TypeStructure>? listElementType =
+ operations.matchListType(matchedValueType);
if (listElementType != null) {
valueType = listElementType;
- } else if (matchedValueType is SharedDynamicType) {
+ } else if (matchedValueType is SharedDynamicTypeStructure) {
valueType = operations.dynamicType;
- } else if (matchedValueType is SharedInvalidType) {
+ } else if (matchedValueType is SharedInvalidTypeStructure) {
valueType = operations.errorType;
} else {
valueType = operations.objectQuestionType;
}
}
- Type requiredType = operations.listType(valueType);
+ SharedTypeView<TypeStructure> requiredType = operations.listType(valueType);
flow.promoteForPattern(
matchedType: matchedValueType,
knownType: requiredType,
@@ -804,7 +828,7 @@
previousRestPattern = element;
Pattern? subPattern = getRestPatternElementPattern(element);
if (subPattern != null) {
- Type subPatternMatchedType = requiredType;
+ SharedTypeView<TypeStructure> subPatternMatchedType = requiredType;
flow.pushSubpattern(subPatternMatchedType);
dispatchPattern(
context.withUnnecessaryWildcardKind(null), subPattern);
@@ -842,8 +866,8 @@
/// subpatterns.
///
/// Stack effect: none.
- TypeSchema analyzeListPatternSchema({
- required Type? elementType,
+ SharedTypeSchemaView<TypeStructure> analyzeListPatternSchema({
+ required SharedTypeView<TypeStructure>? elementType,
required List<Node> elements,
}) {
if (elementType != null) {
@@ -854,13 +878,14 @@
return operations.listTypeSchema(operations.unknownType);
}
- TypeSchema? currentGLB;
+ SharedTypeSchemaView<TypeStructure>? currentGLB;
for (Node element in elements) {
- TypeSchema? typeToAdd;
+ SharedTypeSchemaView<TypeStructure>? typeToAdd;
if (isRestPatternElement(element)) {
Pattern? subPattern = getRestPatternElementPattern(element);
if (subPattern != null) {
- TypeSchema subPatternType = dispatchPatternSchema(subPattern);
+ SharedTypeSchemaView<TypeStructure> subPatternType =
+ dispatchPatternSchema(subPattern);
typeToAdd = operations.matchIterableTypeSchema(subPatternType);
}
} else {
@@ -884,12 +909,14 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (Pattern left, Pattern right)
- PatternResult<Type> analyzeLogicalAndPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ PatternResult<TypeStructure> analyzeLogicalAndPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Pattern node,
Node lhs,
Node rhs) {
- Type matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
// Stack: ()
dispatchPattern(
context.withUnnecessaryWildcardKind(
@@ -912,7 +939,8 @@
/// the left and right sides of the `&&` operator.
///
/// Stack effect: none.
- TypeSchema analyzeLogicalAndPatternSchema(Node lhs, Node rhs) {
+ SharedTypeSchemaView<TypeStructure> analyzeLogicalAndPatternSchema(
+ Node lhs, Node rhs) {
return operations.typeSchemaGlb(
dispatchPatternSchema(lhs), dispatchPatternSchema(rhs));
}
@@ -925,12 +953,14 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (Pattern left, Pattern right)
- LogicalOrPatternResult<Type, Error> analyzeLogicalOrPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ LogicalOrPatternResult<TypeStructure, Error> analyzeLogicalOrPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Pattern node,
Node lhs,
Node rhs) {
- Type matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
Node? irrefutableContext = context.irrefutableContext;
Error? refutablePatternInIrrefutableContextError;
if (irrefutableContext != null) {
@@ -1002,7 +1032,8 @@
/// the left and right sides of the `|` or `&` operator.
///
/// Stack effect: none.
- TypeSchema analyzeLogicalOrPatternSchema(Node lhs, Node rhs) {
+ SharedTypeSchemaView<TypeStructure> analyzeLogicalOrPatternSchema(
+ Node lhs, Node rhs) {
// Logical-or patterns are only allowed in refutable contexts, and
// refutable contexts don't propagate a type schema into the scrutinee.
// So this code path is only reachable if the user's code contains errors.
@@ -1020,16 +1051,21 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (n * MapPatternElement) where n = elements.length.
- MapPatternResult<Type, Error> analyzeMapPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ MapPatternResult<TypeStructure, Error> analyzeMapPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Pattern node, {
- required ({Type keyType, Type valueType})? typeArguments,
+ required ({
+ SharedTypeView<TypeStructure> keyType,
+ SharedTypeView<TypeStructure> valueType
+ })? typeArguments,
required List<Node> elements,
}) {
- Type matchedValueType = flow.getMatchedValueType();
- Type keyType;
- Type valueType;
- TypeSchema keySchema;
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> keyType;
+ SharedTypeView<TypeStructure> valueType;
+ SharedTypeSchemaView<TypeStructure> keySchema;
if (typeArguments != null) {
keyType = typeArguments.keyType;
valueType = typeArguments.valueType;
@@ -1040,11 +1076,11 @@
keyType = typeArguments.keyType;
valueType = typeArguments.valueType;
keySchema = operations.typeToSchema(keyType);
- } else if (matchedValueType is SharedDynamicType) {
+ } else if (matchedValueType is SharedDynamicTypeStructure) {
keyType = operations.dynamicType;
valueType = operations.dynamicType;
keySchema = operations.unknownType;
- } else if (matchedValueType is SharedInvalidType) {
+ } else if (matchedValueType is SharedInvalidTypeStructure) {
keyType = operations.errorType;
valueType = operations.errorType;
keySchema = operations.unknownType;
@@ -1054,7 +1090,7 @@
keySchema = operations.unknownType;
}
}
- Type requiredType = operations.mapType(
+ SharedTypeView<TypeStructure> requiredType = operations.mapType(
keyType: keyType,
valueType: valueType,
);
@@ -1077,7 +1113,8 @@
Node element = elements[i];
MapPatternEntry<Expression, Pattern>? entry = getMapPatternEntry(element);
if (entry != null) {
- Type keyType = analyzeExpression(entry.key, keySchema);
+ SharedTypeView<TypeStructure> keyType =
+ analyzeExpression(entry.key, keySchema);
flow.pushSubpattern(valueType);
dispatchPattern(
context.withUnnecessaryWildcardKind(null),
@@ -1130,8 +1167,11 @@
/// subpatterns.
///
/// Stack effect: none.
- TypeSchema analyzeMapPatternSchema({
- required ({Type keyType, Type valueType})? typeArguments,
+ SharedTypeSchemaView<TypeStructure> analyzeMapPatternSchema({
+ required ({
+ SharedTypeView<TypeStructure> keyType,
+ SharedTypeView<TypeStructure> valueType
+ })? typeArguments,
required List<Node> elements,
}) {
if (typeArguments != null) {
@@ -1141,11 +1181,12 @@
));
}
- TypeSchema? valueType;
+ SharedTypeSchemaView<TypeStructure>? valueType;
for (Node element in elements) {
MapPatternEntry<Expression, Pattern>? entry = getMapPatternEntry(element);
if (entry != null) {
- TypeSchema entryValueType = dispatchPatternSchema(entry.value);
+ SharedTypeSchemaView<TypeStructure> entryValueType =
+ dispatchPatternSchema(entry.value);
if (valueType == null) {
valueType = entryValueType;
} else {
@@ -1169,12 +1210,15 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (Pattern innerPattern).
- NullCheckOrAssertPatternResult<Type, Error> analyzeNullCheckOrAssertPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
- Pattern node,
- Pattern innerPattern,
- {required bool isAssert}) {
- Type matchedValueType = flow.getMatchedValueType();
+ NullCheckOrAssertPatternResult<TypeStructure, Error>
+ analyzeNullCheckOrAssertPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
+ Pattern node,
+ Pattern innerPattern,
+ {required bool isAssert}) {
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
// Stack: ()
Error? refutablePatternInIrrefutableContextError;
Error? matchedTypeIsStrictlyNonNullableError;
@@ -1214,7 +1258,8 @@
/// a null-check or a null-assert pattern.
///
/// Stack effect: none.
- TypeSchema analyzeNullCheckOrAssertPatternSchema(Pattern innerPattern,
+ SharedTypeSchemaView<TypeStructure> analyzeNullCheckOrAssertPatternSchema(
+ Pattern innerPattern,
{required bool isAssert}) {
if (isAssert) {
return operations
@@ -1237,16 +1282,19 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (n * Pattern) where n = fields.length.
- ObjectPatternResult<Type, Error> analyzeObjectPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ ObjectPatternResult<TypeStructure, Error> analyzeObjectPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Pattern node, {
required List<RecordPatternField<Node, Pattern>> fields,
}) {
- Type matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
Map<int, Error>? duplicateRecordPatternFieldErrors =
_reportDuplicateRecordPatternFields(node, fields);
- Type requiredType = downwardInferObjectPatternRequiredType(
+ SharedTypeView<TypeStructure> requiredType =
+ downwardInferObjectPatternRequiredType(
matchedType: matchedValueType,
pattern: node,
);
@@ -1255,9 +1303,9 @@
// If the required type is `dynamic` or `Never`, then every getter is
// treated as having the same type.
- (Object?, Type)? overridePropertyGetType;
- if (requiredType is SharedDynamicType ||
- requiredType is SharedInvalidType ||
+ (Object?, SharedTypeView<TypeStructure>)? overridePropertyGetType;
+ if (requiredType is SharedDynamicTypeStructure ||
+ requiredType is SharedInvalidTypeStructure ||
operations.isNever(requiredType)) {
overridePropertyGetType = (null, requiredType);
}
@@ -1277,20 +1325,23 @@
// Stack: ()
for (RecordPatternField<Node, Pattern> field in fields) {
- var (Object? propertyMember, Type unpromotedPropertyType) =
- overridePropertyGetType ??
- resolveObjectPatternPropertyGet(
- objectPattern: node,
- receiverType: requiredType,
- field: field,
- );
+ var (
+ Object? propertyMember,
+ SharedTypeView<TypeStructure> unpromotedPropertyType
+ ) = overridePropertyGetType ??
+ resolveObjectPatternPropertyGet(
+ objectPattern: node,
+ receiverType: requiredType,
+ field: field,
+ );
// Note: an object pattern field must always have a property name, but in
// error recovery circumstances, one may be absent; when this happens, use
// the empty string as a the property name to prevent a crash.
String propertyName = field.name ?? '';
- Type promotedPropertyType = flow.pushPropertySubpattern(
- propertyName, propertyMember, unpromotedPropertyType) ??
- unpromotedPropertyType;
+ SharedTypeView<TypeStructure> promotedPropertyType =
+ flow.pushPropertySubpattern(
+ propertyName, propertyMember, unpromotedPropertyType) ??
+ unpromotedPropertyType;
if (operations.isNever(promotedPropertyType)) {
flow.handleExit();
}
@@ -1314,7 +1365,8 @@
/// specified with the object name, and with the type arguments applied.
///
/// Stack effect: none.
- TypeSchema analyzeObjectPatternSchema(Type type) {
+ SharedTypeSchemaView<TypeStructure> analyzeObjectPatternSchema(
+ SharedTypeView<TypeStructure> type) {
return operations.typeToSchema(type);
}
@@ -1324,17 +1376,20 @@
/// the pattern, and [rhs] for the right hand side.
///
/// Stack effect: pushes (Expression, Pattern).
- PatternAssignmentAnalysisResult<Type, TypeSchema> analyzePatternAssignment(
+ PatternAssignmentAnalysisResult<TypeStructure> analyzePatternAssignment(
Expression node, Pattern pattern, Expression rhs) {
// Stack: ()
- TypeSchema patternSchema = dispatchPatternSchema(pattern);
- Type rhsType = analyzeExpression(rhs, patternSchema);
+ SharedTypeSchemaView<TypeStructure> patternSchema =
+ dispatchPatternSchema(pattern);
+ SharedTypeView<TypeStructure> rhsType =
+ analyzeExpression(rhs, patternSchema);
// Stack: (Expression)
flow.patternAssignment_afterRhs(rhs, rhsType);
Map<String, List<Variable>> componentVariables = {};
Map<String, int> patternVariablePromotionKeys = {};
dispatchPattern(
- new MatchContext<Node, Expression, Pattern, Type, Variable>(
+ new MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>(
isFinal: false,
irrefutableContext: node,
assignedVariables: <Variable, Pattern>{},
@@ -1350,7 +1405,7 @@
}
flow.patternAssignment_end();
// Stack: (Expression, Pattern)
- return new PatternAssignmentAnalysisResult<Type, TypeSchema>(
+ return new PatternAssignmentAnalysisResult<TypeStructure>(
patternSchema: patternSchema,
type: rhsType,
);
@@ -1370,7 +1425,7 @@
///
/// Note, however, that the caller is responsible for reporting an error if
/// the static type of [expression] is potentially nullable.
- PatternForInResult<Type, Error> analyzePatternForIn({
+ PatternForInResult<TypeStructure, Error> analyzePatternForIn({
required Node node,
required bool hasAwait,
required Pattern pattern,
@@ -1378,21 +1433,23 @@
required void Function() dispatchBody,
}) {
// Stack: ()
- TypeSchema patternTypeSchema = dispatchPatternSchema(pattern);
- TypeSchema expressionTypeSchema = hasAwait
+ SharedTypeSchemaView<TypeStructure> patternTypeSchema =
+ dispatchPatternSchema(pattern);
+ SharedTypeSchemaView<TypeStructure> expressionTypeSchema = hasAwait
? operations.streamTypeSchema(patternTypeSchema)
: operations.iterableTypeSchema(patternTypeSchema);
- Type expressionType = analyzeExpression(expression, expressionTypeSchema);
+ SharedTypeView<TypeStructure> expressionType =
+ analyzeExpression(expression, expressionTypeSchema);
// Stack: (Expression)
Error? patternForInExpressionIsNotIterableError;
- Type? elementType = hasAwait
+ SharedTypeView<TypeStructure>? elementType = hasAwait
? operations.matchStreamType(expressionType)
: operations.matchIterableType(expressionType);
if (elementType == null) {
- if (expressionType is SharedDynamicType) {
+ if (expressionType is SharedDynamicTypeStructure) {
elementType = operations.dynamicType;
- } else if (expressionType is SharedInvalidType) {
+ } else if (expressionType is SharedInvalidTypeStructure) {
elementType = operations.errorType;
} else {
patternForInExpressionIsNotIterableError =
@@ -1409,7 +1466,8 @@
Map<String, List<Variable>> componentVariables = {};
Map<String, int> patternVariablePromotionKeys = {};
dispatchPattern(
- new MatchContext<Node, Expression, Pattern, Type, Variable>(
+ new MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>(
isFinal: false,
irrefutableContext: node,
componentVariables: componentVariables,
@@ -1442,20 +1500,23 @@
/// type of the initializer and the type schema of the [pattern].
///
/// Stack effect: pushes (Expression, Pattern).
- PatternVariableDeclarationAnalysisResult<Type, TypeSchema>
+ PatternVariableDeclarationAnalysisResult<TypeStructure>
analyzePatternVariableDeclaration(
Node node, Pattern pattern, Expression initializer,
{required bool isFinal}) {
// Stack: ()
- TypeSchema patternSchema = dispatchPatternSchema(pattern);
- Type initializerType = analyzeExpression(initializer, patternSchema);
+ SharedTypeSchemaView<TypeStructure> patternSchema =
+ dispatchPatternSchema(pattern);
+ SharedTypeView<TypeStructure> initializerType =
+ analyzeExpression(initializer, patternSchema);
// Stack: (Expression)
flow.patternVariableDeclaration_afterInitializer(
initializer, initializerType);
Map<String, List<Variable>> componentVariables = {};
Map<String, int> patternVariablePromotionKeys = {};
dispatchPattern(
- new MatchContext<Node, Expression, Pattern, Type, Variable>(
+ new MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>(
isFinal: isFinal,
irrefutableContext: node,
componentVariables: componentVariables,
@@ -1481,24 +1542,27 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (n * Pattern) where n = fields.length.
- RecordPatternResult<Type, Error> analyzeRecordPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ RecordPatternResult<TypeStructure, Error> analyzeRecordPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Pattern node, {
required List<RecordPatternField<Node, Pattern>> fields,
}) {
- Type matchedValueType = flow.getMatchedValueType();
- List<Type> demonstratedPositionalTypes = [];
- List<(String, Type)> demonstratedNamedTypes = [];
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
+ List<SharedTypeView<TypeStructure>> demonstratedPositionalTypes = [];
+ List<(String, SharedTypeView<TypeStructure>)> demonstratedNamedTypes = [];
void dispatchField(
RecordPatternField<Node, Pattern> field,
- Type matchedType,
+ SharedTypeView<TypeStructure> matchedType,
) {
flow.pushSubpattern(matchedType);
dispatchPattern(
context.withUnnecessaryWildcardKind(null),
field.pattern,
);
- Type demonstratedType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> demonstratedType =
+ flow.getMatchedValueType();
String? name = field.name;
if (name == null) {
demonstratedPositionalTypes.add(demonstratedType);
@@ -1508,7 +1572,7 @@
flow.popSubpattern();
}
- void dispatchFields(Type matchedType) {
+ void dispatchFields(SharedTypeView<TypeStructure> matchedType) {
for (int i = 0; i < fields.length; i++) {
dispatchField(fields[i], matchedType);
}
@@ -1519,7 +1583,7 @@
// Build the required type.
int requiredTypePositionalCount = 0;
- List<(String, Type)> requiredTypeNamedTypes = [];
+ List<(String, SharedTypeView<TypeStructure>)> requiredTypeNamedTypes = [];
for (RecordPatternField<Node, Pattern> field in fields) {
String? name = field.name;
if (name == null) {
@@ -1530,7 +1594,7 @@
);
}
}
- Type requiredType = operations.recordType(
+ SharedTypeView<TypeStructure> requiredType = operations.recordType(
positional: new List.filled(
requiredTypePositionalCount,
operations.objectQuestionType,
@@ -1541,8 +1605,9 @@
matchedType: matchedValueType, knownType: requiredType);
// Stack: ()
- if (matchedValueType is SharedRecordType<Type>) {
- List<Type>? fieldTypes = _matchRecordTypeShape(fields, matchedValueType);
+ if (matchedValueType is SharedRecordTypeView<TypeStructure>) {
+ List<SharedTypeView<TypeStructure>>? fieldTypes =
+ _matchRecordTypeShape(fields, matchedValueType);
if (fieldTypes != null) {
assert(fieldTypes.length == fields.length);
for (int i = 0; i < fields.length; i++) {
@@ -1551,9 +1616,9 @@
} else {
dispatchFields(operations.objectQuestionType);
}
- } else if (matchedValueType is SharedDynamicType) {
+ } else if (matchedValueType is SharedDynamicTypeStructure) {
dispatchFields(operations.dynamicType);
- } else if (matchedValueType is SharedInvalidType) {
+ } else if (matchedValueType is SharedInvalidTypeStructure) {
dispatchFields(operations.errorType);
} else {
dispatchFields(operations.objectQuestionType);
@@ -1573,7 +1638,7 @@
);
}
- Type demonstratedType = operations.recordType(
+ SharedTypeView<TypeStructure> demonstratedType = operations.recordType(
positional: demonstratedPositionalTypes, named: demonstratedNamedTypes);
flow.promoteForPattern(
matchedType: matchedValueType,
@@ -1590,13 +1655,14 @@
/// Computes the type schema for a record pattern.
///
/// Stack effect: none.
- TypeSchema analyzeRecordPatternSchema({
+ SharedTypeSchemaView<TypeStructure> analyzeRecordPatternSchema({
required List<RecordPatternField<Node, Pattern>> fields,
}) {
- List<TypeSchema> positional = [];
- List<(String, TypeSchema)> named = [];
+ List<SharedTypeSchemaView<TypeStructure>> positional = [];
+ List<(String, SharedTypeSchemaView<TypeStructure>)> named = [];
for (RecordPatternField<Node, Pattern> field in fields) {
- TypeSchema fieldType = dispatchPatternSchema(field.pattern);
+ SharedTypeSchemaView<TypeStructure> fieldType =
+ dispatchPatternSchema(field.pattern);
String? name = field.name;
if (name != null) {
named.add((name, fieldType));
@@ -1620,11 +1686,13 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: pushes (Expression).
- RelationalPatternResult<Type, Error> analyzeRelationalPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ RelationalPatternResult<TypeStructure, Error> analyzeRelationalPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Pattern node,
Expression operand) {
- Type matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
// Stack: ()
Error? refutablePatternInIrrefutableContextError;
Node? irrefutableContext = context.irrefutableContext;
@@ -1633,9 +1701,9 @@
errors.refutablePatternInIrrefutableContext(
pattern: node, context: irrefutableContext);
}
- RelationalOperatorResolution<Type>? operator =
+ RelationalOperatorResolution<TypeStructure>? operator =
resolveRelationalPatternOperator(node, matchedValueType);
- Type? parameterType = operator?.parameterType;
+ SharedTypeView<TypeStructure>? parameterType = operator?.parameterType;
bool isEquality = switch (operator?.kind) {
RelationalOperatorKind.equals => true,
RelationalOperatorKind.notEquals => true,
@@ -1644,7 +1712,7 @@
if (isEquality && parameterType != null) {
parameterType = operations.makeNullable(parameterType);
}
- Type operandType = analyzeExpression(
+ SharedTypeView<TypeStructure> operandType = analyzeExpression(
operand,
parameterType == null
? operations.unknownType
@@ -1691,7 +1759,7 @@
/// Computes the type schema for a relational pattern.
///
/// Stack effect: none.
- TypeSchema analyzeRelationalPatternSchema() {
+ SharedTypeSchemaView<TypeStructure> analyzeRelationalPatternSchema() {
// Relational patterns are only allowed in refutable contexts, and refutable
// contexts don't propagate a type schema into the scrutinee. So this
// code path is only reachable if the user's code contains errors.
@@ -1706,8 +1774,11 @@
///
/// Stack effect: pushes (Expression, n * ExpressionCase), where n is the
/// number of cases.
- SwitchExpressionResult<Type, Error> analyzeSwitchExpression(
- Expression node, Expression scrutinee, int numCases, TypeSchema schema) {
+ SwitchExpressionResult<TypeStructure, Error> analyzeSwitchExpression(
+ Expression node,
+ Expression scrutinee,
+ int numCases,
+ SharedTypeSchemaView<TypeStructure> schema) {
// Stack: ()
// The static type of a switch expression `E` of the form `switch (e0) { p1
@@ -1715,15 +1786,16 @@
// follows:
//
// - The scrutinee (`e0`) is first analyzed with context type `_`.
- Type expressionType = analyzeExpression(scrutinee, operations.unknownType);
+ SharedTypeView<TypeStructure> expressionType =
+ analyzeExpression(scrutinee, operations.unknownType);
// Stack: (Expression)
handleSwitchScrutinee(expressionType);
flow.switchStatement_expressionEnd(null, scrutinee, expressionType);
// - If the switch expression has no cases, its static type is `Never`.
Map<int, Error>? nonBooleanGuardErrors;
- Map<int, Type>? guardTypes;
- Type staticType;
+ Map<int, SharedTypeView<TypeStructure>>? guardTypes;
+ SharedTypeView<TypeStructure> staticType;
if (numCases == 0) {
staticType = operations.neverType;
} else {
@@ -1732,8 +1804,8 @@
// - Let `T` be the least upper bound of the static types of all the case
// expressions.
// - Let `S` be the greatest closure of `K`.
- Type? t;
- Type s = operations.greatestClosure(schema);
+ SharedTypeView<TypeStructure>? t;
+ SharedTypeView<TypeStructure> s = operations.greatestClosure(schema);
bool allCasesSatisfyContext = true;
for (int i = 0; i < numCases; i++) {
// Stack: (Expression, i * ExpressionCase)
@@ -1748,7 +1820,8 @@
Map<String, List<Variable>> componentVariables = {};
Map<String, int> patternVariablePromotionKeys = {};
dispatchPattern(
- new MatchContext<Node, Expression, Pattern, Type, Variable>(
+ new MatchContext<Node, Expression, Pattern,
+ SharedTypeView<TypeStructure>, Variable>(
isFinal: false,
switchScrutinee: scrutinee,
componentVariables: componentVariables,
@@ -1766,7 +1839,7 @@
guard = memberInfo.head.guard;
bool hasGuard = guard != null;
if (hasGuard) {
- Type guardType = analyzeExpression(
+ SharedTypeView<TypeStructure> guardType = analyzeExpression(
guard, operations.typeToSchema(operations.boolType));
Error? nonBooleanGuardError = _checkGuardType(guard, guardType);
(guardTypes ??= {})[i] = guardType;
@@ -1785,7 +1858,8 @@
flow.switchStatement_endAlternative(guard, {});
flow.switchStatement_endAlternatives(null, hasLabels: false);
// Stack: (Expression, i * ExpressionCase, CaseHead)
- Type ti = analyzeExpression(memberInfo.expression, schema);
+ SharedTypeView<TypeStructure> ti =
+ analyzeExpression(memberInfo.expression, schema);
if (allCasesSatisfyContext && !operations.isSubtypeOf(ti, s)) {
allCasesSatisfyContext = false;
}
@@ -1828,10 +1902,12 @@
///
/// Stack effect: pushes (Expression, n * StatementCase), where n is the
/// number of cases after merging together cases that share a body.
- SwitchStatementTypeAnalysisResult<Type, Error> analyzeSwitchStatement(
- Statement node, Expression scrutinee, final int numCases) {
+ SwitchStatementTypeAnalysisResult<TypeStructure, Error>
+ analyzeSwitchStatement(
+ Statement node, Expression scrutinee, final int numCases) {
// Stack: ()
- Type scrutineeType = analyzeExpression(scrutinee, operations.unknownType);
+ SharedTypeView<TypeStructure> scrutineeType =
+ analyzeExpression(scrutinee, operations.unknownType);
// Stack: (Expression)
handleSwitchScrutinee(scrutineeType);
flow.switchStatement_expressionEnd(node, scrutinee, scrutineeType);
@@ -1839,7 +1915,7 @@
bool lastCaseTerminates = true;
Map<int, Error>? switchCaseCompletesNormallyErrors;
Map<int, Map<int, Error>>? nonBooleanGuardErrors;
- Map<int, Map<int, Type>>? guardTypes;
+ Map<int, Map<int, SharedTypeView<TypeStructure>>>? guardTypes;
for (int caseIndex = 0; caseIndex < numCases; caseIndex++) {
// Stack: (Expression, numExecutionPaths * StatementCase)
flow.switchStatement_beginAlternatives();
@@ -1861,7 +1937,8 @@
Map<String, List<Variable>> componentVariables = {};
Map<String, int> patternVariablePromotionKeys = {};
dispatchPattern(
- new MatchContext<Node, Expression, Pattern, Type, Variable>(
+ new MatchContext<Node, Expression, Pattern,
+ SharedTypeView<TypeStructure>, Variable>(
isFinal: false,
switchScrutinee: scrutinee,
componentVariables: componentVariables,
@@ -1879,7 +1956,7 @@
// numHeads * CaseHead, Pattern),
guard = head.guard;
if (guard != null) {
- Type guardType = analyzeExpression(
+ SharedTypeView<TypeStructure> guardType = analyzeExpression(
guard, operations.typeToSchema(operations.boolType));
Error? nonBooleanGuardError = _checkGuardType(guard, guardType);
((guardTypes ??= {})[caseIndex] ??= {})[headIndex] = guardType;
@@ -1971,10 +2048,11 @@
/// Stack effect: none.
///
/// Returns the inferred type of the variable.
- Type analyzeUninitializedVariableDeclaration(
- Node node, Variable variable, Type? declaredType,
+ SharedTypeView<TypeStructure> analyzeUninitializedVariableDeclaration(
+ Node node, Variable variable, SharedTypeView<TypeStructure>? declaredType,
{required bool isFinal}) {
- Type inferredType = declaredType ?? operations.dynamicType;
+ SharedTypeView<TypeStructure> inferredType =
+ declaredType ?? operations.dynamicType;
setVariableType(variable, inferredType);
flow.declare(variable, inferredType, initialized: false);
return inferredType;
@@ -1987,12 +2065,14 @@
/// See [dispatchPattern] for the meaning of [context].
///
/// Stack effect: none.
- WildcardPatternResult<Type, Error> analyzeWildcardPattern({
- required MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ WildcardPatternResult<TypeStructure, Error> analyzeWildcardPattern({
+ required MatchContext<Node, Expression, Pattern,
+ SharedTypeView<TypeStructure>, Variable>
+ context,
required Pattern node,
- required Type? declaredType,
+ required SharedTypeView<TypeStructure>? declaredType,
}) {
- Type matchedValueType = flow.getMatchedValueType();
+ SharedTypeView<TypeStructure> matchedValueType = flow.getMatchedValueType();
Node? irrefutableContext = context.irrefutableContext;
Error? patternTypeMismatchInIrrefutableContextError;
if (irrefutableContext != null && declaredType != null) {
@@ -2033,8 +2113,8 @@
/// explicitly declared type (if present).
///
/// Stack effect: none.
- TypeSchema analyzeWildcardPatternSchema({
- required Type? declaredType,
+ SharedTypeSchemaView<TypeStructure> analyzeWildcardPatternSchema({
+ required SharedTypeView<TypeStructure>? declaredType,
}) {
return declaredType == null
? operations.unknownType
@@ -2058,8 +2138,8 @@
/// [analyzeSwitchExpression].
///
/// Stack effect: pushes (Expression).
- ExpressionTypeAnalysisResult<Type> dispatchExpression(
- Expression node, TypeSchema schema);
+ ExpressionTypeAnalysisResult<TypeStructure> dispatchExpression(
+ Expression node, SharedTypeSchemaView<TypeStructure> schema);
/// Calls the appropriate `analyze` method according to the form of [pattern].
///
@@ -2068,15 +2148,17 @@
/// and the information accumulated while matching previous patterns.
///
/// Stack effect: pushes (Pattern).
- PatternResult<Type> dispatchPattern(
- MatchContext<Node, Expression, Pattern, Type, Variable> context,
+ PatternResult<TypeStructure> dispatchPattern(
+ MatchContext<Node, Expression, Pattern, SharedTypeView<TypeStructure>,
+ Variable>
+ context,
Node pattern);
/// Calls the appropriate `analyze...Schema` method according to the form of
/// [pattern].
///
/// Stack effect: none.
- TypeSchema dispatchPatternSchema(Node pattern);
+ SharedTypeSchemaView<TypeStructure> dispatchPatternSchema(Node pattern);
/// Calls the appropriate `analyze` method according to the form of
/// [statement], and then adjusts the stack as needed to combine any
@@ -2089,8 +2171,8 @@
void dispatchStatement(Statement statement);
/// Infers the type for the [pattern], should be a subtype of [matchedType].
- Type downwardInferObjectPatternRequiredType({
- required Type matchedType,
+ SharedTypeView<TypeStructure> downwardInferObjectPatternRequiredType({
+ required SharedTypeView<TypeStructure> matchedType,
required Pattern pattern,
});
@@ -2107,7 +2189,7 @@
required JoinedPatternVariableLocation location,
required JoinedPatternVariableInconsistency inconsistency,
required bool isFinal,
- required Type type,
+ required SharedTypeView<TypeStructure> type,
});
/// If the [element] is a map pattern entry, returns it.
@@ -2203,8 +2285,8 @@
/// Called after visiting an entry element in a map pattern.
///
/// Stack effect: pushes (MapPatternElement).
- void handleMapPatternEntry(
- Pattern container, Node entryElement, Type keyType);
+ void handleMapPatternEntry(Pattern container, Node entryElement,
+ SharedTypeView<TypeStructure> keyType);
/// Called after visiting a rest element in a map pattern.
///
@@ -2268,14 +2350,15 @@
/// eliminate this method.
///
/// Stack effect: none.
- void handleSwitchScrutinee(Type type);
+ void handleSwitchScrutinee(SharedTypeView<TypeStructure> type);
/// Queries whether the switch statement or expression represented by [node]
/// was exhaustive. [expressionType] is the static type of the scrutinee.
///
/// Will only be called if the switch statement or expression lacks a
/// `default` clause, and patterns support is disabled.
- bool isLegacySwitchExhaustive(Node node, Type expressionType);
+ bool isLegacySwitchExhaustive(
+ Node node, SharedTypeView<TypeStructure> expressionType);
/// Returns whether [node] is a rest element in a list or map pattern.
bool isRestPatternElement(Node node);
@@ -2286,9 +2369,9 @@
/// Returns the type of the property in [receiverType] that corresponds to
/// the name of the [field]. If the property cannot be resolved, the client
/// should report an error, and return `dynamic` for recovery.
- (Object?, Type) resolveObjectPatternPropertyGet({
+ (Object?, SharedTypeView<TypeStructure>) resolveObjectPatternPropertyGet({
required Pattern objectPattern,
- required Type receiverType,
+ required SharedTypeView<TypeStructure> receiverType,
required RecordPatternField<Node, Pattern> field,
});
@@ -2298,17 +2381,18 @@
/// If no operator is found, `null` should be returned. (This could happen
/// either because the code is invalid, or because [matchedValueType] is
/// `dynamic`).
- RelationalOperatorResolution<Type>? resolveRelationalPatternOperator(
- Pattern node, Type matchedValueType);
+ RelationalOperatorResolution<TypeStructure>? resolveRelationalPatternOperator(
+ Pattern node, SharedTypeView<TypeStructure> matchedValueType);
/// Records that type inference has assigned a [type] to a [variable]. This
/// is called once per variable, regardless of whether the variable's type is
/// explicit or inferred.
- void setVariableType(Variable variable, Type type);
+ void setVariableType(Variable variable, SharedTypeView<TypeStructure> type);
/// Computes the type that should be inferred for an implicitly typed variable
/// whose initializer expression has static type [type].
- Type variableTypeFromInitializerType(Type type);
+ SharedTypeView<TypeStructure> variableTypeFromInitializerType(
+ SharedTypeView<TypeStructure> type);
/// Common functionality shared by [analyzeIfStatement] and
/// [analyzeIfCaseStatement].
@@ -2354,7 +2438,8 @@
// Stack: (CollectionElement ifTrue, CollectionElement ifFalse)
}
- Error? _checkGuardType(Expression expression, Type type) {
+ Error? _checkGuardType(
+ Expression expression, SharedTypeView<TypeStructure> type) {
// TODO(paulberry): harmonize this with analyzer's checkForNonBoolExpression
// TODO(paulberry): spec says the type must be `bool` or `dynamic`. This
// logic permits `T extends bool`, `T promoted to bool`, or `Never`. What
@@ -2384,14 +2469,15 @@
Variable? variable = variables[variableName];
List<Variable> components = componentVariables[variableName] ?? [];
bool isFirst = true;
- Type? typeIfConsistent;
+ SharedTypeView<TypeStructure>? typeIfConsistent;
bool? isFinalIfConsistent;
bool isIdenticalToComponent = false;
for (Variable component in components) {
if (identical(variable, component)) {
isIdenticalToComponent = true;
}
- Type componentType = operations.variableType(component);
+ SharedTypeView<TypeStructure> componentType =
+ operations.variableType(component);
bool isComponentFinal = operations.isVariableFinal(component);
if (isFirst) {
typeIfConsistent = componentType;
@@ -2437,20 +2523,22 @@
/// If the shape described by [fields] is the same as the shape of the
/// [matchedType], returns matched types for each field in [fields].
/// Otherwise returns `null`.
- List<Type>? _matchRecordTypeShape(
+ List<SharedTypeView<TypeStructure>>? _matchRecordTypeShape(
List<RecordPatternField<Node, Pattern>> fields,
- SharedRecordType<Type> matchedType,
+ SharedRecordTypeView<TypeStructure> matchedType,
) {
- Map<String, Type> matchedTypeNamed = {};
- for (var SharedNamedType(:name, :type) in matchedType.namedTypes) {
+ Map<String, SharedTypeView<TypeStructure>> matchedTypeNamed = {};
+ for (var SharedNamedTypeView<TypeStructure>(:name, :type)
+ in matchedType.namedTypes) {
matchedTypeNamed[name] = type;
}
- List<Type> result = [];
+ List<SharedTypeView<TypeStructure>> result = [];
int namedCount = 0;
- Iterator<Type> positionalIterator = matchedType.positionalTypes.iterator;
+ Iterator<SharedTypeView<TypeStructure>> positionalIterator =
+ matchedType.positionalTypes.iterator;
for (RecordPatternField<Node, Pattern> field in fields) {
- Type? fieldType;
+ SharedTypeView<TypeStructure>? fieldType;
String? name = field.name;
if (name != null) {
fieldType = matchedTypeNamed[name];
@@ -2502,10 +2590,11 @@
return errorResults;
}
- bool _structurallyEqualAfterNormTypes(Type type1, Type type2) {
- Type norm1 = operations.normalize(type1);
- Type norm2 = operations.normalize(type2);
- return norm1.isStructurallyEqualTo(norm2);
+ bool _structurallyEqualAfterNormTypes(SharedTypeView<TypeStructure> type1,
+ SharedTypeView<TypeStructure> type2) {
+ SharedTypeView<TypeStructure> norm1 = operations.normalize(type1);
+ SharedTypeView<TypeStructure> norm2 = operations.normalize(type2);
+ return norm1.unwrapTypeView().isStructurallyEqualTo(norm2.unwrapTypeView());
}
}
@@ -2516,7 +2605,7 @@
Statement extends Node,
Expression extends Node,
Variable extends Object,
- Type extends SharedType<Type>,
+ Type extends Object,
Pattern extends Node,
Error> implements TypeAnalyzerErrorsBase {
/// Called if pattern support is disabled and a case constant's static type
diff --git a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer_operations.dart b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer_operations.dart
index 4dcba8f..7bc5f93 100644
--- a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer_operations.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_analyzer_operations.dart
@@ -8,48 +8,95 @@
/// Callback API used by the shared type analyzer to query and manipulate the
/// client's representation of variables and types.
+///
+/// Concrete classes that implement this class should also mix in
+/// [TypeAnalyzerOperationsMixin], which provides the implementations of the
+/// operations for types and type schemas using the related operations on type
+/// structures, implemented by the concrete class itself. For example,
+/// [TypeAnalyzerOperationsMixin] adds [TypeAnalyzerOperationsMixin.futureType]
+/// and [TypeAnalyzerOperationsMixin.futureTypeSchema] that are defined in terms
+/// of [TypeAnalyzerOperations.futureTypeInternal], so a concrete class
+/// implementing [TypeAnalyzerOperations] needs to implement only
+/// `futureTypeInternal` to receive the implementations of both `futureType` and
+/// `futureTypeSchema` by mixing in [TypeAnalyzerOperationsMixin].
abstract interface class TypeAnalyzerOperations<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
Variable extends Object,
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
InferableParameter extends Object,
TypeDeclarationType extends Object,
TypeDeclaration extends Object>
- implements FlowAnalysisOperations<Variable, Type> {
+ implements FlowAnalysisOperations<Variable, SharedTypeView<TypeStructure>> {
/// Returns the type `double`.
- Type get doubleType;
+ SharedTypeView<TypeStructure> get doubleType;
/// Returns the type `dynamic`.
- Type get dynamicType;
+ SharedTypeView<TypeStructure> get dynamicType;
/// Returns the type used by the client in the case of errors.
- Type get errorType;
+ SharedTypeView<TypeStructure> get errorType;
/// Returns the type `int`.
- Type get intType;
+ SharedTypeView<TypeStructure> get intType;
/// Returns the type `Never`.
- Type get neverType;
+ SharedTypeView<TypeStructure> get neverType;
/// Returns the type `Null`.
- Type get nullType;
+ SharedTypeView<TypeStructure> get nullType;
/// Returns the type `Object?`.
- Type get objectQuestionType;
+ SharedTypeView<TypeStructure> get objectQuestionType;
/// Returns the type `Object`.
- Type get objectType;
+ SharedTypeView<TypeStructure> get objectType;
/// Returns the unknown type schema (`_`) used in type inference.
- TypeSchema get unknownType;
+ SharedTypeSchemaView<TypeStructure> get unknownType;
/// Returns the type `Future` with omitted nullability and type argument
/// [argumentType].
- Type futureType(Type argumentType);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [futureTypeInternal] to
+ /// receive a concrete implementation of [futureType] instead of implementing
+ /// [futureType] directly.
+ SharedTypeView<TypeStructure> futureType(
+ SharedTypeView<TypeStructure> argumentType);
/// Returns the type schema `Future` with omitted nullability and type
/// argument [argumentTypeSchema].
- TypeSchema futureTypeSchema(TypeSchema argumentTypeSchema);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [futureTypeInternal] to
+ /// receive a concrete implementation of [futureTypeSchema] instead of
+ /// implementing [futureTypeSchema] directly.
+ SharedTypeSchemaView<TypeStructure> futureTypeSchema(
+ SharedTypeSchemaView<TypeStructure> argumentTypeSchema);
+
+ /// [futureTypeInternal] should be implemented by concrete classes
+ /// implementing [TypeAnalyzerOperations]. The implementations of [futureType]
+ /// and [futureTypeSchema] are provided by mixing in
+ /// [TypeAnalyzerOperationsMixin], which defines [futureType] and
+ /// [futureTypeSchema] in terms of [futureTypeInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [futureTypeInternal], and receive
+ /// the implementation of both [futureType] and [futureTypeSchema] from the
+ /// mixin.
+ ///
+ /// The auxiliary purpose of [futureTypeInternal] is to facilitate the
+ /// development of the shared code at early stages. Sometimes the sharing of
+ /// the code starts by unifying the implementations of some concrete members
+ /// in the Analyzer and the CFE by bringing them in a form that looks
+ /// syntactically very similar in both tools, and then continues by
+ /// abstracting the two concrete members and using the shared abstracted one
+ /// instead of the two concrete methods existing previously. During the early
+ /// stages of unifying the two concrete members it can be beneficial to use
+ /// [futureTypeInternal] instead of the tool-specific ways of constructing a
+ /// future type, for the sake of uniformity, and to simplify the abstraction
+ /// step too.
+ TypeStructure futureTypeInternal(TypeStructure typeStructure);
/// If [type] was introduced by a class, mixin, enum, or extension type,
/// returns a [TypeDeclarationKind] indicating what kind of thing it was
@@ -58,7 +105,8 @@
/// Examples of types derived from a class declarations are `A`, `A?`, `A*`,
/// `B<T, S>`, where `A` and `B` are the names of class declarations or
/// extension type declarations, `T` and `S` are types.
- TypeDeclarationKind? getTypeDeclarationKind(Type type);
+ TypeDeclarationKind? getTypeDeclarationKind(
+ SharedTypeView<TypeStructure> type);
/// Returns variance for of the type parameter at index [parameterIndex] in
/// [typeDeclaration].
@@ -74,101 +122,332 @@
/// declaration are `A`, `A?`, `A*`, `B<T, S>`, `B<_, B<_, _>>?`, where `A`
/// and `B` are class declarations or extension type declarations, `T` and
/// `S` are type schemas.
- TypeDeclarationKind? getTypeSchemaDeclarationKind(TypeSchema typeSchema);
+ TypeDeclarationKind? getTypeSchemaDeclarationKind(
+ SharedTypeSchemaView<TypeStructure> typeSchema);
+
+ TypeDeclarationKind? getTypeDeclarationKindInternal(TypeStructure type);
/// Computes the greatest lower bound of [type1] and [type2].
- Type glb(Type type1, Type type2);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [glbInternal] to receive a
+ /// concrete implementation of [glb] instead of implementing [glb] directly.
+ SharedTypeView<TypeStructure> glb(
+ SharedTypeView<TypeStructure> type1, SharedTypeView<TypeStructure> type2);
+
+ /// Computes the greatest lower bound of [typeSchema1] and [typeSchema2].
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [glbInternal] to receive a
+ /// concrete implementation of [typeSchemaGlb] instead of implementing
+ /// [typeSchemaGlb] directly.
+ SharedTypeSchemaView<TypeStructure> typeSchemaGlb(
+ SharedTypeSchemaView<TypeStructure> typeSchema1,
+ SharedTypeSchemaView<TypeStructure> typeSchema2);
+
+ /// [glbInternal] should be implemented by concrete classes implementing
+ /// [TypeAnalyzerOperations]. The implementations of [glb] and [typeSchemaGlb]
+ /// are provided by mixing in [TypeAnalyzerOperationsMixin], which defines
+ /// [glb] and [typeSchemaGlb] in terms of [glbInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [glbInternal], and receive the
+ /// implementation of both [glb] and [typeSchemaGlb] from the mixin.
+ ///
+ /// The auxiliary purpose of [glbInternal] is to facilitate the development of
+ /// the shared code at early stages. Sometimes the sharing of the code starts
+ /// by unifying the implementations of some concrete members in the Analyzer
+ /// and the CFE by bringing them in a form that looks syntactically very
+ /// similar in both tools, and then continues by abstracting the two concrete
+ /// members and using the shared abstracted one instead of the two concrete
+ /// methods existing previously. During the early stages of unifying the two
+ /// concrete members it can be beneficial to use [glbInternal] instead of the
+ /// tool-specific ways of constructing a future type, for the sake of
+ /// uniformity, and to simplify the abstraction step too.
+ TypeStructure glbInternal(TypeStructure type1, TypeStructure type2);
/// Returns the greatest closure of [schema] with respect to the unknown type
/// (`_`).
- Type greatestClosure(TypeSchema schema);
+ SharedTypeView<TypeStructure> greatestClosure(
+ SharedTypeSchemaView<TypeStructure> schema);
/// Queries whether [type] is an "always-exhaustive" type (as defined in the
/// patterns spec). Exhaustive types are types for which the switch statement
/// is required to be exhaustive when patterns support is enabled.
- bool isAlwaysExhaustiveType(Type type);
+ bool isAlwaysExhaustiveType(SharedTypeView<TypeStructure> type);
/// Returns `true` if [fromType] is assignable to [toType].
- bool isAssignableTo(Type fromType, Type toType);
+ bool isAssignableTo(SharedTypeView<TypeStructure> fromType,
+ SharedTypeView<TypeStructure> toType);
/// Returns `true` if [type] is `Function` from `dart:core`. The method
/// returns `false` for `Object?` and `Object*`.
- bool isDartCoreFunction(Type type);
+ bool isDartCoreFunction(SharedTypeView<TypeStructure> type);
/// Returns `true` if [type] is `E<T1, ..., Tn>`, `E<T1, ..., Tn>?`, or
/// `E<T1, ..., Tn>*` for some extension type declaration E, some
/// non-negative n, and some types T1, ..., Tn.
- bool isExtensionType(Type type);
+ bool isExtensionType(SharedTypeView<TypeStructure> type);
/// Returns `true` if [type] is `F`, `F?`, or `F*` for some function type `F`.
- bool isFunctionType(Type type);
+ bool isFunctionType(SharedTypeView<TypeStructure> type);
/// Returns `true` if [type] is `A<T1, ..., Tn>`, `A<T1, ..., Tn>?`, or
/// `A<T1, ..., Tn>*` for some class, mixin, or enum A, some non-negative n,
/// and some types T1, ..., Tn. The method returns `false` if [type] is an
/// extension type, a type alias, `Null`, `Never`, or `FutureOr<X>` for any
/// type `X`.
- bool isInterfaceType(Type type);
+ bool isInterfaceType(SharedTypeView<TypeStructure> type);
/// Returns `true` if `Null` is not a subtype of all types matching
/// [typeSchema].
///
/// The predicate of [isNonNullable] could be computed directly with a subtype
/// query, but the implementations can do that more efficiently.
- bool isNonNullable(TypeSchema typeSchema);
+ bool isNonNullable(SharedTypeSchemaView<TypeStructure> typeSchema);
/// Returns `true` if [type] is `Null`.
- bool isNull(Type type);
+ bool isNull(SharedTypeView<TypeStructure> type);
/// Returns `true` if [type] is `Object` from `dart:core`. The method returns
/// `false` for `Object?` and `Object*`.
- bool isObject(Type type);
+ bool isObject(SharedTypeView<TypeStructure> type);
/// Returns `true` if the type [type] satisfies the type schema [typeSchema].
bool isTypeSchemaSatisfied(
- {required TypeSchema typeSchema, required Type type});
+ {required SharedTypeSchemaView<TypeStructure> typeSchema,
+ required SharedTypeView<TypeStructure> type});
/// Returns whether [node] is final.
bool isVariableFinal(Variable node);
/// Returns the type schema `Iterable`, with type argument.
- TypeSchema iterableTypeSchema(TypeSchema elementTypeSchema);
+ SharedTypeSchemaView<TypeStructure> iterableTypeSchema(
+ SharedTypeSchemaView<TypeStructure> elementTypeSchema);
/// Returns the type `List`, with type argument [elementType].
- Type listType(Type elementType);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [listTypeInternal] to receive
+ /// a concrete implementation of [listType] instead of implementing [listType]
+ /// directly.
+ SharedTypeView<TypeStructure> listType(
+ SharedTypeView<TypeStructure> elementType);
/// Returns the type schema `List`, with type argument [elementTypeSchema].
- TypeSchema listTypeSchema(TypeSchema elementTypeSchema);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [listTypeInternal] to receive
+ /// a concrete implementation of [listTypeSchema] instead of implementing
+ /// [listTypeSchema] directly.
+ SharedTypeSchemaView<TypeStructure> listTypeSchema(
+ SharedTypeSchemaView<TypeStructure> elementTypeSchema);
+
+ /// [listTypeInternal] should be implemented by concrete classes implementing
+ /// [TypeAnalyzerOperations]. The implementations of [listType] and
+ /// [listTypeSchema] are provided by mixing in [TypeAnalyzerOperationsMixin],
+ /// which defines [listType] and [listTypeSchema] in terms of
+ /// [listTypeInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [listTypeInternal], and receive
+ /// the implementation of both [listType] and [listTypeSchema] from the mixin.
+ ///
+ /// The auxiliary purpose of [listTypeInternal] is to facilitate the
+ /// development of the shared code at early stages. Sometimes the sharing of
+ /// the code starts by unifying the implementations of some concrete members
+ /// in the Analyzer and the CFE by bringing them in a form that looks
+ /// syntactically very similar in both tools, and then continues by
+ /// abstracting the two concrete members and using the shared abstracted one
+ /// instead of the two concrete methods existing previously. During the early
+ /// stages of unifying the two concrete members it can be beneficial to use
+ /// [listTypeInternal] instead of the tool-specific ways of constructing a
+ /// future type, for the sake of uniformity, and to simplify the abstraction
+ /// step too.
+ TypeStructure listTypeInternal(TypeStructure elementType);
/// Computes the least upper bound of [type1] and [type2].
- Type lub(Type type1, Type type2);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [lubInternal] to receive a
+ /// concrete implementation of [lub] instead of implementing [lub] directly.
+ SharedTypeView<TypeStructure> lub(
+ SharedTypeView<TypeStructure> type1, SharedTypeView<TypeStructure> type2);
+
+ /// Computes the least upper bound of [typeSchema1] and [typeSchema2].
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [lubInternal] to receive a
+ /// concrete implementation of [typeSchemaLub] instead of implementing
+ /// [typeSchemaLub] directly.
+ SharedTypeSchemaView<TypeStructure> typeSchemaLub(
+ SharedTypeSchemaView<TypeStructure> typeSchema1,
+ SharedTypeSchemaView<TypeStructure> typeSchema2);
+
+ /// [lubInternal] should be implemented by concrete classes implementing
+ /// [TypeAnalyzerOperations]. The implementations of [lub] and [typeSchemaLub]
+ /// are provided by mixing in [TypeAnalyzerOperationsMixin], which defines
+ /// [lub] and [typeSchemaLub] in terms of [lubInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [lubInternal], and receive the
+ /// implementation of both [lub] and [typeSchemaLub] from the mixin.
+ ///
+ /// The auxiliary purpose of [lubInternal] is to facilitate the development of
+ /// the shared code at early stages. Sometimes the sharing of the code starts
+ /// by unifying the implementations of some concrete members in the Analyzer
+ /// and the CFE by bringing them in a form that looks syntactically very
+ /// similar in both tools, and then continues by abstracting the two concrete
+ /// members and using the shared abstracted one instead of the two concrete
+ /// methods existing previously. During the early stages of unifying the two
+ /// concrete members it can be beneficial to use [lubInternal] instead of the
+ /// tool-specific ways of constructing a future type, for the sake of
+ /// uniformity, and to simplify the abstraction step too.
+ TypeStructure lubInternal(TypeStructure type1, TypeStructure type2);
/// Computes the nullable form of [type], in other words the least upper bound
/// of [type] and `Null`.
- Type makeNullable(Type type);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [makeNullableInternal] to
+ /// receive a concrete implementation of [makeNullable] instead of
+ /// implementing [makeNullable] directly.
+ SharedTypeView<TypeStructure> makeNullable(
+ SharedTypeView<TypeStructure> type);
/// Computes the nullable form of [typeSchema].
- TypeSchema makeTypeSchemaNullable(TypeSchema typeSchema);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [makeNullableInternal] to
+ /// receive a concrete implementation of [makeTypeSchemaNullable] instead of
+ /// implementing [makeTypeSchemaNullable] directly.
+ SharedTypeSchemaView<TypeStructure> makeTypeSchemaNullable(
+ SharedTypeSchemaView<TypeStructure> typeSchema);
+
+ /// [makeNullableInternal] should be implemented by concrete classes
+ /// implementing [TypeAnalyzerOperations]. The implementations of
+ /// [makeNullable] and [makeTypeSchemaNullable] are provided by mixing in
+ /// [TypeAnalyzerOperationsMixin], which defines [makeNullable] and
+ /// [makeTypeSchemaNullable] in terms of [makeNullableInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [makeNullableInternal], and
+ /// receive the implementation of both [makeNullable] and
+ /// [makeTypeSchemaNullable] from the mixin.
+ ///
+ /// The auxiliary purpose of [makeNullableInternal] is to facilitate the
+ /// development of the shared code at early stages. Sometimes the sharing of
+ /// the code starts by unifying the implementations of some concrete members
+ /// in the Analyzer and the CFE by bringing them in a form that looks
+ /// syntactically very similar in both tools, and then continues by
+ /// abstracting the two concrete members and using the shared abstracted one
+ /// instead of the two concrete methods existing previously. During the early
+ /// stages of unifying the two concrete members it can be beneficial to use
+ /// [makeNullableInternal] instead of the tool-specific ways of constructing a
+ /// future type, for the sake of uniformity, and to simplify the abstraction
+ /// step too.
+ TypeStructure makeNullableInternal(TypeStructure type);
/// Returns the type `Map`, with type arguments.
- Type mapType({
- required Type keyType,
- required Type valueType,
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [mapTypeInternal] to receive a
+ /// concrete implementation of [mapType] instead of implementing [mapType]
+ /// directly.
+ SharedTypeView<TypeStructure> mapType({
+ required SharedTypeView<TypeStructure> keyType,
+ required SharedTypeView<TypeStructure> valueType,
});
/// Returns the type schema `Map`, with type arguments [keyTypeSchema] and
/// [valueTypeSchema].
- TypeSchema mapTypeSchema(
- {required TypeSchema keyTypeSchema, required TypeSchema valueTypeSchema});
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [mapTypeInternal] to receive a
+ /// concrete implementation of [makeTypeSchemaNullable] instead of
+ /// implementing [makeTypeSchemaNullable] directly.
+ SharedTypeSchemaView<TypeStructure> mapTypeSchema({
+ required SharedTypeSchemaView<TypeStructure> keyTypeSchema,
+ required SharedTypeSchemaView<TypeStructure> valueTypeSchema,
+ });
+
+ /// [mapTypeInternal] should be implemented by concrete classes implementing
+ /// [TypeAnalyzerOperations]. The implementations of [mapType] and
+ /// [makeTypeSchemaNullable] are provided by mixing in
+ /// [TypeAnalyzerOperationsMixin], which defines [mapType] and
+ /// [makeTypeSchemaNullable] in terms of [mapTypeInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [mapTypeInternal], and receive the
+ /// implementation of both [mapType] and [makeTypeSchemaNullable] from the
+ /// mixin.
+ ///
+ /// The auxiliary purpose of [mapTypeInternal] is to facilitate the
+ /// development of the shared code at early stages. Sometimes the sharing of
+ /// the code starts by unifying the implementations of some concrete members
+ /// in the Analyzer and the CFE by bringing them in a form that looks
+ /// syntactically very similar in both tools, and then continues by
+ /// abstracting the two concrete members and using the shared abstracted one
+ /// instead of the two concrete methods existing previously. During the early
+ /// stages of unifying the two concrete members it can be beneficial to use
+ /// [mapTypeInternal] instead of the tool-specific ways of constructing a
+ /// future type, for the sake of uniformity, and to simplify the abstraction
+ /// step too.
+ TypeStructure mapTypeInternal({
+ required TypeStructure keyType,
+ required TypeStructure valueType,
+ });
/// If [type] takes the form `FutureOr<T>`, `FutureOr<T>?`, or `FutureOr<T>*`
/// for some `T`, returns the type `T`. Otherwise returns `null`.
- Type? matchFutureOr(Type type);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [matchFutureOrInternal] to
+ /// receive a concrete implementation of [matchFutureOr] instead of
+ /// implementing [matchFutureOr] directly.
+ SharedTypeView<TypeStructure>? matchFutureOr(
+ SharedTypeView<TypeStructure> type);
/// If [typeSchema] takes the form `FutureOr<T>`, `FutureOr<T>?`, or
/// `FutureOr<T>*` for some `T`, returns the type schema `T`. Otherwise
/// returns `null`.
- TypeSchema? matchTypeSchemaFutureOr(TypeSchema typeSchema);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [matchFutureOrInternal] to
+ /// receive a concrete implementation of [matchTypeSchemaFutureOr] instead of
+ /// implementing [matchTypeSchemaFutureOr] directly.
+ SharedTypeSchemaView<TypeStructure>? matchTypeSchemaFutureOr(
+ SharedTypeSchemaView<TypeStructure> typeSchema);
+
+ /// [matchFutureOrInternal] should be implemented by concrete classes
+ /// implementing [TypeAnalyzerOperations]. The implementations of
+ /// [matchFutureOr] and [matchTypeSchemaFutureOr] are provided by mixing in
+ /// [TypeAnalyzerOperationsMixin], which defines [matchFutureOr] and
+ /// [matchTypeSchemaFutureOr] in terms of [matchFutureOrInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [matchFutureOrInternal], and
+ /// receive the implementation of both [matchFutureOr] and
+ /// [matchTypeSchemaFutureOr] from the mixin.
+ ///
+ /// The auxiliary purpose of [matchFutureOrInternal] is to facilitate the
+ /// development of the shared code at early stages. Sometimes the sharing of
+ /// the code starts by unifying the implementations of some concrete members
+ /// in the Analyzer and the CFE by bringing them in a form that looks
+ /// syntactically very similar in both tools, and then continues by
+ /// abstracting the two concrete members and using the shared abstracted one
+ /// instead of the two concrete methods existing previously. During the early
+ /// stages of unifying the two concrete members it can be beneficial to use
+ /// [matchFutureOrInternal] instead of the tool-specific ways of constructing
+ /// a future type, for the sake of uniformity, and to simplify the abstraction
+ /// step too.
+ TypeStructure? matchFutureOrInternal(TypeStructure type);
/// If [type] is a parameter type that is of a kind used in type inference,
/// returns the corresponding parameter.
@@ -179,27 +458,70 @@
/// `foo`.
///
/// X foo<X>(bool c, X x1, X x2) => c ? x1 : x2;
- InferableParameter? matchInferableParameter(Type type);
+ InferableParameter? matchInferableParameter(
+ SharedTypeView<TypeStructure> type);
/// If [type] is a subtype of the type `Iterable<T>?` for some `T`, returns
/// the type `T`. Otherwise returns `null`.
- Type? matchIterableType(Type type);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [matchIterableTypeInternal] to
+ /// receive a concrete implementation of [matchIterableType] instead of
+ /// implementing [matchIterableType] directly.
+ SharedTypeView<TypeStructure>? matchIterableType(
+ SharedTypeView<TypeStructure> type);
/// If [typeSchema] is the type schema `Iterable<T>?` (or a subtype thereof),
/// for some `T`, returns the type `T`. Otherwise returns `null`.
- TypeSchema? matchIterableTypeSchema(TypeSchema typeSchema);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [matchIterableTypeInternal] to
+ /// receive a concrete implementation of [matchIterableTypeSchema] instead of
+ /// implementing [matchIterableTypeSchema] directly.
+ SharedTypeSchemaView<TypeStructure>? matchIterableTypeSchema(
+ SharedTypeSchemaView<TypeStructure> typeSchema);
+
+ /// [matchIterableTypeInternal] should be implemented by concrete classes
+ /// implementing [TypeAnalyzerOperations]. The implementations of
+ /// [matchIterableType] and [matchIterableTypeSchema] are provided by mixing
+ /// in [TypeAnalyzerOperationsMixin], which defines [matchIterableType] and
+ /// [matchIterableTypeSchema] in terms of [matchIterableTypeInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [matchIterableTypeInternal], and
+ /// receive the implementation of both [matchIterableType] and
+ /// [matchIterableTypeSchema] from the mixin.
+ ///
+ /// The auxiliary purpose of [matchIterableTypeInternal] is to facilitate the
+ /// development of the shared code at early stages. Sometimes the sharing of
+ /// the code starts by unifying the implementations of some concrete members
+ /// in the Analyzer and the CFE by bringing them in a form that looks
+ /// syntactically very similar in both tools, and then continues by
+ /// abstracting the two concrete members and using the shared abstracted one
+ /// instead of the two concrete methods existing previously. During the early
+ /// stages of unifying the two concrete members it can be beneficial to use
+ /// [matchIterableTypeInternal] instead of the tool-specific ways of
+ /// constructing a future type, for the sake of uniformity, and to simplify
+ /// the abstraction step too.
+ TypeStructure? matchIterableTypeInternal(TypeStructure type);
/// If [type] is a subtype of the type `List<T>?` for some `T`, returns the
/// type `T`. Otherwise returns `null`.
- Type? matchListType(Type type);
+ SharedTypeView<TypeStructure>? matchListType(
+ SharedTypeView<TypeStructure> type);
/// If [type] is a subtype of the type `Map<K, V>?` for some `K` and `V`,
/// returns these `K` and `V`. Otherwise returns `null`.
- ({Type keyType, Type valueType})? matchMapType(Type type);
+ ({
+ SharedTypeView<TypeStructure> keyType,
+ SharedTypeView<TypeStructure> valueType
+ })? matchMapType(SharedTypeView<TypeStructure> type);
/// If [type] is a subtype of the type `Stream<T>?` for some `T`, returns
/// the type `T`. Otherwise returns `null`.
- Type? matchStreamType(Type type);
+ SharedTypeView<TypeStructure>? matchStreamType(
+ SharedTypeView<TypeStructure> type);
/// If [type] was introduced by a class, mixin, enum, or extension type,
/// returns an object of [TypeDeclarationMatchResult] describing the
@@ -207,24 +529,64 @@
///
/// If [type] isn't introduced by a class, mixin, enum, or extension type,
/// returns null.
- TypeDeclarationMatchResult? matchTypeDeclarationType(Type type);
+ TypeDeclarationMatchResult? matchTypeDeclarationType(
+ SharedTypeView<TypeStructure> type);
/// Computes `NORM` of [type].
/// https://github.com/dart-lang/language
/// See `resources/type-system/normalization.md`
- Type normalize(Type type);
+ SharedTypeView<TypeStructure> normalize(SharedTypeView<TypeStructure> type);
/// Builds the client specific record type.
- Type recordType(
- {required List<Type> positional, required List<(String, Type)> named});
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [recordTypeInternal] to
+ /// receive a concrete implementation of [recordType] instead of implementing
+ /// [recordType] directly.
+ SharedTypeView<TypeStructure> recordType(
+ {required List<SharedTypeView<TypeStructure>> positional,
+ required List<(String, SharedTypeView<TypeStructure>)> named});
/// Builds the client specific record type schema.
- TypeSchema recordTypeSchema(
- {required List<TypeSchema> positional,
- required List<(String, TypeSchema)> named});
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should mix in
+ /// [TypeAnalyzerOperationsMixin] and implement [recordTypeInternal] to
+ /// receive a concrete implementation of [recordTypeSchema] instead of
+ /// implementing [recordTypeSchema] directly.
+ SharedTypeSchemaView<TypeStructure> recordTypeSchema(
+ {required List<SharedTypeSchemaView<TypeStructure>> positional,
+ required List<(String, SharedTypeSchemaView<TypeStructure>)> named});
+
+ /// [recordTypeInternal] should be implemented by concrete classes
+ /// implementing [TypeAnalyzerOperations]. The implementations of [recordType]
+ /// and [recordTypeSchema] are provided by mixing in
+ /// [TypeAnalyzerOperationsMixin], which defines [recordType] and
+ /// [recordTypeSchema] in terms of [recordTypeInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case [recordTypeInternal], and receive
+ /// the implementation of both [recordType] and [recordTypeSchema] from the
+ /// mixin.
+ ///
+ /// The auxiliary purpose of [recordTypeInternal] is to facilitate the
+ /// development of the shared code at early stages. Sometimes the sharing of
+ /// the code starts by unifying the implementations of some concrete members
+ /// in the Analyzer and the CFE by bringing them in a form that looks
+ /// syntactically very similar in both tools, and then continues by
+ /// abstracting the two concrete members and using the shared abstracted one
+ /// instead of the two concrete methods existing previously. During the early
+ /// stages of unifying the two concrete members it can be beneficial to use
+ /// [recordTypeInternal] instead of the tool-specific ways of constructing a
+ /// future type, for the sake of uniformity, and to simplify the abstraction
+ /// step too.
+ TypeStructure recordTypeInternal(
+ {required List<TypeStructure> positional,
+ required List<(String, TypeStructure)> named});
/// Returns the type schema `Stream`, with type argument [elementTypeSchema].
- TypeSchema streamTypeSchema(TypeSchema elementTypeSchema);
+ SharedTypeSchemaView<TypeStructure> streamTypeSchema(
+ SharedTypeSchemaView<TypeStructure> elementTypeSchema);
/// Returns `true` if [leftType] is a subtype of the greatest closure of
/// [rightSchema].
@@ -234,10 +596,13 @@
/// [leftType] via [isSubtypeOf]. However, that would mean at least two
/// recursive descends over types. This method is supposed to have optimized
/// implementations that only use one recursive descend.
- bool typeIsSubtypeOfTypeSchema(Type leftType, TypeSchema rightSchema);
-
- /// Computes the greatest lower bound of [typeSchema1] and [typeSchema2].
- TypeSchema typeSchemaGlb(TypeSchema typeSchema1, TypeSchema typeSchema2);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should
+ /// implement [isSubtypeOfInternal] and mix in [TypeAnalyzerOperationsMixin]
+ /// to receive an implementation of [typeIsSubtypeOfTypeSchema] instead of
+ /// implementing it directly.
+ bool typeIsSubtypeOfTypeSchema(SharedTypeView<TypeStructure> leftType,
+ SharedTypeSchemaView<TypeStructure> rightSchema);
/// Returns `true` if the least closure of [leftSchema] is a subtype of
/// [rightType].
@@ -247,7 +612,13 @@
/// [isSubtypeOf]. However, that would mean at least two recursive descends
/// over types. This method is supposed to have optimized implementations
/// that only use one recursive descend.
- bool typeSchemaIsSubtypeOfType(TypeSchema leftSchema, Type rightType);
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should
+ /// implement [isSubtypeOfInternal] and mix in [TypeAnalyzerOperationsMixin]
+ /// to receive an implementation of [typeSchemaIsSubtypeOfType] instead of
+ /// implementing it directly.
+ bool typeSchemaIsSubtypeOfType(SharedTypeSchemaView<TypeStructure> leftSchema,
+ SharedTypeView<TypeStructure> rightType);
/// Returns `true` if least closure of [leftSchema] is a subtype of
/// the greatest closure of [rightSchema].
@@ -257,20 +628,236 @@
/// the resulting types via [isSubtypeOf]. However, that would mean at least
/// three recursive descends over types. This method is supposed to have
/// optimized implementations that only use one recursive descend.
+ ///
+ /// The concrete classes implementing [TypeAnalyzerOperations] should
+ /// implement [isSubtypeOfInternal] and mix in [TypeAnalyzerOperationsMixin]
+ /// to receive an implementation of [typeSchemaIsSubtypeOfTypeSchema] instead
+ /// of implementing it directly.
bool typeSchemaIsSubtypeOfTypeSchema(
- TypeSchema leftSchema, TypeSchema rightSchema);
+ SharedTypeSchemaView<TypeStructure> leftSchema,
+ SharedTypeSchemaView<TypeStructure> rightSchema);
- /// Computes the least upper bound of [typeSchema1] and [typeSchema2].
- TypeSchema typeSchemaLub(TypeSchema typeSchema1, TypeSchema typeSchema2);
-
- /// Returns the nullability suffix of [typeSchema].
- NullabilitySuffix typeSchemaNullabilitySuffix(TypeSchema typeSchema);
+ /// The concrete classes implementing [TypeAnalyzerOperations] should
+ /// implement [isSubtypeOfInternal] in order to receive the implementations of
+ /// [typeIsSubtypeOfTypeSchema], [typeSchemaIsSubtypeOfType], and
+ /// [typeSchemaIsSubtypeOfTypeSchema] by mixing in
+ /// [TypeAnalyzerOperationsMixin].
+ bool isSubtypeOfInternal(TypeStructure left, TypeStructure right);
/// Converts a type into a corresponding type schema.
- TypeSchema typeToSchema(Type type);
+ SharedTypeSchemaView<TypeStructure> typeToSchema(
+ SharedTypeView<TypeStructure> type);
/// Returns [type] suffixed with the [suffix].
- Type withNullabilitySuffix(Type type, NullabilitySuffix suffix);
+ SharedTypeView<TypeStructure> withNullabilitySuffix(
+ SharedTypeView<TypeStructure> type, NullabilitySuffix suffix);
+
+ @override
+ bool isNever(SharedTypeView<TypeStructure> type);
+
+ @override
+ bool isTypeParameterType(SharedTypeView<TypeStructure> type);
+
+ @override
+ SharedTypeView<TypeStructure> promoteToNonNull(
+ SharedTypeView<TypeStructure> type);
+
+ @override
+ SharedTypeView<TypeStructure>? tryPromoteToType(
+ SharedTypeView<TypeStructure> to, SharedTypeView<TypeStructure> from);
+}
+
+mixin TypeAnalyzerOperationsMixin<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Variable extends Object,
+ InferableParameter extends Object,
+ TypeDeclarationType extends Object,
+ TypeDeclaration extends Object>
+ implements
+ TypeAnalyzerOperations<TypeStructure, Variable, InferableParameter,
+ TypeDeclarationType, TypeDeclaration> {
+ @override
+ SharedTypeView<TypeStructure> futureType(
+ SharedTypeView<TypeStructure> argumentType) {
+ return new SharedTypeView(
+ futureTypeInternal(argumentType.unwrapTypeView()));
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure> futureTypeSchema(
+ SharedTypeSchemaView<TypeStructure> argumentTypeSchema) {
+ return new SharedTypeSchemaView(
+ futureTypeInternal(argumentTypeSchema.unwrapTypeSchemaView()));
+ }
+
+ @override
+ TypeDeclarationKind? getTypeDeclarationKind(
+ SharedTypeView<TypeStructure> type) {
+ return getTypeDeclarationKindInternal(type.unwrapTypeView());
+ }
+
+ @override
+ TypeDeclarationKind? getTypeSchemaDeclarationKind(
+ SharedTypeSchemaView<TypeStructure> typeSchema) {
+ return getTypeDeclarationKindInternal(typeSchema.unwrapTypeSchemaView());
+ }
+
+ @override
+ SharedTypeView<TypeStructure> glb(SharedTypeView<TypeStructure> type1,
+ SharedTypeView<TypeStructure> type2) {
+ return new SharedTypeView(
+ glbInternal(type1.unwrapTypeView(), type2.unwrapTypeView()));
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure> typeSchemaGlb(
+ SharedTypeSchemaView<TypeStructure> typeSchema1,
+ SharedTypeSchemaView<TypeStructure> typeSchema2) {
+ return new SharedTypeSchemaView(glbInternal(
+ typeSchema1.unwrapTypeSchemaView(),
+ typeSchema2.unwrapTypeSchemaView()));
+ }
+
+ @override
+ SharedTypeView<TypeStructure> listType(
+ SharedTypeView<TypeStructure> elementType) {
+ return new SharedTypeView(listTypeInternal(elementType.unwrapTypeView()));
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure> listTypeSchema(
+ SharedTypeSchemaView<TypeStructure> elementTypeSchema) {
+ return new SharedTypeSchemaView(
+ listTypeInternal(elementTypeSchema.unwrapTypeSchemaView()));
+ }
+
+ @override
+ SharedTypeView<TypeStructure> lub(SharedTypeView<TypeStructure> type1,
+ SharedTypeView<TypeStructure> type2) {
+ return new SharedTypeView(
+ lubInternal(type1.unwrapTypeView(), type2.unwrapTypeView()));
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure> typeSchemaLub(
+ SharedTypeSchemaView<TypeStructure> typeSchema1,
+ SharedTypeSchemaView<TypeStructure> typeSchema2) {
+ return new SharedTypeSchemaView(lubInternal(
+ typeSchema1.unwrapTypeSchemaView(),
+ typeSchema2.unwrapTypeSchemaView()));
+ }
+
+ @override
+ SharedTypeView<TypeStructure> makeNullable(
+ SharedTypeView<TypeStructure> type) {
+ return new SharedTypeView(makeNullableInternal(type.unwrapTypeView()));
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure> makeTypeSchemaNullable(
+ SharedTypeSchemaView<TypeStructure> typeSchema) {
+ return new SharedTypeSchemaView(
+ makeNullableInternal(typeSchema.unwrapTypeSchemaView()));
+ }
+
+ @override
+ SharedTypeView<TypeStructure> mapType({
+ required SharedTypeView<TypeStructure> keyType,
+ required SharedTypeView<TypeStructure> valueType,
+ }) {
+ return new SharedTypeView(mapTypeInternal(
+ keyType: keyType.unwrapTypeView(),
+ valueType: valueType.unwrapTypeView()));
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure> mapTypeSchema(
+ {required SharedTypeSchemaView<TypeStructure> keyTypeSchema,
+ required SharedTypeSchemaView<TypeStructure> valueTypeSchema}) {
+ return new SharedTypeSchemaView(mapTypeInternal(
+ keyType: keyTypeSchema.unwrapTypeSchemaView(),
+ valueType: valueTypeSchema.unwrapTypeSchemaView()));
+ }
+
+ @override
+ SharedTypeView<TypeStructure>? matchFutureOr(
+ SharedTypeView<TypeStructure> type) {
+ return matchFutureOrInternal(type.unwrapTypeView())?.wrapSharedTypeView();
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure>? matchTypeSchemaFutureOr(
+ SharedTypeSchemaView<TypeStructure> typeSchema) {
+ return matchFutureOrInternal(typeSchema.unwrapTypeSchemaView())
+ ?.wrapSharedTypeSchemaView();
+ }
+
+ @override
+ SharedTypeView<TypeStructure>? matchIterableType(
+ SharedTypeView<TypeStructure> type) {
+ return matchIterableTypeInternal(type.unwrapTypeView())
+ ?.wrapSharedTypeView();
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure>? matchIterableTypeSchema(
+ SharedTypeSchemaView<TypeStructure> typeSchema) {
+ return matchIterableTypeInternal(typeSchema.unwrapTypeSchemaView())
+ ?.wrapSharedTypeSchemaView();
+ }
+
+ @override
+ SharedTypeView<TypeStructure> recordType(
+ {required List<SharedTypeView<TypeStructure>> positional,
+ required List<(String, SharedTypeView<TypeStructure>)> named}) {
+ return new SharedTypeView(recordTypeInternal(
+ positional: positional.cast<TypeStructure>(),
+ named: named.cast<(String, TypeStructure)>()));
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure> recordTypeSchema(
+ {required List<SharedTypeSchemaView<TypeStructure>> positional,
+ required List<(String, SharedTypeSchemaView<TypeStructure>)> named}) {
+ return new SharedTypeSchemaView(recordTypeInternal(
+ positional: positional.cast<TypeStructure>(),
+ named: named.cast<(String, TypeStructure)>()));
+ }
+
+ @override
+ bool isSubtypeOf(SharedTypeView<TypeStructure> leftType,
+ SharedTypeView<TypeStructure> rightType) {
+ return isSubtypeOfInternal(
+ leftType.unwrapTypeView(), rightType.unwrapTypeView());
+ }
+
+ @override
+ bool typeIsSubtypeOfTypeSchema(SharedTypeView<TypeStructure> leftType,
+ SharedTypeSchemaView<TypeStructure> rightSchema) {
+ return isSubtypeOfInternal(
+ leftType.unwrapTypeView(), rightSchema.unwrapTypeSchemaView());
+ }
+
+ @override
+ bool typeSchemaIsSubtypeOfType(SharedTypeSchemaView<TypeStructure> leftSchema,
+ SharedTypeView<TypeStructure> rightType) {
+ return isSubtypeOfInternal(
+ leftSchema.unwrapTypeSchemaView(), rightType.unwrapTypeView());
+ }
+
+ @override
+ bool typeSchemaIsSubtypeOfTypeSchema(
+ SharedTypeSchemaView<TypeStructure> leftSchema,
+ SharedTypeSchemaView<TypeStructure> rightSchema) {
+ return isSubtypeOfInternal(
+ leftSchema.unwrapTypeSchemaView(), rightSchema.unwrapTypeSchemaView());
+ }
+
+ @override
+ SharedTypeSchemaView<TypeStructure> typeToSchema(
+ SharedTypeView<TypeStructure> type) {
+ return new SharedTypeSchemaView(type.unwrapTypeView());
+ }
}
/// Describes all possibility for a type to be derived from a declaration.
@@ -456,9 +1043,8 @@
/// Abstract interface of a type constraint generator.
abstract class TypeConstraintGenerator<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
Variable extends Object,
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
InferableParameter extends Object,
TypeDeclarationType extends Object,
TypeDeclaration extends Object,
@@ -477,7 +1063,7 @@
void restoreState(TypeConstraintGeneratorState state);
/// Abstract type operations to be used in the matching methods.
- TypeAnalyzerOperations<Variable, Type, TypeSchema, InferableParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration> get typeAnalyzerOperations;
/// True if FutureOr types are required to have the empty [NullabilitySuffix]
@@ -503,7 +1089,8 @@
///
/// The algorithm for subtype constraint generation is described in
/// https://github.com/dart-lang/language/blob/main/resources/type-system/inference.md#subtype-constraint-generation
- bool performSubtypeConstraintGenerationRightSchema(Type p, TypeSchema q,
+ bool performSubtypeConstraintGenerationRightSchema(
+ SharedTypeView<TypeStructure> p, SharedTypeSchemaView<TypeStructure> q,
{required AstNode? astNodeForTesting});
/// Matches type schema [p] against type [q] as a subtype against supertype,
@@ -520,9 +1107,29 @@
///
/// The algorithm for subtype constraint generation is described in
/// https://github.com/dart-lang/language/blob/main/resources/type-system/inference.md#subtype-constraint-generation
- bool performSubtypeConstraintGenerationLeftSchema(TypeSchema p, Type q,
+ bool performSubtypeConstraintGenerationLeftSchema(
+ SharedTypeSchemaView<TypeStructure> p, SharedTypeView<TypeStructure> q,
{required AstNode? astNodeForTesting});
+ /// [performSubtypeConstraintGenerationInternal] should be implemented by
+ /// concrete classes implementing [TypeConstraintGenerator]. The
+ /// implementations of [performSubtypeConstraintGenerationLeftSchema] and
+ /// [performSubtypeConstraintGenerationRightSchema] are provided by mixing in
+ /// [TypeConstraintGeneratorMixin], which defines
+ /// [performSubtypeConstraintGenerationLeftSchema] and
+ /// [performSubtypeConstraintGenerationRightSchema] in terms of
+ /// [performSubtypeConstraintGenerationInternal].
+ ///
+ /// The main purpose of this method is to avoid code duplication in the
+ /// concrete classes implementing [TypeAnalyzerOperations], so they can
+ /// implement only one member, in this case
+ /// [performSubtypeConstraintGenerationInternal], and receive the
+ /// implementation of both [performSubtypeConstraintGenerationLeftSchema] and
+ /// [performSubtypeConstraintGenerationRightSchema] from the mixin.
+ bool performSubtypeConstraintGenerationInternal(
+ TypeStructure p, TypeStructure q,
+ {required bool leftSchema, required AstNode? astNodeForTesting});
+
/// Matches type [p] against type schema [q] as a subtype against supertype
/// and returns true if [p] and [q] are both FutureOr, with or without
/// nullability suffixes as defined by
@@ -537,53 +1144,11 @@
/// supposed to restore the generator to the prior state in case of a
/// mismatch, taking that responsibility away from the caller.
bool performSubtypeConstraintGenerationForFutureOrRightSchema(
- Type p, TypeSchema q,
+ SharedTypeView<TypeStructure> p, SharedTypeSchemaView<TypeStructure> q,
{required AstNode? astNodeForTesting}) {
- // If `Q` is `FutureOr<Q0>` the match holds under constraint set `C`:
- if (typeAnalyzerOperations.matchTypeSchemaFutureOr(q) case TypeSchema q0?
- when enableDiscrepantObliviousnessOfNullabilitySuffixOfFutureOr ||
- typeAnalyzerOperations.typeSchemaNullabilitySuffix(q) ==
- NullabilitySuffix.none) {
- final TypeConstraintGeneratorState state = currentState;
-
- // If `P` is `FutureOr<P0>` and `P0` is a subtype match for `Q0` under
- // constraint set `C`.
- if (typeAnalyzerOperations.matchFutureOr(p) case Type p0?
- when enableDiscrepantObliviousnessOfNullabilitySuffixOfFutureOr ||
- p.nullabilitySuffix == NullabilitySuffix.none) {
- if (performSubtypeConstraintGenerationRightSchema(p0, q0,
- astNodeForTesting: astNodeForTesting)) {
- return true;
- }
- restoreState(state);
- }
-
- // Or if `P` is a subtype match for `Future<Q0>` under non-empty
- // constraint set `C`.
- bool isMatchWithFuture = performSubtypeConstraintGenerationRightSchema(
- p, typeAnalyzerOperations.futureTypeSchema(q0),
- astNodeForTesting: astNodeForTesting);
- bool matchWithFutureAddsConstraints = currentState != state;
- if (isMatchWithFuture && matchWithFutureAddsConstraints) {
- return true;
- }
- restoreState(state);
-
- // Or if `P` is a subtype match for `Q0` under constraint set `C`.
- if (performSubtypeConstraintGenerationRightSchema(p, q0,
- astNodeForTesting: astNodeForTesting)) {
- return true;
- }
- restoreState(state);
-
- // Or if `P` is a subtype match for `Future<Q0>` under empty
- // constraint set `C`.
- if (isMatchWithFuture && !matchWithFutureAddsConstraints) {
- return true;
- }
- }
-
- return false;
+ return _performSubtypeConstraintGenerationForFutureOrInternal(
+ p.unwrapTypeView(), q.unwrapTypeSchemaView(),
+ leftSchema: false, astNodeForTesting: astNodeForTesting);
}
/// Matches type schema [p] against type [q] as a subtype against supertype
@@ -600,22 +1165,29 @@
/// supposed to restore the generator to the prior state in case of a
/// mismatch, taking that responsibility away from the caller.
bool performSubtypeConstraintGenerationForFutureOrLeftSchema(
- TypeSchema p, Type q,
+ SharedTypeSchemaView<TypeStructure> p, SharedTypeView<TypeStructure> q,
{required AstNode? astNodeForTesting}) {
+ return _performSubtypeConstraintGenerationForFutureOrInternal(
+ p.unwrapTypeSchemaView(), q.unwrapTypeView(),
+ leftSchema: true, astNodeForTesting: astNodeForTesting);
+ }
+
+ bool _performSubtypeConstraintGenerationForFutureOrInternal(
+ TypeStructure p, TypeStructure q,
+ {required bool leftSchema, required AstNode? astNodeForTesting}) {
// If `Q` is `FutureOr<Q0>` the match holds under constraint set `C`:
- if (typeAnalyzerOperations.matchFutureOr(q) case Type q0?
+ if (typeAnalyzerOperations.matchFutureOrInternal(q) case TypeStructure q0?
when enableDiscrepantObliviousnessOfNullabilitySuffixOfFutureOr ||
q.nullabilitySuffix == NullabilitySuffix.none) {
final TypeConstraintGeneratorState state = currentState;
// If `P` is `FutureOr<P0>` and `P0` is a subtype match for `Q0` under
// constraint set `C`.
- if (typeAnalyzerOperations.matchTypeSchemaFutureOr(p) case TypeSchema p0?
+ if (typeAnalyzerOperations.matchFutureOrInternal(p) case TypeStructure p0?
when enableDiscrepantObliviousnessOfNullabilitySuffixOfFutureOr ||
- typeAnalyzerOperations.typeSchemaNullabilitySuffix(p) ==
- NullabilitySuffix.none) {
- if (performSubtypeConstraintGenerationLeftSchema(p0, q0,
- astNodeForTesting: astNodeForTesting)) {
+ p.nullabilitySuffix == NullabilitySuffix.none) {
+ if (performSubtypeConstraintGenerationInternal(p0, q0,
+ leftSchema: leftSchema, astNodeForTesting: astNodeForTesting)) {
return true;
}
restoreState(state);
@@ -623,9 +1195,9 @@
// Or if `P` is a subtype match for `Future<Q0>` under non-empty
// constraint set `C`.
- bool isMatchWithFuture = performSubtypeConstraintGenerationLeftSchema(
- p, typeAnalyzerOperations.futureType(q0),
- astNodeForTesting: astNodeForTesting);
+ bool isMatchWithFuture = performSubtypeConstraintGenerationInternal(
+ p, typeAnalyzerOperations.futureTypeInternal(q0),
+ leftSchema: leftSchema, astNodeForTesting: astNodeForTesting);
bool matchWithFutureAddsConstraints = currentState != state;
if (isMatchWithFuture && matchWithFutureAddsConstraints) {
return true;
@@ -633,8 +1205,8 @@
restoreState(state);
// Or if `P` is a subtype match for `Q0` under constraint set `C`.
- if (performSubtypeConstraintGenerationLeftSchema(p, q0,
- astNodeForTesting: astNodeForTesting)) {
+ if (performSubtypeConstraintGenerationInternal(p, q0,
+ leftSchema: leftSchema, astNodeForTesting: astNodeForTesting)) {
return true;
}
restoreState(state);
@@ -648,6 +1220,146 @@
return false;
}
+
+ /// Matches [p] against [q] as a subtype against supertype and returns true if
+ /// [p] and [q] are both type declaration types as defined by the enum
+ /// [TypeDeclarationKind], and [p] is a subtype of [q] under some constraints
+ /// imposed on type parameters occurring in [q], and false otherwise.
+ ///
+ /// An invariant of the type inference is that only [p] or [q] may be a
+ /// schema (in other words, may contain the unknown type `_`); the other must
+ /// be simply a type. If [leftSchema] is `true`, [p] may contain `_`; if it is
+ /// `false`, [q] may contain `_`.
+ ///
+ /// As the generator computes the constraints making the relation possible, it
+ /// changes its internal state. The current state of the generator can be
+ /// obtained by [currentState], and the generator can be restored to a state
+ /// via [restoreState]. All of the shared constraint generation methods are
+ /// supposed to restore the generator to the prior state in case of a
+ /// mismatch, taking that responsibility away from the caller.
+ bool? performSubtypeConstraintGenerationForTypeDeclarationTypes(
+ TypeStructure p, TypeStructure q,
+ {required bool leftSchema, required AstNode? astNodeForTesting}) {
+ switch ((
+ typeAnalyzerOperations.matchTypeDeclarationType(new SharedTypeView(p)),
+ typeAnalyzerOperations.matchTypeDeclarationType(new SharedTypeView(q))
+ )) {
+ // If `P` is `C<M0, ..., Mk> and `Q` is `C<N0, ..., Nk>`, then the match
+ // holds under constraints `C0 + ... + Ck`:
+ // If `Mi` is a subtype match for `Ni` with respect to L under
+ // constraints `Ci`.
+ case (
+ TypeDeclarationMatchResult(
+ typeDeclarationKind: TypeDeclarationKind pTypeDeclarationKind,
+ typeDeclaration: TypeDeclaration pDeclarationObject,
+ typeArguments: List<TypeStructure> pTypeArguments
+ ),
+ TypeDeclarationMatchResult(
+ typeDeclarationKind: TypeDeclarationKind qTypeDeclarationKind,
+ typeDeclaration: TypeDeclaration qDeclarationObject,
+ typeArguments: List<TypeStructure> qTypeArguments
+ )
+ )
+ when pTypeDeclarationKind == qTypeDeclarationKind &&
+ pDeclarationObject == qDeclarationObject:
+ return _interfaceTypeArguments(
+ pDeclarationObject, pTypeArguments, qTypeArguments, leftSchema,
+ astNodeForTesting: astNodeForTesting);
+
+ case (TypeDeclarationMatchResult(), TypeDeclarationMatchResult()):
+ return _interfaceTypes(p, q, leftSchema,
+ astNodeForTesting: astNodeForTesting);
+
+ case (
+ TypeDeclarationMatchResult? pMatched,
+ TypeDeclarationMatchResult? qMatched
+ ):
+ assert(pMatched == null || qMatched == null);
+ return null;
+ }
+ }
+
+ /// Match arguments [pTypeArguments] of P against arguments [qTypeArguments]
+ /// of Q, taking into account the variance of type variables in [declaration].
+ /// If returns `false`, the constraints are unchanged.
+ bool _interfaceTypeArguments(
+ TypeDeclaration declaration,
+ List<TypeStructure> pTypeArguments,
+ List<TypeStructure> qTypeArguments,
+ bool leftSchema,
+ {required AstNode? astNodeForTesting}) {
+ assert(pTypeArguments.length == qTypeArguments.length);
+
+ final TypeConstraintGeneratorState state = currentState;
+
+ for (int i = 0; i < pTypeArguments.length; i++) {
+ Variance variance =
+ typeAnalyzerOperations.getTypeParameterVariance(declaration, i);
+ TypeStructure M = pTypeArguments[i];
+ TypeStructure N = qTypeArguments[i];
+ if ((variance == Variance.covariant || variance == Variance.invariant) &&
+ !performSubtypeConstraintGenerationInternal(M, N,
+ leftSchema: leftSchema, astNodeForTesting: astNodeForTesting)) {
+ restoreState(state);
+ return false;
+ }
+ if ((variance == Variance.contravariant ||
+ variance == Variance.invariant) &&
+ !performSubtypeConstraintGenerationInternal(N, M,
+ leftSchema: !leftSchema, astNodeForTesting: astNodeForTesting)) {
+ restoreState(state);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ bool _interfaceTypes(TypeStructure p, TypeStructure q, bool leftSchema,
+ {required AstNode? astNodeForTesting}) {
+ if (p.nullabilitySuffix != NullabilitySuffix.none) {
+ return false;
+ }
+
+ if (q.nullabilitySuffix != NullabilitySuffix.none) {
+ return false;
+ }
+
+ // If `P` is `C0<M0, ..., Mk>` and `Q` is `C1<N0, ..., Nj>` then the match
+ // holds with respect to `L` under constraints `C`:
+ // If `C1<B0, ..., Bj>` is a superinterface of `C0<M0, ..., Mk>` and
+ // `C1<B0, ..., Bj>` is a subtype match for `C1<N0, ..., Nj>` with
+ // respect to `L` under constraints `C`.
+
+ if ((
+ typeAnalyzerOperations.matchTypeDeclarationType(new SharedTypeView(p)),
+ typeAnalyzerOperations.matchTypeDeclarationType(new SharedTypeView(q))
+ )
+ case (
+ TypeDeclarationMatchResult(
+ typeDeclarationType: TypeDeclarationType pTypeDeclarationType
+ ),
+ TypeDeclarationMatchResult(
+ typeDeclaration: TypeDeclaration qTypeDeclaration,
+ typeArguments: List<TypeStructure> qTypeArguments
+ )
+ )) {
+ if (getTypeArgumentsAsInstanceOf(pTypeDeclarationType, qTypeDeclaration)
+ case List<TypeStructure> typeArguments) {
+ return _interfaceTypeArguments(
+ qTypeDeclaration, typeArguments, qTypeArguments, leftSchema,
+ astNodeForTesting: astNodeForTesting);
+ }
+ }
+
+ return false;
+ }
+
+ /// Returns the type arguments of the supertype of [type] that is an
+ /// instantiation of [typeDeclaration]. If none of the supertypes of [type]
+ /// are instantiations of [typeDeclaration], returns null.
+ List<TypeStructure>? getTypeArgumentsAsInstanceOf(
+ TypeDeclarationType type, TypeDeclaration typeDeclaration);
}
/// Representation of the state of [TypeConstraintGenerator].
@@ -660,3 +1372,31 @@
/// constraints generated so far. Since the count only increases as the
/// generator proceeds, restoring to a state means discarding some constraints.
extension type TypeConstraintGeneratorState(int count) {}
+
+mixin TypeConstraintGeneratorMixin<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Variable extends Object,
+ InferableParameter extends Object,
+ TypeDeclarationType extends Object,
+ TypeDeclaration extends Object,
+ AstNode extends Object>
+ on TypeConstraintGenerator<TypeStructure, Variable, InferableParameter,
+ TypeDeclarationType, TypeDeclaration, AstNode> {
+ @override
+ bool performSubtypeConstraintGenerationLeftSchema(
+ SharedTypeSchemaView<TypeStructure> p, SharedTypeView<TypeStructure> q,
+ {required AstNode? astNodeForTesting}) {
+ return performSubtypeConstraintGenerationInternal(
+ p.unwrapTypeSchemaView(), q.unwrapTypeView(),
+ leftSchema: true, astNodeForTesting: astNodeForTesting);
+ }
+
+ @override
+ bool performSubtypeConstraintGenerationRightSchema(
+ SharedTypeView<TypeStructure> p, SharedTypeSchemaView<TypeStructure> q,
+ {required AstNode? astNodeForTesting}) {
+ return performSubtypeConstraintGenerationInternal(
+ p.unwrapTypeView(), q.unwrapTypeSchemaView(),
+ leftSchema: false, astNodeForTesting: astNodeForTesting);
+ }
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_constraint.dart b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_constraint.dart
index e77394e..32e8e68 100644
--- a/pkg/_fe_analyzer_shared/lib/src/type_inference/type_constraint.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/type_inference/type_constraint.dart
@@ -9,13 +9,15 @@
///
/// We require that `typeParameter <: constraint` if `isUpper` is true, and
/// `constraint <: typeParameter` otherwise.
-class GeneratedTypeConstraint<Type extends Object, TypeSchema extends Object,
- TypeParameter extends Object, Variable extends Object> {
+class GeneratedTypeConstraint<
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ TypeParameter extends Object,
+ Variable extends Object> {
/// The type parameter that is constrained by [constraint].
final TypeParameter typeParameter;
/// The type schema constraining the type parameter.
- final TypeSchema constraint;
+ final SharedTypeSchemaView<TypeStructure> constraint;
/// True if `typeParameter <: constraint`, and false otherwise.
///
@@ -37,8 +39,7 @@
/// A constraint on a type parameter that we're inferring.
class MergedTypeConstraint<
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
TypeParameter extends Object,
Variable extends Object,
TypeDeclarationType extends Object,
@@ -62,7 +63,7 @@
/// In the example above `num` is chosen as the greatest upper bound between
/// `int` and `double`, so the resulting constraint is equal or stronger than
/// either of the two.
- TypeSchema lower;
+ SharedTypeSchemaView<TypeStructure> lower;
/// The upper bound of the type being constrained. The type being constrained
/// must be a subtype of this bound. In other words, T <: upperBound.
@@ -86,10 +87,10 @@
///
/// Here the [lower] will be `String` and the upper bound will be `num`,
/// which cannot be satisfied, so this is ill typed.
- TypeSchema upper;
+ SharedTypeSchemaView<TypeStructure> upper;
/// Where this constraint comes from, used for error messages.
- TypeConstraintOrigin<Type, TypeSchema, Variable, TypeParameter,
+ TypeConstraintOrigin<TypeStructure, Variable, TypeParameter,
TypeDeclarationType, TypeDeclaration> origin;
MergedTypeConstraint(
@@ -97,9 +98,9 @@
MergedTypeConstraint.fromExtends(
{required String typeParameterName,
- required Type boundType,
- required Type extendsType,
- required TypeAnalyzerOperations<Variable, Type, TypeSchema, TypeParameter,
+ required SharedTypeView<TypeStructure> boundType,
+ required SharedTypeView<TypeStructure> extendsType,
+ required TypeAnalyzerOperations<TypeStructure, Variable, TypeParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations})
: this(
@@ -111,21 +112,22 @@
upper: typeAnalyzerOperations.typeToSchema(extendsType),
lower: typeAnalyzerOperations.unknownType);
- MergedTypeConstraint<Type, TypeSchema, TypeParameter, Variable,
+ MergedTypeConstraint<TypeStructure, TypeParameter, Variable,
TypeDeclarationType, TypeDeclaration> clone() {
return new MergedTypeConstraint(lower: lower, upper: upper, origin: origin);
}
bool isEmpty(
- TypeAnalyzerOperations<Variable, Type, TypeSchema, TypeParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, TypeParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
- return lower is SharedUnknownType && upper is SharedUnknownType;
+ return lower is SharedUnknownTypeStructure &&
+ upper is SharedUnknownTypeStructure;
}
bool isSatisfiedBy(
- Type type,
- TypeAnalyzerOperations<Variable, Type, TypeSchema, TypeParameter,
+ SharedTypeView<TypeStructure> type,
+ TypeAnalyzerOperations<TypeStructure, Variable, TypeParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
return typeAnalyzerOperations.typeIsSubtypeOfTypeSchema(type, upper) &&
@@ -133,9 +135,9 @@
}
void mergeIn(
- GeneratedTypeConstraint<Type, TypeSchema, TypeParameter, Variable>
+ GeneratedTypeConstraint<TypeStructure, TypeParameter, Variable>
generatedTypeConstraint,
- TypeAnalyzerOperations<Variable, Type, TypeSchema, TypeParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, TypeParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
if (generatedTypeConstraint.isUpper) {
@@ -148,16 +150,16 @@
}
void mergeInTypeSchemaUpper(
- TypeSchema constraint,
- TypeAnalyzerOperations<Variable, Type, TypeSchema, TypeParameter,
+ SharedTypeSchemaView<TypeStructure> constraint,
+ TypeAnalyzerOperations<TypeStructure, Variable, TypeParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
upper = typeAnalyzerOperations.typeSchemaGlb(upper, constraint);
}
void mergeInTypeSchemaLower(
- TypeSchema constraint,
- TypeAnalyzerOperations<Variable, Type, TypeSchema, TypeParameter,
+ SharedTypeSchemaView<TypeStructure> constraint,
+ TypeAnalyzerOperations<TypeStructure, Variable, TypeParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
lower = typeAnalyzerOperations.typeSchemaLub(lower, constraint);
@@ -173,8 +175,7 @@
/// readable error message during type inference as well as determining whether
/// the constraint was used to fix the type parameter or not.
abstract class TypeConstraintOrigin<
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
Variable extends Object,
TypeParameter extends Object,
TypeDeclarationType extends Object,
@@ -182,25 +183,24 @@
const TypeConstraintOrigin();
List<String> formatError(
- TypeAnalyzerOperations<Variable, Type, TypeSchema, TypeParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, TypeParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations);
}
class UnknownTypeConstraintOrigin<
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
Variable extends Object,
InferableParameter extends Object,
TypeDeclarationType extends Object,
TypeDeclaration extends Object>
- extends TypeConstraintOrigin<Type, TypeSchema, Variable, InferableParameter,
+ extends TypeConstraintOrigin<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration> {
const UnknownTypeConstraintOrigin();
@override
List<String> formatError(
- TypeAnalyzerOperations<Variable, Type, TypeSchema, InferableParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
return <String>[];
@@ -208,16 +208,15 @@
}
class TypeConstraintFromArgument<
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
Variable extends Object,
InferableParameter extends Object,
TypeDeclarationType extends Object,
TypeDeclaration extends Object>
- extends TypeConstraintOrigin<Type, TypeSchema, Variable, InferableParameter,
+ extends TypeConstraintOrigin<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration> {
- final Type argumentType;
- final Type parameterType;
+ final SharedTypeView<TypeStructure> argumentType;
+ final SharedTypeView<TypeStructure> parameterType;
final String parameterName;
final String? genericClassName;
final bool isGenericClassInDartCore;
@@ -231,7 +230,7 @@
@override
List<String> formatError(
- TypeAnalyzerOperations<Variable, Type, TypeSchema, InferableParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
// TODO(cstefantsova): we should highlight the span. That would be more
@@ -258,13 +257,12 @@
}
class TypeConstraintFromExtendsClause<
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
Variable extends Object,
InferableParameter extends Object,
TypeDeclarationType extends Object,
TypeDeclaration extends Object>
- extends TypeConstraintOrigin<Type, TypeSchema, Variable, InferableParameter,
+ extends TypeConstraintOrigin<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration> {
/// Name of the type parameter with the extends clause.
final String typeParameterName;
@@ -273,13 +271,13 @@
/// this clause only when it is not `null`.
///
/// For example `Iterable<T>` for `<T, E extends Iterable<T>>`.
- final Type boundType;
+ final SharedTypeView<TypeStructure> boundType;
/// [boundType] in which type parameters are substituted with inferred
/// type arguments.
///
/// For example `Iterable<int>` if `T` inferred to `int`.
- final Type extendsType;
+ final SharedTypeView<TypeStructure> extendsType;
TypeConstraintFromExtendsClause(
{required this.typeParameterName,
@@ -288,7 +286,7 @@
@override
List<String> formatError(
- TypeAnalyzerOperations<Variable, Type, TypeSchema, InferableParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
String boundStr = boundType.getDisplayString();
@@ -301,13 +299,14 @@
}
class TypeConstraintFromFunctionContext<
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Type extends SharedTypeStructure<Type>,
+ TypeSchema extends SharedTypeStructure<TypeSchema>,
Variable extends Object,
InferableParameter extends Object,
TypeDeclarationType extends Object,
TypeDeclaration extends Object>
- extends TypeConstraintOrigin<Type, TypeSchema, Variable, InferableParameter,
+ extends TypeConstraintOrigin<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration> {
final Type contextType;
final Type functionType;
@@ -317,7 +316,7 @@
@override
List<String> formatError(
- TypeAnalyzerOperations<Variable, Type, TypeSchema, InferableParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
return [
@@ -329,13 +328,14 @@
}
class TypeConstraintFromReturnType<
- Type extends SharedType<Type>,
- TypeSchema extends SharedType<TypeSchema>,
+ TypeStructure extends SharedTypeStructure<TypeStructure>,
+ Type extends SharedTypeStructure<Type>,
+ TypeSchema extends SharedTypeStructure<TypeSchema>,
Variable extends Object,
InferableParameter extends Object,
TypeDeclarationType extends Object,
TypeDeclaration extends Object>
- extends TypeConstraintOrigin<Type, TypeSchema, Variable, InferableParameter,
+ extends TypeConstraintOrigin<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration> {
final Type contextType;
final Type declaredType;
@@ -345,7 +345,7 @@
@override
List<String> formatError(
- TypeAnalyzerOperations<Variable, Type, TypeSchema, InferableParameter,
+ TypeAnalyzerOperations<TypeStructure, Variable, InferableParameter,
TypeDeclarationType, TypeDeclaration>
typeAnalyzerOperations) {
return [
diff --git a/pkg/_fe_analyzer_shared/lib/src/types/shared_type.dart b/pkg/_fe_analyzer_shared/lib/src/types/shared_type.dart
index 4bd057a..c775ee0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/types/shared_type.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/types/shared_type.dart
@@ -6,56 +6,224 @@
/// Common interface for data structures used by the implementations to
/// represent the type `dynamic`.
-abstract interface class SharedDynamicType<Type extends SharedType<Type>>
- implements SharedType<Type> {}
+abstract interface class SharedDynamicTypeStructure<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ implements SharedTypeStructure<TypeStructure> {}
/// Common interface for data structures used by the implementations to
/// represent a type resulting from a compile-time error.
///
/// The implementations may choose to suppress further errors that arise from
/// the use of this type.
-abstract interface class SharedInvalidType<Type extends SharedType<Type>>
- implements SharedType<Type> {}
+abstract interface class SharedInvalidTypeStructure<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ implements SharedTypeStructure<TypeStructure> {}
/// Common interface for data structures used by the implementations to
/// represent a name/type pair.
-abstract interface class SharedNamedType<Type extends SharedType<Type>> {
+abstract interface class SharedNamedTypeStructure<
+ TypeStructure extends SharedTypeStructure<TypeStructure>> {
String get name;
- Type get type;
+ TypeStructure get type;
}
/// Common interface for data structures used by the implementations to
/// represent a record type.
-abstract interface class SharedRecordType<Type extends SharedType<Type>>
- implements SharedType<Type> {
- List<SharedNamedType<Type>> get namedTypes;
+abstract interface class SharedRecordTypeStructure<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ implements SharedTypeStructure<TypeStructure> {
+ List<SharedNamedTypeStructure<TypeStructure>> get namedTypes;
- List<Type> get positionalTypes;
+ List<TypeStructure> get positionalTypes;
}
/// Common interface for data structures used by the implementations to
/// represent a type.
-abstract interface class SharedType<Type extends SharedType<Type>> {
+abstract interface class SharedTypeStructure<
+ TypeStructure extends SharedTypeStructure<TypeStructure>> {
/// If this type ends in a suffix (`?` or `*`), the suffix it ends with;
/// otherwise [NullabilitySuffix.none].
NullabilitySuffix get nullabilitySuffix;
- /// Return the presentation of this type as it should appear when presented
- /// to users in contexts such as error messages.
+ /// Return the presentation of this type as it should appear when presented to
+ /// users in contexts such as error messages.
///
/// Clients should not depend on the content of the returned value as it will
/// be changed if doing so would improve the UX.
String getDisplayString();
- bool isStructurallyEqualTo(SharedType<Type> other);
+ bool isStructurallyEqualTo(SharedTypeStructure<TypeStructure> other);
}
/// Common interface for data structures used by the implementations to
/// represent the unknown type schema (`_`).
-abstract interface class SharedUnknownType<Type extends SharedType<Type>>
- implements SharedType<Type> {}
+///
+/// Note below that there is no `SharedUnknownTypeView`, only
+/// [SharedUnknownTypeSchemaView], since we want to restrict
+/// [SharedUnknownTypeStructure] from appearing in type views.
+abstract interface class SharedUnknownTypeStructure<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ implements SharedTypeStructure<TypeStructure> {}
/// Common interface for data structures used by the implementations to
/// represent the type `void`.
-abstract interface class SharedVoidType<Type extends SharedType<Type>>
- implements SharedType<Type> {}
+abstract interface class SharedVoidTypeStructure<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ implements SharedTypeStructure<TypeStructure> {}
+
+extension type SharedTypeView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedTypeStructure<TypeStructure> _typeStructure) implements Object {
+ TypeStructure unwrapTypeView() => _typeStructure as TypeStructure;
+
+ NullabilitySuffix get nullabilitySuffix => _typeStructure.nullabilitySuffix;
+
+ String getDisplayString() => _typeStructure.getDisplayString();
+}
+
+extension type SharedDynamicTypeView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedDynamicTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeView<TypeStructure> {}
+
+extension type SharedInvalidTypeView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedInvalidTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeView<TypeStructure> {}
+
+extension type SharedNamedTypeView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedNamedTypeStructure<TypeStructure> _namedTypeStructure)
+ implements Object {
+ SharedTypeView<TypeStructure> get type =>
+ new SharedTypeView(_namedTypeStructure.type);
+
+ String get name => _namedTypeStructure.name;
+}
+
+extension type SharedRecordTypeView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedRecordTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeView<TypeStructure> {
+ List<SharedNamedTypeView<TypeStructure>> get namedTypes {
+ return _typeStructure.namedTypes
+ as List<SharedNamedTypeView<TypeStructure>>;
+ }
+
+ List<SharedTypeView<TypeStructure>> get positionalTypes {
+ return _typeStructure.positionalTypes
+ as List<SharedTypeView<TypeStructure>>;
+ }
+}
+
+extension type SharedVoidTypeView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedVoidTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeView<TypeStructure> {}
+
+extension type SharedTypeSchemaView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedTypeStructure<TypeStructure> _typeStructure) implements Object {
+ TypeStructure unwrapTypeSchemaView() => _typeStructure as TypeStructure;
+
+ NullabilitySuffix get nullabilitySuffix => _typeStructure.nullabilitySuffix;
+
+ String getDisplayString() => _typeStructure.getDisplayString();
+}
+
+extension type SharedDynamicTypeSchemaView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedDynamicTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeSchemaView<TypeStructure> {}
+
+extension type SharedInvalidTypeSchemaView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedInvalidTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeSchemaView<TypeStructure> {}
+
+extension type SharedNamedTypeSchemaView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedNamedTypeStructure<TypeStructure> _typeStructure) implements Object {}
+
+extension type SharedRecordTypeSchemaView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedRecordTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeSchemaView<TypeStructure> {
+ List<SharedNamedTypeSchemaView<TypeStructure>> get namedTypes {
+ return _typeStructure.namedTypes
+ as List<SharedNamedTypeSchemaView<TypeStructure>>;
+ }
+
+ List<SharedTypeSchemaView<TypeStructure>> get positionalTypes {
+ return _typeStructure.positionalTypes
+ as List<SharedTypeSchemaView<TypeStructure>>;
+ }
+}
+
+/// Note that there is no `SharedUnknownTypeView`, only
+/// [SharedUnknownTypeSchemaView], since we want to restrict
+/// [SharedUnknownTypeStructure] from appearing in type views and allow it to
+/// appear only in type schema views.
+extension type SharedUnknownTypeSchemaView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedUnknownTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeSchemaView<TypeStructure> {}
+
+extension type SharedVoidTypeSchemaView<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>(
+ SharedVoidTypeStructure<TypeStructure> _typeStructure)
+ implements SharedTypeSchemaView<TypeStructure> {}
+
+/// Extension methods of [SharedTypeStructureExtension] are intended to avoid
+/// explicit null-testing on types before wrapping them into [SharedTypeView] or
+/// [SharedTypeSchemaView].
+///
+/// Consider the following code:
+/// DartType? type = e.foo();
+/// return type == null ? null : SharedTypeView(type);
+///
+/// In the example above we want to wrap the result of the evaluation of
+/// `e.foo()` in `SharedTypeView` if it's not null. For that we need to store it
+/// into a variable to enable promotion in the ternary operator that will
+/// perform the wrapping.
+///
+/// This code can be rewritten in a more concise way using
+/// [SharedTypeStructureExtension] as follows:
+/// return e.foo()?.wrapSharedTypeView();
+extension SharedTypeStructureExtension<
+ TypeStructure extends SharedTypeStructure<TypeStructure>>
+ on SharedTypeStructure<TypeStructure> {
+ SharedTypeView<TypeStructure> wrapSharedTypeView() {
+ return new SharedTypeView(this);
+ }
+
+ SharedTypeSchemaView<TypeStructure> wrapSharedTypeSchemaView() {
+ return new SharedTypeSchemaView(this);
+ }
+}
+
+extension SharedTypeStructureMapEntryExtension<
+ TypeStructure extends SharedTypeStructure<TypeStructure>> on ({
+ SharedTypeStructure<TypeStructure> keyType,
+ SharedTypeStructure<TypeStructure> valueType
+}) {
+ ({
+ SharedTypeView<TypeStructure> keyType,
+ SharedTypeView<TypeStructure> valueType
+ }) wrapSharedTypeMapEntryView() {
+ return (
+ keyType: new SharedTypeView(this.keyType),
+ valueType: new SharedTypeView(this.valueType)
+ );
+ }
+
+ ({
+ SharedTypeSchemaView<TypeStructure> keyType,
+ SharedTypeSchemaView<TypeStructure> valueType
+ }) wrapSharedTypeSchemaMapEntryView() {
+ return (
+ keyType: new SharedTypeSchemaView(this.keyType),
+ valueType: new SharedTypeSchemaView(this.valueType)
+ );
+ }
+}
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_mini_ast.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_mini_ast.dart
index efe460f..537738b 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_mini_ast.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_mini_ast.dart
@@ -6,6 +6,7 @@
import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis_operations.dart';
import 'package:_fe_analyzer_shared/src/type_inference/promotion_key_store.dart';
import 'package:_fe_analyzer_shared/src/type_inference/type_analysis_result.dart';
+import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
import '../mini_ast.dart';
import '../mini_ir.dart';
@@ -17,41 +18,46 @@
Expression getSsaNodes(void Function(SsaNodeHarness) callback) =>
new _GetSsaNodes(callback, location: computeLocation());
-Expression implicitThis_whyNotPromoted(String staticType,
- void Function(Map<Type, NonPromotionReason>) callback) =>
+Expression implicitThis_whyNotPromoted(
+ String staticType,
+ void Function(Map<SharedTypeView<Type>, NonPromotionReason>)
+ callback) =>
new _WhyNotPromoted_ImplicitThis(Type(staticType), callback,
location: computeLocation());
/// Test harness for creating flow analysis tests. This class provides all
/// the [FlowAnalysisOperations] needed by flow analysis, as well as other
/// methods needed for testing.
-class FlowAnalysisTestHarness extends Harness with FlowModelHelper<Type> {
+class FlowAnalysisTestHarness extends Harness
+ with FlowModelHelper<SharedTypeView<Type>> {
@override
final PromotionKeyStore<Var> promotionKeyStore = PromotionKeyStore();
@override
- final Type boolType = Type('bool');
+ final SharedTypeView<Type> boolType = SharedTypeView(Type('bool'));
@override
- FlowAnalysisOperations<Var, Type> get typeOperations =>
+ FlowAnalysisOperations<Var, SharedTypeView<Type>> get typeOperations =>
typeAnalyzer.operations;
}
/// Helper class allowing tests to examine the values of variables' SSA nodes.
class SsaNodeHarness {
- final FlowAnalysis<Node, Statement, Expression, Var, Type> _flow;
+ final FlowAnalysis<Node, Statement, Expression, Var, SharedTypeView<Type>>
+ _flow;
SsaNodeHarness(this._flow);
/// Gets the SSA node associated with [variable] at the current point in
/// control flow, or `null` if the variable has been write captured.
- SsaNode<Type>? operator [](Var variable) => _flow.ssaNodeForTesting(variable);
+ SsaNode<SharedTypeView<Type>>? operator [](Var variable) =>
+ _flow.ssaNodeForTesting(variable);
}
class _GetExpressionInfo extends Expression {
final Expression target;
- final void Function(ExpressionInfo<Type>?) callback;
+ final void Function(ExpressionInfo<SharedTypeView<Type>>?) callback;
_GetExpressionInfo(this.target, this.callback, {required super.location});
@@ -61,7 +67,8 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var type =
h.typeAnalyzer.analyzeExpression(target, h.operations.unknownType);
h.flow.forwardExpression(this, target);
@@ -79,17 +86,19 @@
void preVisit(PreVisitor visitor) {}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
callback(SsaNodeHarness(h.flow));
h.irBuilder.atom('null', Kind.expression, location: location);
- return SimpleTypeAnalysisResult(type: h.typeAnalyzer.nullType);
+ return SimpleTypeAnalysisResult(
+ type: SharedTypeView(h.typeAnalyzer.nullType));
}
}
class _WhyNotPromoted extends Expression {
final Expression target;
- final void Function(Map<Type, NonPromotionReason>) callback;
+ final void Function(Map<SharedTypeView<Type>, NonPromotionReason>) callback;
_WhyNotPromoted(this.target, this.callback, {required super.location});
@@ -102,7 +111,8 @@
String toString() => '$target (whyNotPromoted)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var type =
h.typeAnalyzer.analyzeExpression(target, h.operations.unknownType);
h.flow.forwardExpression(this, target);
@@ -114,7 +124,7 @@
class _WhyNotPromoted_ImplicitThis extends Expression {
final Type staticType;
- final void Function(Map<Type, NonPromotionReason>) callback;
+ final void Function(Map<SharedTypeView<Type>, NonPromotionReason>) callback;
_WhyNotPromoted_ImplicitThis(this.staticType, this.callback,
{required super.location});
@@ -126,10 +136,12 @@
String toString() => 'implicit this (whyNotPromoted)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
- callback(h.flow.whyNotPromotedImplicitThis(staticType)());
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
+ callback(h.flow.whyNotPromotedImplicitThis(SharedTypeView(staticType))());
h.irBuilder.atom('noop', Kind.expression, location: location);
- return SimpleTypeAnalysisResult(type: h.typeAnalyzer.nullType);
+ return SimpleTypeAnalysisResult(
+ type: SharedTypeView(h.typeAnalyzer.nullType));
}
}
@@ -139,7 +151,8 @@
/// [ExpressionInfo] associated with it. If the expression has no flow
/// analysis information associated with it, `null` will be passed to
/// [callback].
- Expression getExpressionInfo(void Function(ExpressionInfo<Type>?) callback) {
+ Expression getExpressionInfo(
+ void Function(ExpressionInfo<SharedTypeView<Type>>?) callback) {
var location = computeLocation();
return new _GetExpressionInfo(asExpression(location: location), callback,
location: location);
@@ -150,7 +163,7 @@
/// non-promotion info associated with it. If the expression has no
/// non-promotion info, an empty map will be passed to [callback].
Expression whyNotPromoted(
- void Function(Map<Type, NonPromotionReason>) callback) {
+ void Function(Map<SharedTypeView<Type>, NonPromotionReason>) callback) {
var location = computeLocation();
return new _WhyNotPromoted(asExpression(location: location), callback,
location: location);
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index 91a182b..4a4d073 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -9,6 +9,7 @@
import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis_operations.dart';
import 'package:_fe_analyzer_shared/src/flow_analysis/flow_link.dart';
import 'package:_fe_analyzer_shared/src/type_inference/assigned_variables.dart';
+import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
import 'package:test/test.dart';
import '../mini_ast.dart';
@@ -25,7 +26,7 @@
group('API', () {
test('asExpression_end promotes variables', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforePromotion;
+ late SsaNode<SharedTypeView<Type>> ssaBeforePromotion;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
getSsaNodes((nodes) => ssaBeforePromotion = nodes[x]!),
@@ -201,7 +202,7 @@
test('equalityOp(x != null) promotes true branch', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforePromotion;
+ late SsaNode<SharedTypeView<Type>> ssaBeforePromotion;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
getSsaNodes((nodes) => ssaBeforePromotion = nodes[x]!),
@@ -265,7 +266,7 @@
test('equalityOp(x == null) promotes false branch', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforePromotion;
+ late SsaNode<SharedTypeView<Type>> ssaBeforePromotion;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
getSsaNodes((nodes) => ssaBeforePromotion = nodes[x]!),
@@ -297,7 +298,7 @@
test('equalityOp(null != x) promotes true branch', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforePromotion;
+ late SsaNode<SharedTypeView<Type>> ssaBeforePromotion;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
getSsaNodes((nodes) => ssaBeforePromotion = nodes[x]!),
@@ -325,7 +326,7 @@
test('equalityOp(null == x) promotes false branch', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforePromotion;
+ late SsaNode<SharedTypeView<Type>> ssaBeforePromotion;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
getSsaNodes((nodes) => ssaBeforePromotion = nodes[x]!),
@@ -437,7 +438,7 @@
test('doStatement_bodyBegin() un-promotes', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforeLoop;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeLoop;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
x.as_('int'),
@@ -592,10 +593,11 @@
test('finish checks proper nesting', () {
var e = expr('Null');
var s = if_(e, []);
- var flow = FlowAnalysis<Node, Statement, Expression, Var, Type>(
- h.typeOperations, AssignedVariables<Node, Var>(),
- respectImplicitlyTypedVarInitializers: true,
- fieldPromotionEnabled: true);
+ var flow =
+ FlowAnalysis<Node, Statement, Expression, Var, SharedTypeView<Type>>(
+ h.typeOperations, AssignedVariables<Node, Var>(),
+ respectImplicitlyTypedVarInitializers: true,
+ fieldPromotionEnabled: true);
flow.ifStatement_conditionBegin();
flow.ifStatement_thenBegin(e, s);
expect(() => flow.finish(), _asserts);
@@ -603,7 +605,7 @@
test('for_conditionBegin() un-promotes', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforeLoop;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeLoop;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
x.as_('int'),
@@ -737,8 +739,8 @@
test('for_end() with break updates Ssa of modified vars', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> xSsaInsideLoop;
- late SsaNode<Type> ySsaInsideLoop;
+ late SsaNode<SharedTypeView<Type>> xSsaInsideLoop;
+ late SsaNode<SharedTypeView<Type>> ySsaInsideLoop;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -765,8 +767,8 @@
'tested', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> xSsaInsideLoop;
- late SsaNode<Type> ySsaInsideLoop;
+ late SsaNode<SharedTypeView<Type>> xSsaInsideLoop;
+ late SsaNode<SharedTypeView<Type>> ySsaInsideLoop;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -791,7 +793,7 @@
test('forEach_bodyBegin() un-promotes', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforeLoop;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeLoop;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
x.as_('int'),
@@ -944,7 +946,7 @@
test('functionExpression_begin() cancels promotions of written vars', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> ssaBeforeFunction;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeFunction;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -1263,7 +1265,7 @@
var x = Var('x');
var y = Var('y');
var z = Var('z');
- late SsaNode<Type> xSsaNodeBeforeIf;
+ late SsaNode<SharedTypeView<Type>> xSsaNodeBeforeIf;
h.run([
declare(w, type: 'Object', initializer: expr('Object')),
declare(x, type: 'bool', initializer: expr('bool')),
@@ -1291,7 +1293,7 @@
'ifStatement_end() ignores non-matching SSA info from "then" path if '
'unreachable', () {
var x = Var('x');
- late SsaNode<Type> xSsaNodeBeforeIf;
+ late SsaNode<SharedTypeView<Type>> xSsaNodeBeforeIf;
h.run([
declare(x, type: 'Object', initializer: expr('Object')),
getSsaNodes((nodes) {
@@ -1311,7 +1313,7 @@
'ifStatement_end() ignores non-matching SSA info from "else" path if '
'unreachable', () {
var x = Var('x');
- late SsaNode<Type> xSsaNodeBeforeIf;
+ late SsaNode<SharedTypeView<Type>> xSsaNodeBeforeIf;
h.run([
declare(x, type: 'Object', initializer: expr('Object')),
getSsaNodes((nodes) {
@@ -1428,6 +1430,7 @@
.get(h, key)!
.promotedTypes!
.single
+ .unwrapTypeView()
.type,
'int');
}),
@@ -1517,7 +1520,7 @@
String? expectedPromotedTypeThen, String? expectedPromotedTypeElse,
{bool inverted = false}) {
var x = Var('x');
- late SsaNode<Type> ssaBeforePromotion;
+ late SsaNode<SharedTypeView<Type>> ssaBeforePromotion;
h.run([
declare(x, type: declaredType, initializer: expr(declaredType)),
getSsaNodes((nodes) => ssaBeforePromotion = nodes[x]!),
@@ -1788,7 +1791,7 @@
test('nonNullAssert_end(x) promotes', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforePromotion;
+ late SsaNode<SharedTypeView<Type>> ssaBeforePromotion;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
getSsaNodes((nodes) => ssaBeforePromotion = nodes[x]!),
@@ -1810,7 +1813,7 @@
test('nullAwareAccess temporarily promotes', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforePromotion;
+ late SsaNode<SharedTypeView<Type>> ssaBeforePromotion;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
getSsaNodes((nodes) => ssaBeforePromotion = nodes[x]!),
@@ -2132,7 +2135,7 @@
test('switchStatement_beginCase(true) un-promotes', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforeSwitch;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeSwitch;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
x.as_('int'),
@@ -2296,7 +2299,7 @@
test('tryCatchStatement_bodyEnd() un-promotes variables assigned in body',
() {
var x = Var('x');
- late SsaNode<Type> ssaAfterTry;
+ late SsaNode<SharedTypeView<Type>> ssaAfterTry;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
x.as_('int'),
@@ -2427,8 +2430,8 @@
'tryFinallyStatement_finallyBegin() un-promotes variables assigned in '
'body', () {
var x = Var('x');
- late SsaNode<Type> ssaAtStartOfTry;
- late SsaNode<Type> ssaAfterTry;
+ late SsaNode<SharedTypeView<Type>> ssaAtStartOfTry;
+ late SsaNode<SharedTypeView<Type>> ssaAfterTry;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
x.as_('int'),
@@ -2497,8 +2500,8 @@
'variables assigned in finally', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> xSsaAtEndOfFinally;
- late SsaNode<Type> ySsaAtEndOfFinally;
+ late SsaNode<SharedTypeView<Type>> xSsaAtEndOfFinally;
+ late SsaNode<SharedTypeView<Type>> ySsaAtEndOfFinally;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -2536,10 +2539,10 @@
'is sound to do so', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> xSsaAtEndOfTry;
- late SsaNode<Type> ySsaAtEndOfTry;
- late SsaNode<Type> xSsaAtEndOfFinally;
- late SsaNode<Type> ySsaAtEndOfFinally;
+ late SsaNode<SharedTypeView<Type>> xSsaAtEndOfTry;
+ late SsaNode<SharedTypeView<Type>> ySsaAtEndOfTry;
+ late SsaNode<SharedTypeView<Type>> xSsaAtEndOfFinally;
+ late SsaNode<SharedTypeView<Type>> ySsaAtEndOfFinally;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -2999,7 +3002,7 @@
test('whileStatement_conditionBegin() un-promotes', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforeLoop;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeLoop;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
x.as_('int'),
@@ -3078,8 +3081,8 @@
test('whileStatement_end() with break updates Ssa of modified vars', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> xSsaInsideLoop;
- late SsaNode<Type> ySsaInsideLoop;
+ late SsaNode<SharedTypeView<Type>> xSsaInsideLoop;
+ late SsaNode<SharedTypeView<Type>> ySsaInsideLoop;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -3106,8 +3109,8 @@
'types were tested', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> xSsaInsideLoop;
- late SsaNode<Type> ySsaInsideLoop;
+ late SsaNode<SharedTypeView<Type>> xSsaInsideLoop;
+ late SsaNode<SharedTypeView<Type>> ySsaInsideLoop;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -3133,8 +3136,8 @@
test('write() de-promotes and updates Ssa of a promoted variable', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> ssaBeforeWrite;
- late ExpressionInfo<Type> writtenValueInfo;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeWrite;
+ late ExpressionInfo<SharedTypeView<Type>> writtenValueInfo;
h.run([
declare(x, type: 'Object', initializer: expr('Object')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -3156,8 +3159,8 @@
test('write() updates Ssa', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> ssaBeforeWrite;
- late ExpressionInfo<Type> writtenValueInfo;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeWrite;
+ late ExpressionInfo<SharedTypeView<Type>> writtenValueInfo;
h.run([
declare(x, type: 'Object', initializer: expr('Object')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -3188,8 +3191,8 @@
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> xSsaBeforeWrite;
- late SsaNode<Type> ySsa;
+ late SsaNode<SharedTypeView<Type>> xSsaBeforeWrite;
+ late SsaNode<SharedTypeView<Type>> ySsa;
h.run([
declare(x, type: 'int?', initializer: expr('int?')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -3208,7 +3211,7 @@
test('write() does not store expressionInfo for trivial expressions', () {
var x = Var('x');
var y = Var('y');
- late SsaNode<Type> ssaBeforeWrite;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeWrite;
h.run([
declare(x, type: 'Object', initializer: expr('Object')),
declare(y, type: 'int?', initializer: expr('int?')),
@@ -3230,7 +3233,7 @@
test('write() permits expression to be null', () {
var x = Var('x');
- late SsaNode<Type> ssaBeforeWrite;
+ late SsaNode<SharedTypeView<Type>> ssaBeforeWrite;
h.run([
declare(x, type: 'Object', initializer: expr('Object')),
getSsaNodes((nodes) => ssaBeforeWrite = nodes[x]!),
@@ -3443,14 +3446,15 @@
var nullVar = Var('x')..type = Type('Null');
group('setUnreachable', () {
- var unreachable = FlowModel<Type>(Reachability.initial.setUnreachable());
- var reachable = FlowModel<Type>(Reachability.initial);
+ var unreachable = FlowModel<SharedTypeView<Type>>(
+ Reachability.initial.setUnreachable());
+ var reachable = FlowModel<SharedTypeView<Type>>(Reachability.initial);
test('unchanged', () {
expect(unreachable.setUnreachable(), same(unreachable));
});
test('changed', () {
- void _check(FlowModel<Type> initial) {
+ void _check(FlowModel<SharedTypeView<Type>> initial) {
var s = initial.setUnreachable();
expect(s, isNot(same(initial)));
expect(s.reachable.overallReachable, false);
@@ -3462,33 +3466,33 @@
});
test('split', () {
- var s1 = FlowModel<Type>(Reachability.initial);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s2 = s1.split();
expect(s2.reachable.parent, same(s1.reachable));
});
test('unsplit', () {
- var s1 = FlowModel<Type>(Reachability.initial.split());
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial.split());
var s2 = s1.unsplit();
expect(s2.reachable, same(Reachability.initial));
});
group('unsplitTo', () {
test('no change', () {
- var s1 = FlowModel<Type>(Reachability.initial.split());
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial.split());
var result = s1.unsplitTo(s1.reachable.parent!);
expect(result, same(s1));
});
test('unsplit once, reachable', () {
- var s1 = FlowModel<Type>(Reachability.initial.split());
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial.split());
var s2 = s1.split();
var result = s2.unsplitTo(s1.reachable.parent!);
expect(result.reachable, same(s1.reachable));
});
test('unsplit once, unreachable', () {
- var s1 = FlowModel<Type>(Reachability.initial.split());
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial.split());
var s2 = s1.split().setUnreachable();
var result = s2.unsplitTo(s1.reachable.parent!);
expect(result.reachable.locallyReachable, false);
@@ -3496,7 +3500,7 @@
});
test('unsplit twice, reachable', () {
- var s1 = FlowModel<Type>(Reachability.initial.split());
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial.split());
var s2 = s1.split();
var s3 = s2.split();
var result = s3.unsplitTo(s1.reachable.parent!);
@@ -3504,7 +3508,7 @@
});
test('unsplit twice, top unreachable', () {
- var s1 = FlowModel<Type>(Reachability.initial.split());
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial.split());
var s2 = s1.split();
var s3 = s2.split().setUnreachable();
var result = s3.unsplitTo(s1.reachable.parent!);
@@ -3513,7 +3517,7 @@
});
test('unsplit twice, previous unreachable', () {
- var s1 = FlowModel<Type>(Reachability.initial.split());
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial.split());
var s2 = s1.split().setUnreachable();
var s3 = s2.split();
var result = s3.unsplitTo(s1.reachable.parent!);
@@ -3524,25 +3528,25 @@
group('tryPromoteForTypeCheck', () {
test('unpromoted -> unchanged (same)', () {
- var s1 = FlowModel<Type>(Reachability.initial);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s2 = s1._tryPromoteForTypeCheck(h, intVar, 'int').ifTrue;
expect(s2, same(s1));
});
test('unpromoted -> unchanged (supertype)', () {
- var s1 = FlowModel<Type>(Reachability.initial);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s2 = s1._tryPromoteForTypeCheck(h, intVar, 'Object').ifTrue;
expect(s2, same(s1));
});
test('unpromoted -> unchanged (unrelated)', () {
- var s1 = FlowModel<Type>(Reachability.initial);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s2 = s1._tryPromoteForTypeCheck(h, intVar, 'String').ifTrue;
expect(s2, same(s1));
});
test('unpromoted -> subtype', () {
- var s1 = FlowModel<Type>(Reachability.initial);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s2 = s1._tryPromoteForTypeCheck(h, intQVar, 'int').ifTrue;
expect(s2.reachable.overallReachable, true);
expect(s2.promotionInfo.unwrap(h), {
@@ -3552,7 +3556,7 @@
});
test('promoted -> unchanged (same)', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._tryPromoteForTypeCheck(h, objectQVar, 'int')
.ifTrue;
var s2 = s1._tryPromoteForTypeCheck(h, objectQVar, 'int').ifTrue;
@@ -3560,7 +3564,7 @@
});
test('promoted -> unchanged (supertype)', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._tryPromoteForTypeCheck(h, objectQVar, 'int')
.ifTrue;
var s2 = s1._tryPromoteForTypeCheck(h, objectQVar, 'Object').ifTrue;
@@ -3568,7 +3572,7 @@
});
test('promoted -> unchanged (unrelated)', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._tryPromoteForTypeCheck(h, objectQVar, 'int')
.ifTrue;
var s2 = s1._tryPromoteForTypeCheck(h, objectQVar, 'String').ifTrue;
@@ -3576,7 +3580,7 @@
});
test('promoted -> subtype', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._tryPromoteForTypeCheck(h, objectQVar, 'int?')
.ifTrue;
var s2 = s1._tryPromoteForTypeCheck(h, objectQVar, 'int').ifTrue;
@@ -3594,8 +3598,12 @@
test('without declaration', () {
// This should not happen in valid code, but test that we don't crash.
- var s = FlowModel<Type>(Reachability.initial)._write(
- h, null, objectQVar, Type('Object?'), new SsaNode<Type>(null));
+ var s = FlowModel<SharedTypeView<Type>>(Reachability.initial)._write(
+ h,
+ null,
+ objectQVar,
+ SharedTypeView(Type('Object?')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(
s.promotionInfo
?.get(h, h.promotionKeyStore.keyForVariable(objectQVar)),
@@ -3603,10 +3611,10 @@
});
test('unchanged', () {
- var s1 =
- FlowModel<Type>(Reachability.initial)._declare(h, objectQVar, true);
- var s2 = s1._write(
- h, null, objectQVar, Type('Object?'), new SsaNode<Type>(null));
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
+ ._declare(h, objectQVar, true);
+ var s2 = s1._write(h, null, objectQVar, SharedTypeView(Type('Object?')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2, isNot(same(s1)));
expect(s2.reachable, same(s1.reachable));
expect(
@@ -3619,10 +3627,10 @@
});
test('marks as assigned', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, false);
- var s2 = s1._write(
- h, null, objectQVar, Type('int?'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, objectQVar, SharedTypeView(Type('int?')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.reachable.overallReachable, true);
expect(
s2._infoFor(h, objectQVar),
@@ -3634,14 +3642,18 @@
});
test('un-promotes fully', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'int')
.ifTrue;
expect(s1.promotionInfo.unwrap(h),
contains(h.promotionKeyStore.keyForVariable(objectQVar)));
- var s2 = s1._write(h, _MockNonPromotionReason(), objectQVar,
- Type('int?'), new SsaNode<Type>(null));
+ var s2 = s1._write(
+ h,
+ _MockNonPromotionReason(),
+ objectQVar,
+ SharedTypeView(Type('int?')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.reachable.overallReachable, true);
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar): _matchVariableModel(
@@ -3653,7 +3665,7 @@
});
test('un-promotes partially, when no exact match', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'num?')
.ifTrue
@@ -3666,8 +3678,12 @@
assigned: true,
unassigned: false)
});
- var s2 = s1._write(h, _MockNonPromotionReason(), objectQVar,
- Type('num'), new SsaNode<Type>(null));
+ var s2 = s1._write(
+ h,
+ _MockNonPromotionReason(),
+ objectQVar,
+ SharedTypeView(Type('num')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.reachable.overallReachable, true);
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar): _matchVariableModel(
@@ -3679,7 +3695,7 @@
});
test('un-promotes partially, when exact match', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'num?')
.ifTrue
@@ -3694,8 +3710,12 @@
assigned: true,
unassigned: false)
});
- var s2 = s1._write(h, _MockNonPromotionReason(), objectQVar,
- Type('num'), new SsaNode<Type>(null));
+ var s2 = s1._write(
+ h,
+ _MockNonPromotionReason(),
+ objectQVar,
+ SharedTypeView(Type('num')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.reachable.overallReachable, true);
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar): _matchVariableModel(
@@ -3707,7 +3727,7 @@
});
test('leaves promoted, when exact match', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'num?')
.ifTrue
@@ -3720,8 +3740,8 @@
assigned: true,
unassigned: false)
});
- var s2 = s1._write(
- h, null, objectQVar, Type('num'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, objectQVar, SharedTypeView(Type('num')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.reachable.overallReachable, true);
expect(s2.promotionInfo, isNot(same(s1.promotionInfo)));
expect(s2.promotionInfo.unwrap(h), {
@@ -3734,7 +3754,7 @@
});
test('leaves promoted, when writing a subtype', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'num?')
.ifTrue
@@ -3747,8 +3767,8 @@
assigned: true,
unassigned: false)
});
- var s2 = s1._write(
- h, null, objectQVar, Type('int'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, objectQVar, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.reachable.overallReachable, true);
expect(s2.promotionInfo, isNot(same(s1.promotionInfo)));
expect(s2.promotionInfo.unwrap(h), {
@@ -3764,13 +3784,15 @@
test('when declared type', () {
var x = Var('x')..type = Type('int?');
- var s1 = FlowModel<Type>(Reachability.initial)._declare(h, x, true);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
+ ._declare(h, x, true);
expect(s1.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(x):
_matchVariableModel(chain: null),
});
- var s2 = s1._write(h, null, x, Type('int'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, x, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(x):
_matchVariableModel(chain: ['int']),
@@ -3780,7 +3802,8 @@
test('when declared type, if write-captured', () {
var x = Var('x')..type = Type('int?');
- var s1 = FlowModel<Type>(Reachability.initial)._declare(h, x, true);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
+ ._declare(h, x, true);
expect(s1.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(x):
_matchVariableModel(chain: null),
@@ -3793,7 +3816,8 @@
});
// 'x' is write-captured, so not promoted
- var s3 = s2._write(h, null, x, Type('int'), new SsaNode<Type>(null));
+ var s3 = s2._write(h, null, x, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s3.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(x):
_matchVariableModel(chain: null, writeCaptured: true),
@@ -3801,7 +3825,7 @@
});
test('when promoted', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'int?')
.ifTrue;
@@ -3811,8 +3835,8 @@
ofInterest: ['int?'],
),
});
- var s2 = s1._write(
- h, null, objectQVar, Type('int'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, objectQVar, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar): _matchVariableModel(
chain: ['int?', 'int'],
@@ -3822,7 +3846,7 @@
});
test('when not promoted', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'int?')
.ifFalse;
@@ -3832,8 +3856,8 @@
ofInterest: ['int?'],
),
});
- var s2 = s1._write(
- h, null, objectQVar, Type('int'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, objectQVar, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar): _matchVariableModel(
chain: ['Object', 'int'],
@@ -3844,7 +3868,7 @@
});
test('Promotes to type of interest when not previously promoted', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'num?')
.ifFalse;
@@ -3854,8 +3878,12 @@
ofInterest: ['num?'],
),
});
- var s2 = s1._write(h, _MockNonPromotionReason(), objectQVar,
- Type('num?'), new SsaNode<Type>(null));
+ var s2 = s1._write(
+ h,
+ _MockNonPromotionReason(),
+ objectQVar,
+ SharedTypeView(Type('num?')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar): _matchVariableModel(
chain: ['num?'],
@@ -3865,7 +3893,7 @@
});
test('Promotes to type of interest when previously promoted', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'num?')
.ifTrue
@@ -3877,8 +3905,12 @@
ofInterest: ['num?', 'int?'],
),
});
- var s2 = s1._write(h, _MockNonPromotionReason(), objectQVar,
- Type('int?'), new SsaNode<Type>(null));
+ var s2 = s1._write(
+ h,
+ _MockNonPromotionReason(),
+ objectQVar,
+ SharedTypeView(Type('int?')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar): _matchVariableModel(
chain: ['num?', 'int?'],
@@ -3902,7 +3934,7 @@
test('; first', () {
var x = Var('x')..type = Type('Object?');
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, x, true)
._tryPromoteForTypeCheck(h, x, 'B?')
.ifFalse
@@ -3915,7 +3947,8 @@
),
});
- var s2 = s1._write(h, null, x, Type('C'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, x, SharedTypeView(Type('C')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(x): _matchVariableModel(
chain: ['Object', 'B'],
@@ -3927,7 +3960,7 @@
test('; second', () {
var x = Var('x')..type = Type('Object?');
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, x, true)
._tryPromoteForTypeCheck(h, x, 'A?')
.ifFalse
@@ -3940,7 +3973,8 @@
),
});
- var s2 = s1._write(h, null, x, Type('C'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, x, SharedTypeView(Type('C')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(x): _matchVariableModel(
chain: ['Object', 'B'],
@@ -3952,7 +3986,7 @@
test('; nullable and non-nullable', () {
var x = Var('x')..type = Type('Object?');
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, x, true)
._tryPromoteForTypeCheck(h, x, 'A')
.ifFalse
@@ -3965,7 +3999,8 @@
),
});
- var s2 = s1._write(h, null, x, Type('B'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, x, SharedTypeView(Type('B')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(x): _matchVariableModel(
chain: ['Object', 'A'],
@@ -3977,7 +4012,7 @@
group('; ambiguous', () {
test('; no promotion', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'num?')
.ifFalse
@@ -3990,8 +4025,8 @@
ofInterest: ['num?', 'num*'],
),
});
- var s2 = s1._write(
- h, null, objectQVar, Type('int'), new SsaNode<Type>(null));
+ var s2 = s1._write(h, null, objectQVar, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null));
// It's ambiguous whether to promote to num? or num*, so we don't
// promote.
expect(s2, isNot(same(s1)));
@@ -4006,7 +4041,7 @@
});
test('exact match', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'num?')
.ifFalse
@@ -4018,8 +4053,12 @@
ofInterest: ['num?', 'num*'],
),
});
- var s2 = s1._write(h, _MockNonPromotionReason(), objectQVar,
- Type('num?'), new SsaNode<Type>(null));
+ var s2 = s1._write(
+ h,
+ _MockNonPromotionReason(),
+ objectQVar,
+ SharedTypeView(Type('num?')),
+ new SsaNode<SharedTypeView<Type>>(null));
// It's ambiguous whether to promote to num? or num*, but since the
// written type is exactly num?, we use that.
expect(s2.promotionInfo.unwrap(h), {
@@ -4036,7 +4075,7 @@
test('when promoted via test', () {
var x = Var('x')..type = Type('Object?');
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, x, true)
._tryPromoteForTypeCheck(h, x, 'num?')
.ifTrue
@@ -4049,8 +4088,12 @@
),
});
- var s2 = s1._write(h, _MockNonPromotionReason(), x, Type('double'),
- new SsaNode<Type>(null));
+ var s2 = s1._write(
+ h,
+ _MockNonPromotionReason(),
+ x,
+ SharedTypeView(Type('double')),
+ new SsaNode<SharedTypeView<Type>>(null));
expect(s2.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(x): _matchVariableModel(
chain: ['num?', 'num'],
@@ -4064,8 +4107,8 @@
var objectQVar = Var('x')..type = Type('Object?');
test('initialized', () {
- var s =
- FlowModel<Type>(Reachability.initial)._declare(h, objectQVar, true);
+ var s = FlowModel<SharedTypeView<Type>>(Reachability.initial)
+ ._declare(h, objectQVar, true);
expect(s.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar):
_matchVariableModel(assigned: true, unassigned: false),
@@ -4073,7 +4116,7 @@
});
test('not initialized', () {
- var s = FlowModel<Type>(Reachability.initial)
+ var s = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, objectQVar, false);
expect(s.promotionInfo.unwrap(h), {
h.promotionKeyStore.keyForVariable(objectQVar):
@@ -4084,13 +4127,13 @@
group('markNonNullable', () {
test('unpromoted -> unchanged', () {
- var s1 = FlowModel<Type>(Reachability.initial);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s2 = s1._tryMarkNonNullable(h, intVar).ifTrue;
expect(s2, same(s1));
});
test('unpromoted -> promoted', () {
- var s1 = FlowModel<Type>(Reachability.initial);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s2 = s1._tryMarkNonNullable(h, intQVar).ifTrue;
expect(s2.reachable.overallReachable, true);
expect(s2._infoFor(h, intQVar),
@@ -4098,7 +4141,7 @@
});
test('promoted -> unchanged', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._tryPromoteForTypeCheck(h, objectQVar, 'int')
.ifTrue;
var s2 = s1._tryMarkNonNullable(h, objectQVar).ifTrue;
@@ -4106,7 +4149,7 @@
});
test('promoted -> re-promoted', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._tryPromoteForTypeCheck(h, objectQVar, 'int?')
.ifTrue;
var s2 = s1._tryMarkNonNullable(h, objectQVar).ifTrue;
@@ -4118,7 +4161,7 @@
});
test('promote to Never', () {
- var s1 = FlowModel<Type>(Reachability.initial);
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s2 = s1._tryMarkNonNullable(h, nullVar).ifTrue;
expect(s2.reachable.overallReachable, true);
expect(s2._infoFor(h, nullVar),
@@ -4128,7 +4171,7 @@
group('conservativeJoin', () {
test('unchanged', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, intQVar, true)
._tryPromoteForTypeCheck(h, objectQVar, 'int')
.ifTrue;
@@ -4144,7 +4187,7 @@
});
test('written', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._tryPromoteForTypeCheck(h, objectQVar, 'int')
.ifTrue
._tryPromoteForTypeCheck(h, intQVar, 'int')
@@ -4160,7 +4203,7 @@
});
test('write captured', () {
- var s1 = FlowModel<Type>(Reachability.initial)
+ var s1 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._tryPromoteForTypeCheck(h, objectQVar, 'int')
.ifTrue
._tryPromoteForTypeCheck(h, intQVar, 'int')
@@ -4178,7 +4221,7 @@
group('rebaseForward', () {
test('reachability', () {
- var reachable = FlowModel<Type>(Reachability.initial);
+ var reachable = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var unreachable = reachable.setUnreachable();
expect(reachable.rebaseForward(h, reachable), same(reachable));
expect(reachable.rebaseForward(h, unreachable), same(unreachable));
@@ -4195,17 +4238,21 @@
var b = Var('b')..type = Type('int');
var c = Var('c')..type = Type('int');
var d = Var('d')..type = Type('int');
- var s0 = FlowModel<Type>(Reachability.initial)
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, a, false)
._declare(h, b, false)
._declare(h, c, false)
._declare(h, d, false);
var s1 = s0
- ._write(h, null, a, Type('int'), new SsaNode<Type>(null))
- ._write(h, null, b, Type('int'), new SsaNode<Type>(null));
+ ._write(h, null, a, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null))
+ ._write(h, null, b, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null));
var s2 = s0
- ._write(h, null, a, Type('int'), new SsaNode<Type>(null))
- ._write(h, null, c, Type('int'), new SsaNode<Type>(null));
+ ._write(h, null, a, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null))
+ ._write(h, null, c, SharedTypeView(Type('int')),
+ new SsaNode<SharedTypeView<Type>>(null));
var result = s1.rebaseForward(h, s2);
expect(result._infoFor(h, a).assigned, true);
expect(result._infoFor(h, b).assigned, true);
@@ -4218,7 +4265,7 @@
var b = Var('b')..type = Type('int');
var c = Var('c')..type = Type('int');
var d = Var('d')..type = Type('int');
- var s0 = FlowModel<Type>(Reachability.initial)
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
._declare(h, a, false)
._declare(h, b, false)
._declare(h, c, false)
@@ -4247,7 +4294,8 @@
test('write captured and promoted', () {
var a = Var('a')..type = Type('num');
- var s0 = FlowModel<Type>(Reachability.initial)._declare(h, a, false);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
+ ._declare(h, a, false);
// In s1, a is write captured. In s2 it's promoted.
var s1 = s0._conservativeJoin(h, [a], [a]);
var s2 = s0._tryPromoteForTypeCheck(h, a, 'int').ifTrue;
@@ -4265,11 +4313,12 @@
void _check(String? thisType, String? otherType, bool unsafe,
List<String>? expectedChain) {
var x = Var('x')..type = Type('Object?');
- var s0 = FlowModel<Type>(Reachability.initial)._declare(h, x, true);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
+ ._declare(h, x, true);
var s1 = s0;
if (unsafe) {
- s1 =
- s1._write(h, null, x, Type('Object?'), new SsaNode<Type>(null));
+ s1 = s1._write(h, null, x, SharedTypeView(Type('Object?')),
+ new SsaNode<SharedTypeView<Type>>(null));
}
if (thisType != null) {
s1 = s1._tryPromoteForTypeCheck(h, x, thisType).ifTrue;
@@ -4287,7 +4336,7 @@
result
._infoFor(h, x)
.promotedTypes!
- .map((t) => t.type)
+ .map((t) => t.unwrapTypeView().type)
.toList(),
expectedChain);
}
@@ -4310,8 +4359,11 @@
test('promotion chains', () {
// Verify that the given promotion chain matches the expected list of
// strings.
- void _checkChain(List<Type>? chain, List<String> expected) {
- var strings = (chain ?? <Type>[]).map((t) => t.type).toList();
+ void _checkChain(
+ List<SharedTypeView<Type>>? chain, List<String> expected) {
+ var strings = (chain ?? <SharedTypeView<Type>>[])
+ .map((t) => t.unwrapTypeView().type)
+ .toList();
expect(strings, expected);
}
@@ -4328,7 +4380,8 @@
List<String> inFinally, List<String> expectedResult) {
var x = Var('x')..type = Type('Object?');
var initialModel =
- FlowModel<Type>(Reachability.initial)._declare(h, x, true);
+ FlowModel<SharedTypeView<Type>>(Reachability.initial)
+ ._declare(h, x, true);
for (var t in before) {
initialModel = initialModel._tryPromoteForTypeCheck(h, x, t).ifTrue;
}
@@ -4384,7 +4437,8 @@
test('types of interest', () {
var a = Var('a')..type = Type('Object');
- var s0 = FlowModel<Type>(Reachability.initial)._declare(h, a, false);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial)
+ ._declare(h, a, false);
var s1 = s0._tryPromoteForTypeCheck(h, a, 'int').ifFalse;
var s2 = s0._tryPromoteForTypeCheck(h, a, 'String').ifFalse;
expect(
@@ -4399,7 +4453,7 @@
test('variable present in one state but not the other', () {
var x = Var('x')..type = Type('Object?');
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._declare(h, x, true);
expect(s1.rebaseForward(h, s0), same(s1));
expect(s0.rebaseForward(h, s1), same(s1));
@@ -4433,12 +4487,21 @@
test('should return common prefix if there are common types', () {
expect(
- PromotionModel.joinPromotedTypes([objectType, intType],
- [objectType, doubleType], h.typeOperations),
+ PromotionModel.joinPromotedTypes(
+ [SharedTypeView(objectType), SharedTypeView(intType)],
+ [SharedTypeView(objectType), SharedTypeView(doubleType)],
+ h.typeOperations),
_matchPromotionChain(['Object']));
expect(
- PromotionModel.joinPromotedTypes([objectType, numType, intType],
- [objectType, numType, doubleType], h.typeOperations),
+ PromotionModel.joinPromotedTypes([
+ SharedTypeView(objectType),
+ SharedTypeView(numType),
+ SharedTypeView(intType)
+ ], [
+ SharedTypeView(objectType),
+ SharedTypeView(numType),
+ SharedTypeView(doubleType)
+ ], h.typeOperations),
_matchPromotionChain(['Object', 'num']));
});
@@ -4483,7 +4546,8 @@
h.addSuperInterfaces('B', (_) => [Type('A'), Type('Object')]);
h.addSuperInterfaces('A', (_) => [Type('Object')]);
- void check(List<Type> chain1, List<Type> chain2, Matcher matcher) {
+ void check(List<SharedTypeView<Type>> chain1,
+ List<SharedTypeView<Type>> chain2, Matcher matcher) {
expect(
PromotionModel.joinPromotedTypes(chain1, chain2, h.typeOperations),
matcher,
@@ -4496,38 +4560,68 @@
}
{
- var chain1 = [A, B, C];
- var chain2 = [A, C];
+ var chain1 = [SharedTypeView(A), SharedTypeView(B), SharedTypeView(C)];
+ var chain2 = [SharedTypeView(A), SharedTypeView(C)];
check(chain1, chain2, same(chain2));
}
check(
- [A, B, C, F],
- [A, D, E, F],
+ [
+ SharedTypeView(A),
+ SharedTypeView(B),
+ SharedTypeView(C),
+ SharedTypeView(F)
+ ],
+ [
+ SharedTypeView(A),
+ SharedTypeView(D),
+ SharedTypeView(E),
+ SharedTypeView(F)
+ ],
_matchPromotionChain(['A', 'F']),
);
check(
- [A, B, E, F],
- [A, C, D, F],
+ [
+ SharedTypeView(A),
+ SharedTypeView(B),
+ SharedTypeView(E),
+ SharedTypeView(F)
+ ],
+ [
+ SharedTypeView(A),
+ SharedTypeView(C),
+ SharedTypeView(D),
+ SharedTypeView(F)
+ ],
_matchPromotionChain(['A', 'F']),
);
check(
- [A, C, E],
- [B, C, D],
+ [SharedTypeView(A), SharedTypeView(C), SharedTypeView(E)],
+ [SharedTypeView(B), SharedTypeView(C), SharedTypeView(D)],
_matchPromotionChain(['C']),
);
check(
- [A, C, E, F],
- [B, C, D, F],
+ [
+ SharedTypeView(A),
+ SharedTypeView(C),
+ SharedTypeView(E),
+ SharedTypeView(F)
+ ],
+ [
+ SharedTypeView(B),
+ SharedTypeView(C),
+ SharedTypeView(D),
+ SharedTypeView(F)
+ ],
_matchPromotionChain(['C', 'F']),
);
check(
- [A, B, C],
- [A, B, D],
+ [SharedTypeView(A), SharedTypeView(B), SharedTypeView(C)],
+ [SharedTypeView(A), SharedTypeView(B), SharedTypeView(D)],
_matchPromotionChain(['A', 'B']),
);
});
@@ -4587,25 +4681,27 @@
w = h.promotionKeyStore.keyForVariable(Var('w')..type = Type('Object?'));
});
- PromotionModel<Type> model(List<Type>? promotionChain,
- {List<Type>? typesOfInterest, bool assigned = false}) =>
- PromotionModel<Type>(
+ PromotionModel<SharedTypeView<Type>> model(
+ List<SharedTypeView<Type>>? promotionChain,
+ {List<SharedTypeView<Type>>? typesOfInterest,
+ bool assigned = false}) =>
+ PromotionModel<SharedTypeView<Type>>(
promotedTypes: promotionChain,
tested: typesOfInterest ?? promotionChain ?? [],
assigned: assigned,
unassigned: !assigned,
- ssaNode: new SsaNode<Type>(null));
+ ssaNode: new SsaNode<SharedTypeView<Type>>(null));
group('without input reuse', () {
test('promoted with unpromoted', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._setInfo(h, {
- x: model([intType]),
+ x: model([SharedTypeView(intType)]),
y: model(null)
});
var s2 = s0._setInfo(h, {
x: model(null),
- y: model([intType])
+ y: model([SharedTypeView(intType)])
});
expect(FlowModel.joinPromotionInfo(h, s1, s2).promotionInfo.unwrap(h), {
x: _matchVariableModel(chain: null, ofInterest: ['int']),
@@ -4615,19 +4711,19 @@
});
group('should re-use an input if possible', () {
test('identical inputs', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._setInfo(h, {
- x: model([intType]),
- y: model([stringType])
+ x: model([SharedTypeView(intType)]),
+ y: model([SharedTypeView(stringType)])
});
expect(FlowModel.joinPromotionInfo(h, s1, s1), same(s1));
});
test('one input empty', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._setInfo(h, {
- x: model([intType]),
- y: model([stringType])
+ x: model([SharedTypeView(intType)]),
+ y: model([SharedTypeView(stringType)])
});
var s2 = s0;
const Null expected = null;
@@ -4638,9 +4734,9 @@
});
test('promoted with unpromoted', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._setInfo(h, {
- x: model([intType])
+ x: model([SharedTypeView(intType)])
});
var s2 = s0._setInfo(h, {x: model(null)});
var expected = {
@@ -4653,12 +4749,12 @@
});
test('related type chains', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._setInfo(h, {
- x: model([intQType, intType])
+ x: model([SharedTypeView(intQType), SharedTypeView(intType)])
});
var s2 = s0._setInfo(h, {
- x: model([intQType])
+ x: model([SharedTypeView(intQType)])
});
var expected = {
x: _matchVariableModel(chain: ['int?'], ofInterest: ['int?', 'int'])
@@ -4670,12 +4766,12 @@
});
test('unrelated type chains', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._setInfo(h, {
- x: model([intType])
+ x: model([SharedTypeView(intType)])
});
var s2 = s0._setInfo(h, {
- x: model([stringType])
+ x: model([SharedTypeView(stringType)])
});
var expected = {
x: _matchVariableModel(chain: null, ofInterest: ['String', 'int'])
@@ -4687,11 +4783,11 @@
});
test('sub-map', () {
- var s0 = FlowModel<Type>(Reachability.initial);
- var xModel = model([intType]);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
+ var xModel = model([SharedTypeView(intType)]);
var s1 = s0._setInfo(h, {
x: xModel,
- y: model([stringType])
+ y: model([SharedTypeView(stringType)])
});
var s2 = s0._setInfo(h, {x: xModel});
var expected = {x: xModel};
@@ -4702,13 +4798,13 @@
});
test('sub-map with matched subtype', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._setInfo(h, {
- x: model([intQType, intType]),
- y: model([stringType])
+ x: model([SharedTypeView(intQType), SharedTypeView(intType)]),
+ y: model([SharedTypeView(stringType)])
});
var s2 = s0._setInfo(h, {
- x: model([intQType])
+ x: model([SharedTypeView(intQType)])
});
var expected = {
x: _matchVariableModel(chain: ['int?'], ofInterest: ['int?', 'int'])
@@ -4720,13 +4816,13 @@
});
test('sub-map with mismatched subtype', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var s1 = s0._setInfo(h, {
- x: model([intQType]),
- y: model([stringType])
+ x: model([SharedTypeView(intQType)]),
+ y: model([SharedTypeView(stringType)])
});
var s2 = s0._setInfo(h, {
- x: model([intQType, intType])
+ x: model([SharedTypeView(intQType), SharedTypeView(intType)])
});
var expected = {
x: _matchVariableModel(chain: ['int?'], ofInterest: ['int?', 'int'])
@@ -4738,7 +4834,7 @@
});
test('assigned', () {
- var s0 = FlowModel<Type>(Reachability.initial);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var unassigned = model(null, assigned: false);
var assigned = model(null, assigned: true);
var s1 = s0._setInfo(
@@ -4757,8 +4853,8 @@
});
test('write captured', () {
- var s0 = FlowModel<Type>(Reachability.initial);
- var intQModel = model([intQType]);
+ var s0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
+ var intQModel = model([SharedTypeView(intQType)]);
var writeCapturedModel = intQModel.writeCapture();
var s1 = s0._setInfo(h, {
x: writeCapturedModel,
@@ -4792,42 +4888,43 @@
x = h.promotionKeyStore.keyForVariable(Var('x')..type = Type('Object?'));
});
- PromotionModel<Type> model(List<Type> typesOfInterest) =>
- PromotionModel<Type>(
+ PromotionModel<SharedTypeView<Type>> model(
+ List<SharedTypeView<Type>> typesOfInterest) =>
+ PromotionModel<SharedTypeView<Type>>(
promotedTypes: null,
tested: typesOfInterest,
assigned: true,
unassigned: false,
- ssaNode: new SsaNode<Type>(null));
+ ssaNode: new SsaNode<SharedTypeView<Type>>(null));
test('inherits types of interest from other', () {
- var m0 = FlowModel<Type>(Reachability.initial);
+ var m0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var m1 = m0._setInfo(h, {
- x: model([intType])
+ x: model([SharedTypeView(intType)])
});
var m2 = m0._setInfo(h, {
- x: model([stringType])
+ x: model([SharedTypeView(stringType)])
});
expect(m1.inheritTested(h, m2).promotionInfo!.get(h, x)!.tested,
_matchOfInterestSet(['int', 'String']));
});
test('handles variable missing from other', () {
- var m0 = FlowModel<Type>(Reachability.initial);
+ var m0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var m1 = m0._setInfo(h, {
- x: model([intType])
+ x: model([SharedTypeView(intType)])
});
var m2 = m0;
expect(m1.inheritTested(h, m2), same(m1));
});
test('returns identical model when no changes', () {
- var m0 = FlowModel<Type>(Reachability.initial);
+ var m0 = FlowModel<SharedTypeView<Type>>(Reachability.initial);
var m1 = m0._setInfo(h, {
- x: model([intType])
+ x: model([SharedTypeView(intType)])
});
var m2 = m0._setInfo(h, {
- x: model([intType])
+ x: model([SharedTypeView(intType)])
});
expect(m1.inheritTested(h, m2), same(m1));
});
@@ -5656,7 +5753,10 @@
checkNotPromoted(x),
x.whyNotPromoted((reasons) {
expect(reasons.keys, unorderedEquals([Type('int'), Type('int?')]));
- for (var type in [Type('int'), Type('int?')]) {
+ for (var type in [
+ SharedTypeView(Type('int')),
+ SharedTypeView(Type('int?'))
+ ]) {
var nonPromotionReason =
reasons[type] as DemoteViaExplicitWrite<Var>;
expect(nonPromotionReason.node, same(writeExpression));
@@ -5730,8 +5830,8 @@
]),
checkPromoted(x, 'num'),
x.whyNotPromoted((reasons) {
- var nonPromotionReason =
- reasons[Type('int')] as DemoteViaExplicitWrite<Var>;
+ var nonPromotionReason = reasons[SharedTypeView(Type('int'))]
+ as DemoteViaExplicitWrite<Var>;
expect(nonPromotionReason.node, same(writeExpression));
expect(nonPromotionReason.documentationLink,
NonPromotionDocumentationLink.write);
@@ -11046,16 +11146,16 @@
Matcher _matchOfInterestSet(List<String> expectedTypes) {
return predicate(
- (List<Type> x) => unorderedEquals(expectedTypes)
- .matches(x.map((t) => t.type).toList(), {}),
+ (List<SharedTypeView<Type>> x) => unorderedEquals(expectedTypes)
+ .matches(x.map((t) => t.unwrapTypeView().type).toList(), {}),
'interest set $expectedTypes');
}
Matcher _matchPromotionChain(List<String>? expectedTypes) {
if (expectedTypes == null) return isNull;
return predicate(
- (List<Type> x) =>
- equals(expectedTypes).matches(x.map((t) => t.type).toList(), {}),
+ (List<SharedTypeView<Type>> x) => equals(expectedTypes)
+ .matches(x.map((t) => t.unwrapTypeView().type).toList(), {}),
'promotion chain $expectedTypes');
}
@@ -11078,7 +11178,7 @@
Matcher assignedMatcher = wrapMatcher(assigned);
Matcher unassignedMatcher = wrapMatcher(unassigned);
Matcher writeCapturedMatcher = wrapMatcher(writeCaptured);
- return predicate((PromotionModel<Type> model) {
+ return predicate((PromotionModel<SharedTypeView<Type>> model) {
if (!chainMatcher.matches(model.promotedTypes, {})) return false;
if (!ofInterestMatcher.matches(model.tested, {})) return false;
if (!assignedMatcher.matches(model.assigned, {})) return false;
@@ -11108,8 +11208,8 @@
fail('Unexpected call to accept');
}
-extension on FlowModel<Type> {
- FlowModel<Type> _conservativeJoin(FlowAnalysisTestHarness h,
+extension on FlowModel<SharedTypeView<Type>> {
+ FlowModel<SharedTypeView<Type>> _conservativeJoin(FlowAnalysisTestHarness h,
Iterable<Var> writtenVariables, Iterable<Var> capturedVariables) =>
conservativeJoin(h, [
for (Var v in writtenVariables) h.promotionKeyStore.keyForVariable(v)
@@ -11117,17 +11217,18 @@
for (Var v in capturedVariables) h.promotionKeyStore.keyForVariable(v)
]);
- FlowModel<Type> _declare(
+ FlowModel<SharedTypeView<Type>> _declare(
FlowAnalysisTestHarness h, Var variable, bool initialized) =>
this.declare(
h, h.promotionKeyStore.keyForVariable(variable), initialized);
- PromotionModel<Type> _infoFor(FlowAnalysisTestHarness h, Var variable) =>
+ PromotionModel<SharedTypeView<Type>> _infoFor(
+ FlowAnalysisTestHarness h, Var variable) =>
infoFor(h, h.promotionKeyStore.keyForVariable(variable),
ssaNode: new SsaNode(null));
- FlowModel<Type> _setInfo(
- FlowAnalysisTestHarness h, Map<int, PromotionModel<Type>> newInfo) {
+ FlowModel<SharedTypeView<Type>> _setInfo(FlowAnalysisTestHarness h,
+ Map<int, PromotionModel<SharedTypeView<Type>>> newInfo) {
var result = this;
for (var core.MapEntry(:key, :value) in newInfo.entries) {
if (result.promotionInfo?.get(h, key) != value) {
@@ -11137,43 +11238,46 @@
return result;
}
- ExpressionInfo<Type> _tryMarkNonNullable(
+ ExpressionInfo<SharedTypeView<Type>> _tryMarkNonNullable(
FlowAnalysisTestHarness h, Var variable) =>
tryMarkNonNullable(h, _varRefWithType(h, variable));
- ExpressionInfo<Type> _tryPromoteForTypeCheck(
+ ExpressionInfo<SharedTypeView<Type>> _tryPromoteForTypeCheck(
FlowAnalysisTestHarness h, Var variable, String type) =>
- tryPromoteForTypeCheck(h, _varRefWithType(h, variable), Type(type));
+ tryPromoteForTypeCheck(
+ h, _varRefWithType(h, variable), SharedTypeView(Type(type)));
int _varRef(FlowAnalysisTestHarness h, Var variable) =>
h.promotionKeyStore.keyForVariable(variable);
- TrivialVariableReference<Type> _varRefWithType(
+ TrivialVariableReference<SharedTypeView<Type>> _varRefWithType(
FlowAnalysisTestHarness h, Var variable) =>
- new TrivialVariableReference<Type>(
+ new TrivialVariableReference<SharedTypeView<Type>>(
promotionKey: _varRef(h, variable),
after: this,
type: promotionInfo
?.get(h, h.promotionKeyStore.keyForVariable(variable))
?.promotedTypes
?.last ??
- variable.type,
+ SharedTypeView(variable.type),
isThisOrSuper: false,
ssaNode: SsaNode(null));
- FlowModel<Type> _write(
+ FlowModel<SharedTypeView<Type>> _write(
FlowAnalysisTestHarness h,
NonPromotionReason? nonPromotionReason,
Var variable,
- Type writtenType,
- SsaNode<Type> newSsaNode) =>
+ SharedTypeView<Type> writtenType,
+ SsaNode<SharedTypeView<Type>> newSsaNode) =>
write(h, nonPromotionReason, h.promotionKeyStore.keyForVariable(variable),
writtenType, newSsaNode, h.typeOperations,
- unpromotedType: variable.type);
+ unpromotedType: SharedTypeView(variable.type));
}
-extension on PromotionInfo<Type>? {
- Map<int, PromotionModel<Type>> unwrap(FlowAnalysisTestHarness h) => {
+extension on PromotionInfo<SharedTypeView<Type>>? {
+ Map<int, PromotionModel<SharedTypeView<Type>>> unwrap(
+ FlowAnalysisTestHarness h) =>
+ {
for (var FlowLinkDiffEntry(:int key, right: second!)
in h.reader.diff(null, this).entries)
key: second.model
diff --git a/pkg/_fe_analyzer_shared/test/mini_ast.dart b/pkg/_fe_analyzer_shared/test/mini_ast.dart
index 4eec09d..f2fd58e 100644
--- a/pkg/_fe_analyzer_shared/test/mini_ast.dart
+++ b/pkg/_fe_analyzer_shared/test/mini_ast.dart
@@ -529,7 +529,7 @@
}
typedef SharedMatchContext
- = shared.MatchContext<Node, Expression, Pattern, Type, Var>;
+ = shared.MatchContext<Node, Expression, Pattern, SharedTypeView<Type>, Var>;
typedef SharedRecordPatternField = shared.RecordPatternField<Node, Pattern>;
@@ -548,7 +548,8 @@
String toString() => '$target as $type';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
return h.typeAnalyzer.analyzeTypeCast(this, target, type);
}
}
@@ -618,10 +619,11 @@
String toString() => '$value';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var type = h.typeAnalyzer.analyzeBoolLiteral(this, value);
h.irBuilder.atom('$value', Kind.expression, location: location);
- return new SimpleTypeAnalysisResult<Type>(type: type);
+ return new SimpleTypeAnalysisResult<Type>(type: SharedTypeView(type));
}
}
@@ -710,7 +712,8 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
// Form the IR for evaluating the LHS
var targetType =
h.typeAnalyzer.dispatchExpression(target, schema).resolveShorting();
@@ -721,7 +724,8 @@
h.typeAnalyzer._currentCascadeTargetIR = h.irBuilder.allocateTmp();
h.typeAnalyzer._currentCascadeTargetType = h.flow
.cascadeExpression_afterTarget(target, targetType,
- isNullAware: isNullAware);
+ isNullAware: isNullAware)
+ .unwrapTypeView();
if (isNullAware) {
h.flow.nullAwareAccess_rightBegin(target, targetType);
// Push `targetTmp == null` and `targetTmp` on the IR builder stack,
@@ -785,11 +789,12 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
h.irBuilder
.readTmp(h.typeAnalyzer._currentCascadeTargetIR!, location: location);
return SimpleTypeAnalysisResult(
- type: h.typeAnalyzer._currentCascadeTargetType!);
+ type: SharedTypeView(h.typeAnalyzer._currentCascadeTargetType!));
}
}
@@ -801,7 +806,7 @@
CastPattern(this.inner, this.type, {required super.location}) : super._();
@override
- TypeSchema computeSchema(Harness h) =>
+ SharedTypeSchemaView<Type> computeSchema(Harness h) =>
h.typeAnalyzer.analyzeCastPatternSchema();
@override
@@ -816,9 +821,9 @@
context: context,
pattern: this,
innerPattern: inner,
- requiredType: type,
+ requiredType: SharedTypeView(type),
);
- var matchedType = analysisResult.matchedValueType;
+ var matchedType = analysisResult.matchedValueType.unwrapTypeView();
h.irBuilder.atom(type.type, Kind.type, location: location);
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.apply(
@@ -877,11 +882,13 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
expect(h.flow.isAssigned(variable), expectedAssignedState,
reason: 'at $location');
h.irBuilder.atom('null', Kind.expression, location: location);
- return SimpleTypeAnalysisResult(type: h.typeAnalyzer.nullType);
+ return SimpleTypeAnalysisResult(
+ type: SharedTypeView(h.typeAnalyzer.nullType));
}
}
@@ -924,7 +931,8 @@
String toString() => '$inner (should produce IR $expectedIR)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result =
h.typeAnalyzer.analyzeParenthesizedExpression(this, inner, schema);
h.irBuilder.check(expectedIR, Kind.expression, location: location);
@@ -949,8 +957,9 @@
String toString() => '$inner (should be in schema $expectedSchema)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
- expect(schema.typeString, expectedSchema);
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
+ expect(schema.unwrapTypeSchemaView().type, expectedSchema);
var result =
h.typeAnalyzer.analyzeParenthesizedExpression(this, inner, schema);
return result;
@@ -973,10 +982,12 @@
String toString() => '$target (expected type: $expectedType)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result =
h.typeAnalyzer.analyzeParenthesizedExpression(this, target, schema);
- expect(result.type.type, expectedType, reason: 'at $location');
+ expect(result.type.unwrapTypeView().type, expectedType,
+ reason: 'at $location');
return result;
}
}
@@ -1002,10 +1013,11 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var promotedType = promotable._getPromotedType(h);
expect(promotedType?.type, expectedTypeStr, reason: 'at $location');
- return SimpleTypeAnalysisResult(type: NullType.instance);
+ return SimpleTypeAnalysisResult(type: SharedTypeView(NullType.instance));
}
}
@@ -1021,10 +1033,12 @@
String toString() => 'check reachable';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
expect(h.flow.isReachable, expectedReachable, reason: 'at $location');
h.irBuilder.atom('null', Kind.expression, location: location);
- return new SimpleTypeAnalysisResult(type: NullType.instance);
+ return new SimpleTypeAnalysisResult(
+ type: SharedTypeView(NullType.instance));
}
}
@@ -1067,11 +1081,13 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
expect(h.flow.isUnassigned(variable), expectedUnassignedState,
reason: 'at $location');
h.irBuilder.atom('null', Kind.expression, location: location);
- return SimpleTypeAnalysisResult(type: h.typeAnalyzer.nullType);
+ return SimpleTypeAnalysisResult(
+ type: SharedTypeView(h.typeAnalyzer.nullType));
}
}
@@ -1107,7 +1123,7 @@
}
class CollectionElementContextType extends CollectionElementContext {
- final TypeSchema elementTypeSchema;
+ final SharedTypeSchemaView<Type> elementTypeSchema;
CollectionElementContextType._(this.elementTypeSchema);
}
@@ -1133,7 +1149,8 @@
String toString() => '$condition ? $ifTrue : $ifFalse';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer
.analyzeConditionalExpression(this, condition, ifTrue, ifFalse);
h.irBuilder.apply('if', [Kind.expression, Kind.expression, Kind.expression],
@@ -1149,7 +1166,7 @@
ConstantPattern(this.constant, {required super.location}) : super._();
@override
- TypeSchema computeSchema(Harness h) =>
+ SharedTypeSchemaView<Type> computeSchema(Harness h) =>
h.typeAnalyzer.analyzeConstantPatternSchema();
@override
@@ -1162,7 +1179,7 @@
PatternResult<Type> visit(Harness h, SharedMatchContext context) {
var analysisResult =
h.typeAnalyzer.analyzeConstantPattern(context, this, constant);
- var matchedType = analysisResult.matchedValueType;
+ var matchedType = analysisResult.matchedValueType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.apply('const', [Kind.expression, Kind.type], Kind.pattern,
names: ['matchedType'], location: location);
@@ -1256,24 +1273,28 @@
if (initializer == null) {
// Use the shared logic for analyzing uninitialized variable
// declarations.
- staticType = h.typeAnalyzer.analyzeUninitializedVariableDeclaration(
- this, pattern.variable, pattern.declaredType,
- isFinal: isFinal);
+ staticType = h.typeAnalyzer
+ .analyzeUninitializedVariableDeclaration(
+ this, pattern.variable, declaredType?.wrapSharedTypeView(),
+ isFinal: isFinal)
+ .unwrapTypeView();
irName = 'declare';
argKinds = [Kind.variable];
} else {
// There's no shared logic for analyzing initialized late variable
// declarations, so analyze the declaration directly.
h.flow.lateInitializer_begin(this);
- var initializerType = h.typeAnalyzer.analyzeExpression(
- initializer,
- declaredType == null
- ? h.operations.unknownType
- : h.operations.typeToSchema(declaredType));
+ var initializerType = h.typeAnalyzer
+ .analyzeExpression(
+ initializer,
+ declaredType?.wrapSharedTypeSchemaView() ??
+ h.operations.unknownType)
+ .unwrapTypeView();
h.flow.lateInitializer_end();
staticType = variable.type = declaredType ?? initializerType;
- h.flow.declare(variable, staticType, initialized: true);
- h.flow.initialize(variable, initializerType, initializer,
+ h.flow.declare(variable, SharedTypeView(staticType), initialized: true);
+ h.flow.initialize(
+ variable, SharedTypeView(initializerType), initializer,
isFinal: isFinal,
isLate: true,
isImplicitlyTyped: declaredType == null);
@@ -1291,9 +1312,12 @@
}
} else if (initializer == null) {
var pattern = this.pattern as VariablePattern;
- var staticType = h.typeAnalyzer.analyzeUninitializedVariableDeclaration(
- this, pattern.variable, pattern.declaredType,
- isFinal: isFinal);
+ var declaredType = pattern.declaredType;
+ var staticType = h.typeAnalyzer
+ .analyzeUninitializedVariableDeclaration(
+ this, pattern.variable, declaredType?.wrapSharedTypeView(),
+ isFinal: isFinal)
+ .unwrapTypeView();
h.typeAnalyzer.handleDeclaredVariablePattern(pattern,
matchedType: staticType, staticType: staticType);
irName = 'declare';
@@ -1356,7 +1380,8 @@
String toString() => '$lhs ${isInverted ? '!=' : '=='} $rhs';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var operatorName = isInverted ? '!=' : '==';
var result =
h.typeAnalyzer.analyzeBinaryExpression(this, lhs, operatorName, rhs);
@@ -1382,7 +1407,8 @@
void preVisit(PreVisitor visitor);
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema);
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema);
}
/// Representation of a single case clause in a switch expression. Use
@@ -1431,9 +1457,10 @@
@override
void visit(Harness h, CollectionElementContext context) {
- TypeSchema typeSchema = context is CollectionElementContextType
- ? context.elementTypeSchema
- : h.operations.unknownType;
+ SharedTypeSchemaView<Type> typeSchema =
+ context is CollectionElementContextType
+ ? context.elementTypeSchema
+ : h.operations.unknownType;
h.typeAnalyzer.dispatchExpression(expression, typeSchema);
h.irBuilder.apply('celt', [Kind.expression], Kind.collectionElement,
location: location);
@@ -1443,7 +1470,7 @@
class ExpressionInTypeSchema extends Statement {
final Expression expr;
- final TypeSchema typeSchema;
+ final SharedTypeSchemaView<Type> typeSchema;
ExpressionInTypeSchema._(this.expr, this.typeSchema,
{required super.location});
@@ -1595,12 +1622,13 @@
@override
void visit(Harness h) {
- var iteratedType = h._getIteratedType(
- h.typeAnalyzer.analyzeExpression(iterable, h.operations.unknownType));
+ var iteratedType = h._getIteratedType(h.typeAnalyzer
+ .analyzeExpression(iterable, h.operations.unknownType)
+ .unwrapTypeView());
h.flow.forEach_bodyBegin(this);
var variable = this.variable;
if (variable != null && !declaresVariable) {
- h.flow.write(this, variable, iteratedType, null);
+ h.flow.write(this, variable, SharedTypeView(iteratedType), null);
}
h.typeAnalyzer._visitLoopBody(this, body);
h.flow.forEach_end();
@@ -1639,7 +1667,8 @@
bool _started = false;
- late final FlowAnalysis<Node, Statement, Expression, Var, Type> flow;
+ late final FlowAnalysis<Node, Statement, Expression, Var,
+ SharedTypeView<Type>> flow;
bool? _inferenceUpdate3Enabled;
@@ -1814,8 +1843,8 @@
kind: operator == '=='
? RelationalOperatorKind.equals
: RelationalOperatorKind.notEquals,
- parameterType: Type('Object'),
- returnType: Type('bool'));
+ parameterType: SharedTypeView(Type('Object')),
+ returnType: SharedTypeView(Type('bool')));
}
var member = getMember(matchedValueType, operator);
if (member == null) return null;
@@ -1831,8 +1860,8 @@
}
return RelationalOperatorResolution(
kind: RelationalOperatorKind.other,
- parameterType: memberType.positionalParameters[0],
- returnType: memberType.returnType);
+ parameterType: SharedTypeView(memberType.positionalParameters[0]),
+ returnType: SharedTypeView(memberType.returnType));
}
/// Runs the given [statements] through flow analysis, checking any assertions
@@ -1848,10 +1877,11 @@
var b = Block._(statements, location: computeLocation());
b.preVisit(visitor);
flow = operations.legacy
- ? FlowAnalysis<Node, Statement, Expression, Var, Type>.legacy(
+ ? FlowAnalysis<Node, Statement, Expression, Var,
+ SharedTypeView<Type>>.legacy(
operations, visitor._assignedVariables)
- : FlowAnalysis<Node, Statement, Expression, Var, Type>(
- operations, visitor._assignedVariables,
+ : FlowAnalysis<Node, Statement, Expression, Var,
+ SharedTypeView<Type>>(operations, visitor._assignedVariables,
respectImplicitlyTypedVarInitializers:
_respectImplicitlyTypedVarInitializers,
fieldPromotionEnabled: _fieldPromotionEnabled);
@@ -2106,7 +2136,8 @@
String toString() => '$lhs ?? $rhs';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer.analyzeIfNullExpression(this, lhs, rhs);
h.irBuilder.apply(
'ifNull', [Kind.expression, Kind.expression], Kind.expression,
@@ -2133,7 +2164,8 @@
String toString() => '$value';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer.analyzeIntLiteral(schema);
if (expectConversionToDouble != null) {
expect(result.convertedToDouble, expectConversionToDouble);
@@ -2174,7 +2206,8 @@
'$target.$methodName(${[for (var arg in arguments) arg].join(', ')})';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
return h.typeAnalyzer.analyzeMethodInvocation(this,
target is CascadePlaceholder ? null : target, methodName, arguments);
}
@@ -2196,7 +2229,8 @@
String toString() => '$target is${isInverted ? '!' : ''} $type';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
return h.typeAnalyzer
.analyzeTypeTest(this, target, type, isInverted: isInverted);
}
@@ -2253,15 +2287,17 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
for (var element in elements) {
element.visit(
- h, CollectionElementContextType._(TypeSchema.fromType(elementType)));
+ h, CollectionElementContextType._(SharedTypeSchemaView(elementType)));
}
h.irBuilder.apply('list', [for (var _ in elements) Kind.collectionElement],
Kind.expression,
location: location);
- return SimpleTypeAnalysisResult(type: h.operations.listType(elementType));
+ return SimpleTypeAnalysisResult(
+ type: h.operations.listType(SharedTypeView(elementType)));
}
}
@@ -2283,8 +2319,9 @@
: super._();
@override
- TypeSchema computeSchema(Harness h) => h.typeAnalyzer
- .analyzeListPatternSchema(elementType: elementType, elements: elements);
+ SharedTypeSchemaView<Type> computeSchema(Harness h) =>
+ h.typeAnalyzer.analyzeListPatternSchema(
+ elementType: elementType?.wrapSharedTypeView(), elements: elements);
@override
void preVisit(PreVisitor visitor, VariableBinder<Node, Var> variableBinder,
@@ -2297,9 +2334,9 @@
@override
PatternResult<Type> visit(Harness h, SharedMatchContext context) {
var listPatternResult = h.typeAnalyzer.analyzeListPattern(context, this,
- elementType: elementType, elements: elements);
- var matchedType = listPatternResult.matchedValueType;
- var requiredType = listPatternResult.requiredType;
+ elementType: elementType?.wrapSharedTypeView(), elements: elements);
+ var matchedType = listPatternResult.matchedValueType.unwrapTypeView();
+ var requiredType = listPatternResult.requiredType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.atom(requiredType.type, Kind.type, location: location);
h.irBuilder.apply(
@@ -2342,13 +2379,14 @@
String toString() => '() $body';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
h.flow.functionExpression_begin(this);
h.typeAnalyzer.dispatchStatement(body);
h.flow.functionExpression_end();
h.irBuilder.apply('localFunction', [Kind.statement], Kind.expression,
location: location);
- return SimpleTypeAnalysisResult(type: type);
+ return SimpleTypeAnalysisResult(type: SharedTypeView(type));
}
}
@@ -2371,7 +2409,8 @@
String toString() => '$lhs ${isAnd ? '&&' : '||'} $rhs';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var operatorName = isAnd ? '&&' : '||';
var result =
h.typeAnalyzer.analyzeBinaryExpression(this, lhs, operatorName, rhs);
@@ -2391,7 +2430,7 @@
: super._();
@override
- TypeSchema computeSchema(Harness h) =>
+ SharedTypeSchemaView<Type> computeSchema(Harness h) =>
h.typeAnalyzer.analyzeLogicalAndPatternSchema(lhs, rhs);
@override
@@ -2405,7 +2444,7 @@
PatternResult<Type> visit(Harness h, SharedMatchContext context) {
var analysisResult =
h.typeAnalyzer.analyzeLogicalAndPattern(context, this, lhs, rhs);
- var matchedType = analysisResult.matchedValueType;
+ var matchedType = analysisResult.matchedValueType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.apply('logicalAndPattern',
[Kind.pattern, Kind.pattern, Kind.type], Kind.pattern,
@@ -2429,7 +2468,7 @@
LogicalOrPattern(this.lhs, this.rhs, {required super.location}) : super._();
@override
- TypeSchema computeSchema(Harness h) =>
+ SharedTypeSchemaView<Type> computeSchema(Harness h) =>
h.typeAnalyzer.analyzeLogicalOrPatternSchema(lhs, rhs);
@override
@@ -2446,7 +2485,7 @@
PatternResult<Type> visit(Harness h, SharedMatchContext context) {
var analysisResult =
h.typeAnalyzer.analyzeLogicalOrPattern(context, this, lhs, rhs);
- var matchedType = analysisResult.matchedValueType;
+ var matchedType = analysisResult.matchedValueType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.apply('logicalOrPattern',
[Kind.pattern, Kind.pattern, Kind.type], Kind.pattern,
@@ -2501,12 +2540,12 @@
@override
void visit(Harness h, CollectionElementContext context) {
- TypeSchema keySchema;
- TypeSchema valueSchema;
+ SharedTypeSchemaView<Type> keySchema;
+ SharedTypeSchemaView<Type> valueSchema;
switch (context) {
case CollectionElementContextMapEntry(:var keyType, :var valueType):
- keySchema = TypeSchema.fromType(keyType);
- valueSchema = TypeSchema.fromType(valueType);
+ keySchema = SharedTypeSchemaView(keyType);
+ valueSchema = SharedTypeSchemaView(valueType);
default:
keySchema = valueSchema = h.operations.unknownType;
}
@@ -2536,7 +2575,8 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var context = CollectionElementContextMapEntry._(keyType, valueType);
for (var element in elements) {
element.visit(h, context);
@@ -2545,7 +2585,9 @@
Kind.expression,
location: location);
return SimpleTypeAnalysisResult(
- type: h.operations.mapType(keyType: keyType, valueType: valueType));
+ type: h.operations.mapType(
+ keyType: SharedTypeView(keyType),
+ valueType: SharedTypeView(valueType)));
}
}
@@ -2558,8 +2600,10 @@
: super._();
@override
- TypeSchema computeSchema(Harness h) => h.typeAnalyzer.analyzeMapPatternSchema(
- typeArguments: typeArguments, elements: elements);
+ SharedTypeSchemaView<Type> computeSchema(Harness h) =>
+ h.typeAnalyzer.analyzeMapPatternSchema(
+ typeArguments: typeArguments?.wrapSharedTypeMapEntryView(),
+ elements: elements);
@override
void preVisit(PreVisitor visitor, VariableBinder<Node, Var> variableBinder,
@@ -2572,9 +2616,10 @@
@override
PatternResult<Type> visit(Harness h, SharedMatchContext context) {
var mapPatternResult = h.typeAnalyzer.analyzeMapPattern(context, this,
- typeArguments: typeArguments, elements: elements);
- var matchedType = mapPatternResult.matchedValueType;
- var requiredType = mapPatternResult.requiredType;
+ typeArguments: typeArguments?.wrapSharedTypeMapEntryView(),
+ elements: elements);
+ var matchedType = mapPatternResult.matchedValueType.unwrapTypeView();
+ var requiredType = mapPatternResult.requiredType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.atom(requiredType.type, Kind.type, location: location);
h.irBuilder.apply(
@@ -2623,9 +2668,12 @@
}
class MiniAstOperations
+ with
+ TypeAnalyzerOperationsMixin<Type, Var, PromotedTypeVariableType, Type,
+ String>
implements
- TypeAnalyzerOperations<Var, Type, TypeSchema, PromotedTypeVariableType,
- Type, String> {
+ TypeAnalyzerOperations<Type, Var, PromotedTypeVariableType, Type,
+ String> {
static const Map<String, bool> _coreExhaustiveness = const {
'()': true,
'(int, int?)': false,
@@ -2696,19 +2744,21 @@
};
@override
- late final Type objectQuestionType = Type('Object?');
+ late final SharedTypeView<Type> objectQuestionType =
+ SharedTypeView(Type('Object?'));
@override
- late final Type objectType = Type('Object');
+ late final SharedTypeView<Type> objectType = SharedTypeView(Type('Object'));
@override
- late final TypeSchema unknownType = TypeSchema('_');
+ late final SharedTypeSchemaView<Type> unknownType =
+ SharedTypeSchemaView(Type('_'));
@override
- late final Type intType = Type('int');
+ late final SharedTypeView<Type> intType = SharedTypeView(Type('int'));
@override
- late final Type doubleType = Type('double');
+ late final SharedTypeView<Type> doubleType = SharedTypeView(Type('double'));
bool? _legacy;
@@ -2730,13 +2780,13 @@
final TypeSystem _typeSystem = TypeSystem();
@override
- final Type boolType = Type('bool');
+ final SharedTypeView<Type> boolType = SharedTypeView(Type('bool'));
@override
- Type get dynamicType => DynamicType.instance;
+ SharedTypeView<Type> get dynamicType => SharedTypeView(DynamicType.instance);
@override
- Type get errorType => InvalidType.instance;
+ SharedTypeView<Type> get errorType => SharedTypeView(InvalidType.instance);
bool get legacy => _legacy ?? false;
@@ -2745,10 +2795,10 @@
}
@override
- Type get neverType => NeverType.instance;
+ SharedTypeView<Type> get neverType => SharedTypeView(NeverType.instance);
@override
- Type get nullType => NullType.instance;
+ SharedTypeView<Type> get nullType => SharedTypeView(NullType.instance);
/// Updates the harness with a new result for [downwardInfer].
void addDownwardInfer({
@@ -2790,10 +2840,10 @@
}
@override
- TypeClassification classifyType(Type type) {
- if (isSubtypeOf(type, Type('Object'))) {
+ TypeClassification classifyType(SharedTypeView<Type> type) {
+ if (isSubtypeOfInternal(type.unwrapTypeView(), Type('Object'))) {
return TypeClassification.nonNullable;
- } else if (isSubtypeOf(type, NullType.instance)) {
+ } else if (isSubtypeOfInternal(type.unwrapTypeView(), NullType.instance)) {
return TypeClassification.nullOrEquivalent;
} else {
return TypeClassification.potentiallyNullable;
@@ -2809,26 +2859,29 @@
}
@override
- Type extensionTypeErasure(Type type) {
- var query = '$type';
- return _extensionTypeErasure[query] ?? type;
+ SharedTypeView<Type> extensionTypeErasure(SharedTypeView<Type> type) {
+ var query = '${type.unwrapTypeView()}';
+ return SharedTypeView(
+ _extensionTypeErasure[query] ?? type.unwrapTypeView());
}
@override
- Type factor(Type from, Type what) {
- return _typeSystem.factor(from, what);
+ SharedTypeView<Type> factor(
+ SharedTypeView<Type> from, SharedTypeView<Type> what) {
+ return SharedTypeView(
+ _typeSystem.factor(from.unwrapTypeView(), what.unwrapTypeView()));
}
@override
- Type futureType(Type argumentType) {
+ Type futureTypeInternal(Type argumentType) {
return PrimaryType('Future', args: [argumentType]);
}
@override
- TypeDeclarationKind? getTypeDeclarationKind(Type type) {
- if (isInterfaceType(type)) {
+ TypeDeclarationKind? getTypeDeclarationKindInternal(Type type) {
+ if (isInterfaceType(SharedTypeView(type))) {
return TypeDeclarationKind.interfaceDeclaration;
- } else if (isExtensionType(type)) {
+ } else if (isExtensionType(SharedTypeView(type))) {
return TypeDeclarationKind.extensionTypeDeclaration;
} else {
return null;
@@ -2843,12 +2896,7 @@
}
@override
- TypeDeclarationKind? getTypeSchemaDeclarationKind(TypeSchema typeSchema) {
- return getTypeDeclarationKind(typeSchema.toType());
- }
-
- @override
- Type glb(Type type1, Type type2) {
+ Type glbInternal(Type type1, Type type2) {
if (type1.type == type2.type) return type1;
var typeNames = [type1.type, type2.type];
typeNames.sort();
@@ -2857,83 +2905,102 @@
}
@override
- Type greatestClosure(TypeSchema schema) {
- var type = schema.toType();
- return type.closureWithRespectToUnknown(covariant: true) ?? type;
+ SharedTypeView<Type> greatestClosure(SharedTypeSchemaView<Type> schema) {
+ return SharedTypeView(schema
+ .unwrapTypeSchemaView()
+ .closureWithRespectToUnknown(covariant: true) ??
+ schema.unwrapTypeSchemaView());
}
@override
- bool isAlwaysExhaustiveType(Type type) {
- var query = type.type;
+ bool isAlwaysExhaustiveType(SharedTypeView<Type> type) {
+ var query = type.unwrapTypeView().type;
return _exhaustiveness[query] ??
fail('Unknown exhaustiveness query: $query');
}
@override
- bool isAssignableTo(Type fromType, Type toType) {
- if (legacy && isSubtypeOf(toType, fromType)) return true;
+ bool isAssignableTo(
+ SharedTypeView<Type> fromType, SharedTypeView<Type> toType) {
+ if (legacy &&
+ isSubtypeOfInternal(
+ toType.unwrapTypeView(), fromType.unwrapTypeView())) {
+ return true;
+ }
if (fromType is DynamicType) return true;
if (fromType is InvalidType) return true;
- return isSubtypeOf(fromType, toType);
+ return isSubtypeOfInternal(
+ fromType.unwrapTypeView(), toType.unwrapTypeView());
}
@override
- bool isDartCoreFunction(Type type) {
- return type is PrimaryType &&
- type.nullabilitySuffix == NullabilitySuffix.none &&
- type.name == 'Function' &&
- type.args.isEmpty;
+ bool isDartCoreFunction(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ return unwrappedType is PrimaryType &&
+ unwrappedType.nullabilitySuffix == NullabilitySuffix.none &&
+ unwrappedType.name == 'Function' &&
+ unwrappedType.args.isEmpty;
}
@override
- bool isExtensionType(Type type) {
+ bool isExtensionType(SharedTypeView<Type> type) {
// TODO(cstefantsova): Add the support for extension types in the mini ast
// testing framework.
return false;
}
@override
- bool isFunctionType(Type type) => type is FunctionType;
+ bool isFunctionType(SharedTypeView<Type> type) {
+ return type.unwrapTypeView() is FunctionType;
+ }
@override
- bool isInterfaceType(Type type) =>
- type is PrimaryType && type.isInterfaceType;
+ bool isInterfaceType(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ return unwrappedType is PrimaryType && unwrappedType.isInterfaceType;
+ }
@override
- bool isNever(Type type) =>
- type is NeverType && type.nullabilitySuffix == NullabilitySuffix.none;
+ bool isNever(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ return unwrappedType is NeverType &&
+ unwrappedType.nullabilitySuffix == NullabilitySuffix.none;
+ }
@override
- bool isNonNullable(TypeSchema typeSchema) {
- Type type = typeSchema.toType();
- if (type is DynamicType ||
- typeSchema is SharedUnknownType ||
- type is VoidType ||
- type is NullType) {
+ bool isNonNullable(SharedTypeSchemaView<Type> type) {
+ Type unwrappedType = type.unwrapTypeSchemaView();
+ if (unwrappedType is DynamicType ||
+ unwrappedType is SharedUnknownTypeStructure ||
+ unwrappedType is VoidType ||
+ unwrappedType is NullType) {
return false;
- } else if (type is PromotedTypeVariableType &&
- type.nullabilitySuffix == NullabilitySuffix.none) {
- return isNonNullable(typeToSchema(type.promotion));
+ } else if (unwrappedType is PromotedTypeVariableType &&
+ unwrappedType.nullabilitySuffix == NullabilitySuffix.none) {
+ return isNonNullable(SharedTypeSchemaView(unwrappedType.promotion));
} else if (type.nullabilitySuffix == NullabilitySuffix.question) {
return false;
- } else if (matchFutureOr(type) case Type typeArgument?) {
- return isNonNullable(typeToSchema(typeArgument));
+ } else if (matchFutureOrInternal(unwrappedType) case Type typeArgument?) {
+ return isNonNullable(SharedTypeSchemaView(typeArgument));
}
// TODO(cstefantsova): Update to a fast-pass implementation when the
// mini-ast testing framework supports looking up superinterfaces of
// extension types or looking up bounds of type parameters.
- return _typeSystem.isSubtype(NullType.instance, type);
+ return _typeSystem.isSubtype(NullType.instance, unwrappedType);
}
@override
- bool isNull(Type type) => type is NullType;
+ bool isNull(SharedTypeView<Type> type) {
+ return type.unwrapTypeView() is NullType;
+ }
@override
- bool isObject(Type type) {
- return type is PrimaryType &&
- type.nullabilitySuffix == NullabilitySuffix.none &&
- type.name == 'Object' &&
- type.args.isEmpty;
+ bool isObject(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ return unwrappedType is PrimaryType &&
+ unwrappedType.nullabilitySuffix == NullabilitySuffix.none &&
+ unwrappedType.name == 'Object' &&
+ unwrappedType.args.isEmpty;
}
@override
@@ -2941,19 +3008,24 @@
property.isPromotable;
@override
- bool isSubtypeOf(Type leftType, Type rightType) {
+ bool isSubtypeOfInternal(Type leftType, Type rightType) {
return _typeSystem.isSubtype(leftType, rightType);
}
@override
- bool isTypeParameterType(Type type) =>
- type is PromotedTypeVariableType &&
- type.nullabilitySuffix == NullabilitySuffix.none;
+ bool isTypeParameterType(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ return unwrappedType is PromotedTypeVariableType &&
+ unwrappedType.nullabilitySuffix == NullabilitySuffix.none;
+ }
@override
bool isTypeSchemaSatisfied(
- {required TypeSchema typeSchema, required Type type}) =>
- isSubtypeOf(type, typeSchema.toType());
+ {required SharedTypeSchemaView<Type> typeSchema,
+ required SharedTypeView<Type> type}) {
+ return isSubtypeOfInternal(
+ type.unwrapTypeView(), typeSchema.unwrapTypeSchemaView());
+ }
@override
bool isVariableFinal(Var node) {
@@ -2961,31 +3033,33 @@
}
@override
- TypeSchema iterableTypeSchema(TypeSchema elementTypeSchema) {
- return TypeSchema.fromType(
- PrimaryType('Iterable', args: [elementTypeSchema.toType()]));
+ SharedTypeSchemaView<Type> iterableTypeSchema(
+ SharedTypeSchemaView<Type> elementTypeSchema) {
+ return SharedTypeSchemaView(PrimaryType('Iterable',
+ args: [elementTypeSchema.unwrapTypeSchemaView()]));
}
@override
- Type listType(Type elementType) => PrimaryType('List', args: [elementType]);
+ Type listTypeInternal(Type elementType) {
+ return PrimaryType('List', args: [elementType]);
+ }
@override
- TypeSchema listTypeSchema(TypeSchema elementTypeSchema) =>
- TypeSchema.fromType(
- PrimaryType('List', args: [elementTypeSchema.toType()]));
-
- @override
- Type lub(Type type1, Type type2) {
+ Type lubInternal(Type type1, Type type2) {
if (type1 == type2) {
return type1;
- } else if (promoteToNonNull(type1) == type2) {
+ } else if (promoteToNonNull(SharedTypeView(type1)) ==
+ SharedTypeView(type2)) {
return type1;
- } else if (promoteToNonNull(type2) == type1) {
+ } else if (promoteToNonNull(SharedTypeView(type2)) ==
+ SharedTypeView(type1)) {
return type2;
- } else if (type1 is NullType && promoteToNonNull(type2) != type2) {
+ } else if (type1 is NullType &&
+ promoteToNonNull(SharedTypeView(type2)) != SharedTypeView(type2)) {
// type2 is already nullable
return type2;
- } else if (type2 is NullType && promoteToNonNull(type1) != type1) {
+ } else if (type2 is NullType &&
+ promoteToNonNull(SharedTypeView(type1)) != SharedTypeView(type1)) {
// type1 is already nullable
return type1;
} else if (type1 is NeverType &&
@@ -3003,14 +3077,10 @@
}
@override
- Type makeNullable(Type type) => lub(type, NullType.instance);
+ Type makeNullableInternal(Type type) => lubInternal(type, NullType.instance);
@override
- TypeSchema makeTypeSchemaNullable(TypeSchema typeSchema) =>
- TypeSchema.fromType(lub(typeSchema.toType(), NullType.instance));
-
- @override
- Type mapType({
+ Type mapTypeInternal({
required Type keyType,
required Type valueType,
}) {
@@ -3018,15 +3088,7 @@
}
@override
- TypeSchema mapTypeSchema(
- {required TypeSchema keyTypeSchema,
- required TypeSchema valueTypeSchema}) {
- return TypeSchema.fromType(PrimaryType('Map',
- args: [keyTypeSchema.toType(), valueTypeSchema.toType()]));
- }
-
- @override
- Type? matchFutureOr(Type type) {
+ Type? matchFutureOrInternal(Type type) {
if (type is FutureOrType) {
return type.typeArgument;
}
@@ -3034,22 +3096,13 @@
}
@override
- TypeSchema? matchTypeSchemaFutureOr(TypeSchema typeSchema) {
- Type type = typeSchema.toType();
- if (type is FutureOrType) {
- return TypeSchema.fromType(type.typeArgument);
- }
- return null;
- }
-
- @override
- PromotedTypeVariableType? matchInferableParameter(Type type) {
+ PromotedTypeVariableType? matchInferableParameter(SharedTypeView<Type> type) {
// TODO(cstefantsova): Add support for type parameter objects in Mini AST.
return null;
}
@override
- Type? matchIterableType(Type type) {
+ Type? matchIterableTypeInternal(Type type) {
if (type is PrimaryType &&
type.nullabilitySuffix == NullabilitySuffix.none &&
type.args.length == 1) {
@@ -3061,88 +3114,90 @@
}
@override
- TypeSchema? matchIterableTypeSchema(TypeSchema typeSchema) =>
- switch (matchIterableType(typeSchema.toType())) {
- null => null,
- var t => TypeSchema.fromType(t)
- };
-
- @override
- Type? matchListType(Type type) {
- if (type is PrimaryType &&
- type.nullabilitySuffix == NullabilitySuffix.none &&
- type.name == 'List' &&
- type.args.length == 1) {
- return type.args[0];
+ SharedTypeView<Type>? matchListType(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ if (unwrappedType is PrimaryType &&
+ unwrappedType.nullabilitySuffix == NullabilitySuffix.none &&
+ unwrappedType.name == 'List' &&
+ unwrappedType.args.length == 1) {
+ return SharedTypeView(unwrappedType.args[0]);
}
return null;
}
@override
- ({Type keyType, Type valueType})? matchMapType(Type type) {
- if (type is PrimaryType &&
- type.nullabilitySuffix == NullabilitySuffix.none &&
- type.name == 'Map' &&
- type.args.length == 2) {
+ ({SharedTypeView<Type> keyType, SharedTypeView<Type> valueType})?
+ matchMapType(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ if (unwrappedType is PrimaryType &&
+ unwrappedType.nullabilitySuffix == NullabilitySuffix.none &&
+ unwrappedType.name == 'Map' &&
+ unwrappedType.args.length == 2) {
return (
- keyType: type.args[0],
- valueType: type.args[1],
+ keyType: SharedTypeView(unwrappedType.args[0]),
+ valueType: SharedTypeView(unwrappedType.args[1]),
);
}
return null;
}
@override
- Type? matchStreamType(Type type) {
- if (type is PrimaryType &&
- type.nullabilitySuffix == NullabilitySuffix.none &&
- type.args.length == 1) {
- if (type.name == 'Stream') {
- return type.args[0];
+ SharedTypeView<Type>? matchStreamType(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ if (unwrappedType is PrimaryType &&
+ unwrappedType.nullabilitySuffix == NullabilitySuffix.none &&
+ unwrappedType.args.length == 1) {
+ if (unwrappedType.name == 'Stream') {
+ return SharedTypeView(unwrappedType.args[0]);
}
}
return null;
}
@override
- TypeDeclarationMatchResult? matchTypeDeclarationType(Type type) {
- if (type is! PrimaryType) return null;
- if (type.isInterfaceType) {
+ TypeDeclarationMatchResult? matchTypeDeclarationType(
+ SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ if (unwrappedType is! PrimaryType) return null;
+ if (unwrappedType.isInterfaceType) {
return new TypeDeclarationMatchResult(
typeDeclarationKind: TypeDeclarationKind.interfaceDeclaration,
- typeDeclaration: type.type,
- typeDeclarationType: type,
- typeArguments: type.args);
+ typeDeclaration: unwrappedType.type,
+ typeDeclarationType: unwrappedType,
+ typeArguments: unwrappedType.args);
} else if (isExtensionType(type)) {
return new TypeDeclarationMatchResult(
typeDeclarationKind: TypeDeclarationKind.extensionTypeDeclaration,
- typeDeclaration: type.type,
- typeDeclarationType: type,
- typeArguments: type.args);
+ typeDeclaration: unwrappedType.type,
+ typeDeclarationType: unwrappedType,
+ typeArguments: unwrappedType.args);
} else {
return null;
}
}
@override
- Type normalize(Type type) {
- var query = '$type';
- return _normalizeResults[query] ?? fail('Unknown query: $query');
+ SharedTypeView<Type> normalize(SharedTypeView<Type> type) {
+ var query = '${type.unwrapTypeView()}';
+ return SharedTypeView(
+ _normalizeResults[query] ?? fail('Unknown query: $query'));
}
@override
- Type promoteToNonNull(Type type) {
- if (type.nullabilitySuffix == NullabilitySuffix.question) {
- return type.withNullability(NullabilitySuffix.none);
- } else if (type is NullType) {
- return NeverType.instance;
+ SharedTypeView<Type> promoteToNonNull(SharedTypeView<Type> type) {
+ Type unwrappedType = type.unwrapTypeView();
+ if (unwrappedType.nullabilitySuffix == NullabilitySuffix.question) {
+ return SharedTypeView(
+ unwrappedType.withNullability(NullabilitySuffix.none));
+ } else if (unwrappedType is NullType) {
+ return SharedTypeView(NeverType.instance);
} else {
return type;
}
}
@override
- RecordType recordType(
+ RecordType recordTypeInternal(
{required List<Type> positional, required List<(String, Type)> named}) {
return RecordType(
positionalTypes: positional,
@@ -3153,28 +3208,21 @@
}
@override
- TypeSchema recordTypeSchema(
- {required List<TypeSchema> positional,
- required List<(String, TypeSchema)> named}) =>
- TypeSchema.fromType(recordType(positional: [
- for (var t in positional) t.toType()
- ], named: [
- for (var (name, typeSchema) in named) (name, typeSchema.toType())
- ]));
-
- @override
- TypeSchema streamTypeSchema(TypeSchema elementTypeSchema) {
- return TypeSchema.fromType(
- PrimaryType('Stream', args: [elementTypeSchema.toType()]));
+ SharedTypeSchemaView<Type> streamTypeSchema(
+ SharedTypeSchemaView<Type> elementTypeSchema) {
+ return SharedTypeSchemaView(PrimaryType('Stream',
+ args: [elementTypeSchema.unwrapTypeSchemaView()]));
}
@override
- Type? tryPromoteToType(Type to, Type from) {
- var exception = (_promotionExceptions[from.type] ?? {})[to.type];
+ SharedTypeView<Type>? tryPromoteToType(
+ SharedTypeView<Type> to, SharedTypeView<Type> from) {
+ var exception = (_promotionExceptions[from.unwrapTypeView().type] ??
+ {})[to.unwrapTypeView().type];
if (exception != null) {
- return Type(exception);
+ return SharedTypeView(Type(exception));
}
- if (isSubtypeOf(to, from)) {
+ if (isSubtypeOfInternal(to.unwrapTypeView(), from.unwrapTypeView())) {
return to;
} else {
return null;
@@ -3182,35 +3230,12 @@
}
@override
- bool typeIsSubtypeOfTypeSchema(Type leftType, TypeSchema rightSchema) {
- return isSubtypeOf(leftType, rightSchema.toType());
- }
+ SharedTypeSchemaView<Type> typeToSchema(SharedTypeView<Type> type) =>
+ SharedTypeSchemaView(type.unwrapTypeView());
@override
- TypeSchema typeSchemaGlb(TypeSchema typeSchema1, TypeSchema typeSchema2) =>
- TypeSchema.fromType(glb(typeSchema1.toType(), typeSchema2.toType()));
-
- @override
- bool typeSchemaIsSubtypeOfType(TypeSchema leftSchema, Type rightType) {
- return isSubtypeOf(leftSchema.toType(), rightType);
- }
-
- @override
- bool typeSchemaIsSubtypeOfTypeSchema(
- TypeSchema leftSchema, TypeSchema rightSchema) {
- return isSubtypeOf(leftSchema.toType(), rightSchema.toType());
- }
-
- @override
- TypeSchema typeSchemaLub(TypeSchema typeSchema1, TypeSchema typeSchema2) =>
- TypeSchema.fromType(lub(typeSchema1.toType(), typeSchema2.toType()));
-
- @override
- TypeSchema typeToSchema(Type type) => TypeSchema.fromType(type);
-
- @override
- Type variableType(Var variable) {
- return variable.type;
+ SharedTypeView<Type> variableType(Var variable) {
+ return SharedTypeView(variable.type);
}
@override
@@ -3219,18 +3244,9 @@
property.whyNotPromotable;
@override
- Type withNullabilitySuffix(Type type, NullabilitySuffix modifier) =>
- type.withNullability(modifier);
-
- @override
- NullabilitySuffix typeSchemaNullabilitySuffix(TypeSchema typeSchema) {
- return typeSchema.toType().nullabilitySuffix;
- }
-
- @override
- TypeSchema futureTypeSchema(TypeSchema argumentTypeSchema) {
- return TypeSchema.fromType(
- PrimaryType('Future', args: [argumentTypeSchema.toType()]));
+ SharedTypeView<Type> withNullabilitySuffix(
+ SharedTypeView<Type> type, NullabilitySuffix modifier) {
+ return SharedTypeView(type.unwrapTypeView().withNullability(modifier));
}
}
@@ -3285,7 +3301,8 @@
String toString() => '$operand!';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
return h.typeAnalyzer.analyzeNonNullAssert(this, operand);
}
}
@@ -3304,7 +3321,8 @@
String toString() => '!$operand';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
return h.typeAnalyzer.analyzeLogicalNot(this, operand);
}
}
@@ -3329,14 +3347,15 @@
String toString() => '$lhs?.${isCascaded ? '.' : ''}($rhs)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var lhsType =
h.typeAnalyzer.analyzeExpression(lhs, h.operations.unknownType);
h.flow.nullAwareAccess_rightBegin(isCascaded ? null : lhs, lhsType);
var rhsType =
h.typeAnalyzer.analyzeExpression(rhs, h.operations.unknownType);
h.flow.nullAwareAccess_end();
- var type = h.operations.lub(rhsType, NullType.instance);
+ var type = h.operations.lub(rhsType, SharedTypeView(NullType.instance));
h.irBuilder.apply(
_fakeMethodName, [Kind.expression, Kind.expression], Kind.expression,
location: location);
@@ -3354,7 +3373,7 @@
: super._();
@override
- TypeSchema computeSchema(Harness h) => h.typeAnalyzer
+ SharedTypeSchemaView<Type> computeSchema(Harness h) => h.typeAnalyzer
.analyzeNullCheckOrAssertPatternSchema(inner, isAssert: isAssert);
@override
@@ -3368,7 +3387,7 @@
var analysisResult = h.typeAnalyzer.analyzeNullCheckOrAssertPattern(
context, this, inner,
isAssert: isAssert);
- var matchedType = analysisResult.matchedValueType;
+ var matchedType = analysisResult.matchedValueType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.apply(isAssert ? 'nullAssertPattern' : 'nullCheckPattern',
[Kind.pattern, Kind.type], Kind.pattern,
@@ -3391,7 +3410,8 @@
String toString() => 'null';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer.analyzeNullLiteral(this);
h.irBuilder.atom('null', Kind.expression, location: location);
return result;
@@ -3409,8 +3429,9 @@
}) : super._();
@override
- TypeSchema computeSchema(Harness h) {
- return h.typeAnalyzer.analyzeObjectPatternSchema(requiredType);
+ SharedTypeSchemaView<Type> computeSchema(Harness h) {
+ return h.typeAnalyzer
+ .analyzeObjectPatternSchema(SharedTypeView(requiredType));
}
@override
@@ -3426,8 +3447,8 @@
PatternResult<Type> visit(Harness h, SharedMatchContext context) {
var objectPatternResult =
h.typeAnalyzer.analyzeObjectPattern(context, this, fields: fields);
- var matchedType = objectPatternResult.matchedValueType;
- var requiredType = objectPatternResult.requiredType;
+ var matchedType = objectPatternResult.matchedValueType.unwrapTypeView();
+ var requiredType = objectPatternResult.requiredType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.atom(requiredType.type, Kind.type, location: location);
h.irBuilder.apply(
@@ -3465,7 +3486,8 @@
String toString() => '($expr)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
return h.typeAnalyzer.analyzeParenthesizedExpression(this, expr, schema);
}
}
@@ -3476,7 +3498,7 @@
ParenthesizedPattern._(this.inner, {required super.location}) : super._();
@override
- TypeSchema computeSchema(Harness h) => inner.computeSchema(h);
+ SharedTypeSchemaView<Type> computeSchema(Harness h) => inner.computeSchema(h);
@override
void preVisit(PreVisitor visitor, VariableBinder<Node, Var> variableBinder,
@@ -3529,7 +3551,7 @@
location: location);
}
- TypeSchema computeSchema(Harness h);
+ SharedTypeSchemaView<Type> computeSchema(Harness h);
Pattern or(Pattern other) =>
LogicalOrPattern(this, other, location: computeLocation());
@@ -3573,7 +3595,8 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer.analyzePatternAssignment(this, lhs, rhs);
h.irBuilder.apply(
'patternAssignment', [Kind.expression, Kind.pattern], Kind.expression,
@@ -3755,10 +3778,11 @@
String toString() => '(expr with type $type)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
h.irBuilder.atom(type.type, Kind.type, location: location);
h.irBuilder.apply('expr', [Kind.type], Kind.expression, location: location);
- return new SimpleTypeAnalysisResult<Type>(type: type);
+ return new SimpleTypeAnalysisResult<Type>(type: SharedTypeView(type));
}
}
@@ -3842,18 +3866,22 @@
String toString() => '$target.$propertyName';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
return h.typeAnalyzer.analyzePropertyGet(
this, target is CascadePlaceholder ? null : target, propertyName);
}
@override
Type? _getPromotedType(Harness h) {
- var receiverType =
- h.typeAnalyzer.analyzeExpression(target, h.operations.unknownType);
+ var receiverType = h.typeAnalyzer
+ .analyzeExpression(target, h.operations.unknownType)
+ .unwrapTypeView();
var member = h.typeAnalyzer._lookupMember(receiverType, propertyName);
- return h.flow.promotedPropertyType(
- ExpressionPropertyTarget(target), propertyName, member, member!._type);
+ return h.flow
+ .promotedPropertyType(ExpressionPropertyTarget(target), propertyName,
+ member, SharedTypeView(member!._type))
+ ?.unwrapTypeView();
}
@override
@@ -4037,8 +4065,8 @@
/// a type schema of [typeSchema].
Statement inTypeSchema(String typeSchema) {
var location = computeLocation();
- return ExpressionInTypeSchema._(
- asExpression(location: location), TypeSchema(typeSchema),
+ return ExpressionInTypeSchema._(asExpression(location: location),
+ SharedTypeSchemaView(Type(typeSchema)),
location: location);
}
@@ -4164,7 +4192,7 @@
RecordPattern._(this.fields, {required super.location}) : super._();
@override
- TypeSchema computeSchema(Harness h) {
+ SharedTypeSchemaView<Type> computeSchema(Harness h) {
return h.typeAnalyzer.analyzeRecordPatternSchema(
fields: fields,
);
@@ -4183,8 +4211,8 @@
PatternResult<Type> visit(Harness h, SharedMatchContext context) {
var recordPatternResult =
h.typeAnalyzer.analyzeRecordPattern(context, this, fields: fields);
- var matchedType = recordPatternResult.matchedValueType;
- var requiredType = recordPatternResult.requiredType;
+ var matchedType = recordPatternResult.matchedValueType.unwrapTypeView();
+ var requiredType = recordPatternResult.requiredType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.atom(requiredType.type, Kind.type, location: location);
h.irBuilder.apply(
@@ -4233,7 +4261,7 @@
: super._();
@override
- TypeSchema computeSchema(Harness h) =>
+ SharedTypeSchemaView<Type> computeSchema(Harness h) =>
h.typeAnalyzer.analyzeRelationalPatternSchema();
@override
@@ -4246,7 +4274,7 @@
PatternResult<Type> visit(Harness h, SharedMatchContext context) {
var analysisResult =
h.typeAnalyzer.analyzeRelationalPattern(context, this, operand);
- var matchedType = analysisResult.matchedValueType;
+ var matchedType = analysisResult.matchedValueType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.apply(operator, [Kind.expression, Kind.type], Kind.pattern,
names: ['matchedType'], location: location);
@@ -4316,7 +4344,8 @@
String toString() => 'second($first, $second)';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
h.typeAnalyzer.analyzeExpression(first, h.operations.unknownType);
var type = h.typeAnalyzer.analyzeExpression(second, schema);
h.irBuilder.apply(
@@ -4374,7 +4403,8 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer
.analyzeSwitchExpression(this, scrutinee, cases.length, schema);
h.irBuilder.apply(
@@ -4491,7 +4521,8 @@
expectLastCaseTerminates ?? anything);
expect(analysisResult.requiresExhaustivenessValidation,
expectRequiresExhaustivenessValidation ?? anything);
- expect(analysisResult.scrutineeType.type, expectScrutineeType ?? anything);
+ expect(analysisResult.scrutineeType.unwrapTypeView().type,
+ expectScrutineeType ?? anything);
h.irBuilder.apply(
'switch',
[
@@ -4561,7 +4592,8 @@
String toString() => 'this';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer.analyzeThis(this);
h.irBuilder.atom('this', Kind.expression, location: location);
return result;
@@ -4581,7 +4613,8 @@
{_LValueDisposition disposition = _LValueDisposition.read}) {}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer.analyzeThisOrSuperPropertyGet(
this, propertyName,
isSuperAccess: isSuperAccess);
@@ -4597,13 +4630,15 @@
h.irBuilder.atom('$thisOrSuper.$propertyName', Kind.expression,
location: location);
var member = h.typeAnalyzer._lookupMember(h._thisType!, propertyName);
- return h.flow.promotedPropertyType(
- isSuperAccess
- ? SuperPropertyTarget.singleton
- : ThisPropertyTarget.singleton,
- propertyName,
- member,
- member!._type);
+ return h.flow
+ .promotedPropertyType(
+ isSuperAccess
+ ? SuperPropertyTarget.singleton
+ : ThisPropertyTarget.singleton,
+ propertyName,
+ member,
+ SharedTypeView(member!._type))
+ ?.unwrapTypeView();
}
@override
@@ -4627,7 +4662,8 @@
String toString() => 'throw ...';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
return h.typeAnalyzer.analyzeThrow(this, operand);
}
}
@@ -4807,7 +4843,7 @@
@override
Type? _getPromotedType(Harness h) {
h.irBuilder.atom(name, Kind.expression, location: location);
- return h.flow.promotedType(this);
+ return h.flow.promotedType(this)?.unwrapTypeView();
}
}
@@ -4825,11 +4861,12 @@
: super._();
@override
- TypeSchema computeSchema(Harness h) {
+ SharedTypeSchemaView<Type> computeSchema(Harness h) {
if (isAssignedVariable) {
return h.typeAnalyzer.analyzeAssignedVariablePatternSchema(variable);
} else {
- return h.typeAnalyzer.analyzeDeclaredVariablePatternSchema(declaredType);
+ return h.typeAnalyzer.analyzeDeclaredVariablePatternSchema(
+ declaredType?.wrapSharedTypeView());
}
}
@@ -4856,10 +4893,12 @@
return analysisResult;
} else {
var declaredVariablePatternResult = h.typeAnalyzer
- .analyzeDeclaredVariablePattern(
- context, this, variable, variable.name, declaredType);
- var matchedType = declaredVariablePatternResult.matchedValueType;
- var staticType = declaredVariablePatternResult.staticType;
+ .analyzeDeclaredVariablePattern(context, this, variable,
+ variable.name, declaredType?.wrapSharedTypeView());
+ var matchedType =
+ declaredVariablePatternResult.matchedValueType.unwrapTypeView();
+ var staticType =
+ declaredVariablePatternResult.staticType.unwrapTypeView();
h.typeAnalyzer.handleDeclaredVariablePattern(this,
matchedType: matchedType, staticType: staticType);
return declaredVariablePatternResult;
@@ -4900,7 +4939,8 @@
String toString() => variable.name;
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var result = h.typeAnalyzer.analyzeVariableGet(this, variable, callback);
h.irBuilder.atom(variable.name, Kind.expression, location: location);
return result;
@@ -4909,7 +4949,8 @@
@override
void _visitWrite(Harness h, Expression assignmentExpression, Type writtenType,
Expression? rhs) {
- h.flow.write(assignmentExpression, variable, writtenType, rhs);
+ h.flow.write(
+ assignmentExpression, variable, SharedTypeView(writtenType), rhs);
}
}
@@ -4951,9 +4992,9 @@
: super._();
@override
- TypeSchema computeSchema(Harness h) {
+ SharedTypeSchemaView<Type> computeSchema(Harness h) {
return h.typeAnalyzer.analyzeWildcardPatternSchema(
- declaredType: declaredType,
+ declaredType: declaredType?.wrapSharedTypeView(),
);
}
@@ -4966,9 +5007,9 @@
var analysisResult = h.typeAnalyzer.analyzeWildcardPattern(
context: context,
node: this,
- declaredType: declaredType,
+ declaredType: declaredType?.wrapSharedTypeView(),
);
- var matchedType = analysisResult.matchedValueType;
+ var matchedType = analysisResult.matchedValueType.unwrapTypeView();
h.irBuilder.atom(matchedType.type, Kind.type, location: location);
h.irBuilder.apply('wildcardPattern', [Kind.type], Kind.pattern,
names: ['matchedType'], location: location);
@@ -5017,7 +5058,8 @@
}
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
late MiniIRTmp beforeTmp;
if (before != null) {
h.typeAnalyzer.dispatchStatement(before!);
@@ -5063,19 +5105,24 @@
String toString() => '$lhs = $rhs';
@override
- ExpressionTypeAnalysisResult<Type> visit(Harness h, TypeSchema schema) {
+ ExpressionTypeAnalysisResult<Type> visit(
+ Harness h, SharedTypeSchemaView<Type> schema) {
var rhs = this.rhs;
Type type;
if (rhs == null) {
// We are simulating an increment/decrement operation.
// TODO(paulberry): Make a separate node type for this.
- type = h.typeAnalyzer.analyzeExpression(lhs, h.operations.unknownType);
+ type = h.typeAnalyzer
+ .analyzeExpression(lhs, h.operations.unknownType)
+ .unwrapTypeView();
} else {
- type = h.typeAnalyzer.analyzeExpression(rhs, h.operations.unknownType);
+ type = h.typeAnalyzer
+ .analyzeExpression(rhs, h.operations.unknownType)
+ .unwrapTypeView();
}
lhs._visitWrite(h, this, type, rhs);
// TODO(paulberry): null shorting
- return new SimpleTypeAnalysisResult<Type>(type: type);
+ return new SimpleTypeAnalysisResult<Type>(type: SharedTypeView(type));
}
}
@@ -5097,8 +5144,8 @@
class _MiniAstErrors
implements
- TypeAnalyzerErrors<Node, Statement, Expression, Var, Type, Pattern,
- void>,
+ TypeAnalyzerErrors<Node, Statement, Expression, Var,
+ SharedTypeView<Type>, Pattern, void>,
VariableBinderErrors<Node, Var> {
final Set<String> _accumulatedErrors = {};
@@ -5119,8 +5166,8 @@
void caseExpressionTypeMismatch(
{required Expression scrutinee,
required Expression caseExpression,
- required Type scrutineeType,
- required Type caseExpressionType,
+ required SharedTypeView<Type> scrutineeType,
+ required SharedTypeView<Type> caseExpressionType,
required bool nullSafetyEnabled}) {
_recordError('caseExpressionTypeMismatch', {
'scrutinee': scrutinee,
@@ -5223,7 +5270,7 @@
@override
void matchedTypeIsStrictlyNonNullable({
required Pattern pattern,
- required Type matchedType,
+ required SharedTypeView<Type> matchedType,
}) {
_recordError('matchedTypeIsStrictlyNonNullable', {
'pattern': pattern,
@@ -5234,8 +5281,8 @@
@override
void matchedTypeIsSubtypeOfRequired({
required Pattern pattern,
- required Type matchedType,
- required Type requiredType,
+ required SharedTypeView<Type> matchedType,
+ required SharedTypeView<Type> requiredType,
}) {
_recordError('matchedTypeIsSubtypeOfRequired', {
'pattern': pattern,
@@ -5253,7 +5300,7 @@
void patternForInExpressionIsNotIterable({
required Node node,
required Expression expression,
- required Type expressionType,
+ required SharedTypeView<Type> expressionType,
}) {
_recordError('patternForInExpressionIsNotIterable', {
'node': node,
@@ -5266,8 +5313,8 @@
void patternTypeMismatchInIrrefutableContext(
{required Node pattern,
required Node context,
- required Type matchedType,
- required Type requiredType}) {
+ required SharedTypeView<Type> matchedType,
+ required SharedTypeView<Type> requiredType}) {
_recordError('patternTypeMismatchInIrrefutableContext', {
'pattern': pattern,
'context': context,
@@ -5286,8 +5333,8 @@
@override
void relationalPatternOperandTypeNotAssignable({
required Pattern pattern,
- required Type operandType,
- required Type parameterType,
+ required SharedTypeView<Type> operandType,
+ required SharedTypeView<Type> parameterType,
}) {
_recordError('relationalPatternOperandTypeNotAssignable', {
'pattern': pattern,
@@ -5299,7 +5346,7 @@
@override
void relationalPatternOperatorReturnTypeNotAssignableToBool({
required Pattern pattern,
- required Type returnType,
+ required SharedTypeView<Type> returnType,
}) {
_recordError('relationalPatternOperatorReturnTypeNotAssignableToBool', {
'pattern': pattern,
@@ -5362,8 +5409,8 @@
class _MiniAstTypeAnalyzer
with
- TypeAnalyzer<Node, Statement, Expression, Var, Type, Pattern, void,
- TypeSchema, PromotedTypeVariableType, Type, String> {
+ TypeAnalyzer<Type, Node, Statement, Expression, Var, Pattern, void,
+ PromotedTypeVariableType, Type, String> {
final Harness _harness;
@override
@@ -5391,8 +5438,8 @@
_MiniAstTypeAnalyzer(this._harness, this.options);
@override
- FlowAnalysis<Node, Statement, Expression, Var, Type> get flow =>
- _harness.flow;
+ FlowAnalysis<Node, Statement, Expression, Var, SharedTypeView<Type>>
+ get flow => _harness.flow;
Type get nullType => NullType.instance;
@@ -5448,7 +5495,7 @@
flow.logicalBinaryOp_begin();
}
var leftType = analyzeExpression(lhs, operations.unknownType);
- ExpressionInfo<Type>? leftInfo;
+ ExpressionInfo<SharedTypeView<Type>>? leftInfo;
if (isEquals) {
leftInfo = flow.equalityOperand_end(lhs, leftType);
} else if (isLogical) {
@@ -5473,7 +5520,7 @@
Type analyzeBoolLiteral(Expression node, bool value) {
flow.booleanLiteral(node, value);
- return operations.boolType;
+ return operations.boolType.unwrapTypeView();
}
void analyzeBreakStatement(Statement? target) {
@@ -5556,14 +5603,15 @@
arguments[i],
methodType is FunctionType &&
methodType.nullabilitySuffix == NullabilitySuffix.none
- ? operations.typeToSchema(methodType.positionalParameters[i])
+ ? operations.typeToSchema(
+ SharedTypeView(methodType.positionalParameters[i]))
: operations.unknownType);
}
// Form the IR for the member invocation.
_harness.irBuilder.apply(methodName, inputKinds, Kind.expression,
location: node.location);
// TODO(paulberry): handle null shorting
- return new SimpleTypeAnalysisResult<Type>(type: methodType);
+ return new SimpleTypeAnalysisResult<Type>(type: SharedTypeView(methodType));
}
SimpleTypeAnalysisResult<Type> analyzeNonNullAssert(
@@ -5575,12 +5623,12 @@
}
SimpleTypeAnalysisResult<Type> analyzeNullLiteral(Expression node) {
- flow.nullLiteral(node, nullType);
- return new SimpleTypeAnalysisResult<Type>(type: nullType);
+ flow.nullLiteral(node, SharedTypeView(nullType));
+ return new SimpleTypeAnalysisResult<Type>(type: SharedTypeView(nullType));
}
- SimpleTypeAnalysisResult<Type> analyzeParenthesizedExpression(
- Expression node, Expression expression, TypeSchema schema) {
+ SimpleTypeAnalysisResult<Type> analyzeParenthesizedExpression(Expression node,
+ Expression expression, SharedTypeSchemaView<Type> schema) {
var type = analyzeExpression(expression, schema);
flow.parenthesizedExpression(node, expression);
return new SimpleTypeAnalysisResult<Type>(type: type);
@@ -5602,7 +5650,8 @@
// Build the property get IR.
_harness.irBuilder.propertyGet(propertyName, location: node.location);
// TODO(paulberry): handle null shorting
- return new SimpleTypeAnalysisResult<Type>(type: propertyType);
+ return new SimpleTypeAnalysisResult<Type>(
+ type: SharedTypeView(propertyType));
}
void analyzeReturnStatement() {
@@ -5611,24 +5660,27 @@
SimpleTypeAnalysisResult<Type> analyzeThis(Expression node) {
var thisType = this.thisType;
- flow.thisOrSuper(node, thisType, isSuper: false);
- return new SimpleTypeAnalysisResult<Type>(type: thisType);
+ flow.thisOrSuper(node, SharedTypeView(thisType), isSuper: false);
+ return new SimpleTypeAnalysisResult<Type>(type: SharedTypeView(thisType));
}
SimpleTypeAnalysisResult<Type> analyzeThisOrSuperPropertyGet(
Expression node, String propertyName,
{required bool isSuperAccess}) {
var member = _lookupMember(thisType, propertyName);
- var memberType = member?._type ?? operations.dynamicType;
- var promotedType = flow.propertyGet(
- node,
- isSuperAccess
- ? SuperPropertyTarget.singleton
- : ThisPropertyTarget.singleton,
- propertyName,
- member,
- memberType);
- return new SimpleTypeAnalysisResult<Type>(type: promotedType ?? memberType);
+ var memberType = member?._type ?? operations.dynamicType.unwrapTypeView();
+ var promotedType = flow
+ .propertyGet(
+ node,
+ isSuperAccess
+ ? SuperPropertyTarget.singleton
+ : ThisPropertyTarget.singleton,
+ propertyName,
+ member,
+ SharedTypeView(memberType))
+ ?.unwrapTypeView();
+ return new SimpleTypeAnalysisResult<Type>(
+ type: SharedTypeView(promotedType ?? memberType));
}
SimpleTypeAnalysisResult<Type> analyzeThrow(
@@ -5669,24 +5721,24 @@
SimpleTypeAnalysisResult<Type> analyzeTypeCast(
Expression node, Expression expression, Type type) {
analyzeExpression(expression, operations.unknownType);
- flow.asExpression_end(expression, type);
- return new SimpleTypeAnalysisResult<Type>(type: type);
+ flow.asExpression_end(expression, SharedTypeView(type));
+ return new SimpleTypeAnalysisResult<Type>(type: SharedTypeView(type));
}
SimpleTypeAnalysisResult<Type> analyzeTypeTest(
Expression node, Expression expression, Type type,
{bool isInverted = false}) {
analyzeExpression(expression, operations.unknownType);
- flow.isExpression_end(node, expression, isInverted, type);
+ flow.isExpression_end(node, expression, isInverted, SharedTypeView(type));
return new SimpleTypeAnalysisResult<Type>(type: operations.boolType);
}
SimpleTypeAnalysisResult<Type> analyzeVariableGet(
Expression node, Var variable, void Function(Type?)? callback) {
var promotedType = flow.variableRead(node, variable);
- callback?.call(promotedType);
+ callback?.call(promotedType?.unwrapTypeView());
return new SimpleTypeAnalysisResult<Type>(
- type: promotedType ?? variable.type);
+ type: promotedType ?? SharedTypeView(variable.type));
}
void analyzeWhileLoop(Statement node, Expression condition, Statement body) {
@@ -5707,7 +5759,7 @@
@override
ExpressionTypeAnalysisResult<Type> dispatchExpression(
- Expression expression, TypeSchema schema) =>
+ Expression expression, SharedTypeSchemaView<Type> schema) =>
_irBuilder.guard(expression, () => expression.visit(_harness, schema));
@override
@@ -5717,7 +5769,7 @@
}
@override
- TypeSchema dispatchPatternSchema(covariant Pattern node) {
+ SharedTypeSchemaView<Type> dispatchPatternSchema(covariant Pattern node) {
return node.computeSchema(_harness);
}
@@ -5726,15 +5778,16 @@
_irBuilder.guard(statement, () => statement.visit(_harness));
@override
- Type downwardInferObjectPatternRequiredType({
- required Type matchedType,
+ SharedTypeView<Type> downwardInferObjectPatternRequiredType({
+ required SharedTypeView<Type> matchedType,
required covariant ObjectPattern pattern,
}) {
var requiredType = pattern.requiredType;
if (requiredType.args.isNotEmpty) {
- return requiredType;
+ return SharedTypeView(requiredType);
} else {
- return operations.downwardInfer(requiredType.name, matchedType);
+ return SharedTypeView(operations.downwardInfer(
+ requiredType.name, matchedType.unwrapTypeView()));
}
}
@@ -5755,10 +5808,10 @@
required JoinedPatternVariableLocation location,
required JoinedPatternVariableInconsistency inconsistency,
required bool isFinal,
- required Type type,
+ required SharedTypeView<Type> type,
}) {
variable.isFinal = isFinal;
- variable.type = type;
+ variable.type = type.unwrapTypeView();
variable.inconsistency = variable.inconsistency.maxWith(inconsistency);
}
@@ -5913,7 +5966,7 @@
@override
void handleMapPatternEntry(
- Pattern container, Node entryElement, Type keyType) {
+ Pattern container, Node entryElement, SharedTypeView<Type> keyType) {
_irBuilder.apply('mapPatternEntry', [Kind.expression, Kind.pattern],
Kind.mapPatternElement,
location: entryElement.location);
@@ -5985,11 +6038,11 @@
}) {}
@override
- void handleSwitchScrutinee(Type type) {}
+ void handleSwitchScrutinee(SharedTypeView<Type> type) {}
@override
bool isLegacySwitchExhaustive(
- covariant SwitchStatement node, Type expressionType) {
+ covariant SwitchStatement node, SharedTypeView<Type> expressionType) {
return node.isLegacyExhaustive!;
}
@@ -6007,32 +6060,38 @@
}
@override
- (_PropertyElement?, Type) resolveObjectPatternPropertyGet({
+ (_PropertyElement?, SharedTypeView<Type>) resolveObjectPatternPropertyGet({
required Pattern objectPattern,
- required Type receiverType,
+ required SharedTypeView<Type> receiverType,
required shared.RecordPatternField<Node, Pattern> field,
}) {
- var propertyMember = _harness.getMember(receiverType, field.name!);
- return (propertyMember, propertyMember?._type ?? operations.dynamicType);
+ var propertyMember =
+ _harness.getMember(receiverType.unwrapTypeView(), field.name!);
+ return (
+ propertyMember,
+ SharedTypeView(
+ propertyMember?._type ?? operations.dynamicType.unwrapTypeView())
+ );
}
@override
RelationalOperatorResolution<Type>? resolveRelationalPatternOperator(
- covariant RelationalPattern node, Type matchedValueType) {
+ covariant RelationalPattern node, SharedTypeView<Type> matchedValueType) {
return _harness.resolveRelationalPatternOperator(
- matchedValueType, node.operator);
+ matchedValueType.unwrapTypeView(), node.operator);
}
@override
- void setVariableType(Var variable, Type type) {
- variable.type = type;
+ void setVariableType(Var variable, SharedTypeView<Type> type) {
+ variable.type = type.unwrapTypeView();
}
@override
String toString() => _irBuilder.toString();
@override
- Type variableTypeFromInitializerType(Type type) {
+ SharedTypeView<Type> variableTypeFromInitializerType(
+ SharedTypeView<Type> type) {
// Variables whose initializer has type `Null` receive the inferred type
// `dynamic`.
if (_harness.operations.classifyType(type) ==
@@ -6044,7 +6103,9 @@
// (e.g. `T&int` is demoted to `T`).
// TODO(paulberry): add language tests to verify that the behavior of
// `type.recursivelyDemote` matches what the analyzer and CFE do.
- return type.recursivelyDemote(covariant: true) ?? type;
+ return SharedTypeView(
+ type.unwrapTypeView().recursivelyDemote(covariant: true) ??
+ type.unwrapTypeView());
}
/// Analyzes the target of a property get or method invocation, looks up the
@@ -6071,13 +6132,16 @@
targetType = _currentCascadeTargetType!;
} else {
propertyTarget = ExpressionPropertyTarget(target);
- targetType = analyzeExpression(target, operations.unknownType);
+ targetType =
+ analyzeExpression(target, operations.unknownType).unwrapTypeView();
}
// Look up the type of the member, applying type promotion if necessary.
var member = _lookupMember(targetType, propertyName);
- var memberType = member?._type ?? operations.dynamicType;
- return flow.propertyGet(propertyGetNode, propertyTarget, propertyName,
- member, memberType) ??
+ var memberType = member?._type ?? operations.dynamicType.unwrapTypeView();
+ return flow
+ .propertyGet(propertyGetNode, propertyTarget, propertyName, member,
+ SharedTypeView(memberType))
+ ?.unwrapTypeView() ??
memberType;
}
diff --git a/pkg/_fe_analyzer_shared/test/mini_types.dart b/pkg/_fe_analyzer_shared/test/mini_types.dart
index 204fa8e..b6abb1d 100644
--- a/pkg/_fe_analyzer_shared/test/mini_types.dart
+++ b/pkg/_fe_analyzer_shared/test/mini_types.dart
@@ -16,7 +16,7 @@
/// Representation of the type `dynamic` suitable for unit testing of code in
/// the `_fe_analyzer_shared` package.
class DynamicType extends _SpecialSimpleType
- implements SharedDynamicType<Type> {
+ implements SharedDynamicTypeStructure<Type> {
static final instance = DynamicType._();
DynamicType._()
@@ -111,7 +111,7 @@
/// Representation of an invalid type suitable for unit testing of code in the
/// `_fe_analyzer_shared` package.
class InvalidType extends _SpecialSimpleType
- implements SharedInvalidType<Type> {
+ implements SharedInvalidTypeStructure<Type> {
static final instance = InvalidType._();
InvalidType._() : super._('error', nullabilitySuffix: NullabilitySuffix.none);
@@ -120,7 +120,7 @@
Type withNullability(NullabilitySuffix suffix) => this;
}
-class NamedType implements SharedNamedType<Type> {
+class NamedType implements SharedNamedTypeStructure<Type> {
@override
final String name;
@@ -272,7 +272,7 @@
'${promotion.toString(parenthesizeIfComplex: true)}');
}
-class RecordType extends Type implements SharedRecordType<Type> {
+class RecordType extends Type implements SharedRecordTypeStructure<Type> {
@override
final List<Type> positionalTypes;
@@ -385,7 +385,7 @@
/// Representation of a type suitable for unit testing of code in the
/// `_fe_analyzer_shared` package.
-abstract class Type implements SharedType<Type> {
+abstract class Type implements SharedTypeStructure<Type> {
@override
final NullabilitySuffix nullabilitySuffix;
@@ -412,7 +412,7 @@
String getDisplayString() => type;
@override
- bool isStructurallyEqualTo(SharedType other) => '$this' == '$other';
+ bool isStructurallyEqualTo(SharedTypeStructure other) => '$this' == '$other';
/// Finds the nearest type that doesn't involve any type parameter promotion.
/// If `covariant` is `true`, a supertype will be returned (replacing promoted
@@ -461,37 +461,6 @@
String _toStringWithoutSuffix({required bool parenthesizeIfComplex});
}
-class TypeSchema implements SharedType<TypeSchema> {
- final Type _type;
-
- TypeSchema(String typeString) : _type = Type(typeString);
-
- TypeSchema.fromType(this._type);
-
- String get typeString => _type.type;
-
- Type toType() => _type;
-
- @override
- String getDisplayString() {
- throw UnsupportedError("TypeSchema.getDisplayString");
- }
-
- @override
- bool isStructurallyEqualTo(SharedType<TypeSchema> other) {
- throw UnsupportedError("TypeSchema.isStructurallyEqualTo");
- }
-
- @override
- // TODO: implement nullabilitySuffix
- NullabilitySuffix get nullabilitySuffix => throw UnimplementedError();
-}
-
-class DynamicTypeSchema extends TypeSchema
- implements SharedDynamicType<TypeSchema> {
- DynamicTypeSchema() : super.fromType(DynamicType.instance);
-}
-
class TypeSystem {
static final Map<String, List<Type> Function(List<Type>)>
_coreSuperInterfaceTemplates = {
@@ -969,7 +938,7 @@
/// Representation of the unknown type suitable for unit testing of code in the
/// `_fe_analyzer_shared` package.
-class UnknownType extends Type implements SharedUnknownType<Type> {
+class UnknownType extends Type implements SharedUnknownTypeStructure<Type> {
const UnknownType({super.nullabilitySuffix = NullabilitySuffix.none})
: super._();
@@ -990,7 +959,8 @@
/// Representation of the type `void` suitable for unit testing of code in the
/// `_fe_analyzer_shared` package.
-class VoidType extends _SpecialSimpleType implements SharedVoidType<Type> {
+class VoidType extends _SpecialSimpleType
+ implements SharedVoidTypeStructure<Type> {
static final instance = VoidType._();
VoidType._() : super._('void', nullabilitySuffix: NullabilitySuffix.none);
diff --git a/pkg/_fe_analyzer_shared/tool/smoke_test_quick.dart b/pkg/_fe_analyzer_shared/tool/smoke_test_quick.dart
deleted file mode 100644
index b6db837..0000000
--- a/pkg/_fe_analyzer_shared/tool/smoke_test_quick.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-final String repoDir = _computeRepoDir();
-
-String get dartVm => Platform.executable;
-
-main(List<String> args) async {
- Stopwatch stopwatch = new Stopwatch()..start();
- List<Future> futures = <Future>[];
- futures.add(run("pkg/front_end/test/spelling_test_src_suite.dart",
- ["--", "spelling_test_src/_fe_analyzer_shared/..."]));
- futures.add(run(
- "pkg/front_end/test/explicit_creation_git_test.dart", ["--shared-only"],
- filter: false));
- futures.add(run("pkg/front_end/test/lint_suite.dart",
- ["--", "lint/_fe_analyzer_shared/..."]));
- await Future.wait(futures);
- print("\n-----------------------\n");
- print("Done with exitcode $exitCode in ${stopwatch.elapsedMilliseconds} ms");
-}
-
-Future<void> run(String script, List<String> scriptArguments,
- {bool filter = true}) async {
- List<String> arguments = [];
- arguments.add("$script");
- arguments.addAll(scriptArguments);
-
- Stopwatch stopwatch = new Stopwatch()..start();
- ProcessResult result =
- await Process.run(dartVm, arguments, workingDirectory: repoDir);
- String runWhat = "${dartVm} ${arguments.join(' ')}";
- if (result.exitCode != 0) {
- exitCode = result.exitCode;
- print("-----");
- print("Running: $runWhat: "
- "Failed with exit code ${result.exitCode} "
- "in ${stopwatch.elapsedMilliseconds} ms.");
- String stdout = result.stdout.toString();
- if (filter) {
- List<String> lines = stdout.split("\n");
- int lastIgnored = -1;
- for (int i = 0; i < lines.length; i++) {
- if (lines[i].startsWith("[ ")) lastIgnored = i;
- }
- lines.removeRange(0, lastIgnored + 1);
- stdout = lines.join("\n");
- }
- stdout = stdout.trim();
- if (stdout.isNotEmpty) {
- print(stdout);
- print("-----");
- }
- } else {
- print("Running: $runWhat: Done in ${stopwatch.elapsedMilliseconds} ms.");
- }
-}
-
-String _computeRepoDir() {
- ProcessResult result = Process.runSync(
- 'git', ['rev-parse', '--show-toplevel'],
- runInShell: true,
- workingDirectory: new File.fromUri(Platform.script).parent.path);
- return (result.stdout as String).trim();
-}
diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index 797c534..f554c78 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.dart
@@ -136,7 +136,6 @@
'package:js/js.dart',
'package:js/js_util.dart',
'dart:js_util',
- 'dart:js',
'dart:ffi',
];
@@ -478,6 +477,8 @@
} else {
_checkNoNamedParameters(node.function);
}
+
+ super.visitConstructor(node);
}
@override
diff --git a/pkg/_js_interop_checks/lib/src/transformations/shared_interop_transformer.dart b/pkg/_js_interop_checks/lib/src/transformations/shared_interop_transformer.dart
index 91dfba1..146be19 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/shared_interop_transformer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/shared_interop_transformer.dart
@@ -13,7 +13,7 @@
templateJsInteropExportClassNotMarkedExportable,
templateJsInteropExportInvalidInteropTypeArgument,
templateJsInteropExportInvalidTypeArgument,
- templateJsInteropIsAInvalidType,
+ templateJsInteropIsAInvalidTypeVariable,
templateJsInteropIsAObjectLiteralType,
templateJsInteropIsAPrimitiveExtensionType;
import 'package:kernel/ast.dart';
@@ -149,8 +149,10 @@
// Generated tear-offs call the original method, so ignore that
// invocation.
if (!_inIsATearoff) {
+ assert(interopType is TypeParameterType);
_diagnosticReporter.report(
- templateJsInteropIsAInvalidType.withArguments(interopType),
+ templateJsInteropIsAInvalidTypeVariable
+ .withArguments(interopType),
invocation.fileOffset,
invocation.name.text.length,
invocation.location?.file);
diff --git a/pkg/_macros/lib/src/executor/cast.dart b/pkg/_macros/lib/src/executor/cast.dart
index 7f10177..9ee90a0 100644
--- a/pkg/_macros/lib/src/executor/cast.dart
+++ b/pkg/_macros/lib/src/executor/cast.dart
@@ -65,8 +65,8 @@
/// and so `<Object?, Object?>` is used to avoid unnecessary casts.
static MapCast<Object?, Object?> from(
Cast<Object?> keyCast, Cast<Object?> valueCast) =>
- keyCast.getAsTypedCast(<K>(keyCast) => valueCast.getAsTypedCast(
- <V>(valueCast) => MapCast<K, V>._(keyCast, valueCast)));
+ keyCast.getAsTypedCast(<KK>(keyCast) => valueCast.getAsTypedCast(
+ <VV>(valueCast) => MapCast<KK, VV>._(keyCast, valueCast)));
@override
Map<K, V> _cast(Object? from) {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index ac5d77f..6cb54e1 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -15,6 +15,7 @@
import 'package:analysis_server/src/lsp/client_capabilities.dart';
import 'package:analysis_server/src/lsp/client_configuration.dart';
import 'package:analysis_server/src/lsp/constants.dart' as lsp;
+import 'package:analysis_server/src/lsp/error_or.dart';
import 'package:analysis_server/src/lsp/handlers/handler_execute_command.dart';
import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
import 'package:analysis_server/src/plugin/notification_manager.dart';
@@ -29,6 +30,7 @@
import 'package:analysis_server/src/services/completion/completion_performance.dart';
import 'package:analysis_server/src/services/correction/assist_internal.dart';
import 'package:analysis_server/src/services/correction/namespace.dart';
+import 'package:analysis_server/src/services/dart_tooling_daemon/dtd_services.dart';
import 'package:analysis_server/src/services/pub/pub_api.dart';
import 'package:analysis_server/src/services/pub/pub_command.dart';
import 'package:analysis_server/src/services/pub/pub_package_service.dart';
@@ -104,6 +106,12 @@
/// The object through which analytics are to be sent.
final AnalyticsManager analyticsManager;
+ /// A connection to DTD (the Dart Tooling Daemon) that allows other clients to
+ /// call server functionality.
+ ///
+ /// Initialized by the client through a request that calls [connectToDtd].
+ DtdServices? dtd;
+
/// The object for managing showing surveys to users and recording their
/// responses.
///
@@ -257,6 +265,7 @@
bool enableBlazeWatcher = false,
DartFixPromptManager? dartFixPromptManager,
this.providedByteStore,
+ PluginManager? pluginManager,
}) : resourceProvider = OverlayResourceProvider(baseResourceProvider),
pubApi = PubApi(instrumentationService, httpClient,
Platform.environment['PUB_HOSTED_URL']),
@@ -285,12 +294,13 @@
PluginWatcher? pluginWatcher;
if (supportsPlugins) {
- pluginManager = PluginManager(
+ this.pluginManager = pluginManager ??= PluginManager(
resourceProvider,
_getByteStorePath(),
sdkManager.defaultSdkDirectory,
notificationManager,
instrumentationService);
+
pluginWatcher = PluginWatcher(resourceProvider, pluginManager);
}
@@ -488,6 +498,26 @@
}
}
+ /// Connects to DTD at [dtdUri].
+ ///
+ /// If there is already an active connection to DTD or there is an error
+ /// connecting, returns an error, otherwise returns `null`.
+ Future<ErrorOr<Null>> connectToDtd(Uri dtdUri) async {
+ switch (dtd?.state) {
+ case DtdConnectionState.Connecting || DtdConnectionState.Connected:
+ return error(
+ lsp.ServerErrorCodes.StateError,
+ 'Server is already connected to DTD',
+ );
+ case DtdConnectionState.Disconnected || DtdConnectionState.Error || null:
+ var connectResult = await DtdServices.connect(this, dtdUri);
+ return connectResult.mapResultSync((dtd) {
+ this.dtd = dtd;
+ return success(null);
+ });
+ }
+ }
+
/// If the state location can be accessed, return the file byte store,
/// otherwise return the memory byte store.
ByteStore createByteStore(ResourceProvider resourceProvider) {
diff --git a/pkg/analysis_server/lib/src/cider/local_library_contributor.dart b/pkg/analysis_server/lib/src/cider/local_library_contributor.dart
index a74e252..a4fca61 100644
--- a/pkg/analysis_server/lib/src/cider/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/cider/local_library_contributor.dart
@@ -95,7 +95,7 @@
if (element.isOperator) {
return;
}
- if (element.enclosingElement is! CompilationUnitElement) {
+ if (element.enclosingElement3 is! CompilationUnitElement) {
return;
}
var returnType = element.returnType;
@@ -134,9 +134,17 @@
(opType.includeAnnotationSuggestions &&
variable != null &&
variable.isConst)) {
- var parent = element.enclosingElement;
+ var parent = element.enclosingElement3;
if (parent is InterfaceElement || parent is ExtensionElement) {
- builder.suggestAccessor(element, inheritanceDistance: 0.0);
+ if (element.isSynthetic) {
+ if (element.isGetter) {
+ if (variable is FieldElement) {
+ builder.suggestField(variable, inheritanceDistance: 0.0);
+ }
+ }
+ } else {
+ builder.suggestAccessor(element, inheritanceDistance: 0.0);
+ }
} else {
builder.suggestTopLevelPropertyAccessor(element, prefix: prefix);
}
@@ -202,7 +210,15 @@
if (field.isStatic &&
field.isAccessibleIn(request.libraryElement) &&
typeSystem.isSubtypeOf(field.type, contextType)) {
- builder.suggestStaticField(field, prefix: prefix);
+ if (field.isSynthetic) {
+ var getter = field.getter;
+ if (getter != null) {
+ builder.suggestAccessor(getter,
+ inheritanceDistance: 0.0, withEnclosingName: true);
+ }
+ } else {
+ builder.suggestStaticField(field, prefix: prefix);
+ }
}
}
}
diff --git a/pkg/analysis_server/lib/src/cider/rename.dart b/pkg/analysis_server/lib/src/cider/rename.dart
index 781501e..4da587a 100644
--- a/pkg/analysis_server/lib/src/cider/rename.dart
+++ b/pkg/analysis_server/lib/src/cider/rename.dart
@@ -66,7 +66,7 @@
void _analyzePossibleConflicts(
ConstructorElement element, RefactoringStatus result, String newName) {
- var parentClass = element.enclosingElement;
+ var parentClass = element.enclosingElement3;
// Check if the "newName" is the name of the enclosing class.
if (parentClass.name == newName) {
result.addError('The constructor should not have the same name '
@@ -254,8 +254,8 @@
var stateName = flutterState.newName;
var match = await canRename._fileResolver.findReferences2(stateClass);
var sourcePath = stateClass.source.fullName;
- var location =
- stateClass.enclosingElement.lineInfo.getLocation(stateClass.nameOffset);
+ var location = stateClass.enclosingElement3.lineInfo
+ .getLocation(stateClass.nameOffset);
CiderSearchMatch ciderMatch;
var searchInfo =
CiderSearchInfo(location, stateClass.nameLength, MatchKind.DECLARATION);
@@ -297,7 +297,7 @@
Future<CiderReplaceMatch?> _replaceSyntheticConstructor() async {
var element = canRename.refactoringElement.element;
- var interfaceElement = element.enclosingElement;
+ var interfaceElement = element.enclosingElement3;
var fileResolver = canRename._fileResolver;
var libraryPath = interfaceElement!.library!.source.fullName;
@@ -382,7 +382,7 @@
}
bool _canRenameElement(Element element) {
- var enclosingElement = element.enclosingElement;
+ var enclosingElement = element.enclosingElement3;
if (element is ConstructorElement) {
return true;
}
diff --git a/pkg/analysis_server/lib/src/computer/computer_call_hierarchy.dart b/pkg/analysis_server/lib/src/computer/computer_call_hierarchy.dart
index 3c4c683..7d9bb02 100644
--- a/pkg/analysis_server/lib/src/computer/computer_call_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_call_hierarchy.dart
@@ -106,7 +106,7 @@
codeRange = _codeRangeForElement(element),
file = element.source!.fullName,
kind = CallHierarchyKind.forElement(element) {
- var enclosingElement = element.enclosingElement;
+ var enclosingElement = element.enclosingElement3;
var container =
enclosingElement != null ? _getContainer(enclosingElement) : null;
containerName = container != null ? _getDisplayName(container) : null;
diff --git a/pkg/analysis_server/lib/src/computer/computer_color.dart b/pkg/analysis_server/lib/src/computer/computer_color.dart
index ea5507c..5d78069 100644
--- a/pkg/analysis_server/lib/src/computer/computer_color.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_color.dart
@@ -74,7 +74,7 @@
var constructor = expression.constructorName;
var staticElement = constructor.staticElement;
- var classElement = staticElement?.enclosingElement;
+ var classElement = staticElement?.enclosingElement3;
var className = classElement?.name;
var constructorName = constructor.name?.name;
var constructorArgs = expression.argumentList.arguments
@@ -96,30 +96,6 @@
return _tryRecordColorValue(expression, colorValue);
}
- /// Creates a [ColorInformation] by extracting the argb values from
- /// [value] encoded as 0xAARRGGBB as in the dart:ui Color class.
- ColorInformation _colorInformationForColorValue(int value) {
- // Extract color information according to dart:ui Color values.
- var alpha = (0xff000000 & value) >> 24;
- var red = (0x00ff0000 & value) >> 16;
- var blue = (0x000000ff & value) >> 0;
- var green = (0x0000ff00 & value) >> 8;
-
- return ColorInformation(alpha, red, green, blue);
- }
-
- /// Extracts the integer color value from the dart:ui Color constant [color].
- int? _colorValueForColorConst(DartObject? color) {
- if (color == null || color.isNull) return null;
-
- // If the object has a "color" field, walk down to that, because some colors
- // like CupertinoColors have a "value=0" with an overridden getter that
- // would always result in a value representing black.
- color = color.getFieldFromHierarchy('color') ?? color;
-
- return color.getFieldFromHierarchy('value')?.toIntValue();
- }
-
/// Converts ARGB values into a single int value as 0xAARRGGBB as used by
/// the dart:ui Color class.
int _colorValueForComponents(int alpha, int red, int green, int blue) {
@@ -252,6 +228,40 @@
_colors.add(ColorReference(expression.offset, expression.length, color));
return true;
}
+
+ static ColorInformation? getColorForValue(DartObject object) {
+ if (object.type.isColor) {
+ var colorValue = _colorValueForColorConst(object);
+ if (colorValue != null) {
+ return _colorInformationForColorValue(colorValue);
+ }
+ }
+ return null;
+ }
+
+ /// Creates a [ColorInformation] by extracting the argb values from
+ /// [value] encoded as 0xAARRGGBB as in the dart:ui Color class.
+ static ColorInformation _colorInformationForColorValue(int value) {
+ // Extract color information according to dart:ui Color values.
+ var alpha = (0xff000000 & value) >> 24;
+ var red = (0x00ff0000 & value) >> 16;
+ var blue = (0x000000ff & value) >> 0;
+ var green = (0x0000ff00 & value) >> 8;
+
+ return ColorInformation(alpha, red, green, blue);
+ }
+
+ /// Extracts the integer color value from the dart:ui Color constant [color].
+ static int? _colorValueForColorConst(DartObject? color) {
+ if (color == null || color.isNull) return null;
+
+ // If the object has a "color" field, walk down to that, because some colors
+ // like CupertinoColors have a "value=0" with an overridden getter that
+ // would always result in a value representing black.
+ color = color.getFieldFromHierarchy('color') ?? color;
+
+ return color.getFieldFromHierarchy('value')?.toIntValue();
+ }
}
/// Information about a color that is present in a document.
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index b444474..7ba7268 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -332,7 +332,7 @@
var isInvocation =
parent is MethodInvocation && parent.methodName.token == nameToken;
HighlightRegionType type;
- var isTopLevel = element.enclosingElement is CompilationUnitElement;
+ var isTopLevel = element.enclosingElement3 is CompilationUnitElement;
type = isTopLevel
? isInvocation
? HighlightRegionType.TOP_LEVEL_FUNCTION_REFERENCE
@@ -357,7 +357,7 @@
return false;
}
// getter or setter
- var isTopLevel = element.enclosingElement is CompilationUnitElement;
+ var isTopLevel = element.enclosingElement3 is CompilationUnitElement;
HighlightRegionType type;
if (element.isGetter) {
if (isTopLevel) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 9c33a46..f52d99c 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -56,7 +56,8 @@
node is VariableDeclaration ||
node is VariablePattern ||
node is PatternFieldName ||
- node is DartPattern) {
+ node is DartPattern ||
+ (node is LibraryDirective && node.name2 == null)) {
var range = _hoverRange(node, locationEntity);
var hover = HoverInformation(range.offset, range.length);
// element
@@ -73,7 +74,7 @@
hover.elementKind = element.kind.displayName;
hover.isDeprecated = element.hasDeprecated;
// not local element
- if (element.enclosingElement is! ExecutableElement) {
+ if (element.enclosingElement3 is! ExecutableElement) {
// containing class
hover.containingClassDescription = _containingClass(element);
// containing library
@@ -196,6 +197,7 @@
VariablePattern() => node.name,
PatternFieldName() => node.name,
WildcardPattern() => node.name,
+ LibraryDirective() => node.libraryKeyword,
_ => null,
};
}
@@ -265,7 +267,7 @@
/// incorrect types to be shown and so we stick with the synthetic getter.
bool _useNonSyntheticElement(Element element) {
return element is PropertyAccessorElement &&
- !(element.enclosingElement is EnumElement &&
+ !(element.enclosingElement3 is EnumElement &&
element.name == 'values' &&
element.isSynthetic);
}
@@ -280,7 +282,7 @@
element = element.field;
}
if (element is ParameterElement) {
- element = element.enclosingElement;
+ element = element.enclosingElement3;
}
if (element == null) {
// This can happen when the code is invalid, such as having a field formal
@@ -328,9 +330,9 @@
var result =
dartdocInfo.processDartdoc(rawDoc, includeSummary: includeSummary);
- var documentedElementClass = documentedElement.enclosingElement;
+ var documentedElementClass = documentedElement.enclosingElement3;
if (documentedElementClass != null &&
- documentedElementClass != element.enclosingElement) {
+ documentedElementClass != element.enclosingElement3) {
var documentedClass = documentedElementClass.displayName;
result.full = '${result.full}\n\nCopied from `$documentedClass`.';
}
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index ba996ed..00e39d7 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -550,7 +550,7 @@
/// Return `true` if the given [element] is a top-level member of the test
/// package.
bool _isInsideTestPackage(engine.FunctionElement element) {
- var parent = element.enclosingElement;
+ var parent = element.enclosingElement3;
return parent is engine.CompilationUnitElement &&
parent.source.fullName.endsWith('test.dart');
}
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index 94094a2..31fefef 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -10,7 +10,7 @@
/// Return the elements that the given [element] overrides.
OverriddenElements findOverriddenElements(Element element) {
- if (element.enclosingElement is InterfaceElement) {
+ if (element.enclosingElement3 is InterfaceElement) {
return _OverriddenElementsFinder(element).find();
}
return OverriddenElements(element, <Element>[], <Element>[]);
@@ -110,7 +110,7 @@
final Set<InterfaceElement> _visited = {};
factory _OverriddenElementsFinder(Element seed) {
- var class_ = seed.enclosingElement as InterfaceElement;
+ var class_ = seed.enclosingElement3 as InterfaceElement;
var library = class_.library;
var name = seed.displayName;
List<ElementKind> kinds;
diff --git a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
index 3de0e06..f6f71c7 100644
--- a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
@@ -9,7 +9,6 @@
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/source/file_source.dart';
import 'package:analyzer/source/source.dart';
-import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
diff --git a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
index 08c7610..73b87ad 100644
--- a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
@@ -112,7 +112,10 @@
if (element == null) {
return;
}
- if (element.enclosingElement is! CompilationUnitElement) {
+ if (element is PrefixElement) {
+ return;
+ }
+ if (element.enclosingElement3 is! CompilationUnitElement) {
return;
}
diff --git a/pkg/analysis_server/lib/src/legacy_analysis_server.dart b/pkg/analysis_server/lib/src/legacy_analysis_server.dart
index 7aa31af..8a14aa5 100644
--- a/pkg/analysis_server/lib/src/legacy_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/legacy_analysis_server.dart
@@ -395,6 +395,7 @@
bool enableBlazeWatcher = false,
DartFixPromptManager? dartFixPromptManager,
super.providedByteStore,
+ super.pluginManager,
}) : lspClientConfiguration =
lsp.LspClientConfiguration(baseResourceProvider.pathContext),
super(
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
index 23ee015..0b49cd7 100644
--- a/pkg/analysis_server/lib/src/lsp/constants.dart
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -129,6 +129,7 @@
abstract final class CustomMethods {
static const augmented = Method('dart/textDocument/augmented');
static const augmentation = Method('dart/textDocument/augmentation');
+ static const connectToDtd = Method('dart/connectToDtd');
static const diagnosticServer = Method('dart/diagnosticServer');
static const reanalyze = Method('dart/reanalyze');
static const openUri = Method('dart/openUri');
@@ -288,6 +289,9 @@
/// Computation of a refactoring change failed.
static const RefactoringComputeStatusFailure = ErrorCodes(-32014);
+ /// General state error.
+ static const StateError = ErrorCodes(-32015);
+
/// An error raised when the server detects that the server and client are out
/// of sync and cannot recover. For example if a textDocument/didChange notification
/// has invalid offsets, suggesting the client and server have become out of sync
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_connect_to_dtd.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_connect_to_dtd.dart
new file mode 100644
index 0000000..3c42e892
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_connect_to_dtd.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/error_or.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+
+/// A handler for the [CustomMethods.connectToDtd] custom request.
+///
+/// This request allows a client to provide a URI for DTD, which the server will
+/// connect to and provide access to a subset of LSP requests.
+///
+/// A response is sent only once the server has connected to DTD and registered
+/// all services, or the connection failed.
+///
+/// This handler is only available to trusted callers (those with direct access
+/// to the protocol over stdin/stdout).
+class ConnectToDtdHandler
+ extends SharedMessageHandler<ConnectToDtdParams, Null> {
+ ConnectToDtdHandler(super.server);
+
+ @override
+ Method get handlesMessage => CustomMethods.connectToDtd;
+
+ @override
+ LspJsonHandler<ConnectToDtdParams> get jsonHandler =>
+ ConnectToDtdParams.jsonHandler;
+
+ @override
+ bool get requiresTrustedCaller => true;
+
+ @override
+ Future<ErrorOr<Null>> handle(
+ ConnectToDtdParams params,
+ MessageInfo message,
+ CancellationToken token,
+ ) async {
+ return await server.connectToDtd(params.uri);
+ }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
index 90742d8..ef58e23 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
@@ -188,7 +188,7 @@
// the parameters / representation type but we want the whole declaration
// for the code range because otherwise previews will just show `(int a)`
// which is not what the user expects.
- if (codeElement.enclosingElement case ExtensionTypeElement enclosingElement
+ if (codeElement.enclosingElement3 case ExtensionTypeElement enclosingElement
when enclosingElement.primaryConstructor == codeElement) {
codeElement = enclosingElement;
}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
index c9bb685..94270e1 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -10,6 +10,7 @@
import 'package:analysis_server/src/lsp/error_or.dart';
import 'package:analysis_server/src/lsp/handlers/custom/handler_augmentation.dart';
import 'package:analysis_server/src/lsp/handlers/custom/handler_augmented.dart';
+import 'package:analysis_server/src/lsp/handlers/custom/handler_connect_to_dtd.dart';
import 'package:analysis_server/src/lsp/handlers/custom/handler_diagnostic_server.dart';
import 'package:analysis_server/src/lsp/handlers/custom/handler_reanalyze.dart';
import 'package:analysis_server/src/lsp/handlers/custom/handler_super.dart';
@@ -118,6 +119,7 @@
AugmentationHandler.new,
AugmentedHandler.new,
CodeLensHandler.new,
+ ConnectToDtdHandler.new,
DartTextDocumentContentProviderHandler.new,
DocumentColorHandler.new,
DocumentColorPresentationHandler.new,
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index 7874c22..7c8f97d 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -17,6 +17,7 @@
import 'package:analysis_server/src/lsp/source_edits.dart';
import 'package:analysis_server/src/protocol_server.dart' as server
hide AnalysisError;
+import 'package:analysis_server/src/services/completion/dart/dart_completion_suggestion.dart';
import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
import 'package:analysis_server/src/services/snippets/snippet.dart';
import 'package:analysis_server/src/utilities/extensions/string.dart';
@@ -1038,11 +1039,18 @@
}
var element = suggestion.element;
- var completionKind = element != null
- ? elementKindToCompletionItemKind(
- capabilities.completionItemKinds, element.kind)
- : suggestionKindToCompletionItemKind(
- capabilities.completionItemKinds, suggestion.kind, label);
+ var colorPreviewHex =
+ capabilities.completionItemKinds.contains(CompletionItemKind.Color) &&
+ suggestion is DartCompletionSuggestion
+ ? suggestion.colorHex
+ : null;
+ var completionKind = colorPreviewHex != null
+ ? CompletionItemKind.Color
+ : element != null
+ ? elementKindToCompletionItemKind(
+ capabilities.completionItemKinds, element.kind)
+ : suggestionKindToCompletionItemKind(
+ capabilities.completionItemKinds, suggestion.kind, label);
var labelDetails = getCompletionDetail(
suggestion,
@@ -1095,6 +1103,13 @@
);
}
+ // Append hex colours to the end of the docs, this will allow editors that
+ // use a regex to find a color at the start/end like VS Code to show a color
+ // preview.
+ if (colorPreviewHex != null) {
+ cleanedDoc = '${cleanedDoc ?? ''}\n\n$colorPreviewHex'.trim();
+ }
+
// Because we potentially send thousands of these items, we should minimise
// the generated JSON as much as possible - for example using nulls in place
// of empty lists/false where possible.
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
index ebdc2dd..da60dcf 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -219,6 +219,9 @@
'augmented': {},
'augmentation': {},
},
+ // TODO(dantup): Add something to indicate support for connectToDtd here
+ // and also bump the legacy protocol version and record in the
+ // changelog that this is available for LSP-over-Legacy.
},
);
}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 890d358..759583e 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -13,7 +13,6 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/exception/exception.dart';
import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/generated/source.dart';
import 'package:collection/collection.dart';
Future<void> scheduleImplementedNotification(
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index abbbeb8..e575e3fe 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -4,6 +4,7 @@
import 'package:analysis_server/plugin/protocol/protocol_dart.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/computer/computer_color.dart';
import 'package:analysis_server/src/services/search/search_engine.dart'
as engine;
import 'package:analysis_server/src/utilities/extensions/element.dart';
@@ -54,6 +55,25 @@
return null;
}
+/// Returns a color hex code (in the form '#FFFFFF') if [element] represents
+/// a color.
+String? getColorHexString(engine.Element? element) {
+ if (element is engine.VariableElement) {
+ var dartValue = element.computeConstantValue();
+ if (dartValue != null) {
+ var color = ColorComputer.getColorForValue(dartValue);
+ if (color != null) {
+ return '#'
+ '${color.red.toRadixString(16).padLeft(2, '0')}'
+ '${color.green.toRadixString(16).padLeft(2, '0')}'
+ '${color.blue.toRadixString(16).padLeft(2, '0')}'
+ .toUpperCase();
+ }
+ }
+ }
+ return null;
+}
+
String? getReturnTypeString(engine.Element element) {
if (element is engine.ExecutableElement) {
if (element.kind == engine.ElementKind.SETTER) {
@@ -225,7 +245,7 @@
/// Construct based on an element from the analyzer engine.
OverriddenMember newOverriddenMember_fromEngine(engine.Element member) {
var element = convertElement(member);
- var className = member.enclosingElement!.displayName;
+ var className = member.enclosingElement3!.displayName;
return OverriddenMember(element, className);
}
@@ -285,9 +305,8 @@
return element;
}
- var enclosingElement = element.enclosingElement;
- if (enclosingElement is engine.LibraryElement) {
- element = enclosingElement;
+ if (element.enclosingElement3 case engine.LibraryElement enclosing) {
+ return enclosing.definingCompilationUnit;
}
if (element is engine.LibraryElement) {
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index 150484d..683120e 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -97,6 +97,6 @@
if (element is ConstructorElement) {
return false;
}
- return element.enclosingElement is InterfaceElement;
+ return element.enclosingElement3 is InterfaceElement;
}
}
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index cb5d5c2..1e67981 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -159,10 +159,10 @@
bool pivotFieldFinal = false;
if (pivotElement is FieldElement) {
pivotFieldFinal = pivotElement.isFinal;
- element = pivotElement.enclosingElement;
+ element = pivotElement.enclosingElement3;
}
if (pivotElement is ExecutableElement) {
- element = pivotElement.enclosingElement;
+ element = pivotElement.enclosingElement3;
}
InterfaceElement? pivotClass;
if (element is InterfaceElement) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart b/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart
index be3d27c..83cc29a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart
@@ -6,6 +6,7 @@
show CompletionSuggestionKind;
import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
+import 'package:analysis_server/src/services/completion/dart/utilities.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -66,19 +67,88 @@
/// Whether a trailing comma should be included in the suggestion.
final bool includeTrailingComma;
+ /// Whether the code for the closure is a block or an expression.
+ final bool useBlockStatement;
+
+ /// Whether types should be specified whenever possible.
+ final bool includeTypes;
+
+ /// The identation to be used for a multi-line completion.
+ final String indent;
+
+ // Indicates whether _completion, _displayText, and _selectionOffset have been initialized.
+ bool _initialized = false;
+
+ late String _displayText;
+
+ late int _selectionOffset;
+
+ late String _completion;
+
/// Initialize a newly created candidate suggestion to suggest a closure that
/// conforms to the given [functionType].
///
/// If [includeTrailingComma] is `true`, then the replacement will include a
/// trailing comma.
- ClosureSuggestion(
- {required this.functionType,
- required this.includeTrailingComma,
- required super.matcherScore});
+ ClosureSuggestion({
+ required this.functionType,
+ required this.includeTrailingComma,
+ required super.matcherScore,
+ required this.includeTypes,
+ required this.indent,
+ this.useBlockStatement = true,
+ });
@override
- // TODO(brianwilkerson): Fix this.
- String get completion => '() {}${includeTrailingComma ? ', ' : ''}';
+ String get completion {
+ _init();
+ return _completion;
+ }
+
+ /// Text to be displayed in a completion pop-up.
+ String get displayText {
+ _init();
+ return _displayText;
+ }
+
+ /// The offset, from the beginning of the inserted text, where the cursor
+ /// should be positioned.
+ int get selectionOffset {
+ _init();
+ return _selectionOffset;
+ }
+
+ void _init() {
+ if (_initialized) {
+ return;
+ }
+ var parametersString = buildClosureParameters(functionType,
+ includeTypes: includeTypes, includeKeywords: true);
+ // Build a short version of the parameter string without keywords or types
+ // for the completion label because they're less useful there and may push
+ // the end of the completion (`=>` vs `() {}`) off the end.
+ var parametersDisplayString = buildClosureParameters(functionType,
+ includeKeywords: false, includeTypes: false);
+
+ var stringBuffer = StringBuffer(parametersString);
+ if (useBlockStatement) {
+ _displayText = '$parametersDisplayString {}';
+ stringBuffer.writeln(' {');
+ stringBuffer.write('$indent ');
+ _selectionOffset = stringBuffer.length;
+ stringBuffer.writeln();
+ stringBuffer.write('$indent}');
+ } else {
+ _displayText = '$parametersDisplayString =>';
+ stringBuffer.write(' => ');
+ _selectionOffset = stringBuffer.length;
+ }
+ if (includeTrailingComma) {
+ stringBuffer.write(',');
+ }
+ _completion = stringBuffer.toString();
+ _initialized = true;
+ }
}
/// The information about a candidate suggestion based on a constructor.
@@ -117,7 +187,25 @@
}) : assert((isTearOff ? 1 : 0) | (isRedirect ? 1 : 0) < 2);
@override
- String get completion => '$completionPrefix${element.displayName}';
+ String get completion {
+ var enclosingClass = element.enclosingElement3.augmented.declaration;
+
+ var className = enclosingClass.name;
+
+ var completion = element.name;
+ if (completion.isEmpty && suggestUnnamedAsNew) {
+ completion = 'new';
+ }
+
+ if (!hasClassName) {
+ if (completion.isEmpty) {
+ completion = className;
+ } else {
+ completion = '$className.$completion';
+ }
+ }
+ return completion;
+ }
}
abstract interface class ElementBasedSuggestion {
@@ -146,7 +234,7 @@
@override
String get completion {
if (includeEnumName) {
- var enclosingElement = element.enclosingElement;
+ var enclosingElement = element.enclosingElement3;
return '$completionPrefix${enclosingElement.name}.${element.name}';
} else {
return element.name;
@@ -508,7 +596,7 @@
var inheritanceDistance = 0.0;
var element = this.element;
if (!(element is FieldElement && element.isEnumConstant)) {
- var declaringClass = element.enclosingElement;
+ var declaringClass = element.enclosingElement3;
var referencingInterface = this.referencingInterface;
if (referencingInterface != null && declaringClass is InterfaceElement) {
inheritanceDistance = featureComputer.inheritanceDistanceFeature(
@@ -641,15 +729,49 @@
@override
final InterfaceElement? referencingInterface;
+ /// Whether the accessor is being invoked with a target.
+ final bool withEnclosingName;
+
/// Initialize a newly created candidate suggestion to suggest the [element].
PropertyAccessSuggestion(
{required this.element,
required super.importData,
required this.referencingInterface,
- required super.matcherScore});
+ required super.matcherScore,
+ this.withEnclosingName = false});
@override
- String get completion => element.name;
+ String get completion {
+ var prefix = _enclosingPrefix;
+ if (prefix.isNotEmpty) {
+ return '$prefix${element.displayName}';
+ }
+ return element.displayName;
+ }
+
+ /// Return the name of the enclosing class or extension.
+ ///
+ /// The enclosing element must be either a class, or extension; otherwise
+ /// we either fail with assertion, or return `null`.
+ String? get _enclosingClassOrExtensionName {
+ var enclosing = element.enclosingElement3;
+ if (enclosing is InterfaceElement) {
+ return enclosing.name;
+ } else if (enclosing is ExtensionElement) {
+ return enclosing.name;
+ } else {
+ assert(false, 'Expected ClassElement or ExtensionElement');
+ return null;
+ }
+ }
+
+ String get _enclosingPrefix {
+ if (withEnclosingName) {
+ var enclosingName = _enclosingClassOrExtensionName;
+ return enclosingName != null ? '$enclosingName.' : '';
+ }
+ return '';
+ }
}
/// The information about a candidate suggestion based on a field in a record
@@ -693,6 +815,75 @@
String get completion => field.name;
}
+/// The information about a candidate suggestion for Flutter's `setState` method.
+final class SetStateMethodSuggestion extends ExecutableSuggestion
+ with MemberSuggestion {
+ @override
+ final MethodElement element;
+
+ late String _completion;
+
+ /// The element defined by the declaration in which the suggestion is to be
+ /// applied, or `null` if the completion is in a static context.
+ @override
+ final InterfaceElement? referencingInterface;
+
+ /// The identation to be used for a multi-line completion.
+ final String indent;
+
+ // Indicates whether _completion, _displayText, and _selectionOffset have been initialized.
+ bool _initialized = false;
+
+ late int _selectionOffset;
+
+ late String _displayText;
+
+ /// Initialize a newly created candidate suggestion to suggest the [element].
+ SetStateMethodSuggestion(
+ {required this.element,
+ required super.importData,
+ required this.referencingInterface,
+ required super.matcherScore,
+ required this.indent,
+ super.kind = CompletionSuggestionKind.INVOCATION});
+
+ @override
+ String get completion {
+ _init();
+ return _completion;
+ }
+
+ /// Text to be displayed in a completion pop-up.
+ String get displayText {
+ _init();
+ return _displayText;
+ }
+
+ /// The offset, from the beginning of the inserted text, where the cursor
+ /// should be positioned.
+ int get selectionOffset {
+ _init();
+ return _selectionOffset;
+ }
+
+ void _init() {
+ if (_initialized) {
+ return;
+ }
+ // Build the completion and the selection offset.
+ var buffer = StringBuffer();
+ buffer.writeln('setState(() {');
+ buffer.write('$indent ');
+ _selectionOffset = buffer.length;
+ buffer.writeln();
+ buffer.write('$indent});');
+ _completion = buffer.toString();
+ _displayText = 'setState(() {});';
+
+ _initialized = true;
+ }
+}
+
/// The information about a candidate suggestion based on a static field in a
/// location where the name of the field must be qualified by the name of the
/// enclosing element.
@@ -709,7 +900,7 @@
@override
String get completion {
- var enclosingElement = element.enclosingElement;
+ var enclosingElement = element.enclosingElement3;
return '$completionPrefix${enclosingElement.name}.${element.name}';
}
}
@@ -865,11 +1056,18 @@
suggestInterface(suggestion.element,
prefix: suggestion.prefix, relevance: relevance);
case ClosureSuggestion():
- suggestClosure(suggestion.functionType,
- includeTrailingComma: suggestion.includeTrailingComma);
+ suggestClosure(
+ completion: suggestion.completion,
+ displayText: suggestion.displayText,
+ selectionOffset: suggestion.selectionOffset);
case ConstructorSuggestion():
+ var completion = suggestion.completion;
+ if (completion.isEmpty) {
+ break;
+ }
suggestConstructor(suggestion.element,
hasClassName: suggestion.hasClassName,
+ completion: completion,
kind: suggestion.isRedirect || suggestion.isTearOff
? CompletionSuggestionKind.IDENTIFIER
: CompletionSuggestionKind.INVOCATION,
@@ -982,6 +1180,7 @@
suggestion.element,
inheritanceDistance: inheritanceDistance,
relevance: relevance,
+ completion: suggestion.completion,
);
case RecordFieldSuggestion():
suggestRecordField(
@@ -994,6 +1193,18 @@
appendColon: suggestion.appendColon,
appendComma: suggestion.appendComma,
);
+ case SetStateMethodSuggestion():
+ var inheritanceDistance =
+ suggestion.inheritanceDistance(request.featureComputer);
+ suggestSetStateMethod(
+ suggestion.element,
+ kind: suggestion.kind,
+ completion: suggestion.completion,
+ displayText: suggestion.displayText,
+ selectionOffset: suggestion.selectionOffset,
+ inheritanceDistance: inheritanceDistance,
+ relevance: relevance,
+ );
case StaticFieldSuggestion():
suggestStaticField(suggestion.element,
prefix: suggestion.prefix, relevance: relevance);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_state.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_state.dart
index 93b499b..11e8d7d 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_state.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_state.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart/utilities.dart';
import 'package:analysis_server_plugin/src/utilities/selection.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -41,6 +42,13 @@
return selection.coveringNode.thisOrAncestorOfType<ClassMember>();
}
+ /// Indicates if types should be specified whenever possible.
+ bool get includeTypes =>
+ request.fileState.analysisOptions.codeStyleOptions.specifyTypes;
+
+ /// The indentation for the completion text.
+ String get indent => getRequestLineIndent(request);
+
/// Whether the completion location is inside an instance member, and hence
/// whether there is a binding for `this`.
bool get inInstanceScope {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/dart_completion_suggestion.dart b/pkg/analysis_server/lib/src/services/completion/dart/dart_completion_suggestion.dart
index 9ff5cfa..6cf0998 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/dart_completion_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/dart_completion_suggestion.dart
@@ -11,6 +11,7 @@
class DartCompletionSuggestion extends CompletionSuggestion {
final ElementLocation? elementLocation;
final List<Uri> requiredImports;
+ final String? colorHex;
DartCompletionSuggestion(
super.kind,
@@ -40,5 +41,6 @@
super.isNotImported,
required this.elementLocation,
this.requiredImports = const [],
+ this.colorHex,
});
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
index 7394dce..ec94750 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
@@ -10,6 +10,7 @@
import 'package:analysis_server/src/services/completion/dart/not_imported_completion_pass.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_collector.dart';
import 'package:analysis_server/src/services/completion/dart/visibility_tracker.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
@@ -226,7 +227,7 @@
/// be skipped because the cursor is inside that field's name.
void addFieldsForInitializers(
ConstructorDeclaration constructor, FieldElement? fieldToInclude) {
- var containingElement = constructor.declaredElement?.enclosingElement;
+ var containingElement = constructor.declaredElement?.enclosingElement3;
if (containingElement == null) {
return;
}
@@ -357,6 +358,21 @@
excludedFields: const {},
);
_addMembersOfDartCoreObject();
+ _addExtensionMembers(
+ type: type,
+ excludedGetters: const {},
+ includeMethods: !mustBeAssignable,
+ includeSetters: true,
+ );
+ _recordOperation(
+ InstanceExtensionMembersOperation(
+ declarationHelper: this,
+ type: type,
+ excludedGetters: const {},
+ includeMethods: !mustBeAssignable,
+ includeSetters: true,
+ ),
+ );
} else if (type is FunctionType) {
_suggestFunctionCall();
_addMembersOfDartCoreObject();
@@ -420,10 +436,10 @@
}
for (var accessor in extension.accessors) {
if (!accessor.isStatic) {
- _suggestProperty(
+ _suggestFieldOrProperty(
accessor: accessor,
- importData: importData,
- referencingInterface: referencingInterface);
+ referencingInterface: referencingInterface,
+ importData: importData);
}
}
}
@@ -443,18 +459,20 @@
/// not yet imported [library] that are applicable for the given [type].
void addNotImportedExtensionMethods(
{required LibraryElement library,
- required InterfaceType type,
+ required DartType type,
required Set<String> excludedGetters,
required bool includeMethods,
required bool includeSetters}) {
- var applicableExtensions = library.accessibleExtensions.applicableTo(
- targetLibrary: library,
- // Ignore nullability, consistent with non-extension members.
- targetType: type.isDartCoreNull
- ? type
- : library.typeSystem.promoteToNonNull(type),
- strictCasts: false,
- );
+ var applicableExtensions = library.exportNamespace.definedNames.values
+ .whereType<ExtensionElement>()
+ .applicableTo(
+ targetLibrary: library,
+ // Ignore nullability, consistent with non-extension members.
+ targetType: type.isDartCoreNull
+ ? type
+ : library.typeSystem.promoteToNonNull(type),
+ strictCasts: false,
+ );
var importData = ImportData(
libraryUri: library.source.uri, prefix: null, isNotImported: true);
for (var instantiatedExtension in applicableExtensions) {
@@ -536,7 +554,7 @@
void addPossibleRedirectionsInLibrary(
ConstructorElement redirectingConstructor, LibraryElement library) {
var classElement =
- redirectingConstructor.enclosingElement.augmented.declaration;
+ redirectingConstructor.enclosingElement3.augmented.declaration;
var classType = classElement.thisType;
var typeSystem = library.typeSystem;
for (var unit in library.units) {
@@ -679,11 +697,12 @@
/// Add members from all the applicable extensions that are visible for the
/// given [InterfaceType].
- void _addExtensionMembers(
- {required InterfaceType type,
- required Set<String> excludedGetters,
- required bool includeMethods,
- required bool includeSetters}) {
+ void _addExtensionMembers({
+ required DartType type,
+ required Set<String> excludedGetters,
+ required bool includeMethods,
+ required bool includeSetters,
+ }) {
var libraryElement = request.libraryElement;
var applicableExtensions = libraryElement.accessibleExtensions.applicableTo(
@@ -704,8 +723,20 @@
}
}
for (var accessor in extension.accessors) {
- if (accessor.isGetter || includeSetters && accessor.isSetter) {
- _suggestProperty(accessor: accessor);
+ if (!accessor.isSynthetic) {
+ if (accessor.isGetter || includeSetters && accessor.isSetter) {
+ _suggestProperty(accessor: accessor);
+ }
+ } else {
+ // Avoid visiting a field twice. All fields induce a getter, but only
+ // non-final fields induce a setter, so we don't add a suggestion for a
+ // synthetic setter.
+ if (accessor.isGetter) {
+ var variable = accessor.variable2;
+ if (variable is FieldElement) {
+ _suggestField(field: variable);
+ }
+ }
}
}
}
@@ -900,10 +931,8 @@
referencingInterface: referencingInterface,
);
case PropertyAccessorElement():
- _suggestProperty(
- accessor: member,
- referencingInterface: referencingInterface,
- );
+ _suggestFieldOrProperty(
+ accessor: member, referencingInterface: referencingInterface);
}
}
}
@@ -1244,7 +1273,7 @@
(containingElement is EnumElement && field.name == 'values')) &&
field.isVisibleIn(request.libraryElement)) {
if (field.isEnumConstant) {
- var enumElement = field.enclosingElement;
+ var enumElement = field.enclosingElement3;
var matcherScore =
state.matcher.score('${enumElement.name}.${field.name}');
if (matcherScore != -1) {
@@ -1350,7 +1379,7 @@
}
if (element.isProtected) {
- var elementInterface = element.enclosingElement;
+ var elementInterface = element.enclosingElement3;
if (elementInterface is! InterfaceElement) {
return false;
}
@@ -1457,7 +1486,7 @@
}
if (importData?.isNotImported ?? false) {
if (!visibilityTracker.isVisible(
- element: element.enclosingElement, importData: importData)) {
+ element: element.enclosingElement3, importData: importData)) {
// If the constructor is on a class from a not-yet-imported library and
// the class isn't visible, then we shouldn't suggest it.
//
@@ -1471,7 +1500,7 @@
// Add the class to the visibility tracker so that we will know later that
// any non-imported elements with the same name are not visible.
visibilityTracker.isVisible(
- element: element.enclosingElement, importData: importData);
+ element: element.enclosingElement3, importData: importData);
}
// TODO(keertip): Compute the completion string.
@@ -1608,6 +1637,30 @@
}
}
+ /// Adds a suggestion for a [FieldElement] or a [PropertyAccessorElement].
+ void _suggestFieldOrProperty(
+ {required PropertyAccessorElement accessor,
+ required InterfaceElement? referencingInterface,
+ ImportData? importData}) {
+ if (accessor.isSynthetic) {
+ // Avoid visiting a field twice. All fields induce a getter, but only
+ // non-final fields induce a setter, so we don't add a suggestion for a
+ // synthetic setter.
+ if (accessor.isGetter) {
+ var variable = accessor.variable2;
+ if (variable is FieldElement) {
+ _suggestField(
+ field: variable, referencingInterface: referencingInterface);
+ }
+ }
+ } else {
+ _suggestProperty(
+ accessor: accessor,
+ referencingInterface: referencingInterface,
+ importData: importData);
+ }
+ }
+
/// Adds a suggestion for the method `call` defined on the class `Function`.
void _suggestFunctionCall() {
var matcherScore = state.matcher.score('call');
@@ -1662,6 +1715,19 @@
}
var matcherScore = state.matcher.score(method.displayName);
if (matcherScore != -1) {
+ var enclosingElement = method.enclosingElement3;
+ if (method.name == 'setState' &&
+ enclosingElement is ClassElement &&
+ enclosingElement.isExactState) {
+ var suggestion = SetStateMethodSuggestion(
+ element: method,
+ importData: importData,
+ referencingInterface: referencingInterface,
+ matcherScore: matcherScore,
+ indent: state.indent);
+ collector.addSuggestion(suggestion);
+ return;
+ }
var suggestion = MethodSuggestion(
kind: _executableSuggestionKind,
element: method,
@@ -1742,12 +1808,28 @@
}
var matcherScore = state.matcher.score(accessor.displayName);
if (matcherScore != -1) {
- var suggestion = PropertyAccessSuggestion(
- element: accessor,
- importData: importData,
- matcherScore: matcherScore,
- referencingInterface: referencingInterface);
- collector.addSuggestion(suggestion);
+ if (accessor.isSynthetic) {
+ // Avoid visiting a field twice. All fields induce a getter, but only
+ // non-final fields induce a setter, so we don't add a suggestion for a
+ // synthetic setter.
+ if (accessor.isGetter) {
+ var variable = accessor.variable2;
+ if (variable is FieldElement) {
+ var suggestion = FieldSuggestion(
+ element: variable,
+ matcherScore: matcherScore,
+ referencingInterface: referencingInterface);
+ collector.addSuggestion(suggestion);
+ }
+ }
+ } else {
+ var suggestion = PropertyAccessSuggestion(
+ element: accessor,
+ importData: importData,
+ matcherScore: matcherScore,
+ referencingInterface: referencingInterface);
+ collector.addSuggestion(suggestion);
+ }
}
}
}
@@ -1775,7 +1857,7 @@
request.libraryElement.typeSystem
.isSubtypeOf(element.type, contextType)) {
if (element.isEnumConstant) {
- var enumElement = element.enclosingElement;
+ var enumElement = element.enclosingElement3;
var matcherScore = state.matcher
.score('${enumElement.displayName}.${element.displayName}');
if (matcherScore != -1) {
@@ -1788,11 +1870,35 @@
} else {
var matcherScore = state.matcher.score(element.displayName);
if (matcherScore != -1) {
- var suggestion = StaticFieldSuggestion(
- importData: importData,
- element: element,
- matcherScore: matcherScore);
- collector.addSuggestion(suggestion);
+ if (element.isSynthetic) {
+ var getter = element.getter;
+ if (getter != null) {
+ if (getter.isSynthetic) {
+ var variable = getter.variable2;
+ if (variable is FieldElement) {
+ var suggestion = FieldSuggestion(
+ element: variable,
+ matcherScore: matcherScore,
+ referencingInterface: null);
+ collector.addSuggestion(suggestion);
+ }
+ } else {
+ var suggestion = PropertyAccessSuggestion(
+ element: getter,
+ importData: importData,
+ referencingInterface: null,
+ matcherScore: matcherScore,
+ withEnclosingName: true);
+ collector.addSuggestion(suggestion);
+ }
+ }
+ } else {
+ var suggestion = StaticFieldSuggestion(
+ importData: importData,
+ element: element,
+ matcherScore: matcherScore);
+ collector.addSuggestion(suggestion);
+ }
}
}
}
@@ -1917,7 +2023,9 @@
/// Adds a suggestion for each of the [typeParameters].
void _suggestTypeParameters(List<TypeParameterElement> typeParameters) {
for (var parameter in typeParameters) {
- _suggestTypeParameter(parameter);
+ if (!_isWildcard(parameter.name)) {
+ _suggestTypeParameter(parameter);
+ }
}
}
@@ -2166,7 +2274,9 @@
for (var typeParameter in typeParameters.typeParameters) {
var element = typeParameter.declaredElement;
if (element != null) {
- _suggestTypeParameter(element);
+ if (!_isWildcard(element.name)) {
+ _suggestTypeParameter(element);
+ }
}
}
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
index 10882c5..5634a67 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
@@ -3122,15 +3122,22 @@
/// Adds a suggestion for a closure.
void _addClosureSuggestion(
FunctionType parameterType, bool includeTrailingComma) {
- // TODO(keertip): compute the completion string to find the score.
- var matcherScore = 0.0;
- if (matcherScore != -1) {
- collector.addSuggestion(ClosureSuggestion(
- functionType: parameterType,
- includeTrailingComma: includeTrailingComma,
- matcherScore: matcherScore,
- ));
- }
+ var includeTypes = state.includeTypes;
+ collector.addSuggestion(ClosureSuggestion(
+ functionType: parameterType,
+ includeTrailingComma: includeTrailingComma,
+ matcherScore: 0.0,
+ includeTypes: includeTypes,
+ indent: state.indent,
+ ));
+ collector.addSuggestion(ClosureSuggestion(
+ functionType: parameterType,
+ includeTrailingComma: includeTrailingComma,
+ matcherScore: 0.0,
+ useBlockStatement: false,
+ includeTypes: includeTypes,
+ indent: state.indent,
+ ));
}
/// Returns the context type in which [node] is analyzed.
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/not_imported_completion_pass.dart b/pkg/analysis_server/lib/src/services/completion/dart/not_imported_completion_pass.dart
index a7bbaed..524b5b6 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/not_imported_completion_pass.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/not_imported_completion_pass.dart
@@ -38,7 +38,7 @@
final DeclarationHelper _declarationHelper;
/// The type that the extensions must extend.
- final InterfaceType _type;
+ final DartType _type;
/// The names of getters that should not be suggested.
final Set<String> _excludedGetters;
@@ -51,7 +51,7 @@
InstanceExtensionMembersOperation(
{required DeclarationHelper declarationHelper,
- required InterfaceType type,
+ required DartType type,
required Set<String> excludedGetters,
required bool includeMethods,
required bool includeSetters})
@@ -143,7 +143,7 @@
var element = elementResult.element;
if (element == library) {
// Don't suggest elements from the library in which completion is being
- // requested. They've already been sugpested.
+ // requested. They've already been suggested.
continue;
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart
index 74185b9..9fdddb8 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart
@@ -191,6 +191,12 @@
);
case RecordLiteralNamedFieldSuggestion():
return Relevance.requiredNamedArgument;
+ case SetStateMethodSuggestion():
+ return _computeMethodRelevance(
+ suggestion.element,
+ suggestion.inheritanceDistance(featureComputer),
+ suggestion.isNotImported,
+ );
case StaticFieldSuggestion():
return _computeStaticFieldRelevance(
suggestion.element,
@@ -318,7 +324,7 @@
/// Compute the relevance for [ConstructorElement].
int _computeConstructorRelevance(ConstructorElement element,
NeverType neverType, bool isNotImportedLibrary) {
- var enclosingClass = element.enclosingElement.augmented.declaration;
+ var enclosingClass = element.enclosingElement3.augmented.declaration;
var returnType = instantiateInstanceElement(enclosingClass, neverType);
return computeTopLevelRelevance(element,
elementType: returnType, isNotImportedLibrary: isNotImportedLibrary);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 79b82ed..1b4d168 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'dart:collection';
-
import 'package:_fe_analyzer_shared/src/base/syntactic_entity.dart';
import 'package:analysis_server/src/computer/computer_hover.dart';
import 'package:analysis_server/src/protocol_server.dart'
@@ -50,121 +48,6 @@
CompletionSuggestion build();
}
-/// This class provides suggestions based upon the visible instance members in
-/// an interface type.
-class MemberSuggestionBuilder {
- /// Enumerated value indicating that we have not generated any completions for
- /// a given identifier yet.
- static const int _COMPLETION_TYPE_NONE = 0;
-
- /// Enumerated value indicating that we have generated a completion for a
- /// getter.
- static const int _COMPLETION_TYPE_GETTER = 1;
-
- /// Enumerated value indicating that we have generated a completion for a
- /// setter.
- static const int _COMPLETION_TYPE_SETTER = 2;
-
- /// Enumerated value indicating that we have generated a completion for a
- /// field, a method, or a getter/setter pair.
- static const int _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET = 3;
-
- /// The request for which suggestions are being built.
- final DartCompletionRequest request;
-
- /// The builder used to build the suggestions.
- final SuggestionBuilder builder;
-
- /// Map indicating, for each possible completion identifier, whether we have
- /// already generated completions for a getter, setter, or both. The "both"
- /// case also handles the case where have generated a completion for a method
- /// or a field.
- ///
- /// Note: the enumerated values stored in this map are intended to be bitwise
- /// compared.
- final Map<String, int> _completionTypesGenerated = HashMap<String, int>();
-
- MemberSuggestionBuilder(this.request, this.builder);
-
- /// Add a suggestion for the given [accessor].
- void addSuggestionForAccessor(
- {required PropertyAccessorElement accessor,
- required double inheritanceDistance}) {
- if (accessor.isAccessibleIn(request.libraryElement)) {
- var member =
- accessor.isSynthetic ? accessor.variable2 ?? accessor : accessor;
- if (_shouldAddSuggestion(member)) {
- builder.suggestAccessor(accessor,
- inheritanceDistance: inheritanceDistance);
- }
- }
- }
-
- /// Add a suggestion for the given [method].
- void addSuggestionForMethod(
- {required MethodElement method,
- required CompletionSuggestionKind kind,
- required double inheritanceDistance}) {
- if (method.isAccessibleIn(request.libraryElement) &&
- _shouldAddSuggestion(method) &&
- request.opType.patternLocation == null) {
- builder.suggestMethod(method,
- kind: kind, inheritanceDistance: inheritanceDistance);
- }
- }
-
- /// Return `true` if a suggestion for the given [element] should be created.
- bool _shouldAddSuggestion(Element element) {
- // TODO(brianwilkerson): Consider moving this into SuggestionBuilder.
- var identifier = element.displayName;
-
- var alreadyGenerated = _completionTypesGenerated.putIfAbsent(
- identifier, () => _COMPLETION_TYPE_NONE);
- if (element is MethodElement) {
- // Anything shadows a method.
- if (alreadyGenerated != _COMPLETION_TYPE_NONE) {
- return false;
- }
- _completionTypesGenerated[identifier] =
- _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET;
- } else if (element is PropertyAccessorElement) {
- if (element.isGetter) {
- // Getters, fields, and methods shadow a getter.
- if ((alreadyGenerated & _COMPLETION_TYPE_GETTER) != 0) {
- return false;
- }
- _completionTypesGenerated[identifier] =
- _completionTypesGenerated[identifier]! | _COMPLETION_TYPE_GETTER;
- } else {
- // Setters, fields, and methods shadow a setter.
- if ((alreadyGenerated & _COMPLETION_TYPE_SETTER) != 0) {
- return false;
- } else if (element.hasDeprecated &&
- !(element.correspondingGetter?.hasDeprecated ?? true)) {
- // A deprecated setter should not take priority over a non-deprecated
- // getter.
- return false;
- }
- _completionTypesGenerated[identifier] =
- _completionTypesGenerated[identifier]! | _COMPLETION_TYPE_SETTER;
- }
- } else if (element is FieldElement) {
- // Fields and methods shadow a field. A getter/setter pair shadows a
- // field, but a getter or setter by itself doesn't.
- if (alreadyGenerated == _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET) {
- return false;
- }
- _completionTypesGenerated[identifier] =
- _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET;
- } else {
- // Unexpected element type; skip it.
- assert(false);
- return false;
- }
- return true;
- }
-}
-
/// An object used to build a list of suggestions in response to a single
/// completion request.
class SuggestionBuilder {
@@ -265,6 +148,7 @@
required double inheritanceDistance,
bool withEnclosingName = false,
int? relevance,
+ String? completion,
}) {
var enclosingPrefix = '';
var enclosingName = _enclosingClassOrExtensionName(accessor);
@@ -272,54 +156,41 @@
enclosingPrefix = '$enclosingName.';
}
- if (accessor.isSynthetic) {
- // Avoid visiting a field twice. All fields induce a getter, but only
- // non-final fields induce a setter, so we don't add a suggestion for a
- // synthetic setter.
- if (accessor.isGetter) {
- var variable = accessor.variable2;
- if (variable is FieldElement) {
- suggestField(variable, inheritanceDistance: inheritanceDistance);
- }
- }
- } else {
- var completion = enclosingPrefix + accessor.displayName;
- if (_couldMatch(completion, null)) {
- var type = _getPropertyAccessorType(accessor);
- var featureComputer = request.featureComputer;
- var contextType =
- featureComputer.contextTypeFeature(request.contextType, type);
- var elementKind =
- _computeElementKind(accessor, distance: inheritanceDistance);
- var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor);
- var isConstant = _preferConstants
- ? featureComputer.isConstantFeature(accessor)
- : 0.0;
- var startsWithDollar =
- featureComputer.startsWithDollarFeature(accessor.name);
- var superMatches = featureComputer.superMatchesFeature(
- _containingMemberName, accessor.name);
- relevance ??= relevanceComputer.computeScore(
- contextType: contextType,
- elementKind: elementKind,
- hasDeprecated: hasDeprecated,
- isConstant: isConstant,
- isNotImported: request.featureComputer
- .isNotImportedFeature(isNotImportedLibrary),
- startsWithDollar: startsWithDollar,
- superMatches: superMatches,
- inheritanceDistance: inheritanceDistance,
- );
- _addBuilder(
- _createCompletionSuggestionBuilder(
- accessor,
- completion: completion,
- kind: CompletionSuggestionKind.IDENTIFIER,
- relevance: relevance,
- isNotImported: isNotImportedLibrary,
- ),
- );
- }
+ completion ??= enclosingPrefix + accessor.displayName;
+ if (_couldMatch(completion, null)) {
+ var type = _getPropertyAccessorType(accessor);
+ var featureComputer = request.featureComputer;
+ var contextType =
+ featureComputer.contextTypeFeature(request.contextType, type);
+ var elementKind =
+ _computeElementKind(accessor, distance: inheritanceDistance);
+ var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor);
+ var isConstant =
+ _preferConstants ? featureComputer.isConstantFeature(accessor) : 0.0;
+ var startsWithDollar =
+ featureComputer.startsWithDollarFeature(accessor.name);
+ var superMatches = featureComputer.superMatchesFeature(
+ _containingMemberName, accessor.name);
+ relevance ??= relevanceComputer.computeScore(
+ contextType: contextType,
+ elementKind: elementKind,
+ hasDeprecated: hasDeprecated,
+ isConstant: isConstant,
+ isNotImported:
+ request.featureComputer.isNotImportedFeature(isNotImportedLibrary),
+ startsWithDollar: startsWithDollar,
+ superMatches: superMatches,
+ inheritanceDistance: inheritanceDistance,
+ );
+ _addBuilder(
+ _createCompletionSuggestionBuilder(
+ accessor,
+ completion: completion,
+ kind: CompletionSuggestionKind.IDENTIFIER,
+ relevance: relevance,
+ isNotImported: isNotImportedLibrary,
+ ),
+ );
}
}
@@ -347,69 +218,22 @@
);
}
- /// Add a suggestion to insert a closure matching the given function [type].
- /// If [includeTrailingComma] is `true` then the completion text will include
- /// a trailing comma, such as when the closure is part of an argument list.
- void suggestClosure(FunctionType type, {bool includeTrailingComma = false}) {
- var includeTypes =
- request.fileState.analysisOptions.codeStyleOptions.specifyTypes;
- var indent = getRequestLineIndent(request);
- var parametersString = buildClosureParameters(type,
- includeTypes: includeTypes, includeKeywords: true);
- // Build a short version of the parameter string without keywords or types
- // for the completion label because they're less useful there and may push
- // the end of the completion (`=>` vs `() {}`) off the end.
- var parametersDisplayString = buildClosureParameters(type,
- includeKeywords: false, includeTypes: false);
-
- var blockBuffer = StringBuffer(parametersString);
- blockBuffer.writeln(' {');
- blockBuffer.write('$indent ');
- var blockSelectionOffset = blockBuffer.length;
- blockBuffer.writeln();
- blockBuffer.write('$indent}');
-
- var expressionBuffer = StringBuffer(parametersString);
- expressionBuffer.write(' => ');
- var expressionSelectionOffset = expressionBuffer.length;
-
- if (includeTrailingComma) {
- blockBuffer.write(',');
- expressionBuffer.write(',');
- }
-
- CompletionSuggestion createSuggestion({
- required String completion,
+ /// Add a suggestion to insert a closure.
+ void suggestClosure(
+ {required String completion,
required String displayText,
- required int selectionOffset,
- }) {
- return DartCompletionSuggestion(
- CompletionSuggestionKind.INVOCATION,
- Relevance.closure,
- completion,
- selectionOffset,
- 0,
- false,
- false,
- displayText: displayText,
- elementLocation: null, // type.element is Null for FunctionType.
- );
- }
-
- _addSuggestion(
- createSuggestion(
- completion: blockBuffer.toString(),
- displayText: '$parametersDisplayString {}',
- selectionOffset: blockSelectionOffset,
- ),
- );
- _addSuggestion(
- createSuggestion(
- completion: expressionBuffer.toString(),
- displayText: '$parametersDisplayString =>',
- selectionOffset: expressionSelectionOffset,
- ),
- );
+ required int selectionOffset}) {
+ _addSuggestion(DartCompletionSuggestion(
+ CompletionSuggestionKind.INVOCATION,
+ Relevance.closure,
+ completion,
+ selectionOffset,
+ 0,
+ false,
+ false,
+ displayText: displayText,
+ elementLocation: null, // type.element is Null for FunctionType.
+ ));
}
/// Add a suggestion for a [constructor]. If a [kind] is provided it will be
@@ -425,32 +249,34 @@
bool hasClassName = false,
String? prefix,
int? relevance,
+ String? completion,
}) {
// If the class name is already in the text, then we don't support
// prepending a prefix.
assert(!hasClassName || prefix == null);
+ var enclosingClass = constructor.enclosingElement3.augmented.declaration;
- var enclosingClass = constructor.enclosingElement.augmented.declaration;
-
- var className = enclosingClass.name;
- if (className.isEmpty) {
- return;
- }
-
- var completion = constructor.name;
- if (completion.isEmpty && suggestUnnamedAsNew) {
- completion = 'new';
- }
-
- if (!hasClassName) {
- if (completion.isEmpty) {
- completion = className;
- } else {
- completion = '$className.$completion';
+ if (completion == null) {
+ var className = enclosingClass.name;
+ if (className.isEmpty) {
+ return;
}
- }
- if (completion.isEmpty) {
- return;
+
+ completion = constructor.name;
+ if (completion.isEmpty && suggestUnnamedAsNew) {
+ completion = 'new';
+ }
+
+ if (!hasClassName) {
+ if (completion.isEmpty) {
+ completion = className;
+ } else {
+ completion = '$className.$completion';
+ }
+ }
+ if (completion.isEmpty) {
+ return;
+ }
}
if (_couldMatch(completion, prefix)) {
@@ -481,10 +307,10 @@
} else if (element is ExtensionElement) {
suggestExtension(element, kind: kind);
} else if (element is FunctionElement &&
- element.enclosingElement is CompilationUnitElement) {
+ element.enclosingElement3 is CompilationUnitElement) {
suggestTopLevelFunction(element, kind: kind);
} else if (element is PropertyAccessorElement &&
- element.enclosingElement is CompilationUnitElement) {
+ element.enclosingElement3 is CompilationUnitElement) {
suggestTopLevelPropertyAccessor(element);
} else if (element is TypeAliasElement) {
suggestTypeAlias(element);
@@ -498,7 +324,7 @@
void suggestEnumConstant(FieldElement constant,
{String? prefix, int? relevance}) {
var constantName = constant.name;
- var enumElement = constant.enclosingElement;
+ var enumElement = constant.enclosingElement3;
var enumName = enumElement.name;
var completion = '$enumName.$constantName';
relevance ??= relevanceComputer.computeTopLevelRelevance(constant,
@@ -791,41 +617,6 @@
inheritanceDistance: inheritanceDistance,
);
- var enclosingElement = method.enclosingElement;
- if (method.name == 'setState' &&
- enclosingElement is ClassElement &&
- enclosingElement.isExactState) {
- // TODO(brianwilkerson): Make this more efficient by creating the correct
- // suggestion in the first place.
- // Find the line indentation.
- var indent = getRequestLineIndent(request);
-
- // Build the completion and the selection offset.
- var buffer = StringBuffer();
- buffer.writeln('setState(() {');
- buffer.write('$indent ');
- var selectionOffset = buffer.length;
- buffer.writeln();
- buffer.write('$indent});');
-
- _addSuggestion(
- DartCompletionSuggestion(
- kind,
- relevance,
- buffer.toString(),
- selectionOffset,
- 0,
- false,
- false,
- // Let the user know that we are going to insert a complete statement.
- displayText: 'setState(() {});',
- elementLocation: method.location,
- ),
- textToMatchOverride: 'setState',
- );<