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',
-      );<